タクトスイッチを押している間、モードが自動で連続切り替えされてしまう問題は、多くの電子工作初心者が直面する課題です。この記事では、押した瞬間だけモードを切り替える方法について解説します。
チャタリングと連続切替の原因
タクトスイッチを押すと、接点が短時間でオン・オフを繰り返す「チャタリング」が発生することがあります。これにより、押している間にモードが何度も切り替わってしまいます。
さらに、コード上で押下状態を連続的に読み取っている場合も、押している間にmodeやselectが増減し続ける原因となります。
フラグを使った押下検知の改善
押した瞬間だけ切り替えたい場合は、スイッチの状態を一度だけ検知するフラグを使用します。例えば、前回の状態を記憶しておき、押下の変化があったときだけmodeを増減させる方法です。
具体的には、prevButtonStateという変数を用意し、現在のPINB状態と比較して押された瞬間のみ処理を行うようにします。
簡単なコード例
以下のように書き換えると、押した瞬間だけモードが切り替わります。
if (!(PINB & (1 << PINB0)) && prevB0State){ _delay_ms(20); mode++; if (mode > 14) mode = 0; } prevB0State = !(PINB & (1 << PINB0));
この処理を各ボタンに適用することで、押している間に連続で切り替わる問題を防げます。
追加のデバウンス対策
チャタリングを完全に防ぐためには、_delay_msでのソフトウェアデバウンスや、RC回路などのハードウェアデバウンスも併用するとより安定します。
特に高速でボタン操作する場合は、フラグとデバウンスを組み合わせることで、誤動作をほぼゼロにできます。
まとめ
タクトスイッチのモード切替を押した瞬間だけにするには、前回状態を保持するフラグを使った押下検知が効果的です。チャタリング対策として_delay_msやハードウェアデバウンスを併用することで、安定したスイッチ操作が可能になります。
この方法を導入すれば、押しっぱなしによる意図しない連続切替を防ぎ、操作性の高いモード切替を実現できます。


コメント