どうも、なかしー(@nakac_work)です。
僕は自動車や家電製品のマイコンにプログラミングをする組み込みエンジニアとして働いています。
Arduinoでチャタリングを防止する方法を知りたい
と悩んでいる方もいると思います。
チャタリングを放置してしまうと、スイッチを押した時にArduinoが思った通りの動作にならないなんてことになりかねません。
チャタリングの原因を理解して、チャタリングによる意図しない動作を防止しましょう!やることはとても簡単ですよ!
この記事では「Arduinoでチャタリングを防止する方法」について紹介します。
Arduinoで起きるチャタリングとは
チャタリングとは、スイッチなどの機械的な接点で、オンとオフが切り替わる時に振動によってオンとオフが細かく繰り返される現状を意味します。
Arduinoを使う前提でチャタリングが起きる電子部品といえば「押しボタンスイッチ」や「タクトスイッチ」のように押したり、離したりすることで接点が切り替わるようなスイッチですね。
オシロスコープでチャタリングの波形を測定しました。
下の画像のようにスイッチを押した時に、ノイズみたいな変化が分かると思います。
これがチャタリングです。
(思っていたよりも酷くなかった)
Arduinoのチャタリングの原因
なぜ、チャタリングが起きるのでしょうか?
原因は2つあります。
- スイッチ側の接点の問題
- Arduinoの処理速度が速い
詳しく解説します。
スイッチ側の接点の問題
スイッチの中には金属が入っていて、スイッチを押したり、離したりするとその金属が振動します。
振動したときに接点が閉じたり、開いたりを繰り返すことでチャタリングになっています。
これを物理的に解決するのは難しいです。
Arduinoの処理速度が速い
Arduinoが1つの命令を実行できる速度を処理速度と呼びます。
処理速度は、クロック周波数から計算することが可能で、Arduino UNOの場合は16MHzとなっています。その逆数が処理速度なので、1命令は62.5n秒となります。
僕たちが書くプログラムは〇命令ごとに実行されるので、もしもスイッチの状態をArduinoで監視しているとしたら、最短で〇秒ごとにスイッチの電圧を取得していることになります。
これだけ早いとチャタリングも読み取ってしまいますよね。
Arduinoでチャタリングを防止する方法
チャタリングを防止するなら回路かプログラムのどちらでも実現可能ですが、回路で防止しようとすると部品の数が多くなるので、プログラム側で防止しましょう。
チャタリングが発生しているのは、スイッチを押したり、離したりした時から一定時間のみでしたよね。
この時間だけ、スイッチの入力を無視すればOKです。
具体的な方法は、スイッチ入力の後にディレイ(遅延処理)を入れます。
void setup() {
pinMode(3,INPUT); //タクトスイッチ
pinMode(7,OUTPUT); //LED
}
void loop() {
if (digitalRead(3) == 1) {
digitalWrite(7,1); //LEDを点灯
delay(10); //チャタリング防止(10msec)
} else {
digitalWrite(7,0); //LEDを消灯
}
}
もしくは、ハイかロー状態が一定時間以上に達した場合のみスイッチ入力を受け付けるようにArduinoにプログラミングをしておくのも良いと思います。
しかし、高速で処理する必要があるプログラミングの場合は、ディレイの待機時間や時間のカウント処理に時間が掛かってしまうので向いていません。
その場合は回路側で対策しましょう。
スイッチの端子にコンデンサを使った充電回路を組んで、シュミットトリガ回路に入力すればOKです。
Arduinoでチャタリングを防止する方法|まとめ
この記事では「Arduinoでチャタリングを防止する方法」について紹介しました。
Arduinoでチャタリングを防止するなら、次の方法があります。
- スイッチの入力を受け付けた後にディレイ(遅延処理)を実行する
- 一定時間スイッチの入力が安定しているときに入力を受け入れる
もしも、プログラミングを高速で処理したい場合にはプログラムではなく回路側でチャタリングを防止することも考えてみてください。
人気の記事
>>電子工作の始め方【回路設計からプログラミングまで可能にする方法】
当ブログで人気のArduino入門キット