1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CH340X: 最小限の回路でESP32に自動書き込みする

1
Last updated at Posted at 2026-02-10

概要

  • WCHのCH340XというUSB-シリアル変換ICを購入してみたので検証
  • ArchLinuxとWindowsで動作確認した
  • linuxですこし詰まったので解決法も書いておく

CH340Xとは

ESP32などのマイコンはUARTで書き込みができるので、USB-シリアル変換ICを使うことが多いが、その中でも安価で使いやすいものの一つにCH340シリーズがある。

本来、ESP32にUARTで書き込むためには、IO0ピンをLOWに落とした状態で起動(ENピンをH→L→Hにするなど)してboot modeに入る必要があるが、CH340KなどのRTSピンとDTRピンが出ているICとMOSFET2個を使って自動で書き込みができるようにする回路がある。

image.png

このMOSFETでやっていることをシリアル変換ICの内部でやってくれたらいいのに、と考えて調べたら、CH340XというICならそれができるという情報を見つけて、試してみることにした。

ここらへんの情報から、次のような回路で使えそうなことがわかった。

image.png
(R4は4.7kΩ)

データシート↓

ちなみに、今回のESP32とはBOOTピンの論理が逆になっているマイコンについては、DTRピンを4.7kΩでプルダウンすればいいらしい。

ということで、AliExpressのWCH公式ストアから購入してみた。

2026-02-03購入、2026-02-10到着。

購入時点で1,636円/20個だった。

4840.jpg
4841.jpg
4849.jpg

検証

検証には、部室に転がっていたESP32-WROVER-Eの開発ボードを使った。

自分は開発環境としてPlatformIO Coreを使っている。その設定やファイルは以下のようにした。

.
├── platformio.ini
└── src
    └── main.cpp

2 directories, 2 files
platformio.ini
[env:main]
platform = espressif32
framework = arduino
board=esp-wrover-kit
targets=upload
monitor_speed = 115200
src/main.cpp
#include <Arduino.h>

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.println("hello, world");
  delay(1000);
}

前述の回路で書き込みをしたところ、問題なく自動で書き込むことができた。

WindowsとLinuxで同じファイルを用意して書き込みを行なったが、後述の通り自分のLinux環境ではすこし詰まった。

また、74thさんの記事では、シリアルモニターで見ようとするとRTS(=EN)ピンとDTR(=IO0)ピンがLOWのままになってESP32が起動しないという問題が示されていたが、自分が使っているPlatformIOのpio device monitorというコマンドでは、RTS, DTRそれぞれを明示的にinactiveにすることができるため、その問題を回避できた。

pio device monitor --rts 0 --dtr 0

platformio.iniに以下のように書いておけば、毎回オプションを指定しなくてもよい。

ini:platformio.ini
[env:main]
platform = espressif32
framework = arduino
board=esp-wrover-kit
targets=upload
monitor_speed = 115200
+monitor_rts = 0
+monitor_dtr = 0

LinuxでUSBが接続と切断を繰り返す

これはCH340Xの機能に直接関係ないが、自分のArchLinux環境で発生して数時間悩んだので、備忘録として残しておく。

なぜか自分のArchLinuxでは、CH340Xを認識してから数秒後に切断され、それからまた接続され、それ以降も切断と接続を繰り返すという無限ループが発生していた。

dmesgを確認しても、とくにエラーもなく、原因がわからず困っていたが、結論としてはusbcoreautosuspendによるものだった。

対策として、以下のようなudevルールを追加した。

/etc/udev/rules.d/99-ch340-disable-autosuspend.rules
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1a86", ATTR{idProduct}=="7523", TEST=="power/control", ATTR{power/autosuspend}="-1"

udevルールを適用したら、勝手にUSBが切断されることはなくなった。

sudo udevadm control --reload-rules
sudo udevadm trigger

結論

CH340Xには次のようなメリットがあった:

  • 抵抗1個だけで自動書き込みの回路が作れる
  • パッケージが小さい
  • 値段も安い(1個100円以下)

逆に、多少の欠点もある:

  • 入手性が微妙
  • シリアルモニターを使うには、RTS, DTRを制御できるソフトウェアが必要

入手性については、今回購入したAliExpressの他に、LCSCでも取り扱われているようだ。

もっとこのICの知名度が上がって秋月電子などで購入できるようになればいいなと思う。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?