↑ 過去に、ESP32-WROOM、ESP32-WROVER、ESP32-S3-WROOM に対応したマルチ書き込みボードを作成しました。
最近になって、ネイティブUSBの機能を必要としない場合は、ESP32-C3 を使う場面が増えました。安価で、消費電力が少なく 使い勝手がいいと思っています。
そこで、今回は、ESP32-C3-WROOM-02 用の 書き込みボードを作成しました。
ESP32-C3-WROOM-02 は、1.5mmピッチということで、ユニバーサル基板やピンヘッダーの入手が課題です。(1.27mmピッチのものより入手性が悪い。)
◆ 今回使用した部材
- 1.5mmピッチ ユニバーサル基板
↓ここで見つけました
60x80mm 1.5x1.5mmピッチ 両面ユニバーサル基板(1枚 790円(税込))
- 1.5mmピッチ ピンヘッダー
通常のピンヘッダーのピンでは太すぎてユニバーサル基板に刺せません。
1.5mmピッチ φ0.45 25P ピンヘッダー(1パック5個入り 3,630円(税込))
→あまりにも高価で手が出ません。
そこで、2.54mmピッチ 0.5mm角の細ピンヘッダーで代用。
当然、ピッチが合いませんので、ピンだけを引っこ抜いて使います
◆ 回路図
データシートESP32-C3-WROOM-02 「Figure 9-1. Peripheral Schematics」の回路図を元に、書き込みに必要な部分だけを抜き出して、次の回路図としました。「RESET」「BOOT」スイッチは、手動ダウンロードする場合は必須です。
◆ ユニバーサル基板 配線図
半分に切って 40mm x 60mm とし、次に示す配線図としました。
◆ 完成
今回、抵抗とコンデンサに チップ部品を使い、主に裏面で配線しました。
今回はピンヘッダーとしては使わず ピンだけを使ったため、すべての端子を支えていません。ピン番号 1, 2, 7, 8, 9, 11, 12, 16, 18, の 9本だけで支えました。
今回の工作のために購入したのは、「1.5mmピッチ ユニバーサル基板」のみで、それ以外は 手持ちのパーツを使いました。
2022年12月に購入していた ESP32-C3-WROOM-02-N4 のストックが残り1個となった。当時の価格は310円。今買うと440円。それでもESP32の中でH2に次ぐ安さです。
◆ ボーレートについて
この書き込みボードで、ESP32-C3 の Micropython firmware を 921600bps で書き込もうとしたとき、次のエラーが発生。
$ esptool --chip esp32c3 --port /dev/cu.usbserial-53250003491 --baud 921600 write-flash 0 esp32c3-20230426-v1.20.0.bin
esptool v5.1.0
Connected to ESP32-C3 on /dev/cu.usbserial-53250003491:
Chip type: ESP32-C3 (QFN32) (revision v0.4)
Features: Wi-Fi, BT 5 (LE), Single Core, 160MHz
Crystal frequency: 40MHz
MAC: a0:76:4e:b3:5b:70
Stub flasher running.
Changing baud rate to 921600...
Changed.
Hard resetting via RTS pin...
Traceback (most recent call last):
File "/opt/homebrew/lib/python3.13/site-packages/esptool/__init__.py", line 1173, in _main
main()
~~~~^^
File "/opt/homebrew/lib/python3.13/site-packages/esptool/__init__.py", line 1032, in main
cli(args=args, esp=esp)
~~~^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.13/site-packages/esptool/cli_util.py", line 229, in __call__
return super().__call__(*args, **kwargs)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.13/site-packages/rich_click/rich_command.py", line 402, in __call__
return super().__call__(*args, **kwargs)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.13/site-packages/click/core.py", line 1462, in __call__
return self.main(*args, **kwargs)
~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.13/site-packages/rich_click/rich_command.py", line 216, in main
rv = self.invoke(ctx)
File "/opt/homebrew/lib/python3.13/site-packages/click/core.py", line 1850, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
File "/opt/homebrew/lib/python3.13/site-packages/click/core.py", line 1246, in invoke
return ctx.invoke(self.callback, **ctx.params)
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.13/site-packages/click/core.py", line 814, in invoke
return callback(*args, **kwargs)
File "/opt/homebrew/lib/python3.13/site-packages/click/decorators.py", line 34, in new_func
return f(get_current_context(), *args, **kwargs)
File "/opt/homebrew/lib/python3.13/site-packages/esptool/__init__.py", line 688, in write_flash_cli
attach_flash(ctx.obj["esp"], kwargs.pop("spi_connection", None))
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.13/site-packages/esptool/cmds.py", line 1112, in attach_flash
flash_id = esp.flash_id()
File "/opt/homebrew/lib/python3.13/site-packages/esptool/loader.py", line 1091, in flash_id
self.cache["flash_id"] = self.run_spiflash_command(SPIFLASH_RDID, b"", 24)
~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.13/site-packages/esptool/loader.py", line 1653, in run_spiflash_command
old_spi_usr = self.read_reg(SPI_USR_REG)
File "/opt/homebrew/lib/python3.13/site-packages/esptool/loader.py", line 901, in read_reg
return self.check_command(
~~~~~~~~~~~~~~~~~~^
"read target memory", self.ESP_CMDS["READ_REG"], command, timeout=timeout
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/opt/homebrew/lib/python3.13/site-packages/esptool/loader.py", line 565, in check_command
val, data = self.command(op, data, chk, timeout=timeout)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.13/site-packages/esptool/loader.py", line 495, in command
p = self.read()
File "/opt/homebrew/lib/python3.13/site-packages/esptool/loader.py", line 431, in read
return next(self._slip_reader)
StopIteration
A fatal error occurred: The chip stopped responding.
460800bpsなら問題なく書き込める。
どうやら、ESP32-C3-WROOM-02 の内部クロック(80MHz)から(分周して) 921600bpsという中途半端な高ビットレートを作り出すと 割り切れず誤差が大きいことが原因のようです(460800bpsも割り切れないが、誤差が小さい)。
綺麗に割り切れる、1.5Mbpsや 2Mbpsなら書き込めます。
1,466,928バイトの Micropython firmware の書き込み時間を(timeコマンドで)測定した結果を下表に示す。
| bps | 時間[秒] | 比 |
|---|---|---|
| 460800 | 33.018 | 1 |
| 921600 | エラー | |
| 1500000 | 26.286 | 0.796 |
| 2000000 | 24.639 | 0.746 |
ESP32-C3 に書き込むときは、2Mbpsを指定しましょう。約3割早い。
◆ 次回
ESP32-C3 は、直接USBからの書き込みもできます。これを使えば、ESPダウンローダや USBシリアル変換装置 が不要です(代わり、VBUSの5Vを3.3Vに変換するLDOと、手動ダウンロードさせる「RESET」「BOOT」スイッチが必要)。
次は、今回の ESP32-C3 書き込みボード に USBインターフェイスを追加します。
以上
