この記事ははJLCPCBの提供でお送りします。
JLCPCBとは
jlcpcb.jp (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)
JLCPCBとは、プリント基板製造などで有名な香港の企業です。
日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。
値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています
これは何?
8×8=64個のフルカラーLEDを制御するための基板です。 コアとなるマイコンはESP32で、USB接続で簡単に開発できるというものです。
設計
以下のような要件で基板を設計しました。
- USB Type-Cでパソコンと接続できる
- USB シリアル変換IC CH340G
- 自動リセット回路
- 2mm角のシリアル制御できるフルカラーLED (8×8=64個)
- ESP32の足をそのまま引き出した拡張ポート
- フルカラーLEDの制御を3.3V、5Vのどちらか選択できるジャンパ
個々の要素はこれまで作ってきた基板で検証済みのものが多いので、比較的スムーズに設計できました。
例えば、USB Type-CコネクタについてはUARTで書き込みできるCH32V003開発ボードを作った - inajob's blogで検証しましたし、自動リセット回路についてはESPboyというオープンソースの携帯ゲーム機を日本用に再設計してみた - inajob's blogで学んだものです。
部品も上記の製作の時に買ったものがまだ残っていたので、新たに買い足す部品は少なくて済みました。
2mm角、シリアル制御フルカラーLED
今回使用したのはYF923-2020というフルカラーLEDです。
このサイズでメジャーなものとしてはWS2812B-2020やWS2812C-2020なのですが、仕様書を見るとこれらのLEDは3.7~5.3Vということで3.3Vで動かないようなのです(しかし実際のところはそれでも動く、という情報が多数見られますが・・)
今回はどうせ買うなら、ということでプロトコルはWS2812互換ですが、3.3Vでも動作可能とうたっているYF923-2020を選びました。
この情報は3.3V電源で動くNeoPixel LED YF923-2020 をXIAO RP2040に乗っけてPRK Firmware使ってLチカ - kuriharaのブログで学びました。有益な記事に感謝します。
まぁ、3.3Vで動くということですが、何かあったときのために5Vで動かすための仕組みも用意しておき、ジャンパで切り替えできるようにしておきました。(5V接続は結局試してないですが・・)
LEDを配置する面はこんな感じ。GNDを白抜き文字にしてみました。
ICを配置する面はこんな感じ。 ESP-WROOM-32のアンテナ部分は基板から飛び出すように配置しています。 また、各フルカラーLEDに対応したコンデンサも実装できるようにしましたが、これは実装しなくても問題なく動作しました。
発注
サイズは63mm角なので、$4 + 送料という安価で基板製造できました。
実装
さて、この基板、結構表面実装部品が多いので、実装は大変です。
まずは、USB Type-CポートとCH340G、レギュレータ周りの部品を実装して、USBシリアルデバイスとして認識できるかを確認しました。
はんだ付けにははんだペーストとホットエアーガンを使いました。さすがに何度も実装しているので、ここはすんなりと認識されました。
その後、ESP-WROOM-32の実装です。このモジュールは1.27mmピッチの端面スルーホールになっており表面実装部品として実装することにしたのですが、意外とはんだ付けにてこずりました。
この程度のピッチであればそんなに苦労したことはないのですが、特にGNDの端子について、熱が伝わりづらくうまくはんだが乗らないような感じがしました。
まぁ四苦八苦しながらESP-WROOM-32をはんだ付けしたところで、Arduinoとしての書き込みができない問題に気付きました。
色々調べてみると、IO0をHIGHにした状態でRSTをLOWにしてHIGHに戻すとシリアルコンソールに文字が出ていることに気づきました。これはうまくESP32は起動しており、シリアル接続もうまくできているが、自動リセット周りが何かおかしいぞ・・・ということであたりをつけて調べていると、自動リセット回路にプルアップが足りていないことを発見しました。
これは凡ミス・・(こういう回路のピンに求める条件みたいなのをテストするような仕組みはないのかな?、ソフトウェアの単体テストで書くアサーションのような・・)
ということで、とりあえず手元にあった10KΩの抵抗でプルアップを付け足したところ、無事、Arduinoとしての書き込みができました。
自動リセット回路だけでなく、IO0やRSTに対応するスイッチをつけておいてもよかったかなと感じました。
さて、最後は大量のフルカラーLEDです。
その前に、LED制御信号線に問題があることに気づきました。まず3.3Vレベルの信号線と5Vレベルの信号線につけているラベルが逆になっており、シルクの記載と実際に流れる信号レベルが異なっていました。
まぁこれはシルクの記載を無視してジャンパすれば問題なさそう。
そしてもう一つは、3.3Vレベルの信号線が実際のフルカラーLEDの制御ポートと接続されていない問題がありました。
これは大問題で、接続されていないので、当然信号をいくら出力してもフルカラーLEDには到達しません。
原因となっているのがこのラベルのようで、これDIN5とIO27というラベルがくっついており、横切っている配線と2つのラベルはくっついていない状態だったのです。
設計図がこうなっていると、DRCでも配線ミスとして検出されないため、結果として必要な結線を見落としてしまっていました・・
まぁここも必要な配線をジャンパすることで、問題を解決できました。
気を取り直してフルカラーLEDの実装です。
まず1つ実装してみて、ESP32から制御できるかを確かめました。
簡単にESP32から制御するために、ここからはMicroPythonを用いることにしました。
ThonnyというMicroPython用のIDEを使って、MicroPythonのファームウェアをまず焼きこんで、その後以下のようなプログラムを転送して動作を確認しました。 ESP32向けのMicroPythonにはNeoPixel互換のフルカラーLEDを制御するためのモジュールが標準搭載されているので本当に簡単に制御できました。
import neopixel import machine import time np = neopixel.NeoPixel(machine.Pin(27), 64) count = 0 while True: for i in range(64): np[i] = (0,((i + count)%8)*2,((int(i/8) + count)%8)*2) np.write() time.sleep(0.1) count = count + 1
Arduinoだと、(特にWindowsだと)コンパイルが非常に遅く、転送も含めると開発のイテレーションが非常に遅くなってしまい、イライラするのですが、MicroPythonだと、さっと書いたコードを実行できるのでストレスなく動作テストができました。
さて、ここからはフルカラーLEDをどんどん実装していって、キリの良いところで動作テストをすることを繰り返しました。
このフルカラーLEDはデイジーチェーンで数珠繋ぎに接続されているので、あるLEDのはんだ付けがうまくできてない場合は、そのLEDより先は全部制御できなくなるため、これを頼りにはんだ付けを進めました。
そしてついに64個すべてのLEDの実装が完了しました。(肩凝った・・)
まぁここまでできれば、あとは好きな模様を表示したり、WiFi経由で表示内容を制御するなど、応用先は様々ありそうです。
まぁ今回は基板の機能が一通り動くことを確認できたということで、ひとまず記事にしました。
まとめ
ESP32をコアとした8×8=64個のフルカラーLEDを制御する開発ボードを作りました。 表面実装部品が結構ありましたが、実装面で苦労することはあまりなく、はんだ付けが少しは上達したかなと感じました。
ESP32の開発はコンパイルが遅いという印象でしたが、MicroPythonを使うことで迅速に開発サイクルを回すことができました。
回路のミスもいくつかありましたが、切り分けがうまくでき、そこまで悩まずに対処できたのもよかったです。
今までESP-WROOM-32を使うときには開発ボードを使っていましたが、今回初めて自作の基板に直接実装することを試すことができました。今後は自作のガジェットにも積極的にESP32を採用できそうです。