ESP32の自動ダウンロードブート制御をマイコンで行うESP32 Writer Pro CH9102Fを作った

tl;dr

  • ESP32はBOOTピンとENピンを制御して、ダウンロードブートモードで起動し、UART経由で書き込みを行うよ
  • この制御に、USBシリアル変換のDTRとRTSMOSFETを使って行う方法が公式から出ているよ。しかし、タイミングを制御するためにキャパシタを追加したりするけど、作りによってはうまくいかないようだよ
  • タイミングの問題でしかないので、タイミング制御を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のデータシートより

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にも搭載されています。

ESP-Progの紹介ページより

docs.espressif.com

私自身もESP32 Writerというアイテムにこの回路を組み込み、利用していました。

しかし、この回路を期待通り動作させるために、ENピンにキャパシタを追加する必要があります。キャパシタで信号を遅らせることで実現すると言うことです。公式が提案するキャパシタの容量も0.1uF→1uFにいつの間にか変更されていたり、うまくいかないことがあるのが知られていたように思います。

この辺りは「タイミング制御の問題」でしかないと思っており、なんとかならないかと思っていました。

CH32V003マイコンで余裕を持って制御する

タイミングの制御であればマイコンで余裕を持った制御をやれば良いと思いました。 そこで格安マイコンであるCH32V003J4M6を組み込むことにしました。

マイコンプログラムとしては以下のことしかやっていません。以下の処理だけで実現できました。 なお、各制御は100msの余裕を持って行わせています。

  • DTRのH→Lを検出し、EN、BOOTを使ってダウンロードブートモードに入れる(書き込み開始時に行われる)
  • RTSのH→Lを検出し、ENを使ってリセットする(書き込み後のリセットに使われる)
  • SWが操作を検出し、EN、BOOTを使ってブートモードに入れる

このファームウェアのプログラムは以下で公開しています。

github.com

さらに今までUSBシリアル変換ICにCH340Cを使っていたのですが、より高速なCH9102Fに置き換えました。 実際に使ってみると、特に不便なく使えています。

他の機能

私自身の作るESP32を使った開発ボード、製品には、必ずESP-Progに搭載のものと同仕様の1.27mmピッチ2x3ボックスピンヘッダを用意しています。

ESP-Prog搭載の書き込みポート仕様

これでリボンケーブルで簡単に接続して書き込みができるようになりました。

現在BOOTHにて販売中

こちらをBOOTHにて現在販売中です。キットではなく、完成品として販売しています。 製品名は『ESP32 Write Pro CH9102』です。

74th.booth.pm

名称の"Pro"は以前作成していたバージョンより良くなったため付けました。 本製品はアマチュアによる作品であり、プロユースを意味しません。 良ければ手に取ってみてください。

こちらの商品の回路図は以下となります。

KiCad設計ファイル等は公開しています。

github.com

製作の感想

LED、ボタンの制御を含めるとSOP8のピン数でギリギリになりました。 LEDピンとSWDIOピンを同一にし、ボタンを押しながら電源が入った場合のみ、SWDIOが有効になる(LEDとしてピンを使わない)ようにしてピンの数をカバーしました。