ESP-IDFを使ってみる

ESP32-C3開発ボード

2020年にESP32-C3が発表されました。
データシートがこ ちらに公開されていますが、CPUコアがXtensaからRISC-Vに変わっています。
また、ESP32が48ピンのCore、ESP32-S2が56ピンのCoreですが、ESP32-C3は32ピンとCoreのピン数が少なく なっていま す。

2021年の7月にようやく開発ボードを入手しました。
どちらもフルカラーLEDが付いていて、RGBがIO3、IO4、IO5に繋がっています。
レギュレータはAMS1117ではなく、CJT1117Bという互換製品が使われています。


ESP32-C3Sのボードの裏面のシルク印刷にはIO19が2か所あります。
IO10の1つ上はIO9の間違いです。
使えるGPIOはIO0からIO10、IO18、IO19の13本です。
ESP32はGPIO01がU0_TXD、GPIO03がU0_RTXですが、ESP32-C3はGPIO20がU0_TXD、GPIO21が U0_RTXなので、
GPIO01とGPIO03は普通のGPIOとして使えます。
CoreからはGPIO11からGPIO17も出ていますが、これらはSPI Flashとの接続に使われています。

- GPIO0-10 GPIO
- GPIO11-17 SPI Flashとの接続
- GPIO18-19 GPIO、またはUSB シリアル/JTAG コントローラー
- GPIO20-21 UART

ESP32やESP32-S2に比べ、13本のGPIOは少なく感じますが、普通の用途であれば13本あれば十分です。


どちらのボードにもこの様なファームが最初から書き込まれていました。




コアがXtensaからRISC-Vに変わりました。
こちらのコー ドで、真面目にベンチマークを計ってみました。
160MHzの結果を一覧にすると、このようになります。
Dhrystone(整数演算能力)はESP32よりも高いことが分かりました。

Dhrystone(MIPS) Whetstones(MIPS)
ESP8266@160 57 6.2
ESP32@160 142 9.1
ESP32S2@160 95 8.3
ESP32S3@160 142 10.0
ESP32C3@160 167 8.3



esp-idfにはESP32-S2やESP32-C3専用のサンプルコードが幾つか付属しています。
これを見る限り、ESP32-C3だけで利用できる機能はBluetooth5だけです。
$ grep -rn  "Supported Targets" * | grep ESP32-C3 | grep -v "ESP32 "
bluetooth/bluedroid/ble_50/peroidic_adv/README.md:1:| Supported Targets | ESP32-C3 |
bluetooth/bluedroid/ble_50/ble50_security_server/README.md:1:| Supported Targets | ESP32-C3 |
bluetooth/bluedroid/ble_50/peroidic_sync/README.md:1:| Supported Targets | ESP32-C3 |
bluetooth/bluedroid/ble_50/multi-adv/README.md:1:| Supported Targets | ESP32-C3 |
bluetooth/bluedroid/ble_50/ble50_security_client/README.md:1:| Supported Targets | ESP32-C3 |
peripherals/rmt/musical_buzzer/README.md:1:| Supported Targets | ESP32-S2 | ESP32-C3 |
peripherals/temp_sensor/README.md:1:| Supported Targets | ESP32-S2 | ESP32-C3 |
peripherals/adc/esp32c3/adc/README.md:1:| Supported Targets | ESP32-C3 |
protocols/mqtt/ssl_ds/README.md:1:| Supported Targets | ESP32-S2 | ESP32-C3 |
wifi/ftm/README.md:1:| Supported Targets | ESP32-S2 | ESP32-C3 |



既存のアプリをいくつかESP32-C3で動かしてみました。
少しだけはまりどころが有ります。

ESP32-C3の開発ボードには2M Flashのモデルと4M Flashのモデルが有ります。
4Mの設定のままで、2M Flashのモデルでビルドすると以下の様にabortします。
aaa

memuconfigでFlash sizeを変更する必要が有ります。



ESP32-C3Sが使われている開発ボードでは、以下のエラーでabortしました。


こちらもmemnuconfigでSupported Revisionを変える必要が有ります。


これらの開発ボードではなぜかGPIO06、GPIO08、GPIO09、GPIO19はSPIのクロックピンに使えませんでした。
ESP32-C3のデータシートを見てみましたが理由が分からないので、この開発ボードだけの制限かもしれません。
SPIのMISOには制限は有りませんでした。どのGPIOも使えました。



こちらの開発ボードにはAi ThinkerのESP-C3-13の2Mモジュールが使われています。


ESP-C3-13はESP-WROOM-02(ESP13)と同じフォームファクターのモジュールです。
ESP-WROOM-02用のピッチ変換基盤が使えます。


フォームファクターは同じですが、ピンアサインは違っています。


ピンアサインを比べるとこの様になります。
3V3、EN、GND、TXD、RXDの位置だけは同じです。


IO8をPullUp、IO9をPullDownにした状態でリセットすると書き込みモードになります。
IO9をPullUPした状態でリセットすると、IO8の状態に関係なくSPI Flashから起動します。
IO9はSoC内部でPullUpされているので、オープンにするとPullUpとなります。
ENはPullUpされていないので、リセット回路を構成する際にはPullUpしておく必要があります。
IO8は常にPullUpしていても問題ありません。
Pin Default SPI Start up mode Download Start up mode
IO8 Non (Don't care) PullUp
IO9 PullUp PullUp PullDown

2021年8月時点で以下の4種類のESP-C3-13が入手可能です。
C3FN4には4M Flashが内蔵されています。
C3-2Mには外付けの2M Flashがハウジングされています。


aitendoのピッチ変換基盤にマウントしてみました。
PullUp、PullDown抵抗は4つで済みます。
SPI CLOCKピンの制限ですが、GPIO6、GPIO8、GPIO9、GPIO19も問題なく使えました。
ESP-IDFのIssuesを検索しても、見つからなかったので開発ボード固有の問題の様です。





こちらはESP-C3-12Fが使われている開発ボードです。
どちらもフルカラーLEDが付いていて、RGBがIO3、IO4、IO5に繋がっています。


裏面のマーキングはどちらも同じですが、ピンのマーキングが見事に間違っています。
GPIO-->繋がっているピンヘッダー
GPIO0-->右側の下から3番目のNC
GPIO1-->GPIO0
GPIO18-->GPIO19
GPIO19-->GPIO18
GPIO9-->GPIO10
GPIO10-->GPIO9


2021年8月時点で2種類のESP-C3-12Fが入手できます。
こちらのボードにはC3コアが使われています。
C3コアはFlashを内蔵していないので、外付けの2M Flashがハウジングされています。


こちらのボードにはC3FN4コアが使われています。
C3FN4コアには4M Flashが内蔵されています。


ESP-C3-12FはESP-12と同じフォームファクターのモジュールです。
ESP-12用のピッチ変換基盤が使えます。


フォームファクターは同じですが、ピンアサインは違っています。


ピンアサインを比べるとこの様になります。
3V3、EN、GND、TXD、RXDの位置だけは同じです。
IO6、IO7以外の下側のピンは何処にも繋がっていません。


aitendoのピッチ変換基盤にマウントしてみました。
右側は同じフォームファクターのESP-12です。
ESP-12には有るオンボードLEDは、ESP-C3-F12には有りません。


欠けている場所にはIPEXアンテナコネクターを付けることができます。


ESP12に比べ、PullUp、PullDownの抵抗の数は減ります。




2021年10月にM5Stamp C3 Mateという製品が発売されました。
ESP32-C3FH4のSoCを中心に、SY8003のSTEP DOWN レギュレータと、USB-TTL変換を組み合わせた製品です。
SK6812のFull Color LED、ピンヘッダーやGrove Connectorもついて、大体1000円ぐらいで購入できます。
こ ちらにSchematicsが公開されています。
USB-TTL変換チップがCH9102Fという、今まで聞いたことが無いチップです。
こちらにCH9102Fドライバーのイン ストール方法が 紹介されています。



2022年1月にM5Stamp C3U Mateという製品が発売されました。
switch-scienceのページを見ると、以下の記載が有ります。
M5Stamp C3との違い

"C3U"はUSB変換ICが省略されました。USB type Cポートから直接ESP32-C3に接続されており、ESP32-C3に組み込まれているUSBシリアル機能でプログラム書き込みを行います。

こ ちらに回路図が公開されていますが、ESP32-C3のGPIO18とGPIO19をUSBとして使っています。
この機能はUSB Serial/JTAG Controller Consoleと呼ばれ、こ ちらに公式のドキュメントが公開されています。



LuatOSブランドのチープなESP32-C3開発ボードを入手しました。
ESP32-C3チップが直付けされています。
ベンダーの製品ページがこちらに有り ますが全て中国語です。
価格は上のボードが$2.24+送料、下のボードが$1.82+送料と格安です。
ESP8266のNodeMCUボードが$1.75+送料程度なので、ほとんど価格差は有りません。
この価格差であれば、ESP8266を選ぶ理由はもうありません。


上のボードはUSB-TTL変換チップとしてQinHeng Electronicsの変換チップが使われています。
変換チップのマーキングは「343PB49」です。udevadmで調べるとこの様に表示されます。
ネットで調べましたが、明確な情報は得られませんでした。
マーキングから推測すると、CH343互換チップだと思います。
$ sudo udevadm info -q property -n /dev/ttyACM0
DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.1/1-1.1:1.0/tty/ttyACM0
DEVNAME=/dev/ttyACM0
MAJOR=166
MINOR=0
SUBSYSTEM=tty
USEC_INITIALIZED=21090753
ID_BUS=usb
ID_VENDOR_ID=1a86
ID_MODEL_ID=55d3
ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
ID_PCI_INTERFACE_FROM_DATABASE=EHCI
ID_VENDOR_FROM_DATABASE=QinHeng Electronics
ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB EHCI
ID_VENDOR=1a86
ID_VENDOR_ENC=1a86
ID_MODEL=USB_Single_Serial
ID_MODEL_ENC=USB\x20Single\x20Serial
ID_REVISION=0443
ID_SERIAL=1a86_USB_Single_Serial_544C001139
ID_SERIAL_SHORT=544C001139
ID_TYPE=generic
ID_USB_INTERFACES=:020201:0a0000:
ID_USB_INTERFACE_NUM=00
ID_USB_DRIVER=cdc_acm
ID_USB_CLASS_FROM_DATABASE=Communications
ID_PATH=pci-0000:00:1a.0-usb-0:1.1:1.0
ID_PATH_TAG=pci-0000_00_1a_0-usb-0_1_1_1_0
ID_MM_CANDIDATE=1
DEVLINKS=/dev/serial/by-path/pci-0000:00:1a.0-usb-0:1.1:1.0 /dev/serial/by-id/usb-1a86_USB_Single_Serial_544C001139-if00
TAGS=:systemd:

下のボードはM5Stamp C3U Mateと同様に、USB-TTL変換チップが省略されていて、ESP32-C3のGPIO18とGPIO19をUSBとして使っています。
USBコネクターはどちらもType-Cが使われています。
レギュレータはH7211-33M5Rで300mAまで流せるみたいです。

裏は同じマーキングです。


ESP32搭載の開発ボードと比べるとずいぶん小さいことが分かります。


コアはFlashが内蔵されていないESP32-C3です。
こ ちらに変換チップ付きの回路図、こ ちらに変換チップ無しの回路図が公開されています。
この類のボードで回路図が公開されているのは、なかなか珍しいです。
Flashとの接続はSPICS0(GPIO14)、SPICLK(GPIO15)、SPID(GPIO16)、SPIQ(GPIO17)の4線 だけで、
FlashのSPIHD(Hold Input)とSPIWP(Write Protect Input)は3.3V直結です。
その結果、本来はこれらの用途に使われるGPIO12、GPIO13と、Flashへの電源供給に使われるGPIO11はFreeに使えます。
GPIO12とGPIO13はオンボードLEDに繋がっています。

マウントされているFlashの形状が明らかに違います。
上のボードにはMACRONIXのMX25L3233F(32Mbit)、下のボードにはTsingTengのTH25Q- 32HA(32Mbit)が使われています。
SPI Flashは規格が厳密に規定されているので、出荷時期やロット、Flashチップの価格により、採用されるFlashチップは変わるのだと思います。

なんとなく、はんだの付き方がFlashだけは手作業のような気がします。
Flashチップの足の長さが違うので、チップマウンターを使った自動マウントができなかったのでしょうか?


Linuxマシンに接続すると、どちらも/dev/ttyACM0として認識します。
lsusbでデバイス情報を表示するとこの様になります。
こ ちらにttyUSBとttyACMの違いが公開されています。
どうもttyUSBとttyACMは、モデム関連の機能が違うことを示しているみたいです。
$ lsusb

Bus 001 Device 028: ID 1a86:55d3 QinHeng Electronics


Bus 001 Device 027: ID 303a:1001

変換チップが無いボードでは、GPIO18とGPIO19をUSBとして使うので、これらをオープンにしておかないと書き込みができません。
いくつかサンプルコードを書き込んでみましたが、問題なく使えます。

気になっていたGPIO18とGPIO19ですが、変換チップが有るボードでは普通のGPIOとして使えます。
これらのGPIOに対するLチカコードが動きます。
変換チップが無いボードでは、普通のGPIOとして使えません。
GPIO18、GPIO19をLチカしてみましたが、正しく動きません。
また、GPIO18、GPIO19をLチカするファームを書き込むと、手動でBOOTスイッチを切り替えないと、書き込みが出来なくなります。
汎用的に作るならば、ESP32-C3でGPIO18とGPIO19は使わない方がいいです。

変換チップが有るボードではMonitor実行中にRESETボタンを押すと、再度Monitorが起動しますが、
変換チップが無いボードではMonitor実行中にRESETボタンを押すと、Monitorが止まってしまいます。
変換チップの有無で価格は$0.4ぐらいしか変わらないので、変換チップ有りがお勧めです。



少し変わったESP32-C3開発ボードを入手しました。
使われているSoCはESP32-C3-MINI-1です。
写真の様にTYPE-Cのポートが2つ付いています。
上側のポートはCH340Kに繋がっていて、ttyUSB0として認識されます。
下側のポートは直接、ESP32-C3のGPIO18/19に繋がっていて、ttyACM0として認識されます。
上側のポートも下側のポートも、どちらも同じ内容がロギング出力されるので、片方を通信ポートとして使うことはできません。
フルカラーLEDはWS2812でGPIO8に繋がっています。
単純なGPIOのON/OFFでは制御できません。ドライバーが必要です。
WS2812のドライバーはこ ちらに公開されています。
コンポーネントライブラリとして追加することができます。


幅は結構広いです。




ものすごく小さなESP32-C3開発ボードを入手しました。
基板サイズは18.00x22.52mmの完全に切手サイズです。
MCUはFlash内蔵のESP32-C3FN4、レギュレータはME6211(500mA)が使われています。、
標準的なESP32開発ボードの半分以下の大きさしかありません。
M5Stamp C3U Mateと同様に、TTL-USB変換チップは使わずに、GPIO18とGPIO19をUSBとして使っています。
ESP32 S2-Miniボードと違って、ちゃんとシリアルモニターが使えます。


裏にはESP32 Super Miniと言うロゴが印刷されています。
GPIOはIO00-IO10、IO20-21と、ESP32C3が持っている全てのGPIOが使えます。
電源関係は5V、GND、3.3Vがそれぞれ1ピンだけ出ています。




こちらに ESP32-C3ベースのスマートスイッチの紹介ページが有ります。
このページの下の方に、ESP32-C3 SoCの比較表が有りますが、
ESP32-C3 SoCのVriantsとして、ESP8685H2が掲載されてます。

ESP8684とESP8685の違いがこちらに紹介 されています。
この記事によると、ESP8685はESP32-C3F2とソフトウェア的に同じで、
ESP-IDFの「esp32c3」ターゲットを使用してソフトウェアをコンパイルできると書かれています。

ESP8685はESP32-C3のバリエーションの様ですが、なぜか名前にESP32が付きません。
2022年1月時点で、こち らのページでは既にMass Productionとなっています。
こ ち らのページからESP32-C3とESP8685だけを抜き出してみました。
ESP32-C3と比べると、GPIOが22→15になっています。
name mpn status type wifi bluetooth operatingTemp gpio flash sram rom psram freq dimensions spq moq
ESP32-C3 ESP32-C3 Mass Production SoC IEEE 802.11 b/g/n; 2.4 GHz; HT20/40; up to 150 Mbps Bluetooth LE v5.0 -40 ~ 105 22 0 400 384 0 160 QFN32 (5*5) 5000 5000
ESP32-C3 ESP32-C3FN4 Mass Production SoC IEEE 802.11 b/g/n; 2.4 GHz; HT20/40; up to 150 Mbps Bluetooth LE v5.0 -40 ~ 85 22 4 400 384 0 160 QFN32 (5*5) 5000 5000
ESP32-C3 ESP32-C3FH4 Mass Production SoC IEEE 802.11 b/g/n; 2.4 GHz; HT20/40; up to 150 Mbps Bluetooth LE v5.0 -40 ~ 105 22 4 400 384 0 160 QFN32 (5*5) 5000 5000
ESP8685 ESP8685H2 Mass Production SoC IEEE 802.11 b/g/n; 2.4 GHz; HT20/40; up to 150 Mbps Bluetooth LE v5.0 -40 ~ 105 15 2 400 384 0 160 QFN28 (4*4) 5000 5000


ESP32-C3のGPIOは以下の様にアサインされています。
- GPIO0-10 GPIO
- GPIO11-17 Exrternal SPI Flashとの接続専用 おそらくFモデルでは未使用
- GPIO18-19 GPIO、またはUSB
- GPIO20-21 UART
GPIO11-17は、External SPI Flashとの接続専用になっていて、
ピンの名前はGPIOnではなく、VDD_SPI/SPIHD/SPIWP/SPICS0/SPICLK/SPID/SPIQとなっています。
ESP32-C3Fモデル(FはEmbedded Flashを示す)は、既にSPI Flashをコア内にビルトインしています。
(おそらく)これらのモデルでは、ビルトインFlashとの接続にGPIO11-17を使っていません。

ESP8685のデータシートがこ ちらに公開されてます。
ESP8685のGPIOは以下の様にアサインされていて、GPIO11-17が有りません。
- GPIO0-10 GPIO
- GPIO18-19 GPIO、またはUSB
- GPIO20-21 UART

ESP8685のデータシートを注意深く見てみると、SoCから出ているピンの数がESP32-C3とは違っていました。
これがチップサイズ(ダイサイズ)の違いになっています。
ダイサイズが5x5から4x4になると、同じ面積でより多くのチップが取れるので、それだけコストダウンになります。
ESP32-C3:32ピンで、External SPI Flashとの接続ピン(GPIO11-17)がSocから出ています。
ESP8685:28ピンで、External SPI Flashとの接続ピンは有りません。

GPIO11-17(Exrternal SPI Flashとの接続専用)は使い道が無いので、ESP8685ではこれらが削除された様です。
2021年12月27日に、ESP8685­-WROOM­-03のデータシートがこ ちらに公開されました。
2022年2月の時点で、ESP8685を使った開発ボードやSoCモジュールはまだ入手できません。

こ ちらにESP32-C3のSPI Master Driverに関する仕様が公開されています。
ESP32-C3は3つのSPI-BUS(SPI0 SPI1 SPI2)を持っています。
SPI0 と SPI1 は、ESP32-C3 に取り付けられたフラッシュ メモリにアクセスするために内部で使用されます。
両方のコントローラーは同じ SPI バス信号を共有し、どちらがバスにアクセスできるかを決定するアービターがあります。
現在、SPI マスター ドライバーは SPI1 バスをサポートしていません。
SPI2は汎用SPIコントローラーです。バスには、最大6つのSPIスレーブを駆動するための6つのCSラインがあります。
その結果、合計、6台までのSPI SlaveをHardware CSを使って制御することができますが、
これを超えるときは、Hardware CSではなく、Software CSを使う(要するに自分でCSのGPIOをHigh/Lowに切り替える)必要が有ります。
ESP32やESP32S2と違って、SPI3を使うことはできません。
ESP32-C3もESP8685も、SPI Master Driverの仕様は同じ仕様です。

こ ちらにESP8685-WROOM-01のデータシートが公開されています。
また、こ ちらにESP8685­-WROOM­-04のデータシートが公開されています。
フォームファクターを見ると完全にESP12シリーズと同じ様です。


こちらに ESP32-C3の製品情報が公開されています。
ESP32-C3 SoCsとしてESP8686が登場しています。
2024年5月時点で、こちらの製 品一覧には、まだESP8686は有りません。

続く....