Raspberry Pi3 GPIO 入力2
Raspberry Pi3 で GPIO ポートからの入力実験その2
「PICと楽しむRaspberryPi活用ガイドブック」の汎用GPIOテストボードを使ってGPIO17、GPIO18に接続されているスイッチが押されたときに割り込みが発生するように登録する
複数のGPIOポートに同じ割り込み処理を登録することも可能で割り込み処理の中でGPIO番号を確認し処理を切り分ける。
File:gpioin17-2.py
#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep
#初期化
GPIO.setmode(GPIO.BCM) #GPIO番号指定
GPIO.setwarnings(False)
#GPIO17(SW3)、18(SW4)、27(SW1)を入力モードとして設定
GPIO.setup (17,GPIO.IN,pull_up_down=GPIO.PUD_UP) #SW3
GPIO.setup (18,GPIO.IN,pull_up_down=GPIO.PUD_UP) #SW4
GPIO.setup (27,GPIO.IN,pull_up_down=GPIO.PUD_UP) #SW1
#割り込みで受け取る関数定義
def myFunc1(channel):
if (channel == 17) :
#出力状態変更
print ( 'SW3:GPIO17 RISING' )
sleep (1)
if (channel == 18) :
#出力状態変更
print ( 'SW4:GPIO18 RISING' )
sleep (1)
if (channel == 27) :
#出力状態変更
print ( 'SW1:GPIO27 RISING' )
sleep (1)
def myFunc2(channel):
if (channel == 17) :
#出力状態変更
print ( 'SW3:GPIO17 FALLING' )
sleep (1)
if (channel == 18) :
#出力状態変更
print ( 'SW4:GPIO18 FALLING' )
sleep (1)
if (channel == 27) :
#出力状態変更
print ( 'SW1:GPIO27 FALLING' )
sleep (1)
#変化を割り込みで受け取る関数登録
#GPIO.RISINGは立ち上がり、GPIO.FALLINGは立ち下り GPIO.BOTHは両方
#押したときに立ち上がるのか立ち下がるのかは回路による(^^)
#一つのポートの RISINGは立ち上がり、FALLINGは立ち下りを両方登録する
# ことはできない(エラーになる)
#bouncetime はチャタリング回避のタイマ msec 単位
#GPIO.add_event_detect ( 17 , GPIO.RISING , callback = myFunc1 , bouncetime = 300)
#GPIO.add_event_detect ( 18 , GPIO.RISING , callback = myFunc1 , bouncetime = 300)
#GPIO.add_event_detect ( 27 , GPIO.RISING , callback = myFunc1 , bouncetime = 300)
GPIO.add_event_detect ( 17 , GPIO.FALLING , callback = myFunc2 , bouncetime = 300)
GPIO.add_event_detect ( 18 , GPIO.FALLING , callback = myFunc2 , bouncetime = 300)
GPIO.add_event_detect ( 27 , GPIO.FALLING , callback = myFunc2 , bouncetime = 300)
#コントロールCが押されるまでループ
try:
while True:
print ( 'wait' )
sleep (1)
#例外
except KeyboardInterrupt:
print ( 'CTRL + C' )
pass
#変化を割り込みで受け取る関数定義解除
GPIO.remove_event_detect ( 17 )
GPIO.remove_event_detect ( 18 )
GPIO.remove_event_detect ( 27 )
#GPIOのリセット終了
GPIO.cleanup()
Raspberry Pi3 GPIO 入力1
Raspberry Pi3 で GPIO ポートからの入力実験その1
「PICと楽しむRaspberryPi活用ガイドブック」の汎用GPIOテストボードを使ってGPIO17(SW3)、GPIO18(SW4)、GPIO27(SW1)に接続されているスイッチ状態を読みだして表示してみる。ただしGPIO27(SW1)はPIC経由なので使えるのかどうかよくわからない。➡SW1の操作してもGPIO27のは反応なかった。
File:gpioin17-1.py
#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep
#初期化
GPIO.setmode(GPIO.BCM) #GPIO番号指定
GPIO.setwarnings(False)
#GPIO17(SW3)、18(SW4)、27(SW1)を入力モードとして設定
GPIO.setup (17,GPIO.IN,pull_up_down=GPIO.PUD_UP) #SW3
GPIO.setup (18,GPIO.IN,pull_up_down=GPIO.PUD_UP) #SW4
GPIO.setup (27,GPIO.IN,pull_up_down=GPIO.PUD_UP) #SW1
#コントロールCが押されるまでループ
try:
while True:
if GPIO.input(17)==GPIO.HIGH : #GPIO.LOW または GPIO.HIGHを得る
print ( 'SW3:GPIO17 HIGH' )
else :
print ( 'SW3:GPIO17 LOW' )
if GPIO.input(18)==GPIO.HIGH : #GPIO.LOW または GPIO.HIGHを得る
print ( 'SW4:GPIO18 HIGH' )
else :
print ( 'SW4:GPIO18 LOW' )
if GPIO.input(27)==GPIO.HIGH : #GPIO.LOW または GPIO.HIGHを得る
print ( 'SW1:GPIO27 HIGH' )
else :
print ( 'SW1:GPIO27 LOW' )
sleep (1)
#例外
except KeyboardInterrupt :
print ( 'CTRL + C' )
pass
#GPIOのリセット終了
GPIO.cleanup()
Raspberry Pi3 GPIO 制御をやってみる
以前買った「PICと楽しむRaspberryPi活用ガイドブック」では、序盤でGPIOを制御する方法の解説とサンプルプログラムが掲載されており、テストに使うボードの作り方やの説明もあります。日本橋の共立電子では テストボードのパーツをセットにしたキットや、なんと組み立て完成品も売ってます。
ハンダが出来ない人でもとりあえず完成品を買えば、GPIO制御プログラムで電子機器の制御結果を確認して遊べます。(*^-^*)
ただ、この書籍はハードに詳しい人が書いたものらしく、ソフト屋の僕には説明足らずの部分が多く、つくり始めるきっかけにはいいですが、これだけでは中途半端な感じがします。
なかなか理解できない事が多いのですが、今後の為に整理しておくことにしました。
このボードでスイッチ状態入力に使えるのは
GPIO17(SW3) , GPIO18(SW4) , GPIO27(SW1) ※SW1はPIC経由
LED出力に使えるのは
GPIO2(青) , GPIO3(緑) , GPIO4(赤)
です
#GPIOライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep
同じようにモジュールを読み込んでいるのになぜか書式が全然違うのはなぜ?
#GPIO初期化
GPIO.setmode(GPIO.BCM) #GPIO番号指定の場合
#GPIO.setmode(GPIO.BOARD) #ピン番号指定の場合
#GPIOの不要なワーニングを出さないようにする
GPIO.setwarnings(False)
#GPIO2 ポートを出力モードとして設定する
GPIO.setup (2,GPIO.OUT,initial =GPIO.LOW) #初期状態LOW
#GPIO.setup (2,GPIO.OUT,initial =GPIO.HIGH) #初期状態HIGH
#GPIO17 ポートを入力モードとして設定する
GPIO.setup (17,GPIO.IN,pull_up_down=GPIO.PUD_UP) #プルアップ抵抗ON
#GPIO.setup (17,GPIO.IN,pull_up_down=GPIO.PUD_DOWN) #プルダウン抵抗ON
#GPIOリセット終了
GPIO.cleanup()
次はちゃんとLEDを付けたり、スイッチ状態を読み取ったりしてみます。
Raspberry Pi3のBluetoothで音が出せる?
PiRaspberry3は標準で 無線LAN、有線LAN、Bluetooth機能が実装されており何も買い足さなくてもいろんなものに接続して使用できそう!
今まで無線LAN、有線LANは使ってみて利用できることを確認できていますが、Bluetoothに関してはまだ接続テストしてみてませんでした。
幸いアイフォンに使っているBluetoothのヘッドセットがあるので試してみることにしました。
ペアリングは簡単にできたのですが、標準ではAudioデバイスには対応していないのか接続しようとするとエラーになります。
ネットでググるとBluetoothを置き換えるようなことが書いてありました。
sudo apt update
//Bluetoothマネージャーアプリ
sudo apt install pi-bluetooth blueman -y
//pulseaudio ... サウンドサーバ
//pavucontrol ... PulseAudioの音量などを調整するもの
//pulseaudio-module-bluetooth ... PulseAudioのbluetoothモジュール
sudo apt install pulseaudio pavucontrol pulseaudio-module-bluetooth -y
sudo reboot -y
//Bluetooth設定する前に、pulseaudioを立ち上げておく
pulseaudio -D
//設定
bluetoothctl
[NEW] Controller B8:27:EB:DE:7F:EF raspberrypi [default]
[NEW] Device xx:xx:xx:xx:xx:xx Bose Revolve+ SoundLink
[bluetooth]# power on
Changing power on succeeded
[bluetooth]# agent on
Agent registered
[bluetooth]# pair xx:xx:xx:xx:xx:xx
Attempting to pair with xx:xx:xx:xx:xx:xx
Pairing successful
[bluetooth]# trust xx:xx:xx:xx:xx:xx
Changing xx:xx:xx:xx:xx:xx trust succeeded
[bluetooth]# connect xx:xx:xx:xx:xx:xx
Attempting to connect to xx:xx:xx:xx:xx:xx
Connection successful
[bluetooth]# quit
Agent unregistered
[DEL] Controller B8:27:EB:DE:7F:EF raspberrypi [default]
//テスト
speaker-test -t wav
ここも見て
自分なりの Raspbian の インストール手順(NOOBS)
先日 NOOBS liteを使うと インストールする時にサイトからRaspbian をダウンロードするので最新の版数がインストールされ、インストール後に最新版へのアップデートが不要なのでは?と、期待して試してみたのですが、ダウンロード時間が相当長く、しかもダウンロードされてきたのは NOOBS に同梱されているRaspbian と同じ版数!という残念な結果でした。
そのあと、bluetooth のヘッドフォンにつなげようと試行錯誤した結果、つなげることはできずに、なおかつシステムが不安定になったので再インストールすることにしました。前回の反省を元に NOOBS を使って(笑)
* 2018 /01/31版 *
01.microSDカードの初期化
取得ファイル:SD_CardFormatter0500SetupJP.exe
WindowsPCにフォーマッターをインストールし、microSDカードをフォーマットする。
「クイックフォーマット」でも「上書きフォーマット」でもどちらでも可能。
「クイックフォーマット」ならエントリテーブルだけを初期化するだけなので数秒で終わりますが、「上書きフォーマット」は全エリアを初期化するので数分かかります。
02.インストーラ NOOBS の準備
公式サイトから NOOBS をダウンロードします。
https://www.raspberrypi.org/downloads/noobs/
NOOBS Lite は、Raspbian が同梱されておらず、インストール時にネットからRaspbianをインストールしますが、NOOBS には Raspbian が同梱されているのでインストールが早いです。ハズです(笑)
NOOBS
取得ファイル:NOOBS_v2_4_5.zip
展開して出てきた全てのファイルを microSD カードにそのまま格納します。
NOOBS_v2_4_5.zipを右クリックして出てくるメニューから「すべて展開(T)」を選択します。
microSDカードがEドライブに割りついている場合の例:
展開後のファイル一覧
03.sshの許可設定
Raspbian は デフォルトでは ssh 通信は許容されていないので、利用するためにはインストール後にssh通信を設定で開放する必要があります。GUI操作で簡単に設定できるのですが、インストール前に特殊ファイルを作成しておけばインストール直後から ssh 接続が開放される仕組みになっています。ほほう。
特殊ファイルといっても普通の単純ファイルで、 ssh というファイル名にするだけです(笑)。
中身は不要なのでどうやってファイルを生成してもいいのですが、エディタを使うまでもないので、リダイレクトで作成してみました。
・コマンド画面を開きます。
・exit > ssh コマンドを実行し 「ssh」ファイルを作成します。
ssh ファイルができました。
04.電源投入
microSDカードと、起動に必要なケーブルを差します。
・microSDカード
・usb キーボード
・usb マウス
・HDMI ディスプレイケーブル
・電源供給用miniUSBケーブル
NOOBS には Raspbian と LibreELEC_RPi2 が含まれているため、LANをつながなくても電源を投入して起動するだけで Raspbian か LibreELEC_RPi2を選択する画面が表示され、そのままインストールできます。
ですが、せっかくなのでとりあえずWi-Fi設定を行います。
「Wifi networks(w)」をクリックします。
受信できているアクセスポイントのSSID一覧から接続するアクセスポイント選択します。
接続するアクセスポイントへのパスワードを入力します。
ここで設定したアクセスポイント情報は、これからインストールする Raspbian に引き継がれます。
05.インストーラ NOOBS の 日本語設定
電源投入時は English(UK) ですので、下部のメニュから「日本語」を選択します。
日本語化するとリボン内のメニューが一部日本語化されました。
06.Raspbian の インストール
Raspbian[RECOMMENDED]にチェックを設定インストールボタンをクリックします。
SDカード上書きメッセージが出ますが、「はい」をクリックします。
インストールが始まるまで少し待ちます。
インストールが始まります
インストールが完了すると以下のダイアログが出ます。「OK」をクリックすると再起動が行われます。
再起動直後、SSHが開放されている為、確認画面が出ます。
これはsshファイルを作成しておいた事によるものなので「OK」をクリックします
cat/etc
インストール直後の版数を確認してみると 9.1でした。
cat /etc/debian_version
07.OS アップデート
インストール前にネットワーク接続していれば、インストール後も引き継がれています。そのまま以下のコマンドでサイトからアップデートができます。
sudo apt update
取得:1 http://archive.raspberrypi.org/debian stretch InRelease [25.3 kB]
取得:2 http://mirrordirector.raspbian.org/raspbian stretch InRelease [15.0 kB]
取得:3 http://mirrordirector.raspbian.org/raspbian stretch/main armhf Packages [11.7 MB]
取得:4 http://archive.raspberrypi.org/debian stretch/main armhf Packages [127 kB]
取得:5 http://mirrordirector.raspbian.org/raspbian stretch/contrib armhf Packages [56.8 kB]
取得:6 http://mirrordirector.raspbian.org/raspbian stretch/non-free armhf Packages [95.2 kB]
12.0 MB を 44秒 で取得しました (269 kB/s)
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
アップグレードできるパッケージが 54 個あります。表示するには 'apt list --upgradable' を実行してください。
pi@raspberrypi:~ $
sudo apt upgrade -y
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
アップグレードパッケージを検出しています... 完了
以下のパッケージが新たにインストールされます:
libexiv2-14 wolframscript
以下のパッケージはアップグレードされます:
base-files bind9-host bluez-firmware curl dbus dbus-user-session dbus-x11
erlang-base erlang-crypto erlang-syntax-tools gir1.2-gdkpixbuf-2.0
:
:
cat /etc/debian_version
sudo shutdown -r now
08.日本語入力メソッドのインストール
sudo apt install fcitx-mozc -y
im-config -n fcitx
sudo shutdown -r now
09.日本語フォントのインストール
sudo apt install fonts-vlgothic
10.固定IPアドレス設定
DHCPでダイナミックにアドレス取得していても困りはしませんが、サーバなので固定している方が安心です。Wi-Fiも固定Lanもスタティックアドレス方式に変更します。
sudo vi /etc/dhcpcd.conf
dhcpcd.conf には wlan0 も eth0 の定義もないので、最終行の下に新たに定義を追加します。
:
:
# fallback to static profile on eth0
#interface eth0
#fallback static_eth0
interface wlan0
static ip_address=192.168.0.20/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1
interface eth0
static ip_address=192.168.1.20/24
以下のコマンドでdhcpdを再起動して設定を反映させる、という事が書かれている記事を見てやってみたけですが、
dhcpdの再起動の場合(これはダメ)
sudo /etc/init.d/dhcpcd restart
ifconfig で確認すると、eth0 のアドレスは変わったが、wlan0 の方のアドレスは変わらずそのままでした。結局、Raspbianの再起動をする事でアドレスが割り振りされなおしました。
Raspbianの再起動をする場合
sudo shutdown -r now
11.Raspberry Pi の設定
インストール後の初期設定をします。
「システム」タブの「オーバースキャン」を有効から無効に変更する。
「システム」タブの「パスワードを変更」をクリックする。
pi アカウントのパスワードを指定します。
インターフェースタブでSSHのみ有効であることを確認します。
パフォーマンスタブでオーバークロックが利用できないことを確認します。
ローカライゼーションタブでロケールを設定します
言語:ja(Japanese)
国:JP(Japan)
文字セット:UTF-8
であることを確認します。違う場合は修正します。
ローカライゼーションタブでタイムゾーンの設定を変更します
地域を Etc から Asia に変更します。
位置を UTC から Tokyo に変更します。
ローカライゼーションタブでキーボードの設定を変更します
初期設定では、Country:日本、Variant:日本語(PC-98xxシリーズ)になっています。
Country:日本、Variant:日本語(OADG109A)に変更しOKをクリックします。
ローカライゼーションタブで無線LANの国設定を変更します
AD Andorra が設定されているので、JP Japanに設定しなおします。
OKをクリックします。
設定が終わったらOKボタンをクリックします。
再起動の確認を要求されるので、「はい(Y)」をクリックします。
12.デスクトップの設定
デスクトップの何もないところで右クリックしてデスクトップの設定をクリックする
Desktop Layout を Fill screen with image から No image に変更する
Desktop Colour を クリックし
Red:214 Green:211 Blue:222
から
Red:0 Green:0 Blue:0
に変更する
Desktop Text Colour はそのままにしておく
Menu Bar は変更しません
System は変更しません
13.リモートデスクトップ化
sudo apt install xrdp -y
sudo apt install vnc4server -y
14.リモートデスクトップキーボードの日本語化
cd /etc/xrdp
sudo wget http://w.vmeta.jp/temp/km-0411.ini
sudo chown root:root km-0411.ini
sudo ln -s km-0411.ini km-e0200411.ini
sudo ln -s km-0411.ini km-e0010411.ini
sudo service xrdp restart
15.root パスワードの設定
sudo passwd root
新しい UNIX パスワードを入力してください:
新しい UNIX パスワードを再入力してください:
passwd: パスワードは正しく更新されました
電子機器の制御 Lチカってなんや?
電子機器制御の初心者は「Lチカ」から(*^-^*)
勿論LEDの点滅ですが、LEDを付けるために Pythonを使ってGPIO のポートに電圧をかけたり止めたりするというもの。
利用宣言
import wiringpi as pi
import time
GPIO23を出力として使用
LED_PIN = 23
pi.wiringPiSetupGpio()
pi.pinMode( LED_PIN, pi.OUTPUT )
1秒単位でLOWとHIGHを永遠に繰り返す
while True:
pi.digitalWrite( LED_PIN, pi.LOW )
time.sleep( 1 )
pi.digitalWrite( LED_PIN, pi.HIGH )
time.sleep( 1 )
意外とコンパクト。
勿論ガイド本がないとなにもできませんけどね。
Python とは?
RaspberryPi3 に Raspbian をインストール してあの小型筐体で Linux風な動作は確認できたし、標準でインストールされている Chromium ブラウザも良くできているので Youtube のサイトを覗くと動画もちゃんと見れました。
HDMI接続にしたのでディスプレイ側からは音もちゃんと鳴りました。これはもう普通にパソコンです。あ、MSWindowsじゃないですけどね。
もともとRaspberryPi3を始めたきっかけは子供がミニ四駆の速度制御を小形の組み込みマイコンを使ってやってみたいと言い出したのがきっかけです。小型組み込みパソコンってどんなん?どんなことが出来るん?話相手になるために、僕も小型組み込みパソコンを知らなきゃって感じで始めてます。
なので電子制御がメインなんですよね(笑)
というわけでやっと Python で電子制御を!
参考にしている本は「RaspbrryPi電子工作実践講座」福田和宏 ソーテック社 です。
こんな感じにしてみました。
LED光ります!
import wiringpi as pi
import time
INPUT_PIN = 24
OUTPUT_PIN = 23
pi.wiringPiSetupGpio()
pi.pinMode( INPUT_PIN, pi.INPUT )
pi.pinMode( OUTPUT_PIN, pi.OUTPUT )
/* GPIO23のON,OFF */
pi.digitalWrite( OUTPUT_PIN, pi.HIGH)
time.sleep(1)
pi.digitalWrite( OUTPUT_PIN, pi.LOW)
time.sleep(1)
/* GPIO24の読み出し */
value = pi.digitalRead( INPUT_PIN )
if ( value == pi.HIGH ):
print("High")
print( value )
else:
print("Low")
print( value )
/* PWMモードを使った疑似アナログ出力 */
/* GPIO24を0~100の中間的な50でON */
pi.softPwmCreate( OUTPUT_PIN, 0, 100)
pi.softPwmWrite( OUTPUT_PIN, 50 )