M5stack ボタンスイッチの、チャタリング、誤作動防止、感度調整、長押し設定を考えてみる

M5Stack,のボタンスイッチに特化してプログラムをくんでみた M5Stack

こんばんは。

前回の記事に引き続き、ESP32 搭載の M5Stack を掘り下げていく実験です。

今回は、前面にある押しボタンスイッチだけに焦点をあてて、動作感度を Arduino core for the ESP32 でプログラミングして、瞬時押しや連続押し、および2秒長押し設定してみる実験です。

何を今さら・・・、っていう感じですね。

実は、今までいろいろ電子工作してきても、物理スイッチについてはあまり追求しませんでした。
なぜなら、ESP32 は Wi-Fi 通信できるので、スイッチはスマホでコントロールすれば良いという考えだったのです。
それに、スイッチ関連については、ネットで有り余るほどの情報があって、ちょっと調べて理解した気になっていました。

でも、実際にちゃんと誤動作しないように、自分の意図した感度で動くようにプログラムを組もうとすると、これがかなり難しいのです。
だいたい標準ライブラリを使えば、それがよくできているので、甘えていました。

そこで、今回は M5Stack を入手したこともあり、真剣にボタンスイッチの挙動を追求してみることにしました。

スポンサーリンク

それにしても、M5Stack は前面に押しボタンスイッチがドーンとあるので、何より使ってみたくなるオーラ満載です。
やっぱり見た目というのは恐ろしいですね。
とにかく前面の3つのスイッチは押したくなるんですよ!

前回の記事では、TFT 液晶ディスプレイ ILI9341 のデモグラフィックを作ってみましたが、やっぱりこの押しボタンで動作させてみたいという欲求が湧いてきました。

M5Stack 純正の Arduino – ESP32 ライブラリでは既にボタンライブラリがあって、それを使うと簡単ですが、アマチュア電子工作家の私としては、あまりにも便利すぎて、自分でプログラミングする楽しさが半減してしまいます。

それと、誤作動しないボタンのプログラミングっていのは、実はいろいろなノウハウがあって、それを理解せずにスッ飛ばしてしまうのが嫌だったのです。

ボタンスイッチの挙動でチャタリングという現象がありますが、これもネットで調べて分かった気になっていただけでした。
プロの電子回路屋や組み込みプログラミング屋の方々から見れば、あまりにも初歩的で既知のことばかりだと思います。
でも、素人の私にとってはまだまだ未知のことが多いのです。

今回、この実験を真剣に取り組んでみて、とても多くのことを学びました。
実際にボタン動作のプログラミングを自分自身でやるのとやらないのとでは、身になる物が全然違うということが肌で分かりました。
特に、プログラミングで enum の使い方をようやく理解したという感じです。

ということで、素人の自分なりにやってみた実験を紹介してみたいと思います。
自己満足追求ですので、大げさなことが多いと思いますが、ご容赦ください。

使用するもの

M5Stack

(追記)
M5Stack Basicは、この記事を書いた当時より格段にバージョンアップしております。
以下のスイッチサイエンスさんの公式サイトをご参照ください。
https://www.switch-science.com/collections/%E5%85%A8%E5%95%86%E5%93%81/products/9010

※M5Stack Gray(9軸IMU搭載)現在は販売終了しております

 

Amazon.co.jp で購入する場合、おすすめはスイッチサイエンスさん販売のものが信頼出来て良いと思います。

私の場合は、9軸センサー付きグレーのものを購入しましたが、Basic でもOKです。

パソコン等

私の場合は Windows 10 を使用しています。

その他

スイッチの挙動を観測するために、ESP32-DevKitC やタクトスイッチ、固定抵抗、ブレッドボード、オシロスコープ等を使用しています。

Arduino core for the ESP32 をインストールしておく

パソコンに Arduino IDE と、Arduino core for the ESP32 をインストールしておいてください。
Arduino IDE は 1.8.5 で動作確認しています。
インストール方法は以下の記事を参照してください。

Arduino core for the ESP32 のインストール方法

M5Stack のスイッチ周り回路構成について

まず、前回記事でも紹介したように、M5Stack のドキュメントを見てみると、ボタンスイッチの関係は下図の様になっています。

●ボタンA —– ESP32 GPIO #39
●ボタンB —– ESP32 GPIO #38
●ボタンC —– ESP32 GPIO #37

では、実際の回路ではスイッチにどの様に接続されているのでしょうか?

M5Stack の回路図は開発元の Webページにあります。
http://www.m5stack.com/
その他、日本の販売代理店でもあるスイッチサイエンスさんのサイトにもありました。
https://www.switch-science.com/catalog/3647/

回路図からボタンスイッチ周りを抜粋させていただくと、こんな感じになっていました。

これを見ると、ESP32 の GPIO #37~#39 は 100kΩの抵抗でプルアップされていますね。
なぜプルアップされているのでしょうか?

では、Espressif Systems社のページにある、ESP32 のデータシートを見てみると、以下のような項目があります。

【ver2.1(2018/01/12版)より】

これを見ると、ESP32 の GPIO #37~#39 は、ADコンバーターになるようですが、内蔵リアルタイムクロックの GPIO や、ADC_PRE_AMP になったりするようです。
GPIO #37および #39 は ESP-WROOM-32 には端子が出ていないので、ESP32-DevKitC や ESPr Developer 32では接続できません。

このうち、ESP-WROOM-32 開発ボード系で接続できる端子は、GPIO #39 だけです。
これは、ESP32-DevKitC でいうと、SVN 端子です。

また、データシートの下図の様なところに、プルアップ抵抗について書いてありました。

これによると、ESP32 の GPIO #34~#39 は入力のみで、出力ドライバー回路や、インプットプルアップまたはプルダウン回路は無いとのことです。

ということは、例えば GPIO #39 にスイッチを直付けしただけでは、電圧の HIGH – LOW レベルを作ることができないので、別途抵抗を接続して、プルアップするということになります。
スイッチがOFF の時は、GPIO が HIGH レベルになり、スイッチがONになると、GNDに短絡されて LOWレベルになるようにし、スイッチを押しても 3.3V と GND が短絡しないように回路を組むと、M5Stack の回路になるわけです。
ということで、プルアップしている意味が分かりました。

次に、M5Stack の回路図に、RLSD52A031V という素子がありますね。
これは、ネットで調べると、静電気対策部品 ( ESD ) および、サージ対策ツェナーダイオード( TVS ) だそうです。

私は、あまりツェナーダイオードは使ったことが無いので詳しくは知りませんが、概ね HIGH レベルの電圧を安定させる役割と、静電気などのサージ電圧を吸収して、ESP32 を保護する役割があると思われます。
そう言えば、静電気を帯びた手で M5Stack のボタンを押すことはありますからね。
さすがに製品として販売する場合はこの手の保護機能は確実に備えているということです。

でも、サージ対策部品を自分の電子工作で使う場合、何V までのものを使えば良いか、いつも迷ってしまいます。
部品を買う時に見当が付けられないので、適当に買って工作して、対策した気になっているパターンが殆どです。
やっぱり、大手メーカーはこの辺の保護対策についてのデータを蓄積していて、故障しない範囲というものを熟知しているんだろうなぁ・・・。

では、次のページでスイッチの誤作動対策を見てみたいと思います。

コメント

タイトルとURLをコピーしました