前回は単にスイッチの入力を検出し、そのまま終了するプログラムを書きました。
今回はスイッチの入力をコールバックで受け取るバージョンを試してみました。
回路
回路は前回から変わってません。

18ピンのGPIO24を入力ピンに使用します。
内蔵プルアップをかけておき、SW1を押すとLOWとなります。
8ピンのGPIO14は出力ピンに設定し、LEDを点灯します。
プログラム(Python)
動作としては、スイッチを押す度にLEDの点灯・消灯を繰り返すものとします。
今回はコールバックを使用しました。
コールバック関数とは、GPIOピンに何らかの変化・イベントが発生したときに、システムによって自動的に呼ばれる関数です。これを使用することで、メイン関数でループを作ってピンの設定を調べる等の記述をしなくて済むようになります。イベント駆動型の言語のイベント処理関数と同じです。
プログラム全体の流れ
- コールバックで使用する関数を定義する
- GPIOの準備設定をする
- 先に定義した関数をコールバック関数として登録する
- メインループ
import RPi.GPIO as GPIO #GPIO操作用
import time #sleep用
def switch_on(pin): #後述
if GPIO.input(8) == GPIO.HIGH: #後述
GPIO.output(8,GPIO.LOW)
else :
GPIO.output(8,GPIO.HIGH)
GPIO.setmode(GPIO.BOARD) #ピン番号モード
GPIO.setup(8, GPIO.OUT) #8ピンは出力
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP) #18ピンは入力・プルアップ
GPIO.add_event_detect(18, GPIO.FALLING, callback=switch_on, bouncetime=300) #後述
GPIO.output(8,GPIO.LOW) #8ピンをLOWに設定(この行は不要かも)
try: #後述
while True: #メインループ
time.sleep(1)
except KeyboardInterrupt: #後述
GPIO.cleanup()今回新しいのは下記4点です。
後でスイッチ入力検出時のコールバック関数として登録します。
pinには、このプラグラムの場合ピン番号が入ります。setmodeでGPIO.BCMとした場合は恐らくGPIO番号が入るんだと思います。(試してません)
GPIO.output(8,GPIO.LOW)
else :
GPIO.output(8,GPIO.HIGH)
関数switch_onの動作を書いています。
8番ピンの状態を調べてHIGHならLOWに(LEDを消灯)、LOWならHIGHを出力(LEDを点灯)します。
先に書いたswitch_onをここでコールバック関数として登録しています。
最初の18はピン番号で、18ピンに変化が有った時のコールバックとて指定しています。
GPIO.FALLINGはイベントを立ち下がりエッジで検出します。立ち上がりエッジの時はRISINGを指定します。
callback=でコールバック関数名を指定しています。
bouncetime=300は、この後300ミリ秒間はコールバックを発生させない事を指定しています。チャタリング防止用です。
~
except KeyboardInterrupt:
~
tryは例外処理です。今回、メインループは無限ループなので、プログラムを終了させるにはCTRL+C押します。これが例外扱いになりKeyboardInterruptを発生させるようなので、except KeyboardInterrupt:でキャッチしてGPIO.cleanupでピンを開放し、プログラムが終了します。
実機
ブレッドボードで作成した実機も前回と変わりありません。

このプログラムにより、コールバックを使用して、スイッチを押すことによりLEDが点灯/消灯を繰り返すことを確認しました。
