CH340X で小さな ESP32 Writer を作った

tl;dr

  • CH340 は部品点数を減らせる便利な USB シリアル変換ICだよ
  • ESP32 はGPIO0 を H にしながら、EN を H→L→H にしてリセットすると、UART でファームウェアを書き込みを受け付ける状態になるよ。MOSFETを2個使って、UARTの送信リクエストと同時にこの操作をする回路がよく使われているよ。
  • CH340X は↑の入力をする機能のついたバージョンだよ。これを使って最小サイズの ESP32 Writer を作ってみたよ。
  • CH340X は使えたけれど、minicom で UART を開くと EN を L に操作されてしまって、ENに接続したままでは普通のUSBシリアル変換としては使えなかったよ。

CH340シリーズとは

CH340 シリーズとは、WCH が発売している安価なUSBシリアル変換ICです。最近のUSBシリアル変換アダプタにもよく使われています。

akizukidenshi.com

CH340 には以下のような特徴があります。

  • USBのD+/- や、MCUのUARTと抵抗などの別の部品を挟まずに直接接続できる。これによりICの他に必要な部品がほとんどない。
  • オシレータ内蔵モデルがある。
  • 5Vと3.3V電源及び、UARTのIOに対応。
  • SOIC8や、MSOP10 など、様々なサイズのICがでている。
  • 安い。その上、秋月電子通商で取り扱いがある。

www.wch-ic.com

akizukidenshi.com

データシートには直接回路例も載っているため、割と簡単にUSBシリアル変換アダプタを作ることができます。

ESP32 にダウンロードする回路をUSBシリアル変換ICで作れる

ESP32 は UART でファームウェアを書き込む機能を持ちます。そのモードに入るためには、ESP32 の場合、GPIO0 をLにしたまま、ENをH→L→Hにしてリセットすると、それを受け付けるモードになります。

これを USBシリアル変換ICのDTR、RTSを使うと、送信リクエストでこのGPIO0とENの操作してくれる回路を MOS-FET 2 個で作ることができます。公式の開発ボードである ESP32-DevKitC にも、USBシリアル変換ICと合わせて、この回路が付属しています。

docs.espressif.com

私自身もCH340Cと2N7002を使って、ESP32-Writer を作りました。これはEspressif公式のファームウェア Writerである ESP-Prog と互換の 1.27ピッチボックスピンヘッダを持たせています。私の作るESP32開発ボードにはこのボックスピンヘッダで接続できる口を持たせていて、これをケーブルで繋ぐだけで、EN、GPIO0、UART RX/TX、VCC、GNDを一挙に接続することができます。向きを正しくしないと差し込めなかったり、非常にMCUとPCとの接続が簡単になります。

ESP Prog

espressif-docs.readthedocs-hosted.com

この ESP32開発ボードは Boothで販売していて、この ESP32-Writer もオプションでつけています。

74th.booth.pm

74th.booth.pm

CH340X にGPIO0、EN操作機能が付いたIC

CH340XというUSBシリアル変換ICがでました。これには、さきほどの GPIO0、ENを操作する機能が付いています。データシートには以下のように書かれています。

The type of MCU targeted in the figure above: the MCU itself needs to support one-click download through the UART. NRST is a reset input (active low). By default, application is selected when BOOT0 is low, and Boot-Loader is selected when it is high. For example 32F103, etc.

The MCU in the figure above is CH340X. The resistance of the 4.7KΩ pull-down resistor can be selected from 3 to 5.6KΩ. This resistor also serves as the BOOT0 pull-down resistor of the MCU. For CH340C with the last 3 digits of the batch number greater than or equal to B40, OUT# can be used as the second DTR# to connect to BOOT0.

Note: For other MCUs with opposite BOOT mode levels, you can directly use CH340C/G DTR# to control (default high level), or use DTR# of CH340X with a resistor connected between the 6# pin and the 5# pin to control (push-pull DTR enhanced mode, default high level).

要約

  • BOOT0 を H にするとブートローダーに入るSTMF103のようなMCUの場合、6ピンに 3 ~ 5.6kΩのプルダウン抵抗をつけて BOOT0 に接続する
  • BOOT0 を L にするとブートローダーに入るMCU(つまりESP32)の場合、6ピンと5ピンを抵抗(3~5.6kΩと思われる)を挟んで接続する

この解説は以下のWCHのYouTubeチャンネルでも紹介されていました。

www.youtube.com

CH340Xを使うことで、2N7002が2個必要だったものから 3 ~ 5.6kΩ抵抗1個で済み、配線もシンプルになるとのことでした。

この CH340X を aliexpress のショップから購入して入手しました。送料含めて、10個 $3.73 、おおよそ500円で購入できました。(2023/04/24 CH340G の注文と取り違えていたので修正、下記リンク修正済み)送料含めて、10個 $9.33、おおよそ1300円で購入できました。

(5個) 新CH340G CH340C CH340B sop-16 CH340E CH340X MSOP-10 CH340T SSOP-20 CH340N sop-8 CH340K ESSOP-20 usbシリアルポート

https://ja.aliexpress.com/item/1005004957210331.html

これで最小ライタを作る

CH340X はMSOP10のとても小さなICです。これを使えば、ほぼUSBソケットサイズの、ESP32用のライタが作れると考えました。私自身は先に説明した ESP-Prog 互換 UART ボックスピンヘッダがあればよいため、これだけを持つモジュールを作ってみました。

回路図もこれだけです。

KiCadファイルはこちら

github.com

本当に USB Type-C ソケットに 1.27mmピッチのボックスピンヘッダが生えているだけです。

これで、無事 ESP32-C3 に esptool.py を使って chip_id が動作することを確認できました。

普通の USBシリアル変換ICとして使えない??

ただし、このCH340Xを普通のUSBシリアル変換として使おうとしたところ、問題がありました。

いつもの minicom コマンドを使って、ESP32-C3 とUARTでやりとりをしようとしたところ、動作しませんでした。

このとき、EN、GPIO9(ESP32と違い、ESP32-C3 ではブートローダの選択ピンが GPIO 9 になっている) を確認すると、どちらも L になっていました。つまり、リセットボタンが押された状態です。これでは、UARTで送ってくるはずがありません。

残念ながら、CH340X を ESP32 Writer として作ると、ファームウェアの書き込みには使えるけれど起動中の UART は見ることができませんでした。

まとめ

CH340X を使って簡単に凄く小さいサイズの ESP32 の Writer を作ることができました。とてもかわいらしいものができました。

しかし通常のUSBシリアル変換としては、EN、GPIO0を外さないと、兼ねられないならば、わざわざ使いたいシーンは少なそうです。

さらなる疑問として、なぜ 2N7002 を使った回路では EN に影響を及ぼさずに、通常のUARTで通信できているのか(MicroPythonで送受信共にできていました)謎が残ります。