はじめに
最近、ESP32を使った電子工作にハマったので、いくつかガラクタを作ってみた経験をもとにESP32を使ったおおまかな電子工作のやり方を紹介しようと思う
ESP32とは
ESP32シリーズとはEspressif Systemsという中国の会社が開発しているマイコンのシリーズである。WiFiまたはBluetoothモジュールを搭載したマイコンが多く、これらを使うと簡単に周辺機器と接続して何かをする電子工作を作ることができる。
以前はUART経由でのみプログラムの書き込みの可能なモデルがほとんどだった(と思われるが)、最近はUSB経由で直接パソコン等と接続してプログラムの書き込みのできるモデルがかなり増えてきた。
ほとんどのESP32シリーズはArduino UNOほどflash領域が少ないわけでもないし、UARTやSPI、I2C等の主要な通信プロトコルにも対応しているし、PWMやADC等も搭載している。(DACは搭載していなさそう)
前置きはこれぐらいにして。。。
ハード設計
マイコン選定
ESP32はいくつかモデルがあり、それぞれ特徴がある。(投稿者の主観だとこんな感じ)
| モデル | 特徴 |
|---|---|
| ESP32-S | 高性能、カメラモジュールの接続やエッジコンピューティングをしたい人向け |
| ESP32-C | Sシリーズよりは低性能だが、低消費電力でありつつWiFiとBluetoothを搭載 |
| ESP32-H | 無線はBluetoothのみだがCシリーズよりさらに低消費電力とのこと |
| ESP32 | 流行り始めた初期からあるモデル、多分一番設計資産が多くコミュニティが大きそう |
投稿者は主にESP32-CシリーズやHシリーズの新しめの型番(ESP32-C3やESP32-H2)を使うことが多い。それはUSBから直接プログラムの書き込みが出来るからである。(UART経由の場合はUSB-UART変換回路等を別途用意する必要があり面倒だなと)
以下のような電子工作は大抵CシリーズかHシリーズで事足りるだろう。投稿者もこれに毛が生えた程度の工作しかしてない。
- エルチカ
- ちょっとしたモジュールの制御 (液晶モジュール、センサーモジュール等)
回路設計
ここでは主にCシリーズやHシリーズに適用出来るようなESP周りの回路設計を紹介する。
(そんなものはいらん、出来合いの開発ボードがあれば良いじゃねえかっていう人はブラウザバック推奨)
ピンアサイン
CシリーズやHシリーズは水晶発信器も内蔵している型番が多く(全てかどうかは分からないので要確認)、基本的には最低限以下を適切に接続すればとりあえず動くハズ。(投稿者の環境では動いています)
以下はESP32-H2-MINI-1という型番のピンアサインだが、シリーズや型番によって微妙にピンアサインが異なるので注意。
また、この型番はBGAのようなパッケージなのでクリームハンダとホットプレートが無いと実装ができない。

こちらはESP32-C3-WROOM-02というモデルだが、ピンのパッドがパッケージの側面に出ているタイプなのではんだごてを使って実装が出来なくもないかも。

話を戻して、ESP32-H2-MINI-1のピンアサインの詳細はこんな感じ。↓
特にSPIの表記が分かりにくいが、通常の4線SPIに置き換えるとそれぞれ以下に対応している。
(多分Quad SPI表記?)
| ペリフェラル表記 | 4線SPI |
|---|---|
| FSPICLK | SPI CLK |
| FSPID | SPI MOSI |
| FSPIQ | SPI MISO |
| FSPICSx | SPI CS |
その他I2CやPWM、GPIO等のペリフェラルはある程度自由にアサインができる模様。だが、ADCや水晶発信子(32.768kHz)、UART、SPI、USB等はアサインできるピンが固定だったり限られていたりするようなので注意。
ENピン (リセットピン)
他のマイコンでもそうだが、ENピン(リセットピン)周りは適切に設計する必要がある。(仰々しく複雑な回路を組む必要はないが、おろそかにするとまともに起動しない場合もあるかも)
ESP32の場合はENピン外部から電源電圧等でpull-upしてあげる必要があり、以下の通りPower-upシーケンスになるように設計をしなければならない。(論理はもちろんLow active)

型番によって微妙に差異があるかもしれないが、ESP32-H2-MINI-1の場合は電源電圧が立ち上がってからtSTBL = 50us最低でも待つ必要がある。
プルアップ抵抗を10kΩ、GND間に接続するコンデンサを0.1u - 1uF程度にすればまあ余裕でこの条件を満たすと思う。
↓回路的にはこんな感じ。この例では非実装としているが、リセットICも一応入れている(❌印)。
鉄則だと思うが、GND間に適当に小さなスイッチを入れておくと手動でもリセットができて便利。

boot selectピン
ESP32 は2つboot select pinがある。
ESP32-HシリーズではGPI08とGPIO9がboot Select ピントして割り当てられている。(シリーズによって異なる場合もあるので要確認)
以下の表の通り、起動時のGPIO8と9の状態を制御すると2通りのBoot modeで起動する。
SPI BootモードはESP32に書き込まれたプログラムを起動する(正確には内部にSPI経由で接続されているフラッシュメモリからプログラムを読み出して起動する)。
それに対してJoint Download BootモードはUSBまたはUARTからプログラムをダウンロードして起動するモードである。

まずGPIO8に着目すると、あるべき論理はAny valueまたは1となっている。なので、GPIO8は10kΩ程度でプルアップしておくのが妥当だろう。
一方GPIO9の場合、基本的には論理は1(プルアップ)で問題なさそう。通常起動時とプログラム書き込み時とではGPIO9の論理を1 <-> 0とで切り替えないといけないと思うかもしれないが、少なくともベンダーで推奨している書き込み方法では内蔵されているUSB-Serial-JTAGコントローラが内部的に書き込みモードをJoint Download Bootに切り替えてくれるとのこと。(書き込み方法等は別の記事で紹介予定)だが、色々な要因でたまにこの書き込みモードの切り替えがうまくいかない場合があるとのことなので、手動でLow activeにするスイッチは一応つけたほうが良いだろう。
↓回路としてはこんな感じ

電源ピン
他社のマイコンにもよくあるが、電源ピンは通常の3.3Vの他にバッテリー供給用(と思われる)のVBATというピンもある。だが、少なくともESP32-HシリーズやCシリーズの場合は金属製のシールドの内部で二つの電源ピンは0Ωのジャンパ抵抗で直結されているとのこと。VBATピンの存在意義がわからないが、3.3V電源の供給は3.3Vピンにのみ供給すれば良いだろう。
↓回路としてはこんな感じ。調べてみるとESPモジュールの内部にも3.3V - GND間のパスコンが入っているらしいとのことであるが、安定動作のために追加でパスコンを接続しても問題ないだろう。

USB
USBは2.0 Full-Speed(12Mbps)まで対応している。ESP側はUSBのピンアサインが特定のピンに固定されていることに注意して、+/-を間違えないように配線すれば問題ないだろう。

USB端子側はある程度ちゃんと設計したほうが良いと思われる。適当に設計しても動く場合があるかもしないけど。 投稿者はだいたい以下の点を押さえて設計している:
- ESD対策用のバリスタ(RV1, RV2)をUSB+/-とGND間に接続
- 回路のGNDとUSBコネクタのシャーシGND(UGND)間をフェライトビーズ(FB1)と1MΩ(R35)で接続
→ シャーシとGND間を接続しつつ、高周波ノイズをカット - VBUSの経路上にポリスイッチ(F1)を配置(500mA程度で落ちる型番を使用)
- CC1, CC2端子には5.1kΩ(R28, R30)を接続
→ PDのネゴシエーションをする端子であり、5.1kΩを接続しないとVBUSから電圧が正しく供給されない場合があるとのこと - USB+/-の経路上に22Ωのダンピング抵抗(R29, R31)を配置
ちなみに、VBUSは5V -> 3.3V変換回路に接続するなどしてESP32用の電源を用意するのも良いだろう。
↓この例はお高いスイッチングレギュレータを使っているが、100〜300円程度で買えるスイッチングレギュレータも普通に売っていたりするのでそれらを使って回路を組んでも良いと思う

。
ここまで回路を設計するとUSB電源でESPを駆動したり、USBからプログラムを書き込んだりできるような回路図が出来上がる。
その他
SPI, I2C, PWM等、使いたい場合はデータシート等を見ながら設計をする。
上述の説明や画像は以下ドキュメントから引用したもの。
↓ESP32-H2-MINI-1のデータシート
基板設計
ここでは基板設計で特筆すべきことを紹介する
ESP32周辺
例として、ESP32-H2-MINI-1を使用した場合の基板パターンはこんな感じ。
Antenna Areaと書いてある部分はアンテナが内蔵されている部分と重なるのでパターンを避けたほうが良い領域(GNDベタも含めて)。KiCadで用意されているフットプリントでは、そのエリアが禁止領域になっているので間違って配置せずに済む。
また、このモデルはBGAのように端子が全てチップの裏側に配置されているSMDパッケージである。実装するにはクリームハンダとホットプレートもしくはヒートガンがほぼ必須。JLCPCB等に基板の注文をする際にはクリームハンダをきれいに塗るためのステンシルも注文したほうが良いだろう。
端子の大きさやピッチも小さく、0.2〜0.3mmぐらいの幅の配線がちょうど良い感じ。以下の例では基板代をケチるために、無理やり2層基板にパターンを詰め込んでいるが、ちゃんとしたものを作りたいなら4層以上が良いと思う。

USB周辺
USB周辺はこんな感じ。この例では黄色で示したUSB+/-のパターンがなるべく短くなるように配置配線している。なるべく短くするのが難しい場合は、USB+/-の両端はGNDベタで囲むのが定石だろう。(Full Speed 12Mbpsなのであまり神経質にならなくても良いかもしれないが)
その他VBUSやGNDは消費電流を意識して適切な太さにすると良いだろう。

その他
Boot SelectやENピン周りの回路(スイッチ等)は特筆すべきことがあまりないので省略ということで。。。
最後に
ここまで延々と書いたけど、秋月でも売ってるこんな感じの開発ボードを買えばこんなことやらずとも全て事足ります。
↓ESP32-H2-MINI-1の開発ボード

基板の寸法やコンセプトやあらゆるものを自分で全て自由に設計したい人はやってみても良いかもしれません。
あと、この続きの後編ということで環境構築/プログラミングに関する内容の記事も近々公開しようと思います。

