Raspberry Pi3 GPIO 入力2

Raspberry Pi3 で GPIO ポートからの入力実験その2

「PICと楽しむRaspberryPi活用ガイドブック」の汎用GPIOテストボードを使ってGPIO17、GPIO18に接続されているスイッチが押されたときに割り込みが発生するように登録する
複数のGPIOポートに同じ割り込み処理を登録することも可能で割り込み処理の中でGPIO番号を確認し処理を切り分ける。

 

File:gpioin17-2.py

#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep

#初期化
GPIO.setmode(GPIO.BCM) #GPIO番号指定
GPIO.setwarnings(False)

#GPIO17(SW3)、18(SW4)、27(SW1)を入力モードとして設定
GPIO.setup (17,GPIO.IN,pull_up_down=GPIO.PUD_UP) #SW3
GPIO.setup (18,GPIO.IN,pull_up_down=GPIO.PUD_UP) #SW4
GPIO.setup (27,GPIO.IN,pull_up_down=GPIO.PUD_UP) #SW1

#割り込みで受け取る関数定義
def myFunc1(channel):
if (channel == 17) :
    #出力状態変更
    print ( 'SW3:GPIO17 RISING' )
    sleep (1)

if (channel == 18) :
    #出力状態変更
    print ( 'SW4:GPIO18 RISING' )
    sleep (1)
if (channel == 27) :
    #出力状態変更
    print ( 'SW1:GPIO27 RISING' )
    sleep (1)


def myFunc2(channel):
if (channel == 17) :
    #出力状態変更
    print ( 'SW3:GPIO17 FALLING' )
    sleep (1)

if (channel == 18) :
    #出力状態変更
    print ( 'SW4:GPIO18 FALLING' )
    sleep (1)
if (channel == 27) :
    #出力状態変更
    print ( 'SW1:GPIO27 FALLING' )
    sleep (1)

 


#変化を割り込みで受け取る関数登録
#GPIO.RISINGは立ち上がり、GPIO.FALLINGは立ち下り GPIO.BOTHは両方
#押したときに立ち上がるのか立ち下がるのかは回路による(^^)
#一つのポートの RISINGは立ち上がり、FALLINGは立ち下りを両方登録する
# ことはできない(エラーになる)
#bouncetime はチャタリング回避のタイマ msec 単位
#GPIO.add_event_detect ( 17 , GPIO.RISING , callback = myFunc1 , bouncetime = 300)
#GPIO.add_event_detect ( 18 , GPIO.RISING , callback = myFunc1 , bouncetime = 300)
#GPIO.add_event_detect ( 27 , GPIO.RISING , callback = myFunc1 , bouncetime = 300)
GPIO.add_event_detect ( 17 , GPIO.FALLING , callback = myFunc2 , bouncetime = 300)
GPIO.add_event_detect ( 18 , GPIO.FALLING , callback = myFunc2 , bouncetime = 300)
GPIO.add_event_detect ( 27 , GPIO.FALLING , callback = myFunc2 , bouncetime = 300)

#コントロールCが押されるまでループ
try:
    while True:
        print ( 'wait' )
        sleep (1)

#例外
except KeyboardInterrupt:
    print ( 'CTRL + C' )
    pass

#変化を割り込みで受け取る関数定義解除
GPIO.remove_event_detect ( 17 )
GPIO.remove_event_detect ( 18 )
GPIO.remove_event_detect ( 27 )

#GPIOのリセット終了
GPIO.cleanup()