
トグルスイッチでのLEDの点灯を制御したいのですが、
下記のようなソースで割り込みの箇所
pi.wiringPiISRの関数で、トグルスイッチを押すとプログラムが終了してしまいます。
本来は、無限ループなので、プログラムが終了することはないのですが。
原因が、わかりません。
import time, wiringpi as pi led_pin = 23 bt_pin = 17 counter = 0 pi.wiringPiSetupGpio() pi.pinMode( bt_pin, 0 ) pi.pullUpDnControl( bt_pin, 2) pi.pinMode( led_pin, 1 ) def Warikomi(): global counter if ( pi.digitalRead( bt_pin ) == 0 ): counter = counter + 1 try: ret = pi.wiringPiISR( bt_pin, pi.INT_EDGE_BOTH , Warikomi ) while True: if ( counter % 2 == 0 ): pi.digitalWrite( led_pin, 1 ) time.sleep(0.5) pi.digitalWrite( led_pin, 0 ) time.sleep(0.1) except KeyboardInterrupt: pi.pinMode( led_pin, 0 ) finally : pi.pinMode( led_pin, 0 )
動作としては、プログラムが開始すると、LEDが点滅します。
ボタンを押して、LEDの点滅を止めようとすると、プログラムが終了(正常終了?異常終了?)してしまいます。
下記は、その時の結果(添付画像が何故かさかさまになります。すみません。)
問題を単純化してみたのが次のコードです。
wiringpi
1 2global counter 3bt_pin = 17 4counter = 0 5 6pi.wiringPiSetupGpio() 7 8def Warikomi(): 9 print( "割り込み関数通過" ) 10 11try: 12 ret = pi.wiringPiISR( bt_pin, pi.INT_EDGE_RISING , Warikomi ) 13 while True: 14 time.sleep(0.5) 15 counter = counter + 1 16 print( counter ) 17 time.sleep(0.5) 18except KeyboardInterrupt: 19 print ("except通過" ) 20finally : 21 print ("finally通過" ) 22
このプログラムが開始すると、ディスプレイに1ずつカウントアップされ、
ボタンが押されたときにプログラムが終了(正常終了?異常終了?)してしまいます。
finally句は通りません。Warikomi関数も実行されません。

try:を外すとエラーの起きる箇所で止まってしかも「エラー:何行目の関数○○で××が起きました」と出そうなのですが、こちら試されましたか?
ご意見ありがとうございます。try句を外しても、同様の結果になってしまいます。エラーメッセージなどは出ず、単純にプログラムが終了してしまいます。
ちなみに、while True:の文節をpi.wiringPiISRの関数とtime.sleepにしても同様です。なので、wiringPiISRの関数の動きがネットで見る情報と違うような気がします
念のために確認です。プログラム開始するとLEDは点滅するが、スイッチ押したとたんにプログラム終了するということでしょうか?
はい。その通りです。LEDは点灯しっぱなしの状態(100%この状態です。)でプログラムが終了します。詳しい現象を書いていないのでわかりづらいですよね。
すなわちexcept,finally内に処理がいっていない可能性が高いですね。左記の場所にprint文を入れて何らか出力されるか確認ください(本来は出力されるはず)。
ご意見ありがとうございます。そうなのです。print文が入っているのですが、finally句を通らないのです。添付画像がさかさまで見づらいと思いますが、finally句にwiringPiISR関数の戻り値retを出力しているのですが、printされません。
もう少し、情報を付け加えますと、キーボードからの割り込み終了(Ctrl+c)をすると、except KeyboardInterruptを通り(当たり前ですよね)、finally句を通って、関数の戻り値が返ってきます(「None」と返ってきました)
やはり通っていませんね。了解です。ちょっと勘なので回答ではなくこちらに記載しますがWarikomi関数の「if ( pi.digitalRead( bt_pin ) == 0 ):」行を取り除いてみてください。
キーボード割り込みは正常に動作しているということですね。やはり割り込み処理部分が怪しそうですね。
ご意見ありがとうございます。「if ( pi.digitalRead( bt_pin ) == 0 ):」行を取り除いてみましたが、同様の結果でした。
確認ありがとうございます。割り込み中にdigitalReadしてよいものか疑問だったので。調べてみて何か分かれば回答できればと思います。
ラズパイの種類、OSやWiringPlのバージョンなども記載していただけますでしょうか?
ラズパイですが、zero wです。OSは、Raspbianです。WiringPlは、2.44.4です。よろしくお願いします。

WiringPlとWiringPl2があるんですね。紛らわしいですが違いがよくわからず。importでWiringPl(最終更新2017-08)の人とWiringPl2(最終更新2016-03)の人が居ました。 https://pypi.python.org/pypi?%3Aaction=search&term=wiringpi&submit=search
Package Ownerの違いでバージョンへの追従具合が違うだけに見えますね。実際どうなんだろ?
なるほど。勉強になります。slashさんのリンクしているサイトからwiringPi.cを確認しているのですが、(Raspbianの中のwiringPi.cが現在、探せていません。)正直、怪しいところにprintfを入れて確認したいのですが、それをコンパイルする方法(技量がない)がわからないので、(本題からそれてる気がします)調査中です。

回答6件
あなたの回答
tips
プレビュー