今回学ぶこと
今回はタクトスイッチを使ってLEDの点灯をコントロールするプログラムを実行します。タクトスイッチを使ってLEDのON-OFFというとRaspberry Piを使わなくてもできてしまいますが、マイコンを使うと様々な制御に繋がります。例えば、
- スイッチを押したときにLEDが点灯して、離すと消灯する。
- LEDは常に点灯していて、スイッチを押すとLEDが消灯する。
- タクトスイッチを1回押すとLEDが点灯し、もう一回押すと消灯する。
など、プログラムでその動きをいろいろコントロールできるようになるわけです。
スイッチを使う場合、良く出てくるのが「プルアップ/プルダウン抵抗」です。今回はこの取り扱いについても学びます。
使用する部品
- Raspberry Pi 3 Model B × 1
- 電源アダプター5V 2.5A × 1
- ブレットボード × 1
- LED × 1
- タクトスイッチ×1
- 抵抗 220Ω × 1
- ジャンプワイヤー(オス/オス) × 4
※これらの部品はFabshopがふるさと納税で提供している「ふるさと納税Raspberry Piスターターキット」もしくは当サイトで購入可能な「Raspberry Pi スターターキット」の電子工作キットに同梱されています。
実体配線図
配線はLEDの点滅させる場合と同様なもので、その配線図にさらにタクトスイッチが付いたものになります。
タクトスイッチは図のような回路図になっていて、4つ足が出ていて、2つの回路のON-OFFを同時にできるようになっています。
プルアップ・プルダウン抵抗
スイッチなどを使う時には通常プルアップ/プルダウン抵抗を使います。スイッチは回路図のようにONになってないときには回路がきれてしまいます。この状態ですと同線の微小な抵抗値が影響してスイッチがONなのかOFFなのか正しく判定できなくなってしまいます。そのため、ONならHIGH、OFFならLOWと明確に電圧の差を作るためにこの抵抗を用います。
今回の回路にはプルアップ・プルダウン抵抗を直接回路では作りませんが、RPi.GPIOにはこれらを疑似的に実現するライブラリが用意されているので、setup関数の中でそれを使います。
今回の場合、スイッチがOFFの時には3.3Vがかかった状態にしておきたいの「プルアップ抵抗」をセットする設定にします。
プログラムのコピーと保存
ラズベリーパイメニューから「プログラミング」→「Geany」を開きます。
メニューバーから「ファイル」→「新規」をクリックします。
【Lesson1】のときと同じように、この下にある「Controlling an LED with a buttonのプログラム」の枠右上に並んだアイコンの内、右から2番目のアイコンをクリックします。(マウスをアイコンに近づけると”Copy”の表示が現れます)
すると、プログラムの文字列が全て選択されるので、「Ctrl」と「C」キーを同時に押してコピーします。
import RPi.GPIO as GPIO LedPin = 11 BtnPin = 12 def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(LedPin, GPIO.OUT) GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.output(LedPin, GPIO.HIGH) def loop(): while True: if GPIO.input(BtnPin) == GPIO.LOW: print ('...led on') GPIO.output(LedPin, GPIO.LOW) else: print ('led off...') GPIO.output(LedPin, GPIO.HIGH) def destroy(): GPIO.output(LedPin, GPIO.HIGH) GPIO.cleanup() if __name__ == '__main__': setup() try: loop() except KeyboardInterrupt: destroy()
プログラムの解説
いままでは1つのポートだけをコントロールしていましたが、今回はLEDとタクトスイッチがつながるので2つのポートをコントロールします。
def setup() は各種設定を行う関数を定義しているところですが、この中の3つ目に GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP という記述があります。ここが前述した「プルアップ抵抗を設定しておく」という部分です。
実際の配線の時はGPIOから直接タクトスイッチに入っているだけなので、プルアップ抵抗がないため、プログラム上でプルアップ抵抗を設定しておきます。こうすることでボタンが押されていないときには3.3Vがかかっていることになります。
def loop()のWhile Trueの中で、if GPIO.input(BtnPin) == GPIO.LOW; となっています。ボタンを押していないときはBtnPinは3.3VでHighになっているので、else以降が当てはまることになり、led off… と表示され、LedPin には3.3Vがかかっている状態になります。
LedPinのアノード側にも3.3Vがかかっているため、同じ電圧なのでLEDは光りません。
タクトスイッチを押したときにはBtnPinはGNDに流れ電圧が0Vになります。こうなるとloop()関数のif文と合致するため、LedがONになり、LedPinのカソード側がLOWを出すため、3.3Vと0Vと電位差ができて電気が流れるためLEDが点灯します。
新たに開いたタブ「untitled×」の1行目にマウスカーソルを置いて右クリックして出てくるメニューから「貼り付け」を選択します。
Geanyのメニューバーから「ファイル」→「別名で保存」をクリックします。
新たに「ファイルを保存」画面が現れるので、左ペインの「デスクトップ」をクリックします。
「ファイルを保存」画面の1番上の項目「名前:」の入力欄に拡張子”.py”でプログラム名を入力し、「保存」ボタンをクリックします。
プログラムの実行
Geanyの画面に戻って、ツールバーの紙飛行機のようなアイコンをクリックします。
新たに「ターミナル」画面が開き、スイッチを押す前は”led off…”が縦に並んで表示されていますが、スイッチを押すと”…led on”の表示に変わってLEDが点灯し、スイッチを離すと表示が”led off…”に戻ってLEDが消えます。「Ctrl」と「C」キーを同時に押すとプログラムが停止します。