ESP-WROOM-02とTVOCセンサーのCCS811を用いた測定プログラムを動作させているとCCS811とのI2C通信がハングアップしてソフト的なリスタートではうまく回復しなかった。
このために、I2C通信でタイムアウトした場合に、プログラムなどで使っていないGPIO16を使ってESP-WROOM-02をリセットするための回路を追加した。備忘録として参照したWebや不明点などについて書いておく。
目次
GPIO16とRSTの接続によるリセット
GPIO16とRSTを直接接続するとリセットはうまくいくが、書き込みがうまくいかなくなったりした。調べたところESP8266 Community Forumの次の質問に回答があった。
PROBLEM FLASHING AFTER RST AND GPIO16 CONNECTED…
GPIO16のHighが強くて、フラッシュへの書き込みを制御しているリセット回路ではRSTをLowにできないということのようだ。
解決法としては、GPIO16 と RST を470Ωか1kΩの抵抗で接続するか、ショットキーダイオードで接続するようにとのことである。
ショットキーダイオードのアノード側をRST、カソード側をGPIO16に接続することで問題を解消できた。
フラッシュ書き込みのための NodeMCU メソッド回路への疑問
リセットの回路を見ていてちょっとわからない点があるので備忘録としてついでに書いておく。
Arduino IDEを使ってプログラムを書いているが、多くの開発ボードのフラッシュ書き込みのための自動リセット回路としてはシリアルのDTRとRTSの2線を使ったNodeMCU方式が良く使われているようである。DTRだけでRSTを制御する比較的簡単なCK方式だとボードとのシリアル通信のUSBケーブルを接続した際にリセットがかかりっぱなしになってしまうことがあるためのようだ。
NodeMCU方式
NodeMCU方式では、双安定マルチバイブレータ回路を思い出させる次の回路が使われている。
https://github.com/nodemcu/nodemcu-devkit-v1.0/blob/master/NODEMCU_DEVKIT_V1.0.PDF
回路図を見た範囲では、次の真理値表を実現するために汎用ロジックICを使わないでトランジスターと抵抗で構成したというように読める。
この真理値表が実現できれば、USBケーブルを接続した直後のDTRとRTSがともに0になっているような場合でもRSTやGPIO0を0にすることなく、どちらも1にしておけるということのようだ。
しかし、次の記事にもあるようにそのままではタイミング的に問題が発生するように思える。
フラッシュ書き込みのためのプログラム ESP8266 and ESP32 serial bootloader utility のプログラム esptool.py を見ると以下のようなDTRとRTSの制御順序になっている。
ESP8266 Boot Mode Selection に記載の次の単純な接続であれば問題なさそうであるが、NodeMCU方式の場合には問題があるように思える。
ESP8266 Pin | Serial Pin |
---|---|
CH_PD ("enable") or nRESET | RTS |
GPIO0 | DTR |
NodeMCU方式の場合
NodeMCU方式での論理的なタイミングは以下のような流れになると思われ、赤字の部分で一瞬GPIO0が1の状態でnRSTが0から1への立ち上がりがあり、UARTからの書き込みにならない場合があるように思える。
Time | DTR | RTS | nRST | GPIO0 | Program comment | |
False (VCC) | 1 | IO0=HIGH | ||||
True (0V) | 0 | 1 | Reset | EN=LOW, chip in reset | ||
≧0.1s | ||||||
True(0V) | 1 | 1 | IO0=LOW? | |||
False(VCC) | 1 | 0 | Program from UART | EN=HIGH, chip out of reset | ||
≧0.05s | ||||||
False(VCC) | 1 | 1 |
納得できないので NodeMCUの回路を見ていたら、次のようにnRSTとGNDの間に100nFのコンデンサがつけてある(下の図のC1)。
このコンデンサでnRSTのVCCに向けての立ち上がりが遅れるので、GPIO0が1になっているタイミングでリセット状態からnRSTが1になっていくとしても、起動モードのGPIO0がセンスされるのはGPIO0が0になってからのタイミングということであろうか?
NodeMCU DEVKIT 1.0は上記の通りであるので、他のものも少しだけ調べてみた。
WeMos D1 Mini
WeMos D1 Mini でも回路図を見るとRSTにコンデンサがつながっている。
ESPr Developer
Switch Scienceの ESPr Developer の回路図をみるとRSTとGNDの間にはコンデンサはなさそうである。
もっとも、これまで使っている感じではリセットがうまくいかないという感じはしていない。うまくいかない場合もあったと思うが、他の開発ボードもうまくいかない場合があるので、上記のタイミングの問題で書き込みができないものなのかはっきりしない。
NodeMCU メソッド回路についてのまとめ
NodeMCU DEVKIT 1.0ではコンデンサがRSTとGNDの間に入れてあってRSTの立下りのタイミングを考慮しているように思える。ただし、本当にそのようになっているのかははっきりしない。
もしも上記の通りとすると、コンデンサがRSTとGNDに接続されていないNodeMCU方式のリセット回路を採用しているボードは失敗する率が高くなるということであろうか?よくわからない。