スイッチの誤作動、およびチャタリングについて
電子工作家ならば、誰しも知っていると思われる、チャタリングという現象があります。
これは、物理スイッチを組み込んだ工作をするとき、必ず考えておかねばならないと思います。
チャタリングとは、スイッチを押した瞬間、スイッチ内部の金属接点が、ごくごく短い時間でバウンドするような現象のことです。
押された 10μs~10ms くらいの瞬間に、どんなに確実にスイッチを押し込んでも、擦れや金属の弾性により、接点が接触したり放れたりしてしまいます。
これによって、スイッチを押した瞬間に複数回押されたと検知してしまい、誤作動の原因になる場合があります。
これについてはマルツオンラインの以下の記事が参考になります。
https://www.marutsu.co.jp/pc/static/large_order/1405_311_ph
今まで面倒で敬遠していたのですが、これを機に、今回は思い切ってオシロスコープでチャタリング波形を確認してみることにしました。
本当に マルツさんの記事のようになっているのでしょうか?
なお、M5Stack のスイッチの挙動をオシロスコープで見てみたかったのですが、ちょっと難しかったので、今回は別途ブレッドボード上で ESP32-DevKitC のタクトスイッチ回路を組んでみました。
M5Stack の Aボタンに接続されているのと同じように、SVN端子 ( GPIO #39 )に接続し、とりあえず 10kΩ以上の抵抗で3.3Vプルアップします。
因みに、ツェナーダイオードは使っていません。
純粋にタクトスイッチのチャタリング挙動を見るためです。
タクトスイッチは Amazon.co.jp でスイッチサイエンスさん販売の以下の物を使いました。
このタクトスイッチは小さく、スペースが少なくて済み、しかも、ブレッドボード上にガッツリ刺さってくれて、接触不良の心配が無くて良い感じです。
オシロスコープは 100MHz クラスのものを使いました。
これくらいのオシロを使わないと、チャタリング波形を見ることができません。
では、スイッチをできる限り素早く押して放してみた測定結果は以下のようになりました。
いくら素早くやっても、押されている時間間隔はおよそ 80 ms くらいに落ち着きました。
ということは、感度を良くしようとして、プログラミングでそれ以下の時間で設定しても意味がないことです。
タクトスイッチの個体差や、個人差もあると思いますが、大体こんなものだと思います。
でも、この波形からはチャタリングは見えませんね。
では、ボタンを押した時点の波形を拡大してみるとこんな感じになりました。
ほんの少しですがチャタリングが出ていますね。
でも、最近のタクトスイッチは高性能で、なかなかハッキリとしたチャタリングが捉えられませんでした。
何回か動作させて、それらしい波形をつかんだ感じです。
この波形でのチャタリングは 2μs ほどです。
これ、かなり短い期間です。
恐らく、ESP32 の Analog 入力では検知できないレベルと思われます。
マルツさんの記事によれば、100μs~10ms とありますが、それよりも遙かに小さいです。
最近のスイッチが進化した結果でしょうか?
または、たまたま私が買ったこのタクトスイッチが高性能だったのでしょうか?
実は、スイッチを押した時点よりも、放した瞬間の方がチャタリングは激しかったのです。
拡大した下図をご覧ください。
なんと、320 μs の区間でハッキリと発生しています。
スイッチを押した瞬間よりも、放す時の方が圧倒的に激しいチャタリングが発生していました。
それでも、恐らく ESP32 では検知できないレベルですが、やはりこれはある程度対策しなければなりません。
因みに、以前の記事で M5Stack を分解している時、電源ボタンを壊してしまいましたが、そのボタンがタクトスイッチそのものでした。
丁度、接点構造が分かる状態になっていたので、見てみるとこんな感じです。
ドーム型の薄い金属のふくらみがあって、押すとヘコむ様になっています。
その下に別の金属があって、接触しているようです。
おそらく、前面のタクトスイッチも同じ構造だと思います。
何となく、押した瞬間や放した瞬間の接触状態が想像できますね。
しかし、これ、良くできていますね・・・。
自分的に想像したスイッチ接点の様子を図に表すとこんな感じです。
ドーム型の金属を押した瞬間は、小さい面積で接触し始め、更に押し込むと接触面積が大きくなると想像しました。
放す瞬間はこの逆になり、接触面積が大きいところから徐々に面積が小さくなってリリースされます。
これから、放す時に金属の微妙な歪みによって、接点が触れたり離れたりしていると想像できます。
何となく、放す時の方がチャタリングの方が激しいということが理解できます。
因みにタクトスイッチの構造については以下の記事がとても参考になりました。
https://pcnomori.blog.fc2.com/blog-entry-315.html
それにしても、M5Stack の電源ボタンを破損して分かったのですが、垂直方向のタクトスイッチが横方向で押される構造になっていて、とっても細かい部品で構成されていました。
この部分のパーツの強度や耐久性などは、とっても重要なところですね。
これを製造する技術はスゴイものがありますね。
以上からチャタリング対策を考えてみたいと思います。
先に紹介したマルツさんの記事のようにコンデンサなどを使ったハードウェア対策がありますが、このタクトスイッチに限って私の個人的な考えでは、ソフトウェアだけで十分な対策ができると思っています。
では、実際にプログラミングして実験してみます。
コメント
結構前の記事なのでもう解決済みかもしれませんが・・・。
ボタンの処理は遅延を最小限にするのに割り込み(ISR)を使われたほうが良いかと思います。
あと、どんなスイッチを使ってもほぼチャタリングは発生するので、バイナリーセマフォかミューテックスを使うのが常套手段かなと思います。
Lang-Shipさんが詳しくまとめられているので、参考になると思います。
https://lang-ship.com/blog/work/esp32-freertos-l06-semaphore-mutex/
PeakAliveさん
記事をご覧いただき、ありがとうございます。
チャタリングには割り込みとかバイナリセマフォとかミューテックスつかうのが常套手段というのは知らなかったです。
当時はFreeRTOSは全く無知でした。
しばらくプログラミングから離れておりますが、久々に勉強しなおそうかと思いました。
Lang-Shipさんは以前、大変お世話になったので、参考にさせて頂こうと思います。
情報ありがとうございました!!!
m(_ _)m