2022年4月16日土曜日
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);
試すとパルスは発生しなくなった。