非公式Rock研究所

Radxaのシングルボード(主にRock4c+)について書いています

Non Debounce on a Pushbutton-No Debounce, No Life.

Debounceコード

【gpio】「Debounce on a Pushbutton-デバウンス対応」で、デバウンス対応したボタンスイッチのプログラムを紹介していますが、もしデバウンスを考慮しなければどうなるのか試してみます。

元記事:【gpio】「Debounce on a Pushbutton-デバウンス対応」 - 非公式Rock研究所
https://informal-r-labo.net/posts/gpio006

回路図

Non Debounce回路図

回路図は元記事の回路と同じです。

コーディング

~/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行ずつ理解しながらコードを追えますし、なんならこれでもうまく動きそうに見えます。

ボタンを押すだけ、ただ押すだけなのに…

コーディングできましたので、実行してみましょう。

Non Debounce実行

ボタンを押してみます。

Non Debounceボタン押下1回目 Non Debounceボタン押下2回目 Non Debounceボタン押下3回目

どうでしょう。押してもLEDがうまく切り替わりません。
この後も何度か押しましたが、反応したりしなかったりでスイッチとしての機能を全然果たせていません。

デバウンス、恐るべしです。