TinyGo + Wio Terminal で LED マトリクスを利用してみる。
追記:「TinyGo drivers/hub75 のコードについて補足」を追加しました。(2024/12/05)
やりたいこと
- LED matrix を制御するために使用する hub-75 の仕様を理解する
- LED matrix と Wio Terminal を接続する
- TinyGo の drivers の hub75 を利用し、LED matrix を制御する
結果
LED matrix を hub-75 という通信を利用して制御することができました。
準備
hub75 の 仕様を理解する
仕様を理解するといっても、TinyGo の hub75 を使用すれば、細かく仕様を理解する必要はありません。ただし、機器を接続する上では、知っておくべき情報があり、特に自分が調べた情報や困ったこと・難しかったことを記載したいと思います。
hub-75 の詳細について知りたい方は、下記の参考リンク等で説明がされているため、そちらを参照してください。
接続に関する情報を得る
今回使用する TinyGo drivers/hub75 のコメントを見ると https://github.com/2dom/PxMatrix を元に作成しているようなので、そちらを見てみます。
その結果、以下に接続に関する情報がありました。
hub-75 の制御方法についての注意点
情報を調べていくうちに hub-75 を使用する上で、2つの制御方法があることがわかりました。これから、それらを説明していきます。
補足:
下記の説明について、もう少し正確に説明すると A,B,C,D のピンでセクションを指定するという話があります。しかし、その部分も説明すると複雑になるので、省略しています。
1つ目の制御方法
恐らくこちらがスタンダードな方法
RGB の各データのピンの HIGH/LOW 状態は、ラッチ(保持するという意味)のピンを HIGH にした時点でシフトレジスタ(LED matrix のデータを格納する記憶素子)に記録されます。そのため、ラッチが HIGH になったタイミングで 1bit(LED の1つ分) × 6(R1~B2までのピン数) のデータが格納されます。
- 以下、シフトレジスタにデータが格納されるイメージ
2つ目の制御方法
2dom/PxMatrix および、TinyGo drivers/hub75 で使用している方法
「1つ目の制御方法」とは接続方法が異なるため、TinyGo drivers/hub75 を 1つ目の制御方法で動かそうとすると、上手く動きません。
2dom/PxMatrix の説明を日本語に訳したものが以下になります。
長いLEDモジュールのチェーンを直列に駆動する場合、カラーのデータラインを並列にするのは理にかなっています。これはデータレートを減らすためです。
しかし、今回は少数のモジュールを駆動するだけなので、それは必要ありません。
したがって、入力コネクタと出力コネクタをジャンパーワイヤーで接続して、すべてのシフトレジスタを一つの大きなシフトレジスタとしてチェーン接続することができます。
これには2つの利点があります。1つ目は、マイコンで必要なGPIOピンの数を減らせること、2つ目は、ハードウェアSPIインターフェースを使って駆動できることです。
理解する上で、重要なのはこの部分です。
すべてのシフトレジスタを一つの大きなシフトレジスタとしてチェーン接続することができます。
各ピンを数珠つなぎに接続し、SPI 通信のデータを R1 に、クロック信号をラッチに接続します。
そうすることで、SPI で 1bit 送信し、クロック信号が HIGH になるたびに 1bit のデータが格納されます。
少々理解に苦しみましたが、面白いですね!この方法を考えた人は頭が良いなと思いました。
- 以下、シフトレジスタにデータが格納されるイメージ
LED matrix と Wio Terminal を接続する
以下に、接続例を記載しているため、参考にしていただければと思います。
実装してみる
TinyGo のソースコードを作成する
下記のコードを参考に、SPI, hub75 の config を設定してください。
その上で、hub75.SetPixel で SPI 通信するデータをバッファに格納し、hub75.Display で SPI 通信をすることで、LED を点灯させることができます。
補足:
2024/12/02 時点では、TinyGo の drivers/hub75 をそのまま使用すると、赤の LED がうまく表示されないようです。PullRequest 作成済
TinyGo drivers/hub75 のコードについて補足
TinyGo drivers/hub75 の処理の補足情報。
個人的に理解が難しかったのは、色のデータを Wio Terminal のバッファに格納し、LED を点灯する処理です。
そのため、少し説明を記載したいと思います。
色のデータを Wio Terminal のバッファに格納する処理
1ピクセルにRGBの0〜255の値を格納するというような処理ではなく、輝度ごとに階層を分けして、1ピクセルに 0/1 の値 * 3(RGBの分) * 8(輝度)を格納するというようなものになっています。
以下のソースコードで言うと d.buffer が上記のデータを格納している変数になります。
バッファに格納したデータで LED を点灯する処理
上記のように格納したバッファと値はどのように扱われるのか、具体例で説明します。
まず、2 * 2 の領域で以下のデータを格納したとします。
- 格納するデータ(左上のピクセルを座標(0, 0) とする)
- (0, 0) 輝度0、R0, G0, B0
- (1, 0) 輝度0、R1, G0, B0
- (0, 1) 輝度7、R1, G0, B0
- (1, 1) 輝度3、R0, G1, B1
そして、ループ内では Display() を呼び出すことににより、高速で LED が点滅します。
その時、以下のように、輝度ごとに光ります。
- 輝度が 0 であり、0/8 で点灯するので、光りません
- 1.と同様
- 輝度が 7 であり、8/8 で点灯するので、とても強く光ります
- 輝度が 3 であり、4/8 で点灯するので、3.より弱めに光ります
最後に
本記事は、現在作成中の LED matrix で 天気情報を表示する制作記事の一部となっています。ご興味がありましたら、是非そちらもご覧ください。
Discussion