ESP32マルチ書き込みボード

これ一つで、ESP32-WROOM、ESP32-WROVER、ESP32-S3にマルチに対応します。

# 0. はじめに

今回は『**ESP32書き込みボードの製作**』（**工作**）の話です。Qiitaにふさわしくないかもしれませんが、興味のある方の参考になればと思いますので、今回はご容赦ください。

# 1. 製作した書き込みボード

↓これが今回自作した書き込みボードです。クレカの半分より小さいぐらいのサイズ感です。

|表|裏|
|:-:|:-:|
|<img alt="IMG_0803.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/62a7fe27-c610-5b39-a60e-47a757bf6555.png">|<img  alt="IMG_0804.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/38b60eb8-b634-7fcb-e1f5-6c36ea43769e.png">|

ユニバーサル基板をベースに、ピンヘッダとその他の数個の部品（抵抗、コンデンサ、タクトスイッチ）をハンダ付けしただけの単純な作りとなっていて、材料費はたった**数百円**です。

後述する既製品のUSBシリアル変換モジュールを6Pソケットに挿して使用します。

このボード一つで、ESP32-WROOM、ESP32-WROVERやESP32-S3にプログラムをダウンロード（書き込み）できます。


# 2. USBシリアル変換モジュール

今回使用するUSBシリアル変換モジュールは、こちらの[ESP32ダウンローダ](https://docs.m5stack.com/en/accessory/esp32_downloader_kit)です。
<img width=200 src="https://akizukidenshi.com/img/goods/L/117240.jpg">
なんと言っても、低価格ながら自動書き込みできる点で、自動書き込みする回路作成に必要な部品代やハンダ付け作業と比較して、これを採用することにしました。このため、自作の書き込みボード自体を単純化することができます。
（ESPダウンローダ：[秋月電子さん](https://akizukidenshi.com/catalog/g/gM-17240/)税込820円、[スイッチサイエンスさん](https://www.switch-science.com/products/7471?variant=42382162460870)税込770円）

USB Type-Cである点も気に入ってます。


# 3. 書き込み装置を自作した経緯

みなさんはどうされているのでしょうか？
<img width=200 src="https://akizukidenshi.com/img/goods/L/115673.jpg">
ESP32を使って開発する場合、ESP32-DevKitCのような開発ボードをブレッドボードに挿して、センサーやLCDをI2CやSPIで接続してプログラムのデバッグやチューニングすると思いますが、
これを完成版にするとき、自分は、高価な開発ボードではなく、ESP32-WROOM-32EなどのESP32モジュールを単体で使っています。
<img width=150 src="https://akizukidenshi.com/img/goods/L/115675.jpg">

ESP32モジュール単体なら、価格は開発ボードの$\frac{1}{4}$程度ですし、開発ボードに乗っているUSBシリアルも不要で ただ電力を無駄に消費するだけですから。

<table style="text-align:center;">
  <caption><b>参考</b>&nbsp;&nbsp;&nbsp; 秋月電子さん税込価格 （<i>価格を保証するものではありません</i>）</caption>
  <thead>
    <tr>
      <th>種類</th> <th>開発ボード</th><th>単体モジュール</th>
    </tr>
  </thead>
  <tr>
    <td>ESP32-WROOM</td><td><a href="https://akizukidenshi.com/catalog/g/gM-15673">ESP32-DevKitC-32E</a>(4MB)<br>¥1,230</td><td><a href="https://akizukidenshi.com/catalog/g/gM-15675/">ESP32-WROOM-32E</a>(16MB)<br>¥360</td>
  </tr>
  <tr>
    <td>ESP32-WROVER</td><td><a href="https://akizukidenshi.com/catalog/g/gM-15674/">ESP32-DevKitC-VE</a>(8MB)<br>￥1,360</td><td><a href="https://akizukidenshi.com/catalog/g/gM-15676/">ESP32-WROVER-E</a>(16MB)<br>¥310（在庫処分特価）</td>
  </tr>
  <tr>
    <td>ESP32-S3</td><td>-</td><td><a href="https://akizukidenshi.com/catalog/g/gM-17256/">ESP32-S3-WROOM-1-N16R8</a><br>¥530</td>
  </tr>
</table>






このため、ESP32モジュール単体にプログラムを書き込むための装置が必要になる訳です。

↓下記の様な**市販品**もあるのですが、（USBシリアル付きのため?）値段が高いのと、ESP32-S3やESP32-WROVERに対応していないので、自分で設計することにしました。

| aitedoさん | 秋月電子さん |
|:-:|:-:|
|税込2,838円<br>[<img width=150 src="https://www.aitendo.com/data/aitendo/product/20171211_bf1a5e.png">](https://www.aitendo.com/product/16508)|税込1,580円<br>[<img width=200 src="https://akizukidenshi.com/img/goods/L/117380.jpg">](https://akizukidenshi.com/catalog/g/gM-17380/)|

     



# 4. ESP32にマルチに対応

今回の書き込みボードの特徴でもある、これ一つで、ESP32-WROOM、ESP32-WROVER、ESP32-S3にマルチに対応できる点ですが、これを可能した最大の理由は、ESP32にプログラムを書き込むために必要な**ピン位置が**、どのモジュールも**同じ**である事です。
![esp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/91a793ea-1f19-2e2a-4d28-84d080b5d7c5.png)

書き込みに使うピンは全部で**6**つ。前述のESP32ダウンローダの**6P**にそのまま対応します。

| ピン名称 | 用途 | ESP32ダウンローダ |
|:-:|:-:|:-:|
| GND  | 電源(-)  | GND  |
| 3V3  | 電源(+)  | 3.3V  |
| EN  | リセット  | EN  |
| IO0  | 起動モード  | G0  |
| RXD0  | シリアル（受信）  | TXD  |
| TXD0  | シリアル（送信）  | RXD  |

さらに、ピンピッチが1.27mm、モジュール幅が18.0mmと**どれも同じ**であることも重要でした。
![esp32-dimm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/1118f1eb-eae7-be79-340f-c125f3ca2f01.png)

~~さらに付け加えると、~~ ピンヘッダに接触させるだけでハンダ付けしないため、ESP32の取り外しが自由にできる、という点がポイントです。_書き込み装置なので当たり前ですね。_
冒頭の写真の通り、GPIOを引き出すためのピンソケットを省略しています。書き込みに特化することで、ピン数が異なる3つのモジュールに対応しています。

:::note
1.27mmピッチでモジュール幅が18.0mm、上記6ピンの位置が同じであれば、将来登場するESPモジュールにも適用できるはずです。
:::

:::note warn
ESP32-C3は、ピンピッチが1.5mm、ピン配置も異なるため、これ専用に作成する必要があります。
:::


# 5. 作り方

ESP32モジュールをピッチ変換基板や開発基板にハンダ付けされた経験がある方なら、簡単に作ることができると思います。

## 5.1 材料

<img width=150 src="https://akizukidenshi.com/img/goods/L/111605.jpg">
<img width=150 src="https://akizukidenshi.com/img/goods/L/103865.jpg">

・1.27ミリピッチのユニバーサル基板：[秋月電子さんの72×48mmサイズ](https://akizukidenshi.com/catalog/g/gP-11605/)で税込220円（約半分に切断して使用）　（片面基板で十分でした。[片面基板](https://akizukidenshi.com/catalog/g/gP-04707/)なら税込100円）

・1.27ミリピッチのピンヘッダ：[秋月電子さんの1.27ミリピッチピンヘッダ1x40p](https://akizukidenshi.com/catalog/g/gC-03865/)で税込90円（19pに2本切断して使用）

その他の部品として、
・10μFコンデンサ x1
・0.1μFコンデンサ x2
・10kΩ抵抗 x1
・タクトスイッチ x1 （リセットスイッチ）
・ピンソケット(6p) x1 （USBシリアル変換モジュールを直接ハンダ付する場合は不要）
・配線ワイヤ（スズメッキ線やUEW線）



## 5.2 回路図

ESP32-WROOM-32 DatasheetのPeripheral Schematicsに準拠しています。
<img width=200 alt="7per.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/ff509715-14f4-1ed3-e1f0-827ac021ae42.png">
![cir.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/c1ff16e6-732f-6eda-4b39-68671ddc2512.png)

:::note info
リセットスイッチは用意しましたが、もし、手動書き込みにも対応するなら、IO0をGNDに落とすタクトスイッチを追加してください（プルアップ抵抗は不要）。
:::


:::note warn
自動書き込み機能を持たないUSBシリアル変換モジュールを使う場合は、6PのENとG0が不要となり、3.3V・GND・TXD・RXDだけをUSBシリアル変換モジュールにつなげばよいので 4Pで済みますが、手動書き込みとなるため、ENのリセットスイッチとIO0をGNDに落とすタクトスイッチが必須です。
:::


:::note alert
5VのUSBシリアル変換モジュールは使えません。ESP32が壊れます。
5Vと3.3Vが選べるUSBシリアル変換モジュールの場合は、3.3Vに設定すれば使用できるはずです（実際の出力電圧を測定して3.3Vとなっていることを確認できた場合）。

:::

## 5.3 各部品をユニバーサル基板にハンダ付け

下記の写真や前項の回路図を参考に、それぞれの部品を配置してハンダ付けしください。何をどこに置くなどの決まりはありませんが、**2列のピンヘッダの間隔は重要**です。
<img width=300 alt="IMG_0802.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/7c9932f9-124c-a48a-5a51-acc6c0ba0cdf.png">

:::note info
もう一つの注意点は、
ピンヘッダをハンダ付けする向きです。下の写真のようにピンヘッダはピンの長さが**長い側**と**短い側**があります。**長い側**のピンでESP32モジュールを支えるため、今回は**短い側**のピンを基板にハンダ付けします。
<img src="https://akizukidenshi.com/img/goods/3/C-03865.jpg" style="transform:rotate(180deg);">
:::


## 5.4 製作上のコツ

これに限らないですが、自分の経験上、表面実装部品とか、1ミリ前後のサイズにハンダ付けするコツは、糸はんだの細さだと思っています。
私は[gootの20Wハンダゴテ](https://www.goot.jp/products/detail/sr_20)を愛用しています。温度管理できるような立派はハンダゴテがなくても、φ0.3mm位の極細糸ハンダがあれば、十分に手ハンダできます。0.6mmでも細い方だと思うのですが、コテを当てた時に溶けるハンダの量が多過ぎて、細かいピッチだとうまくハンダ付けができません。温度管理できるハンダゴテならそうはならないのかな?
あくまで自分の経験ですのでご参考まで。


## 5.5 ケースで保護

裏面の配線を保護するために、3Dプリンタで基板の裏側を覆うケースを作成して取り付けました。（必須ではありません）
<img width=300 alt="IMG_0821.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/c7f05d6f-c226-ec6a-d7b5-e48d037da487.png"> <img width=200 alt="capture.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/c01f7b88-efbf-af19-8d3a-58cfee3dff65.png">



# 6. 使い方

既出の写真からもうお分かりだと思いますが、以下の3ステップです。

1. ESP32モジュールをピンヘッダに挿す（はめる） （_下記<font color=green>(<b>✓</b>)</font>参照_ ）
1. 6PソケットにESP32ダウンローダ（USBシリアル変換モジュール）をセット
1. ESP32ダウンローダとPCを、USBケーブルで接続

以上で準備完了、Arduino IDEや[esptool.py](https://docs.espressif.com/projects/esptool/en/latest/esp32/esptool/index.html)、[mpremote](https://micropython-docs-ja.readthedocs.io/ja/latest/reference/mpremote.html)から書き込みが（読み込みも）可能です。


:::note info
ESP32をピンヘッダにセットするとき、
ちょっとした**コツ**というか慣れが必要で、力任せに押し込むと壊れてしまいます。

**スッと簡単にハマらない理由**ですが、
モジュールの幅が18.0ミリです。1.27ミリピッチだと2列のピンヘッダの間隔が17.78ミリとなり、計算上は0.22ミリだけモジュール幅より狭いことに起因しています。

実際につけてみると、0.2ミリもあるように見えませんが、少し狭いことは事実なので、片側列のピンヘッダの先の方に置いた後、気持ち広げるように もう片側のピンヘッダに差し込む感じではめていくと、はまりやすいと思います。


少し狭いことの副作用?で、簡単にESP32が抜け落ちることも無く、接触不良にもならず、いい感じになっていると思います。
:::

:::note warn
最初に片側列のピンヘッダの根元まで挿してしまうと、モジュールが傾き過ぎて反対側のピンヘッダに挿せなくなります。
また、両側ともピンヘッダに挿さったとしても、ピンヘッダの根元まで押し込むことは不要です。無理に押し込むとピンヘッダが逆ハの字に曲がってしまいます。
:::

_試していませんが、ピンの長い側は4.5ミリもあるので、先端の1ミリぐらいを外側に曲げて`へ`の字を立てた様な状態にすると、もっと簡単に挿せるかもしれません。_


![IMG_0827.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/76d2203b-256c-6791-ecf7-2921ddb6b464.png)

:::note warn
ピン数の多いESP32-WROVERに合わせてピンヘッダを片側19ピンづつにしているため、ESP32-S3やESP32-WROOMをセットすると、下から5番目のピンの位置には、ESP32側には端子がありません。そのため、上記のコツを押さえて差し込もうとしてもESP32側の基板に当たるため、入りません。よって、**下から5番目のピンは最初から外側に1ミリほど曲げておいてください**（上の写真の<font color=red>↑</font>矢印で示したピン）。

もしくは、どうせ書き込みでは使用しないピンのため、最初から**14ピンの2列**でもまったく問題ありません（14ピンでもESP32-WROVERに書き込めます）。

当初設計時に、さらに外側にピンソケットも立てて開発ボードっぽくGPIOを取り出せるようなことを考えていたので、そのときの名残です。書き込み装置に特化した段階で14ピンに減らしておくべきだったかも・・・
:::


:::note alert
はじめて使用する場合は、USBシリアルのドライバのインストールが必要かもしれません。もしPCがUSBシリアルを認識しない場合は、USBシリアルの製品ページの案内に従ってドライバのインストールを行なってください。
:::



# 7. おわりに

記事は以上です。何かの参考になればと思いまとめました。
他にもっとよいアイデア等があれば是非教えてください。

> 記事をまとめていて改善点が見つかったので、今後実践してみようと思います。
・14ピンに減らす
・ピンの先端を`へ`の字に曲げてみる


**以上**


<hr>


<i>2022.10.23追記</i>
ネイティブUSBによる書き込みもできるように改造しました。


https://qiita.com/nak435/items/ff716135632651ad9569

<br><br><br><br>


# 8. 二代目を作りました

<i>2022.10.30追記</i>
前回予告を含めて変更点は以下の通り。
・14ピンに減らす（19ピン分のスペースは確保）
・ピンの先端を`へ`の字に曲げてみた
・Bootボタン追加（右側：IO0をGNDに落とす、左側はRESET）
・ネイティブUSB用のピンソケットを独立

<img width=300 alt="IMG_0905.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/6acbc22b-da41-5f16-71b5-4825de718e87.png">

ピンヘッダの曲げ具合は、↓こんな感じです。ESP32がサッと挿せるようになりました。
<img width=300 alt="IMG_0904.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/70ddf826-88a9-6be6-494e-4fafe273d6bc.png">

裏側で配線しているので、片面基板の方が見栄えが良かったですね。（作るなら）三代目はそうします。

_2023.6.5追記_
何十回か挿したり抜いたりしていると、読み書きでエラーが起きるようになりました。接触不良を起こしているようで、読み書きに必要な6本のピンの反りを調整するようになりました。素手(指)で直接触っているので、端子の酸化？腐食？かも知れません。