まずは、ラズパイでGPIOの基本的な使い方を確認していきます。
↓のような回路を作って、CDSで明るさを検出し、LEDを制御します。
回路図用パーツを作る
ここで、回路図は水魚堂のエディタhttp://www.suigyodo.com/online/schsoft.htmを使っていますが、ラズパイの回路図部品がないので作成しました。部品の作成はLcoV.exeというエディタで作成します。「回路図エディタBSch3V」 をダウンロードすると一緒に入っているはずです。
これを立ち上げて、”編集¥部品の新規作成”とクリックします。
ここで名前を「RASPBERRYPI」とつけます。
サイズを設定してOKで枠がつくられます。
"ピン"のアイコンまたは、"ツール¥ピン"を選択し、ピンを配置していきます。
ピンを必要数配置したら、”表示¥ピン編集ウィンドウ”でGPIO名やピン番号を設定して、保存します。
これで部品は完成です。
次に、回路図エディタBSch3Vで、”設定¥ライブラリ¥add” でさきほど作成したライブラリを読み込みます。
これで、部品にラズパイが追加され、ラズパイを含む回路図が作成できます。
部品ファイルは↓にアップしておきました。よかったらご自由にご活用ください。
github.com
ターミナルでGPIOの状態を確認する
現在のGPIOの状態は、ターミナルからGPIO Readallコマンドで確認することができます。ちょっと、最初はわかりにくいですが以下のように一覧で、ピン配置と同じように、段組みで表示されます。
前回調べた通り、10番Pin(physical)はGPIOの15(BCM)でINPUT MODEになっていることが確認できます。
WiringPiでは16番になるようです。
pi@raspberrypi:~ $ gpio readall +-----+-----+---------+------+---+-Pi ZeroW-+---+------+---------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | | | 3.3v | | | 1 || 2 | | | 5v | | | | 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | | | 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | | | 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 0 | IN | TxD | 15 | 14 | | | | 0v | | | 9 || 10 | 0 | IN | RxD | 16 | 15 | | 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 | | 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | | | 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 | | | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 | | 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | | | 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 | | 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 | | | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 | | 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 | | 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | | | 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 | | 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | | | 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 | | 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 | | | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+---------+------+---+-Pi ZeroW-+---+------+---------+-----+-----+
トランジスタの状態
ここで、CDSを手で覆う用にして「暗い」状態にすると、10番ピンがHIGHになります。事前にCDSの抵抗を調べてあって、暗いときは10kΩ、明るいときは1kΩぐらいになっています。
3.3VをCDS、抵抗(ここでは1kΩ)に接続し、CDSと抵抗の分圧された位置からNPNトランジスタのBaseに接続しています。
明るいとき、CDSの抵抗が低くなり、BaseはHighになり、E-Cはつながり、10番がLowになります(GNDと10番がつながるため)。
暗いとき、CDSの抵抗が高くなりBaseはLowになり、E-Cは切れて、10番がHigh(プルアップされているため)になります。
CDSと抵抗の間からラズパイのGPIOに直接入力しても、電位水準は変わりますが読み取ることができます。
しかし、GPIOには中途半端な電位を入力するのはあまり良くないらしいので、トランジスタでHigh/Lowを明確にします。
いつも迷う、トランジスタのECB。刻印のある面を見て左から「エクボ」
- 出版社/メーカー: 東芝
- メディア:
- この商品を含むブログを見る
これで、ラズパイでHigh/Lowが読み取れることが確認できました。
WiringPiのインストール
WiringPiはもともとC言語でGPIOを制御するライブラリで、いろんな言語のラッパーが提供されています。ここではpyhton3用のラッパーをインストールします。
Windowsには標準ではインストールされていないので、anaconda pronptからpipインストールします。
$pip install wiringpi
て、やろうとしたが、インストール失敗。
っていうか、Windows PCではどちらにしろGPIOの動作はできないのか…
だが、インストール出来ている例がggrと出てくるので、これはこれで別途調査する必要がある。
ラズパイにはインストール済みのようです。
インストール済みのライブラリは↓で確認できます。
$dpkg -l
入っていなければ、同様にpip3でインストールします。
GPIOの基本のプログラミング
CDSで明るさを検出してLEDを制御するプログラムをpython3で作成しました。# -*- coding: utf-8 -*- import wiringpi import time print("Start WiringPi!") # プルアップ INPUT collector_pin = 15 # 10番pin(GPIO15) # OUTPUT LED_pin =23 #16番pin(GPIO23) # GPIO初期化 wiringpi.wiringPiSetupGpio() # GPIOを入力モード(0)/出力モード(1)に設定 wiringpi.pinMode( collector_pin,0) wiringpi.pinMode( LED_pin,1) wiringpi.digitalWrite(LED_pin,0) while(True): if (wiringpi.digitalRead(collector_pin))==1: print("High") wiringpi.digitalWrite(LED_pin, 1) else: print("Low") wiringpi.digitalWrite(LED_pin, 0) time.sleep(1)
ラズパイのGPIOを操作するライブラリは数種類ありますが、私にとっては"WiringPi"がArduinoと似ていて使いやすそうなのでこれを選びました。
参考資料
日経Linux付属のラズパイマガジンビギナーズ- 作者: 日経Linux編集部
- 出版社/メーカー: 日経BP社
- 発売日: 2017/08/10
- メディア: Kindle版
- この商品を含むブログを見る