Open4

M5Atomが書き込み後リセットしない問題

okuokuokuoku

まぁそもそもArduino式のリセットは安全に動作しずらいからなぁ。。

M5Stackは消費電力が高いのでM5Atom Matrixにしてみた。

https://www.switch-science.com/catalog/6260/

しかし、書き込み後正常にリセットしない症状が出ていて、今は書き込みのたびにUSBから抜き差ししている。

okuokuokuoku

書き込み後リセットしない問題

ただ、直前に使っていたM5Stack(Gray)と比べて、M5Atomは正常にリセットしなかった。書き込み後に側面のリセットボタンを押すと、

rst:0x1 (POWERON_RESET),boot:0x3 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))
waiting for download

と出て、ファームウェアのDLまちになってしまう。これはGPIO 0 がアサートされっぱなしになっている状態で、どうもM5Atom側に積まれているUART変換チップの DTR が正常に操作できていないようだ。

https://qiita.com/h_nari/items/b971e615688d69bb3564

↑ にあるように、ESP32のリセットとリセット後挙動の決定は、UART的には RTSDTR の各ピンにマップされている。で、ESP32には内蔵ROMがあり、この内蔵ROMが起動時にGPIO 0 を読み出して起動モードを決定している。↑では正常に動作しなかったのはリセットの解除が早すぎるためだったのでコンデンサを追加している。

... もっとも、この辺の制御はesptoolのPythonコード側に存在するのでそちらを調整してしまえば解決する可能性がある。

    def hard_reset(self):
        print('Hard resetting via RTS pin...')
        self._setRTS(True)  # EN->LOW
        time.sleep(0.1)
        self._setRTS(False)

が、今回のケースでは何を設定してもGPIO0を制御できず、UART変換チップ側の問題だろうと結論した。

正常にGPIO0が制御できていると、起動時には:

ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)

のように出る。