ESP-01ボードの自動フラッシュ書き込み対応化

前回記事で試した、ESP-01ボードの専用プログラマは「専用」とは名ばかりで実際にはプログラムの書き込み時にいちいちスイッチ操作が必要なのが難点。そこで今回は、ESP-01ボードの自動フラッシュ書き込み対応化を行った。

スポンサーリンク

ESP8266チップのブートシーケンス調べる

ESP8266チップのブートはけっこうデリケートなようで、開発元による各種ドキュメントに色々記述がある。だが困ったことにドキュメントによって書いてあることがバラバラで、例えばRSTピンとCHIP_ENピンの立ち上がりについて「VDD→RST→CHIP_ENピンの順にHレベルにせよ」と書いてあるドキュメントがあると思ったら、別のドキュメントでは「VDDとCHIP_ENピンを同時にHレベルにしても良い」と書いてあったり少々混乱気味。

ESP8266はRSTピンとCHIP_ENピンの状態がチップのアナログ周りを含めたチップの起動タイミングを司る一方で、マイコンのブートプログラムの読み込み先が起動時のGPIOピンの値の組み合わせで変わる仕様にもなっている。このへんも何故か上記の開発元のドキュメントにちゃんとした記述が無く、断片的な情報を拾うと以下の通りのようだ。(これ以外にもGPIO15がSDカードによるブートに関わっているようだが、今回は省略。)

UARTブートFLASHブート
GPIO0LH
GPIO2HH

前回記事でGPIO0をLowに落として「書込みモード」と呼んでいたが、要するにUART経由でフラッシュ書込みプログラムを起動していたという事らしい。

ESP-01自動書き込み対応回路

ESP8266の仕様書紐解いても詳しい記述が見つからず「困ったなぁ」と当初は思ったものの、同じチップが載ったWeMos D1ボードの回路図を参考にすれば良いと思いついた。というわけで、回路の断片をWeMos D1ボードの回路図から拾って作った、ESP-01自動書き込み対応回路の回路図は以下。

(2020/2/23追記)
当初公開した回路図には問題があり、以下の回路は訂正版です。

RSTピンとGPIO0ピン周辺の回路

RSTとGPIO0にトランジスタを2本使った回路を追加している。元々はWeMos D1の回路をそのまま拝借したが、少しアレンジを加えている(詳細はこちらの記事を参照)。トランジスタはNPNタイプだったら品種を問わず何でも動作する筈。

CH_PDピンとRSTピン周辺の回路

チップ開発元のドキュメントに「起動時にはVDD→RST→CHIP_ENピンの順にHレベルにせよ」と書かれていたのが気になってCH_PD(CHIP_EN)ピンにコンデンサを付けたり色々試行錯誤してみたのだが、チップが正常起動するのは結局WeMos D1ボードで実績がある上記回路のみであった。

FTDI232 USBシリアルインタフェース

esptool.pyを使った自動書き込み対応を行うには、DTRとRTS信号が取り出せるUSBシリアルインタフェースを使うことが必須。今回は以下のFT232RLチップ搭載USBシリアル変換モジュールを使用した。

FT232RLモジュール FTDI 5V 3.3V FTDI USB TTL変換アダプタ USB to TTL シリアル コンバーター アダプター モジュール(Amazon)

このモジュールは外部出力電源の電圧をジャンパで選べるので、3.3Vを取り出せるように設定し、ESP-01への電源供給も行った。RTS信号はピンヘッダに出ていないが、基板に端子は出ており電線をハンダ付けして信号を取り出した。

フラッシュの自動書込みは問題無し

上記回路を用いた自動書き込みを試す。

MicroPythonはesptool.pyを用いた以下のコマンドを実行すればOK。自動リセットもかかり、書込み後シリアルコンソールから接続すればそのままインタープリタが使え、使い勝手はWeMos D1ボードと全く同一になった。回路をコピーしてるんだから当たり前か(笑)

$ esptool.py --port /dev/ttyUSB0 erase_flash
$ esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash -fm dio -ff 20m --flash_size=detect 0 esp8266-20191220-v1.12.bin

ArduinoでもIDEメニューのツール->ボードから”Generic ESP8266 Module”を選択し、フラッシュサイズ1MBを選択すればプログラムの書込き込みは普通に出来る。

書込み回路がI2C動作に影響するか確認

ESP-01ボードはGPIOが2本出ておりI2Cならギリギリ使える。しかし今回はその2本のうちの1本であるGPIO0にトランジスタによる書き込み回路を追加しているので、これがI2C使用に影響するかを確認した。

確認には以前の記事で作ったArduinoによるLCDクロックのスケッチを用いた。但し、プログラムにはWireオブジェクトのbeginメソッド実行箇所に変更が必要。

Wire.begin(2,0);

この記述により、SDAをGPIO2へ、SCLをGPIO0へと割り当てる事が出来る。
さて、LCDやRTCと接続して回路を組んだ後プログラムをビルドして実行してみると…正常に動作しない。

GPIOを使いたい場合は、ESP-01を書込み回路から切り離す必要がありそうだ。

まとめ

最後にまとめとして、ブレッドボード上に組んだ回路の写真を。

真ん中の8Pソケット(ソケット自体はAliExpressで購入)にESP-01ボードを挿して使う。そして、USBケーブルを接続すればスイッチ操作無しでflash書き込み可能だ。

写真をよく見ると抵抗値が回路図と食い違っているが…気にしない気にしない。大体合っていればOK。

バッテリー給電する回路を作って、この回路でflash書き込みした後に付け替えるようにすると ESP-01をWi-Fi対応の超小型IoTデバイスとして快適に使えそうだ。そのうち対応してみたい。

コメント