h_nari @ 熊本市のブログ。電子工作、プログラミング、ゲーム、TV、 政治、インターネットなどに日々の思い付きを、 うだうだ~と書いていきたい。
このブログにはコメント欄を設けておりません。 記事への御意見、ご質問はtwitter @h_nari宛に お願い致します。


アーカイブ

メタ情報
RSS
Login

M5Stackのfake BtnA press

M5StackのLCDと3個のスイッチを使ったユーザインターフェイスを持つ プログラムを作成した。 デバッグ後、期待した動作をするようになったが 放置していると画面表示が変化している。 ButtonA(左端)を押されたような動作である。 数分に1度程度発生する。 プログラムを見直すが原因がわからない。 他のM5Stackで試すと同じ現象が発生する。

いろいろ調べるとButtonAの信号 ESP32のGPIO39に ノイズが発生しているようである。 プログラムでは M5.BtnA.wasPressed()でボタンの状態を見ている。 この関数にはdebounce(チャタリング キャンセル)の機能があるのだが 十分ではなく、たまにノイズのパルスをボタン押下と誤認識している ということらしい。

まず、本当にGPIO39にノイズが乗っているのか確認する プログラムを作成した。 以下に示す。

#include 
#include 

int pin = 39;  // ButtonA:GPIO39
// int pin = 38;  // ButtonB:GPIO38
// int pin = 37;  // ButtonC:GPIO37

void setup() {
  M5.begin();
  Serial.println("Start");
  pinMode(pin, INPUT_PULLUP);
  WiFi.mode(WIFI_STA);
  // WiFi.setSleep(false);   // 回避策!!
  WiFi.begin("your_ssid_name", "your_ssid_password");//これが無いとノイズ無し
}

int v0 = HIGH;
uint32_t tFall;

void loop() {
  int v = digitalRead(pin);
  if (v != v0) {
    if (v == LOW)
      tFall = micros();
    else
      Serial.printf("pulse %lu uSec\n", micros() - tFall);
    v0 = v;
  }
}

実行結果は以下のようになる。

pulse 1 uSec
pulse 1 uSec
pulse 1 uSec
pulse 1 uSec
pulse 2 uSec
pulse 1 uSec
pulse 1 uSec
pulse 1 uSec
...

実験の結果、複数のM5Stackでスイッチを操作しない状態で パルスが検出された。 パルス幅は1または2uSecと表示された。 但し、調べたM5Stackは古い個体なので 最近のもので改良されている可能性はある。

WiFiを使用するとパルスが出るようで、 WiFi.begin()の行をコメントアウトすると パルスはでなくなった。 また、中央と右ボタンの入力GPIO38と37では WiFi使用中であってもパルスは出なかった。

対策

M5Stackライブラリの Button.cppを使用せず、 自前のプログラムでdebounceを行ったところ ノイズでボタン操作を誤認識する現象はでなくなった。

今、調べて気が付いたが M5StackライブラリのIssue#52として上がっている。

以下の設定を追加すると回避できるらしい。

  WiFi.setSleep(false);
試すとパルスは発生しなくなった。