ESP32-C3-WROOMを最小限の回路で開発する
ESP32-C3
ESP32-C3はESP32シリーズの廉価モデルで、アンテナ内蔵のモジュールを300円程度で購入することができます。普通のESP32と比べ機能やIOピンは少ないですが、WiFi, Bluetoothはもちろん、ESP32にはないUSBもあるので個人的に重宝しています。
とはいえ、様々な部品の付いた開発ボードとなると1000円以上はするので、IoT用にたくさん使うとなるとやはりモジュールを直接使いたいものです。
ということで、ESP32-C3のモジュールESP32-C3-WROOM-02を使う際の回路や書き込み方をまとめました。
配線
ブレッドボードに刺せるよう変換基板を作りました。
頑張ればスズメッキ線をはんだ付けすることもできますが、お試し程度ならともかく常用するにはアレなので
底のGNDパッドは側面のGNDピンと導通しているのではんだ付けしなくても動作します。

電源
電源は他のESP32と同じく3.3Vです。操作ミスでUSBの5Vがかかって1つ壊してしまいました。お気をつけください。
せっかくなので自作のDCDCコンバーターをつかいましたが、三端子レギュレーターでokです。
ESP32よりは省電力ですが、それでもWiFiを使うときは瞬間的にかなりの電流が流れるので容量の大きいコンデンサを接続しておくことをおすすめします。
USB
ESP32-C3はUSBに対応しており、書き込みやシリアル出力をUSB経由で行えるのでUSBシリアル変換ICは不要です。
配線はUSBコネクタとESP32-C3のDP/DMを繋げるだけ。まぁ簡単!
USB-Cコネクタのブレークアウト基板データは↓で公開しています。
https://git.moris.day/moris/BreakoutBoards/src/branch/main/USB-C
起動
ENピンをHIGHにすることで起動します。内部プルアップされていないので、プルアップ抵抗を接続する必要があります。
書き込みモード
起動時に特定のピンをLOW/HIGHにすることで起動モードを変更することができます。
データシートにはSPI boot modeやJoint download boot modeと書かれていますが、要するに通常モードと書き込みモードということです。
内部のUSB-JTAGコントローラーがチップを自動的に書き込みモードにしてくれるので基本的に操作は不要ですが、初回書き込み時やコントローラーが無効になっているときは手動でモードを切り替える必要があります。
| 通常モード | 書き込みモード | default | |
|---|---|---|---|
| IO8 | Any | 1 | float |
| IO9 | 1 | 0 | pull-up |
また、不具合のためIO2もプルアップすることが推奨されています。
まとめると、EN, IO2, IO8をプルアップして、書き込むときはIO9をGNDに接続すればいいです。
回路図
┌────USB────┐ ┌───ESP32-C3───┐
│ DP ├───────────────────────────┤ DP │
│ DM ├───────────────────────────┤ DM │
│ │ ┌─────────┐ │ │
│ VBUS ├────┤VIN 3.3V├──┬─────────┤ 3.3V │
│ GND │ │ GND │ ├──10kΩ───┤ IO2 │
└─────┬─────┘ └────┬────┘ ├──10kΩ───┤ IO8 │
│ │ └──10kΩ─┬─┤ EN IO9 ├──Switch──┐
GND GND │ └───────┬──────┘ │
Switch │ GND
│ GND
GND

(ENをプルアップさえすれば起動はするっぽいが)
書き込み
回路ができたので、Arduino IDEで書き込みしてみます。
まず、Arduinoの設定から追加のボードマネージャのURLに次のURLを追加します。
https://espressif.github.io/arduino-esp32/package_esp32_index.json
次にサイドバーのボードマネージャでesp32と検索して、esp32 by Espressifをインストールします。
PCと接続したら、IO9のスイッチを押しながらENのスイッチをオンオフして書き込みモードにします。(初回のみ)
ポートを確認するため、ターミナルでls /dev/を実行すると、Linuxでは/dev/ttyACM0、macでは/dev/cu.usbmodem101として認識されていました。
Arduinoのツールから
- ボード →
ESP32C3 Dev Module - ポート → 先程確認したもの
- USB CDC On Boot → Enable
と設定します
テストコード
#define LED_PIN 0
void setup() {
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(LED_PIN, HIGH);
delay(500);
digitalWrite(LED_PIN, LOW);
delay(500);
static int count = 0;
Serial.println(count++);
}
Note
Linuxで権限により書き込みできないときはsudo usermod -aG dialout $USER