ESP32でLEDマトリクスを使ってみた（＆ハマったところ）

この記事は、[NTTテクノクロス Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ntt-tx) 17日目です。

NTTテクノクロス熊谷です。社内では端末評価業務や[ソフト道場講師](https://www.ntt-tx.co.jp/products/soft_dojyo/?utm_source=qiita&utm_medium=ac2019&utm_campaign=17)を担当しておりますが、社外でIoT検定テキストの編纂などに関わっております。

# はじめに
ESP32って知ってますか？
Espressif Systems 社の ESP32は 32bit、240MHzで動くデュアルコアCPUです。
ソフトウェアがメインの弊社でなんでこれを使っているかと言えば、IoTへの対応として、ちょっとくらいハードウェアに強くなってもいいんじゃない？って事で研修で利用しています。
厳密にはArduinoではないのですが、Arduino IDEと組み合わせ高機能Arduinoとして利用しています。
今回はESP32&Arduino IDEを使ってLEDマトリクスを制御しようとしてハマりまくった話でもしたいと思います。


# この記事で対象とするユーザー層
 - ESP32で電子工作をしている個人
 - MAKERを目指す方々
 - ESP32をゴリゴリ活用したい人

# 今回作ったLEDマトリクスによる情報表示機器
[MCPC](http://www.mcpc-jp.org/) SMC有志にて、天気予報やニュースを表示するデバイスを作りたいよね？ってことで、9月から取り掛かり11月末に展示を行う事になりました。（実質ミーティングしたのは9月、10月の2回だけ土曜日の午後に集合）
3名のチームを作業開始。ネタは夏休み時期からSlackで共有していたことから、どんな感じにするか、利用するデバイスはどうするか、諸々を話し合い、ESP32とMAX7219を組み合わせてLEDマトリクスに表示させる方向に。
　・
　・
　・
10月中旬、私が研修準備に時間を取られ全く進んでいない状況であり、研修後10日くらいでえいやで実装したのが
以下のスケッチ。
1．叩くAPIはkeyが必要なものがほとんどの中、livedoor 天気情報Webサービス（ Livedoor Weather Web Service / LWWS）の[Weather Hacks](http://weather.livedoor.com/weather_hacks/)が

 - Key不要でJSONで返してくれる！ステキ！って事で即採用
 - ベタでシリアルに出力する：OK

2．JSONをパースしてくれるArduinoJSONライブラリ。6系で始めたけど、あちこち動かないことが多く、実装優先で5系をインストール。1の内容をパースして個々のデータをシリアルに出力：OK

3．LEDマトリクス8x8の4連（32x8）に固定文字列を表示する：OK
　MAX7219と8x8マトリクスLEDのセットが秋葉原で500円弱だったはずだけど、4連を中華通販で買ったら同じくらい。安いぞ？
![IMG_79.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536292/660d2237-a9bc-baeb-424b-a8a5da735cd1.jpeg)


ここまでを終えて10月下旬のミーテイングに参加。

- おおむね上記で実装したものをベースに進めることで了承。
- 天気予報以外も実装したいね。
- Wi-Fiアクセスポイントを探す処理はもうちょっと改良したい。APが無かった場合は？
- 8x8のフォントより16x16やりたいねー。
- 次回ミーティングは無しでそのまま展示だねー。とスケジュール確認。

## ここからがドはまりポイント
- LEDマトリクスを文字がスクロールしていくと上下がずれる。
- たまにLEDが全点灯(ノイズの影響でテストモードが動作したと推測、供給電流ヤバイ)
- 8x8のLED素子丸ごと非表示。

上記事象はESP-WROOM-32のrev.0からrev.1のものに変更したところ、発生が激減。
OLEDやTFTの表示の際にゴミが乗るとされていたノイズによるものと判断。

- コンパイル後書き込みがタイムアウト　→　手動書き込みモードを利用する。
- 書き込み終了後、表示が出ないLEDマトリクスがある　→書き込み終了後、再度手動リセットをかける。


Arduino IDEのスケッチを描いたことのある人はわかると思いますが、C言語ライクな表記がほとんどです。上記で作った個別プログラムを組み合わせてJSONのパースした内容をフォントに置き換えMAX7219に流し込むだけのはずだったのですが、何も考えずにコピペしていったら、定義が無いよとか連発。そりゃそうだ。
外部変数に置き換えてあれこれっと。。。コンパイルが通らない。
Core dump:Guru Meditation Error: Core 0 panic'ed とか発生。
あちこち検索してsetup()やloop()はcore 1で動作している様子。ううん、わからない。
　・
　・
　・
2週間くらいトライしてたものの、最後にはデバッグ用シリアルモニタ出力を追加して焼きこんだだけでエラー。Arduino IDEのデバッグ出力オプションをつけただけでエラー。お手上げ状態。
最後の最後で一緒に作業しているメンバーにデバッグ修正してもらったり、展示用のパッケージを頑張ってもらったり、と頼り切りに。
その辺のまとめは[こちら](https://www.evernote.com/l/AoS1Epa4jtJL8Z-OvqUHIRcCTlCNUtuLe1E/)にあります。
![IMG_80.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536292/e847efd1-720f-3d1f-240a-3461c9ca189e.jpeg)

# 反省会会場
なんだかんだ言いつつ、ひとまずは展示にこぎつけましたが、今回の反省点。

- やっぱりチームで何か作るときは環境構築が重要。バージョンを揃える、ライブラリを揃えるとか基本中の基本。
- LEDマトリクスをは4連で400円くらいで都合7個くらい買いましたが、1個はソケットピンが折れるくらいの衝撃を受けた模様。はんだ付けし直して動作しましたが、中華通販のリスクを思い知ることに。
- でも同等品をAmazonで探すと4連が1000円ちょっとする。
- ESP32-DevKitCも秋月で買ったら1480円。中華通販で同等品買ったら半値くらいに。
- そもそもESP32にコスパが異常。
- Arduino IDEはデバッグにはとても向いていないって事を実感。でも今までの先人の積み重ねがあるので、何かやりたいことがあっても、似たような実装をしている方がなんとなく見つかる。スケッチのヒントやはまりどころも情報が得やすい。

# 今後は？
ニュースを流したり、株価、為替とか流せたらいいですね。IoT的にはエッジでの動作状況や作業指示なんかを文字で出せるところにメリットが出せるかなぁ？

# 謝辞
今回の制作にあたり、チームのSさん、Nさん、他SMC有志メンバー、本当にありがとうございましたm(__)m

それでは、[NTTテクノクロス Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ntt-tx)の18日目にバトンタッチします。

引き続き、お楽しみください。