ESP32-WROOM-32(D)とMAX7219 LEDマトリクスディスプレイ

Arduino互換マイコンでNTP時計を作るハードウエア編 0
市販品の電波時計がとにかくJJY標準電波信号を受信しない。室内では全く受信しなくて、ベランダのガラス戸近くに置いてもダメ。ベランダに普通に置いてもダメでベランダの手摺壁の上に置いてようやく。でも風が吹いて落下したらと思うと怖いのでそれもなかなか。
JJY標準電波は40kHz(福島・東日本)と60kHz(長崎・西日本)の長波で、超短波と違って回り込んで入るのは得意なんだろうど、波長が40kHz/7.5km, 60kHz/5kmとなると鉄筋/鉄骨の建物には電波が入れないのかな?ファラデーケージ的な意味で。知らんけど。
この手の時計は標準電波で頻繁に補正されることが前提の精度で作られているのか、補正されないと時刻の狂いっぷりが酷い。

で、正確な時刻を表示する時計が欲しいと思った。

  • 電波時計からアンテナを引き出して線をつないでアンテナを屋外に置けばもしかしたら受信できるかもしれない。(できないかもしれない)
  • JJY電波のレピーターを購入して中継してやれば屋内の電波時計で電波を掴めるようになるかもしれない。(ムリかもしれないし何しろ高額で手が出ない)
  • JJY電波のレピーターを自作して中継してやれば屋内の電波時計で電波を掴めるようになるかもしれない。(詳しい人なら簡単なのかもだが自分では作れない)
  • 特定の周波数でJJY電波をエミュレートした音声をイヤホンで出力し、イヤホンコードから出る電波で電波時計を補正する。(手で時刻合わせした方が早そう)
  • 電波時計を諦めてGPSクロックを購入すれば正しい時刻を表示できる。(まぁまぁ高額だし窓際に置くか屋外アンテナが要る)
  • 電波時計を諦めてGPSクロックを自作すれば正しい時刻を表示できる。(窓際に置くか屋外アンテナが要る)
  • 電波時計を諦めてNTPクロックを購入すれば正しい時刻を表示できる。(何故かすんごい高額)
  • 電波時計を諦めてNTPクロックを自作すれば正しい時刻を表示できる。(簡単で安そう)

最後のNTPクロックの自作が良さげ。NTPクライアントはナントカパイのようなSBCを使う手もあるが、最近は高額になっているのとたかが?NTPクライアントにそんな高性能は要らない。Arduinoはすごく安くて適度に低性能で情報が豊富なので良さそうだけどネットワーク接続に難あり。Arduino互換で安くてネットワーク接続対応なのを探したら、ESP32-WROOM-32xというマイコンボードがあった。Wi-Fiでネットワーク接続できてBluetoothも対応。お値段は200円程度。ただし、このマイコンは指先程度のチップ型(実際は極小基盤)なのでそのままでは扱いづらい。DevKitと呼ばれる基板付きのものを選ぶことに。これだとESP32-WROOM-32xのマイコン本体込みで300〜500円程度で販売されている。日本だとその3倍程度? 時計として使うなら時刻を表示するディスプレイが必要。これは液晶モニターでも良いのだろうけど、消費電力大きいし大きさの割にはそれなりに高額。そこでLEDのマトリクスパネルを使うことにした。これだと大きさの割にはかなり安価、そしてArduinoのようなマイコンからの給電で十分に機能するのでディスプレイ用の電源ケーブルが不要。ただし、解像度が低くて色表示が自由にはならない(若しくは単色のみ)。

Arduino互換マイコンでNTP時計を作るハードウエア編 1
例によってAliExpressで購入。後述の理由で商品のリンクは貼らない。今年は夏に中国で大洪水があったり停電があったりといろんな理由で注文から届くまで大遅延が発生している。そして、中国の物流は(他の国も物流ではその傾向があるけど)、先入れ先出し(FIFO)ではなく後入れ先出し(LIFO)なので早くから空港の倉庫などに入ってしまった荷物がいつまでも荷物の山の底に溜まったまま、後から来た荷物が先に目的の国に送られるという状態が続いている。つまり運良くサクッと届く荷物と待てど暮せど届かない荷物で二分化されている。

Arduino互換マイコンでNTP時計を作るハードウエア編 2
プチプチに包まれた中身。右がESP32-WROOM-32D DevKitC V4(の筈な品)。お値段は購入時1枚US$3.59。
中央と左はLEDマトリクスディスプレイ(同じものの表と裏)。お値段は購入時1枚US$4.52。
ちなみに送料はUS$2.53だった。

Arduino互換マイコンでNTP時計を作るハードウエア編 3
ESP32-WROOM-32DのDevkitC V4。画像では大きく見えるが、画像の基板の左右の長い辺が単3電池とちょうど同じ長さ。(右側に出ている黒い板Wi-Fiアンテナ部分を除く)
右半分の銀色の部分がESP32-WROOM-32D本体のマイコンボード。(チップのように見えるけど銀色の金属板を外すと中にいろいろ入った基板)
左端にmicroUSBポートがあって電力はここから。PCと接続してプログラムの書き込みもこのポートを使う。
プログラムを書き込むとき以外はPCは要らなくて、電源をつなぐと書き込み済みのプログラムがすぐに実行される。

Arduino互換マイコンでNTP時計を作るハードウエア編 4
DevKitC V4の基板のウラ面には特に何もない。19x2のピンヘッダが付いている。

Arduino互換マイコンでNTP時計を作るハードウエア編 5
ESP32-WROOM-32D本体の銀色の金属板シールドの刻印に何か違和感を感じたので光を斜めから当てたらこんなの。
ESP32-WROOM-32D最後のDだけ取って付けたように薄かったり微妙にズレていたり。
つまりESP32-WROOM-32DではなくESP32-WROOM-32にリマークしたものかなと思った。少なくとも技適の番号はESP32-WROOM-32DのものではなくESP32-WROOM-32のもの。しかし、CMIIT IDはESP32-WROOM-32でもESP32-WROOM-32DでもなくESP32-WROOM-32Uのもの?「2017DP7123(M)」ならそうなのだが画像では(M)無し。
コイツ本当は何者なのかしら? と、いうことでモノが怪しいのでAliExpressの商品リンクは貼らないことに。

Arduino互換マイコンでNTP時計を作るハードウエア編 6
Max7219(シリーズ?)というシリアル制御の8 x 8のLEDマトリクスディスプレイが4つ並んだもの(4連タイプ)。それに5本並びのリボンケーブルと5本分のL字型ピンヘッダ。これで1セット。リボンケーブルのケーブルの色は選べないみたい。写真のリボンケーブルは個人的には特に苦手な色の組み合わせ。暗いところで間違いやすい色。
LEDの色は知っている範囲では赤と青と緑がある。白色があれば欲しかったのだが見つからなかったので青を購入した。
Max 7219ディスプレイモジュールには8 x 8のマトリクスタイプではなく7セグのデジタル数字表示タイプもある。(電卓や昔のデジタル時計の数字みたいなの)

Arduino互換マイコンでNTP時計を作るハードウエア編 7
ウラ面は同じ基板が4つ連結したものになっている。ただし、これで1枚の基板。糸ノコで切り分けなければ分離はできない。
これは4モジュールの製品だが、1モジュールの基板も販売されているので必要な数を買って連結して使う。なお、基板が8 x 8のLED部分とほぼ同じ大きさなのが新しいタイプでICチップが載った部分が飛び出ているのが古いタイプ。古いタイプも販売されているので購入時は間違わないように注意。新しいタイプは直線に連結する(横に並べるだけでなく縦に並べて大きな1つのLEDディスプレイのようにすることもできる。古いタイプは縦並べ(実際は横並べ)は構造的に最大で2列に制限される。しかも上下反転の処理が必要。

Arduino互換マイコンでNTP時計を作るハードウエア編 8
今回はブレッドボードは使わずにピンヘッダに直接リボンケーブルをつなぐことにした。
ESP32-WROOM-32 DevKit側は5VとGNDだけは間違えないようにし、他は数字だけが書かれたピンに適当に(テキトーではない)につなぐ。Max7219 LEDマトリクスディスプレイに付属のリボンケーブルを使うことにするならリボンケーブルの並びどおりにつないでやると良いかと。つまり、5VとGNDを先に接続して他はその隣に並べるとラク。数字のピンは今回は12, 14, 27を使うことにした。(好みでOK)

Arduino互換マイコンでNTP時計を作るハードウエア編 9
リボンケーブルの並ぶ順のまま接続してやるとリボンケーブルの負担を少なくできる。(接続間違いも防ぎやすい)

Arduino互換マイコンでNTP時計を作るハードウエア編 10
対向するMax7219 LEDディスプレイ側は「IN←」が書かれている側のピン(ピンヘッダが付いている側)にマイコンボードからのケーブルをつなぐ。
VCCにマイコン側5Vからの線を接続。GNDは両方GND。他はリボンケーブルの並び順で接続する。
つまり、DIN(Data Input)が12ピン、CS(Chip-Select Input)が14ピン、CLK(シリアルクロック)が27ピンにつながることになる。これをメモしておく。プログラムを作るときに使う情報になる。

Arduino互換マイコンでNTP時計を作るハードウエア編 11
白い8 x 8のLEDマトリクス部分は基板から分離可能。LED側のピンが軟弱なので抜き取りと差し込みには注意。
で、マイコンボードとつないだ反対側(アウト側)は基板にピンホールがあるだけなので別のディスプレイモジュールと接続するためにピンヘッダを取り付ける。基板と基板を接着してジャンパ線を使うかハンダを使うかして接続する方法もあるが、それだと直線に並べて使うことしかできない。リボンケーブル等で接続するならディスプレイモジュールの並べ方は後で変えることができる。Max7219ディスプレイモジュールに付属するL型ピンヘッダを使うのが良さそう。
なお、付属のピンヘッダを使うなら必ず基板とのハンダ付けが必要。テストでハンダ無しの状態で動かしてみたら全く使い物にならない状態だった(壊れるわけではないが)。

Arduino互換マイコンでNTP時計を作るハードウエア編 12
接続自体が簡単なのは画像の向きに取り付けること。これはデータイン側に最初から付いているピンヘッダと同じ。
しかし、このように外向けにピンヘッダを付けるとその方向に別のLEDディスプレイモジュールをぴったり並べるのにじゃまになる。

Arduino互換マイコンでNTP時計を作るハードウエア編 13
画像のようにL型ピンヘッダの先端が基板の内側方向を向くように取り付けた。リボンケーブルの取り回しを変更するときには画像のようにLEDパネル部分を取り外す必要はあるが、別のモジュールをぴったり並べるにはこの方が都合が良い。縦方向に重ねて使うにもこの方がケーブルの接続がスマートになる。

Arduino互換マイコンでNTP時計を作るハードウエア編 14
リボンケーブルをつないでみた。
画像に黄文字で書いたが、白いLEDパネルは正方形で接続の向きが判りにくくなりやすい。側面の1方向に黒い文字列が書いてあるのでその文字列が他のLEDパネルと同じになるよう嵌めてやるのが簡単。(4連で全部外してしまうと嵌めるときに悩むかも。)一応、Data-inが右側、Data-outが左側になるように基板を置いて手前側に文字列があるように嵌めるのが正解っぽい。

Arduino互換マイコンでNTP時計を作るハードウエア編 15
マイコンボードと接続するMax7219モジュール以外はData-in側のピンヘッダが元々の外向きだと邪魔になる。ピンヘッダを外して内向きに差し替えるのが良い。ただし、ハンダごてでハンダを溶かして5ピンを抜くのは難しいというかムリだと思われるのでヒートガンを使うのが良さそう。なお、ヒートガンの当て方が悪いと裏側のICチップが剥がれるかもしれないので使い方注意。
これでモジュール間に邪魔者が無くなるのでモジュール同士をピタっと並べることができる。

Arduino互換マイコンでNTP時計を作るハードウエア編 16
このLEDディスプレイは屋外でも通用しそうなほど強力な光を放つ。1m以上離れていても直視すると眼の奥が痛ダルくなるので要注意。特に青タイプの「毒の光」はキツネリスが発狂して死ぬほど体に有害そう。
LED点灯中に撮影すると、周りは普通に明るいのに(カメラが勝手に露出を調整するので)暗いところで撮影しているみたいになる。

LEDディスプレイはガラスかアクリルの入れ物に入れて間に紙か黒アクリル板などを挟んで光量を調節した方が良さそう。プログラムでも光量を制御できるが、最低輝度でも眩しい。(眼が痛くなるほどではない)

関連記事: