この記事の内容はRaspberry Pi 4と3の両方で動作確認済みです
ブログ管理者のP.Hです!
スイッチを押した時やセンサーが反応したときに、プログラムを実行するには??
そういうときは、割り込みという機能を使えば実現できます。信号を検知したときに、割り込んで処理をしてくれるので、割り込みです。
タイマーで設定した時間とGPIOピン(汎用入出力)の立ち上がり、立ち下がりエッジで割り込み処理をしてくれるwait for edge関数という便利な関数があります。今回はこのwait for edge関数について詳しく説明していきます。
それでは、割り込み(wait for edge関数)の使い方を説明します。
wait for edge関数の使い方
下記がサンプルコードになります。wait for edge関数を使うと、この関数のところでイベントが来るまで、待っていてくれます。タイムアウト設定した時間経過したときと、割り込みが来た時にイベント待ちが解除されます。
import RPi.GPIO as GPIO class CallBack: def __init__(self): # 4番pinを入力、プルアップに設定 self.pin = 4 GPIO.setmode(GPIO.BCM) GPIO.setup(self.pin, GPIO.IN, GPIO.PUD_UP) def callback_test(self): while(True): # 立下りエッジイベント、タイムアウトイベント待ち isr = GPIO.wait_for_edge(self.pin, GPIO.FALLING, timeout=5000, bouncetime=1000) if isr is None: # 5秒間割り込みがないときに実行される print("5秒間割り込みなし") else: # 割り込みがあったときに実行される print("割り込みあり") cb = CallBack() cb.callback_test()
上記のサンプルコードの説明をします。GPIO.wait_for_edgeメゾットで、pin番号、イベント、タイムアウト時間を設定します。引数の意味は以下のようになります。
- pin ⇒ GPIO4番ピン
- GPIO.FALLING ⇒ 立下りエッジのイベントが発生した時
- timeout ⇒ タイムアウト時間の設定
- bouncetime = 1000 ⇒ 割り込み検知後、1000msは割り込みをマスクする(割り込みを検知しないようにする)
タイムアウトで設定した時間内に割り込みがあれば、else内の処理が実行されます。割り込みがなければ、if isr is None内の処理が実行されます。
動作確認
それでは、動作確認をしてみましょう。この例ではタイムアウトが5秒に設定されていますので、割り込みがなければ、5秒間隔で毎回、"5秒間割り込みなし"のメッセージが表示されます。GPIO4番ピンに立下りエッジ(High→Low)を入力すると、即座に"割り込みあり"のメッセージが表示されます。
これで割り込みのイベント待ちで処理が実行できるようになりました。割り込みはcallback関数を使う別の方法があります。割り込み発生時に登録したコールバック関数が実行される、という流れになります。下記記事で紹介していますので、こちらもご覧ください。
Raspberry Piを購入したい方は、下記のセットがお得です。SD Cardが2枚付いてきます。