この記事の内容はRaspberry Pi 4と3の両方で動作確認済みです
ブログ管理者のP.Hです!
スイッチを押した時やセンサーが反応したときに、プログラムを実行するには??
そういうときは、割り込みという機能を使えば実現できます。信号を検知したときに、割り込んで処理をしてくれるので、割り込みです。
Raspberry PiにはGPIOピンの立ち上がり、立ち下がりエッジを検知した時に、指定の関数(コールバック関数)を呼び出すしくみがあります。今回はそのコールバック関数の使い方を紹介したいと思います。
それでは、割り込み(callback関数)の使い方を説明します。
割り込み(コールバック関数)の実装方法
下記がサンプルコードになります。まず、ざっとコードに目を通してみてください。コメントも記載していますので、イメージがつかめると思います。
import RPi.GPIO as GPIO import time class CallBack: def __init__(self): # 4番pinを入力、プルアップに設定 pin = 4 GPIO.setmode(GPIO.BCM) GPIO.setup(pin, GPIO.IN, GPIO.PUD_UP) # 割り込みイベント設定 GPIO.add_event_detect(pin, GPIO.RISING, bouncetime=1000) # コールバック関数登録 GPIO.add_event_callback(pin, self.my_callback_one) GPIO.add_event_callback(pin, self.my_callback_two) def my_callback_one(self, channel): print('Callback one') def my_callback_two(self, channel): print('Callback two') def callback_test(self): while True: time.sleep(1) cb = CallBack() cb.callback_test() # 割り込みイベント待ち
上記のコードについて詳しく説明をしていきます。
GPIO.add_event_detectメゾットで、割り込みを検知するpin番号、エッジ、バウンスタイムを設定します。引数の意味は以下のようになります。
- pin ⇒ GPIO4番ピン
- GPIO.FALLING ⇒ 立下りエッジのイベントが発生した時
- bouncetime = 1000 ⇒ 割り込み検知後、1000msは割り込みをマスクする(割り込みを検知しないようにする)
※スイッチのON、OFFでチャタリングが発生する時に、マスク時間を設定し、何度も割り込みが発生することを防ぐことができます。
PIO.add_event_callbackでコールバック関数名を登録します。引数の意味は以下のようになります。
- pin ⇒ GPIO4番ピン
- self.my_callback_on, self.my_callback_two ⇒ 割り込み検知後に実行される関数名
動作確認
それでは、コールバック関数が呼ばれるか確認してみましょう。GPIO4番ピンに立下りエッジ(High→Low)を入力すると、my_callback_oneとmy_callback_two関数が呼ばれ、"Callback one”と"Callback two”がコンソールに表示されます。 (このコールバック関数はスレッドで実行されます。)
設定できるイベント
設定できるイベントは以下のようになります。
- GPIO.FALLING → 立ち下がりエッジ
- GPIO.RISING → 立ち上エッジ
- GPIO.BOTH → 両エッジ
そもそもコールバック関数とは?
コールバック関数とは、関数ポインタを使用して、呼び出される関数のことを言います。C言語をバリバリやっていた人でないとイメージできないと思います。割り込みのイベントが発生した時に、呼ばれる関数くらいに覚えておけばよいでしょう。
これで割り込みが使えるようになりました。便利ですね。今回、callback関数の使い方を紹介しましたが、wait for edge関数を使う方法もあります。割り込みのイベント待ち ⇒ 割り込み発生 ⇒ 処理を実行という流れで処理ができ、イベント待ちに慣れている人はこちらの方が使いやすいかもしれません。下記ブログで紹介していますので、こちらもご覧ください。
Raspberry Piを購入したい方は、下記のセットがお得です。SD Cardが2枚付いてきます。