Raspberry Piでボタン入力を扱っていると、
・1回押したのに複数回反応する
・LEDが意図せず点滅する
・動作が不安定になる
といった問題が発生することがあります。
これは「チャタリング」と呼ばれる現象です。
本記事では、チャタリングの原因と、
gpiozeroを使った対策方法を分かりやすく解説します。
チャタリングとは?
チャタリングとは、スイッチのON/OFFが瞬間的に何度も繰り返される現象です。
ボタンを1回押したつもりでも、
内部では高速にON/OFFが繰り返されるため、
複数回入力されたように見えます。
なぜチャタリングが発生するのか
ボタンの接点は完全に一瞬で切り替わるわけではなく、
物理的な振動によって短時間のON/OFFが発生します。
そのため、ソフトウェアから見ると、
複数回押されたように認識されます。
チャタリングが起きるとどうなるか
・1回の押下で複数回処理が実行される
・LEDの動作が不安定になる
・カウンタが意図せず増える
例えば1回ボタンを押しただけでも、
5回〜10回程度の信号変化が発生することがあります。
例えば、ボタンを押してLEDが光るソフトウェアだった場合、
LEDの明るさが一気に変わってしまう場合は、チャタリングが原因の可能性があります。
対策①:bounce_timeを使う(簡単)
from gpiozero import Button
button = Button(18, bounce_time=0.05)
bounce_timeは、一定時間内の入力を無視することで、
誤検知を防ぐ仕組みです。
bounce_timeを設定することで、
指定した時間内の連続入力を無視できます。
例えば0.05秒(50ms)以内の入力は無視されます。
※一般的には0.01〜0.1秒程度が目安です。
迷った場合は0.05秒がおすすめです。
対策②:ソフトウェアで待機時間を入れる
from time import sleep
def on_press():
print("押された")
sleep(0.05)
一定時間待機することで、
連続入力を抑制する方法です。
※sleepを使用すると、その間プログラム全体が停止するため、
他の処理に影響が出る可能性があります。
対策③:ハードウェアで対策する
コンデンサを使用することで、
信号を安定させることができます。
これを「デバウンス回路」と呼びます。
実際に試してみる
bounce_timeなしとありで比較すると、
挙動の違いが分かりやすくなります。
よくあるミス
・bounce_timeを設定していない
・値が小さすぎる(効果がない)
・sleepで全体が止まる
関連記事
まとめ
本記事では、チャタリングの原因と対策を解説しました。
・原因は物理的な接点の振動
・bounce_timeで簡単に対策可能
・必要に応じてハードウェア対策も検討
