PR

Raspberry Pi 5でボタンのチャタリングを防止する方法(gpiozero・Python)

4. Raspberry Pi

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で全体が止まる

関連記事

ボタン入力
長押し制御
ボタン2個で明るさ制御

まとめ

本記事では、チャタリングの原因と対策を解説しました。

・原因は物理的な接点の振動
・bounce_timeで簡単に対策可能
・必要に応じてハードウェア対策も検討

タイトルとURLをコピーしました