macsbug

Archive for 5月 2021

ButtonA on M5Stack does not work properly

leave a comment »

M5Stack の ButtonA が 勝手に動作する 原因と対策。2021.05.02。追記:2012.06.13

結論:WiFi.setSleep(false); を追加します。

不具合:
. 1. Web Radio で ButtonA [vol-] が 勝手に動作し Volume が低下します。
. 2. 発生回数は 6時間に 1〜2回程度。
. 3. GPIO39 (ButtonA) に Pulse が発生します。
. 4. 他のスケッチでも WiFi ( WiFi.begin(); ) を使用するとPulseが発生します。

条件:
. 1. WiFi ( WiFi.begin(); ) を使用する時。
. 2. M5.BtnA.wasPressed(); を使用する時。
. 3. Arduino IDE: ESP32 Board Manager:ES32 Arduino 1.0.5 , 1.0.6

原因:
. Arduino IDF(1.06)のBUGと言われています。参照に記載あり。

🔴 対策:( 回避策 )
. Arduino IDE:Setup() , WiFi.Begin(); の直後に
. WiFi.setSleep(false); を記載します。

void setup(){
  WiFi.Begin();
  WiFi.setSleep(false);
}

結果:
. GPIO39のPulse は無くなり ButtonA が 勝手に押される事は無くなります。
 
今後:
. 原因が Arduino IDF(1.06)のBUG であるならば 修正される事を期待します。
. ESP32のBUG であるならば 今回の回避策になります。

追記:2021.06.13
🔴 対策:( 回避策 )

#include <driver/adc.h>
void setup(){
  adc_power_acquire(); // ADC Power ON

_ nao*(なお)氏の調査、解析により、対策が判明 致しました。
_ ADC測定指示→ADC電源がOFFなので、電源ON処理はいる→GPIO39が80ns落ちる→割り込み入る
_ nao*(なお)氏の尽力 と らびやん氏のフォローに感謝いたします。
_ M5Stackでボタン割り込みとanalogReadで、ボタンA押してないのに割り込みが入る。
_ esp_phy_load_cal_and_init(PHY_WIFI_MODULE);でも効果がある。
 


 
🔵 Espressif 情報:
_ 以下の資料にバグ情報があり、GPIO39に約80nsが発生する状況は同じです。
_ ハードのバグで「回避策は 入力を無視してください」と書かれていますが
_ M5Stackでは GPIO39にA Buttonが接続されており 対策が必要です。
_ 尚、M5Stackの ESP-WROOM-32 だけでなく ATOMの ESP32-PICO でも発生している様です。

_ ESP32 ECO and Workarounds for Bugs
_ 資料:eco_and_workarounds_for_bugs_in_esp32_en_V2.3_2020
_ page:9
_ 3.11
_ 特定のRTCペリフェラルの電源がオンになると、GPIO36およびGPIO39の入力が
_ 約80nsの間プルダウンされます。
_ 詳細: 🔴 次のRTCペリフェラルの電源を入れると、この問題が発生します。
_ •SARADC1 •SARADC2 •AMP •HALL
_ 回避策: これらの周辺機器のいずれかで電源を有効にする場合は、
_      GPIO36およびGPIO39からの入力を無視してください。


 
測定:GPIO39 ( ButtonA )( S3 )
. Circuit Diagram:
.  GPIO39(S3)にPulseが発生し GPIO37(S1), GPIO38(S2) には発生しない。
.  memo:
.   GPIO39は 内部PullUpのない入力端子。(SENSOR_VN : Input : ADC1_CH3, RTC_GPIO3)
.   M5Stackの GPIO39は R10 (100kΩ) で PullUp されています。
.   R10 (100kΩ) が無いと Logic “0” で S3 が押された事と同じになります。
.   R10 (100kΩ) 周辺の汚れによる電圧リークは 電圧が高くなる方向で問題は低下する。
.   D27 Diodeは M5Stackのversionにより 接続されているものと無いものがあります。
.   人による Switchが押される時間は 約200〜300msec です。
.   チャタリング防止は M5.BtnA.pressedFor(msec) がありますが 50msec でも
.   今回の不具合は発生します。この命令は速度低下になり使用したくない所です。

 
. TEST POINT ( GPIO39 ):Yellow
.  D27 Diode の上側にOscilloScopeを接続します。
.  R10の場所は R10が破損する恐れがあり接続しない事。
.  注意:基板への部品の接続と基板のpatternは 非常に弱いです。
.  レイアウト参照:Parts arrangement of M5Stack

 
. Waveform:WiFi.begin(); で 以下の画像に示す Pulse が発生します。
.   Period:100msec , Pulse Width:30μsec , Voltage:+1.6Vdc
.   Pulse電圧は +1.6Vdc で ButtonA ON 状態では無いが 何らかの要因が加わり
.   Logic “0” 相当の 0Vdc 近辺になり ButtonA(GPIO39)が動作すると判断しています。
.   WiFi.setSleep(false); を追加すると Pulse は無くなり +3.3Vdc になります。
 

 
memo:WiFi.setSleep(true); を記載すると Pulseが発生します。
 


 
参照:
M5.BtnA.wasPressed() conflicts with WiFi? #52:Apr 17, 2018 – Apr 6, 2021 🔴
_ Apr 17, 2018 : M5StackがWiFi経由で接続されている場合、
_  M5.BtnA.wasPressed() は正しく機能しないようです。
_ valki2氏(Jun 7, 2020) , antimix氏(Mar 27, 2021) , zasnicoff氏(Apr 6, 2021) が
_  WiFi.setSleep(false); の回避策を記載しています。
 
After 1.0.6 update WiFi won’t connect to other network // connection time increased #4980
. Mar 26, 2021 – Apr 29,2021
_ zasnicoff氏(Apr 6, 2021) : WiFiがGPIO39でパルスを引き起こしているように見えます。
 
M5.BtnA.wasPressed() conflicts with WiFi?
_ Apr 17, 2018
_ M5StackがWiFi経由で接続の場合 M5.BtnA.wasPressed() は正しく機能しない。
 
M5Stack: M5.BtnA.wasPressed() conflicts with WiFi #1334
_ Apr 19, 2018:現在のIDFの問題のようです。
 
Calling iot_button_create() causes RTCWDT_RTC_RESET (IDFGH-3167) #1857
_ Apr 14, 2018:ボタンコードは、任意のエッジ割り込みを使用する。これは非常に古い問題。
 
Problems with interface after connecting to network
_ Apr 1, 2020:ButtonA(gpio 39)で1秒に約1回短いパルスをカウントします。
_ M5Stack and its buttonsを参照して下さい。
 
Spurious interrupts on GPIO 36 when using WiFi (IDFGH-2473) #4585
_ Jan 5, 2020:これは既知のハードウェアの問題です。WIFIはADCを使用するためです。
_ igrr commented Jan 7, 2020:
_  Voltage spikes at 5Hz in GPIO36 causing interrupts in release v3.3, v3.2.2 works fine (IDFGH-1917) #4117
_ GPIO 36 and 39 constantly trigger interrupts #7
 
LVGL:M5Stack and its buttons
_ Apr, 2020:period=0.8sec, Pulse width=13us to 170us
 


 
M5StackのボタンAが勝手に反応してしまう件:
_ ESP32 及び M5Stack が販売されてからの不具合です。
_ M5Stack forum では 2018年4月に質問があり、原因と対策が不明のままでした。
_ 2018年4月から2021年4月に Github M5Stack issues #52 で話され
_ valki2氏(Jun 7, 2020) , antimix氏(Mar 27, 2021) , zasnicoff氏(Apr 6, 2021) が
_ WiFi.setSleep(false); の回避策を述べています。
_ 長く不具合をかかえていた件は、3年もかかり 回避策が判明しました。
_ ただし回避策であり 根本的な原因の解明には至っていません。

_ ESP32 , ECO and Workarounds for Bugs マニュアル 9page
_ 3.11. When certain RTC peripherals are powered on, the inputs of
_ GPIO36 and GPIO39 will be pulled down for approximately 80 ns.
_ 特定のRTCペリフェラルの電源がオンになると、GPIO36およびGPIO39の
_ 入力が約80nsの間プルダウンされます。 と書かれています。
_ 回避策は この時 GPIO39を読み込まない事と書かれています。
_ これが原因とすれば ESP32 のバグという事になります。
_ 波形の確認:
_  WiFi,Begin(); で GPIO39にPulseが発生しますが GPIO36は発生しません。

M5StickC:
. MDAR氏(Jun 29, 2020)によると「M5StickCでも非常によく似た問題が発生しています」との事。
. M5StickCの ButtonBは GPIO39を使用しています。
. Waveform:WiFi.begin(); で 以下の画像に示す Pulse が発生します。
.   Pulse Width:1.5μsec , Voltage:+1.2Vdc
.   Pulse電圧は +1.2Vdc で ButtonB ON 状態では無いが 何らかの要因が加わり
.   Logic “0” 相当の 0Vdc 近辺になり ButtonB(GPIO39)が動作すると判断しています。
.   WiFi.setSleep(false); を追加すると Pulse は無くなり +3.3Vdc になります。



 


 
感想:
Web Radioで まれ(6時間に 1〜2回程度)にしか起きない為に追求が困難でした。
波形観測により WiFi.Begin(); で GPIO39に Pulse が発生する事が判明しました。
この問題は参照によると2018年4月からあり 2020から2021年にかけて解明されてきました。
不具合は GPIO39に発生する Pulse波形により判断する必要があります。
Arduino IDF(1.06)(Arduino IDE Board ManagerのESP32) のバグと言われています。
Ver 1.05 では起きない話がありますが Ver 1.05 でもPulseは発生しています。

Espressif(igrr氏)とM5Stack社は この件を古くから認識していますが解決には至っていません。
この件で BtnA は使用出来ないとか 工夫して使用する人がいるのを知りました。
発売時からの不具合に対し EspressifとM5stackは フォローしていないのが現状です。
M5Stack専用のFaceBookも同様に不具合のフォローがされていません。
FaceBook 及び M5Stack community に この件を公開しました。

回避策が判明し これまでの Web Radio の記事及びスケッチの修正を致しました。
 


 
 
M5Stack , ButtonA , GPIO39 , WiFi , WiFi.begin , WiFi.setSleep(false) , setSleep , 勝手に押される

Written by macsbug

5月 2, 2021 at 11:18 am

カテゴリー: ESP32, M5STACK