tl;dr
- ESP32はBOOTピンとENピンを制御して、ダウンロードブートモードで起動し、UART経由で書き込みを行うよ
- この制御に、USBシリアル変換のDTRとRTSをMOSFETを使って行う方法が公式から出ているよ。しかし、タイミングを制御するためにキャパシタを追加したりするけど、作りによってはうまくいかないようだよ
- タイミングの問題でしかないので、タイミング制御をCH32V003マイコンで行えば良いと思い、ESP32 Writer Pro CH9102を作ったよ
ESP32の書き込み機
ESP32はUART経由でファームウェアの書き換えをサポートしており、USBシリアル変換があれば可能なため、非常に手軽に使えます。 ただし、これが可能になるダウンロードブートモードにするために、BOOTピン(ESP32/ESP32-S3であればGPIO0、ESP32-C3であればGPIO9)をLにしたまま、ENピンをH→L→Hにしてリセットを制御する必要があります。
ESP32-C3-WROOM-02 Datasheet
https://www.espressif.com/sites/default/files/documentation/esp32-c3-wroom-02_datasheet_en.pdf
この制御をMOSFETを使ってUARTのDTR、RTSから自動で行う回路を、Espressif公式が紹介しています。Espressif公式の開発ボードや、公式の書き込みツールESP-Progにも搭載されています。
私自身もESP32 Writerというアイテムにこの回路を組み込み、利用していました。
しかし、この回路を期待通り動作させるために、ENピンにキャパシタを追加する必要があります。キャパシタで信号を遅らせることで実現すると言うことです。公式が提案するキャパシタの容量も0.1uF→1uFにいつの間にか変更されていたり、うまくいかないことがあるのが知られていたように思います。
この辺りは「タイミング制御の問題」でしかないと思っており、なんとかならないかと思っていました。
CH32V003マイコンで余裕を持って制御する
タイミングの制御であればマイコンで余裕を持った制御をやれば良いと思いました。 そこで格安マイコンであるCH32V003J4M6を組み込むことにしました。
マイコンプログラムとしては以下のことしかやっていません。以下の処理だけで実現できました。 なお、各制御は100msの余裕を持って行わせています。
- DTRのH→Lを検出し、EN、BOOTを使ってダウンロードブートモードに入れる(書き込み開始時に行われる)
- RTSのH→Lを検出し、ENを使ってリセットする(書き込み後のリセットに使われる)
- SWが操作を検出し、EN、BOOTを使ってブートモードに入れる
このファームウェアのプログラムは以下で公開しています。
さらに今までUSBシリアル変換ICにCH340Cを使っていたのですが、より高速なCH9102Fに置き換えました。 実際に使ってみると、特に不便なく使えています。
他の機能
私自身の作るESP32を使った開発ボード、製品には、必ずESP-Progに搭載のものと同仕様の1.27mmピッチ2x3ボックスピンヘッダを用意しています。
これでリボンケーブルで簡単に接続して書き込みができるようになりました。
現在BOOTHにて販売中
こちらをBOOTHにて現在販売中です。キットではなく、完成品として販売しています。 製品名は『ESP32 Write Pro CH9102』です。
名称の"Pro"は以前作成していたバージョンより良くなったため付けました。 本製品はアマチュアによる作品であり、プロユースを意味しません。 良ければ手に取ってみてください。
こちらの商品の回路図は以下となります。
- PDF: https://github.com/74th/esp32-dev-boards/blob/main/ESP32-Writer-CH9102F/ESP-Writer-CH9102F-v1.0.1-semantics.pdf
- kicanvas: https://kicanvas.org/?github=https%3A%2F%2Fgithub.com%2F74th%2Fesp32-dev-boards%2Fblob%2Fesp32-writer-ch9102f%2Fv1.0.1%2FESP32-Writer-CH9102F%2FESP-Writer-CH9102F.kicad_sch
KiCad設計ファイル等は公開しています。
製作の感想
LED、ボタンの制御を含めるとSOP8のピン数でギリギリになりました。 LEDピンとSWDIOピンを同一にし、ボタンを押しながら電源が入った場合のみ、SWDIOが有効になる(LEDとしてピンを使わない)ようにしてピンの数をカバーしました。