Arduinoでチャタリングを防止する方法

どうも、なかしー(@nakac_work)です。
僕は自動車や家電製品のマイコンにプログラミングをする組み込みエンジニアとして働いています。

Arduino初心者
Arduino初心者

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をゼロから勉強する方法【参考書は不要】

>>ラズベリーパイで実現できることを紹介

当ブログで人気のArduino入門キット

第1位:Arduino UNO スターターキット
Arduino UNOのスタータキットです。電子工作でよく使う部品が一式揃っており、バラバラで購入するより格段に安いです。
第2位:ELEGOO Arduino用のUNO R3 最終版スタータキット
こちらも電子工作によく使う部品が第一位のスタータキットよりたくさん入っています。とてもお買い得です。
第3位:ELEGOO Arduino MEGA 2560 R3
UNOの上位互換版MEGAのスターターキットです。これだけ入っていれば十分に電子工作の基本をマスターできることでしょう。
エンジニアが教えるArduino入門講座のまとめ【解説動画付き】