機器に使用する接点が機械的に接触したり離れたりするときに、小さな振動で小さな接触の繰り返しを起こします。
この現象をチャタリングといいます。
チャタリングは実に面倒なもので、ハードとソフトの両面から歩み寄ってとっていかなくてはいけません。
この図で言うところの押し始めの部分です。
人は実際にはキュっと押しているのですがスイッチ内部では目に見えない速さでカチャカチャと振動しています。
チャタリングが起こる接続
Arduinoの実験回路では。Arduinoのポートに直接タクトスイッチをつけて実験しているシーンばが多く簡単な実験回路ではこれで十分です。
ところが、これでスイッチを押されたときの回数をカウントするようなプログラムを書いたりすると、初期のカチャカチャをカウントしてしまい予期しない結果を作ってしまいます。
ソフトでとりあえずは逃げる
この場合は、カチャカチャが終わる間じっとなにもしないで待つ delay などで時間を置く制御をいれます。
下記の例では、カチャカチャが落ち着くのに20ms待っている処理です。
int count ; void setup(){ pinMode(13,INPUT) ; } void loop(){ while(1){ if(degitalRead(13) == LOW){ delay(20) ; //ちょっとまつ count++; } }
この20msですが、これはスイッチの特性によって大きく変わるため根本的な対策にはなりません。
そこで、ハード上の回路でもチャタリングを取る工夫をして見ます。
回路で逃げる構成
抵抗とコンデンサーとシュミットトリガーを使った回路を作ってみます。
まず前段のR(抵抗)47KΩとC(コンデンサー)0.1μFによって、スイッチのカチャカチャ波形を丸くなだらかにしてしまいます。
抵抗とコンデンサーの容量はスイッチの特性によってことなりますので、細かくはハード的に微調整する必要があります。
その結果①ではカチャカチャ波形がなだらかな波形にかわります。
②では、なだらかな波形を7414を利用することで、HIGHとLOWのロジック波形に変換させます。
遅れ時間計算公式
この遅れ時間はRとCの値によって計算します。
その公式は下記の通りとなります。
スイッチON遅れ時間 = R(47K)× C(0.1μ)= 4.7msec
スイッチOFF遅れ時間 = (R(47K) + R(47K)) × C(0.1μ) = 9.4msec
4.実際の接続
実際に接続するイメージを示します。