Non Debounce on a Pushbutton-No Debounce, No Life.
【gpio】「Debounce on a Pushbutton-デバウンス対応」で、デバウンス対応したボタンスイッチのプログラムを紹介していますが、もしデバウンスを考慮しなければどうなるのか試してみます。
元記事:【gpio】「Debounce on a Pushbutton-デバウンス対応」 - 非公式Rock研究所
https://informal-r-labo.net/posts/gpio006
回路図
回路図は元記事の回路と同じです。
コーディング
~/pyディレクトリに"Non_Debounce_sw.py"のファイル名でプログラムを作成してみます。
(Rock4c+には日本語が入力できないため、カッコ書きのコメント行は入力不要です。)
# (ライブラリのimport)
import mraa
import time
# (SW Pin8を操作対象にして、mr.DIR_OUT_LOWで"LOW"状態に初期化)
gpio_sw = mraa.Gpio(8)
gpio_sw.dir(mraa.DIR_OUT_LOW)
# (反映に少しタイムラグがあるので、1秒ほど待機)
time.sleep(1)
# (gpioをmraa.DIR_INで読み取りに変更)
gpio_sw.dir(mraa.DIR_IN)
# (LED Pin13を操作対象にして、mr.DIR_OUTで"出力"に設定)
gpio_led = mraa.Gpio(13)
gpio_led.dir(mraa.DIR_OUT)
# (LEDのステータス変数の初期化)
ledState = 0
gpio_led.write(ledState)
while True:
# (スイッチの状態を読み取り)
reading = gpio_sw.read()
# (押した状態であれば)
if reading == 1:
# (LEDの点灯を切り替える)
ledState = int(not bool(ledState))
gpio_led.write(ledState)
デバウンスに関する処理をごっそり抜くと、GPIO設定部分はさておき、ロジック部分はかなりあっさりしたコードになりました。
デバウンスの処理はややこしくて、理解するのが大変ですが、これなら1行ずつ理解しながらコードを追えますし、なんならこれでもうまく動きそうに見えます。
ボタンを押すだけ、ただ押すだけなのに…
コーディングできましたので、実行してみましょう。
ボタンを押してみます。
どうでしょう。押してもLEDがうまく切り替わりません。
この後も何度か押しましたが、反応したりしなかったりでスイッチとしての機能を全然果たせていません。
デバウンス、恐るべしです。