ラズパイでスイッチを使おう(2)
こんばんは。國松です。
今回は、イベントを利用してスイッチを制御してLEDをOn/Offしていきたいと思います。
用意するもの
・Raspberry Pi 3 Model B+
・ブレッドボード
・330Ωの抵抗×1
・LED×1
・タクトスイッチ×1
・ジャンパワイヤ×4
(ラズパイとの接続)
イベントによるLEDのOn/Off
前回はwhile文でスイッチの状態を監視していましたが今回はRPi.GPIOのイベント機能を使っていきたいと思います。イベントを使えば値が変化したときだけ指定した処理(関数)を実行できます。
イベントを検知する関数
1 2 3 4 5 6 7 8 9 10 11 | add_event_detect( ポート番号, イベントの種類, callback = イベント発生時に実行する関数, bouncetime = ミリ秒で指定 ) |
イベントの種類に指定できる値は以下の3つです。
GPIO.RISING | ポートの値がLOWからHIGHに変化したとき(ポジティブエッジ) |
GPIO.FALLING | ポートの値がHIGHからLOWに変化したとき(ネガティブエッジ) |
GPIO.BOTH | ポートの値が変化したとき |
bouncetimeはチャタリング防止のため指定した時間(ミリ秒)以内には連続でイベントが発生しないようにできます。
参考書籍&サイト
.やさしくはじめるラズベリー・パイ 電子工作でガジェット&簡易ロボットを作ってみよう【クジラ飛行机(著)】
Raspberry PiのGPIOをpythonから利用する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #ライブラリのインポート import RPi.GPIO as GPIO import time #ポート番号の定義 SWITCH = 18 LED = 21 led_value = GPIO.LOW #GPIOの初期化 GPIO.setmode(GPIO.BCM) GPIO.setup(LED,GPIO.OUT) GPIO.setup(SWITCH,GPIO.IN, pull_up_down = GPIO.PUD_DOWN) #ラズパイの内部抵抗(プルダウン)を利用 #swith切り替えイベントの定義 def switch_change_callback(ch): global led_value if ch != SWITCH: return if led_value == GPIO.LOW: GPIO.output(LED,GPIO.HIGH) led_value = GPIO.HIGH else: GPIO.output(LED, GPIO.LOW) led_value = GPIO.LOW #イベントの設定 GPIO.add_event_detect( SWITCH, GPIO.RISING, callback=switch_change_callback, bouncetime= 200) #LEDの消灯 GPIO.output(LED, GPIO.LOW) try: while True: time.sleep(0.1) except KeyboardInterrupt: GPIO.cleanup() try: while True: GPIO.output(LED,GPIO.LOW) time.sleep(0.1) except KeyboardInterrupt: GPIO.cleanup() |
スイッチが押されるとLEDが点灯してもう一度押されるとLEDが消灯します。ラズパイの内部抵抗を利用しているのでスイッチに抵抗はなくても大丈夫です。
LEDを点灯させるのにスイッチを押し続ける仕事から解放されました。