Python & Raspberry Pi 開発ブログ ☆彡

Raspberry Pi 3の使い方、設定をわかりやすく解説。Raspberry Pi3 Model B(Element14版)、Raspbianを使用して開発中。

【スポンサーリンク】

割り込み:コールバック関数(Python)の使い方

【スポンサーリンク】

今回はRaspberry Piで割り込み(コールバック関数)を使う方法を紹介します。Raspberry PiにはGPIOピンの立ち上がり、立ち下がりエッジを検出した時に、指定の関数(コールバック関数)を呼び出すしくみがあります。これにより、割り込みと同じようにイベント待ちで処理が実行できるようになります。それでは、Pythonコードの記載方法を紹介したいと思います。

割り込み(コールバック関数)の実装方法

import RPi.GPIO as GPIO
import time 

class CallBack:

    def __init__(self):
        pin = 4
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(pin, GPIO.IN, GPIO.PUD_UP) # 4番pinを入力、プルアップに設定

        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番号やエッジ、バウンスタイムを、GPIO.add_event_callbackでコールバック関数名を登録します。それぞれの引数の意味は以下のようになります。

・pin ⇒ GPIO4番ピン
・GPIO.FALLING ⇒ 立下りエッジのイベントが発生した時
・bouncetime = 1000 ⇒ 割り込み検知後、1000msは割り込みをマスクする(割り込みを検知しないようにする) 
※スイッチのON、OFFでチャタリングが発生する時に、マスク時間を設定し、何度も割り込みが発生することを防ぐことができます。

動作確認

それでは、コールバック関数が呼ばれるか確認してみましょう。GPIO4番ピンに立下りエッジ(High→Low)を入力すると、my_callback_oneとmy_callback_two関数が呼ばれ、"Callback one”と"Callback two”がコンソールに表示されます。
(このコールバック関数はスレッドで実行されます。)

設定できるイベント

設定できるイベントは以下のようになります。

・GPIO.FALLING → 立ち下がりエッジ
・GPIO.RISING → 立ち上エッジ
・GPIO.BOTH → 両エッジ

そもそもコールバック関数とは?

コールバック関数とは、関数ポインタを使用して、呼び出される関数のことを言います。C言語をバリバリやっていた人でないとイメージできないと思います。割り込みのイベントが発生した時に、呼ばれる関数くらいに覚えておけばよいでしょう。

少し長くなりましたが、これでイベント待ちで処理を実行することができるようになりました。便利ですね。

 

ラズパイ ハードウェアに戻る
トップページに戻る