ESP32を搭載し、リチウムポリマー電池によって駆動できるArduino互換機をゼロから自作してみた話

# はじめに
今回は初めてArduino互換機の自作に挑戦してみました。特徴としては低消費電力なESP32-C3-WROOM-02を搭載し、BLE[^1]やWi-Fiが利用できる点、Type-C端子に対応した点、直接リチウムポリマー電池を接続して駆動できる点です。既製品を使用する中で少し不便に感じていたところを解消できるように設計してみました。なんとか期待した通りに動くところまでは確認できたので手順などを共有します。ご参考になりましたら幸いです。
![picture.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/cfbbf392-4bf9-6cbe-8cc7-8e7a78bacc11.jpeg)
# 方針
まずは既製品の長所と短所を考えてみました。今回は秋月電子通商より購入できる以下の製品を基準に取り上げます。

https://akizukidenshi.com/catalog/g/g115673/

長所だと思う点は以下の通りです。
* USB経由で書き込める
* 高性能なESP32を搭載
* Arduino開発環境が利用できる

逆に短所だと思う点は以下の通りです。
* 少し高価
* 標準的なブレッドボードに対して幅が広い
* micro-B端子を搭載

このような長所は活かしつつ、なるべく短所を克服するため、以下のような点を目標に設計しました。
* 安価
* 標準的なブレッドボードに合わせて幅が狭い
* Type-C端子を採用
* リチウムポリマー電池から駆動できる
* リチウムポリマー電池を充電できる
* 低消費電力
# 設計
今回はKiCadを使用しました。無償のソフトですが、機能は豊富で日本語の資料も割と簡単に見つかる印象です。導入については[**こちら**](https://zenn.dev/suzuky/articles/e2a745c5aeb2fc)が参考になりました。
## 部品表
使用した部品は以下の通りです。
| リファレンス番号 | 型番 | LCSC | 個数 | 価格 |
|:-:|:-:|:-:|:-:|:-:|
| J1 | U262-161N-4BVC11 | C319148 | 5個 | 292.2885円 |
| C2, C3, C5 | CL05A106MQ5NUNC | C15525 | 15個 | 10.6709円 |
| R1 | 0402WGF3301TCE | C25890 | 5個 | 0.3866円 |
| SW1, SW2 | SKRKAEE020 | C115357 | 12個 | 193.1888円 |
| U1 | MCP73831T-2ACI/OT | C424093 | 5個 | 548.6209円 |
| R5, R6 | 0402WGF4700TCE | C25117 | 10個 | 0.7732円 |
| R3, R4 | 0402WGF5101TCE | C25905 | 10個 | 0.7732円 |
| R7, R8 | 0402WGF1002TCE | C25744 | 10個 | 0.7732円 |
| R2 | 0402WGF1003TCE | C25741 | 5個 | 0.3866円 |
| D1 | B5819W | C8598 | 5個 | 19.9499円 |
| D2, D3 | KT-0603R | C2286 | 10個 | 8.0418円 |
| U2 | AP2112K-3.3TRG1 | C51118 | 7個 | 95.1561円 |
| C6, C7 | CL05B104KB54PNC | C307331 | 10個 | 8.1965円 |
| Q1 | AO3401A | C15127 | 5個 | 45.6991円 |
| C1, C4 | CL05A475MP5NRNC | C23733 | 10個 | 8.3511円 |

後述するように今回はJLCPCBのPCBA[^2]を利用するため、そこで安く用意されている部品を優先的に選んでいます。実装費が高い数個の部品については秋月電子通商で別に購入し、後から手実装しました。
| リファレンス番号 | 型番 | 販売コード | 個数 | 価格 |
|:-:|:-:|:-:|:-:|:-:|
| J3, J4 | PHA-1x9SG | 100167 | 10個 | 80円 |
| J2 | B2B-PH-K-S | 112802 | 5個 | 50円 |
| U3 | ESP32-C3-WROOM-02-N4 | 117493 | 5個 | 1550円 |

ここからは主要な部品に関して説明します。
### ESP32-C3-WROOM-02
今回はESP32-C3-WROOM-02を使用します。そこそこ安価でWi-FiやBLE[^1]が利用できます。また、USB機能を内蔵し、別途USBシリアル変換ICなどを載せる必要がないため、簡素化、小型化できました。省電力性も高いので今回のような用途にはぴったりです。
### AP2112
ESP32-C3-WROOM-02の電源電圧は3.3Vです。そのため、USBから給電する場合やリチウムポリマー電池で駆動する場合は3端子レギュレータ等で降圧する必要があります。ただし、後者の場合は特にドロップアウト電圧が低い部品を使わないと安定的に駆動できません。今回はAP2112を選びました。出力電圧は3.3V、出力電流は600mA、ドロップアウト電圧は最大250mV程度なので起動時や通信時の消費電流が大きいESP32も駆動できそうです。パッケージはSOT-25なのでコンパクトな方だと思います。
### MCP73831
リチウムポリマー電池の充電を制御するため、MCP73831を使用しました。まず、動作の概要ですが、充電中はUSBから供給される5Vを降圧し、定電流充電します。充電池の電圧が約4.2Vを超えたら定電圧充電に切り替えて充電は完了し、過充電を防止します。データシートより抜粋した下図においては約90分を境に切り替わる様子が読み取れます。
![datasheet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/f104a7e8-f537-4896-791d-e68b9ee50821.png)
STATピンの電圧レベルが充電中はLレベル、充電後はHレベルと切り替わるため、ここにLEDを接続することで簡単に確認できます。また、充電時の電流$I_{REG}$はPROGピンに接続した抵抗器$R_{PROG}$で次式のように求まります。
```math
I_{REG} = \frac{1000}{R_{PROG}}
```
この電流が大きくなると充電に要する時間は短くなりますが、充電池の容量とCレートに応じて適切な設計を行わないと非常に危険です。例えば100mAh、1Cの充電池を使用する場合、これは1時間で満充電できる電流を意味するため、充電時の電流は100mA以下、抵抗器は10kΩ以上が妥当です。
## 回路図
今回は電源がUSBから給電する場合、またはリチウムポリマー電池で駆動する場合の2系統です。このまま並列に接続すると片側に電流が逆流してしまう危険性もあるため、電源を切り替えるための回路が必要です。単純にダイオード2個のみで組むこともできますが、順方向電圧の分だけ損失が生じてしまいます。特に充電池で駆動する場合は無視できない損失です。そのため、より損失が小さいMOSFETを使用し、[**こちら**](http://denshikousakusenka.blog.fc2.com/blog-entry-170.html
)を参考に組んでみました。
![schematic.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/6b6d958b-e811-e8f2-8627-47d0990f4a27.jpeg)
また、先述したようにESP32-C3-WROOM-02は従来のUART経由に加えてUSB経由で書き込むことも可能です。その場合、リセットスイッチや動作モード切り替え用スイッチの操作は不要ですが、念のために付けておきました。後述しますが、結果的には付けた方が無難だと思います。
## レイアウト
今回のプリント基板は2層です。シルクが重ならない範囲で部品の配置は割と大雑把に決めましたが、その代わり配線には苦労しました。下図においては左側にType-C端子、リチウムポリマー電池を接続するためのPH端子、各スイッチ、右側にESP32-C3-WROOM-02、その他の部品が載ります。
![rendering_front.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/e963ea7e-6a5a-d2ad-a231-35d2e8bd70ce.png)
ESP32の全ピンを引き出してあります。ピン名のシルクは表面に余白が足りず、裏面に入れました。
![rendering_back.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/f2809d3b-be70-1cb2-85a1-d3774f495bf7.png)
また、プリント基板の幅は標準的なブレッドボードに差し込んでも両側1列が余るように調整しました。ガーバーファイルは[**こちら**](https://drive.google.com/file/d/1VBz69XkGorazxm_uOG2inaxYI5RFATyU/view?usp=sharing)からダウンロードできます。
# 製造
今回はJLCPCBにPCBA[^2]まで依頼しました。
## 発注
KiCadで作成したガーバーファイル、BOM[^3]ファイルやCPL[^4]ファイルをアップロードします。ただし、JLCPCBの形式に合わせる必要があるので少し面倒です。ここでは専用のプラグインを使うと手間が省けます。導入については[**こちら**](https://nararoboconproject.wordpress.com/2023/06/27/i/)が参考になりました。後は必要に応じて各項目を変更しますが、基本的にはデフォルトのままでも大丈夫です。今回は青色のレジストに変更してみました。実際はイメージより少し暗い青色でした。また、`JLCJLCJLCJLC`とシルクを入れておくことで製造番号の位置を任意に指定することも可能です。無償です。ちょうどESP32で隠れるような位置に今回は入れました。
## 価格
プリント基板は5枚を発注しました。配送業者は送料が最も安い`OCS Express`を選び、納期は約10日間でした。クーポンを適用し、全体的には1枚当たり約700円となりました。
# 実装
残りの部品を手実装し、完成です。
![pcb.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/47c72c26-1a78-e358-c489-d01718853b52.jpeg)
# 動作確認
最後に正しく動作することを検証します。
## LEDの点滅
書き込み方法などは以下の記事と重複するので今回は割愛します。

https://qiita.com/ricelectric/items/17f8aedb972e5898a8bc

まずは短絡などのミスを入念に点検し、それからLEDの点滅を試してみました。電源を入れる瞬間は緊張しますが、ちゃんと期待した通りに動いたので良かったです。リチウムポリマー電池を接続しても問題なく動きました。
![led.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/2b7e5900-aa22-e37b-1fa3-7a32c00a0271.jpeg)
## 書き込みに失敗する場合
偶にエラーメッセージが表示されて上手く書き込めないこともありました。解決策としてはUSBから切断し、動作モード切り替え用スイッチを押しながらUSBを再接続することみたいです。確実にプログラムを書き込める状態へ切り替わるため、書き込みに成功しました。本来USB経由で書き込む場合は不要ですが、ここでは動作モード切り替え用スイッチを付けておいた恩恵を受けることができました。
# 反省点
リチウムポリマー電池が未接続のところに電源としてUSBを接続した場合、2個のLEDが同時に点灯してしまうので少し不自然に見えます。改めてMCP73831のデータシートを読んでみたところ、その場合はSTATピンがオープンとなるようでした。組み込む前にブレッドボードなどで挙動を確認しておく必要もありました。
![mistake.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/ccf84604-6c95-0737-6e7a-189ee3bdd9f1.jpeg)
また、当初はリチウムポリマー電池の電圧をESP32から測定し、過放電を防止する想定でしたが、そのための配線が容易には引き出せないような設計となっていました。それでも保護回路が付いたリチウムポリマー電池なら使用できますが、あまり望ましい設計ではありません。さらに、今回は余白の都合でピン名のシルクを裏面に入れましたが、実際に使用してみると少し不便に感じました。
# おわりに
まずは無事に完成し、なんとか正常に動作したので安心しました。そこから見つかった反省点については改めて考え直し、しっかり次に活かしていきたいと思います。
[^1]:低消費電力で通信することが可能なBluetoothの仕様です。
[^2]:プリント基板の製造から部品の実装まで行うことです。
[^3]:部品の型番や個数などに関するデータです。
[^4]:部品の位置などに関するデータです。