追記(2019/10/20): 後日談ですが、当時結局この方法でC++のコードを書いたところ、うまく動きませんでした。おそらくどこかが間違っていると思われます。間違った情報をお伝えしてしまい、申し訳ありませんでした。
どうも、予定が一杯でリア充のかちおです(違
諸事情で秋葉原のピカリ館でHUB75型の32x32のLED Matrix Panelを購入し、いじろうと思ったのでメモ。調べても日本語情報全然出てこなかった。
どうやら通常はライブラリを使うらしいが、公式にはArduinoしか対応しておらず、なんとか汎用IOで操作したいため、データシートとにらめっこした。
公式のリファレンスとかデータシートとかサンプルコードを翻訳しながら書いていく。
画面構成
合計1024個のLED(とRGB)をすべて同時に光らせることは現実的ではないので、全16セクションに分けるとのこと。
32のLED、横に32列ある。
全部で32列。
1セクションは一番上の1列目と真ん中の17列目、2セクションは2と18列目…らしい。
余談ですが、32x16のパネルは1と9、2と10…って組み合わせらしい。まあそれが妥当。
セクション | 列 |
---|---|
1 | 1と17 |
2 | 2と18 |
3 | 3と19 |
︙ | ︙ |
16 | 16と32 |
1セクションは 32LED x 2列 で64LED。さらにRGBがあるので3を掛けて192。
なのでセクションごとにこの192bitを送ってあげればいいらしい。
人間の目からしたら残像だけど、実際には同時に1セクション(64LED)しか光らないらしい。
まあそうだよね。
セクション(192個のLED)の光らせ方
まず接続端子にR1、G1、B1、R2、G2、B2、っていうピンがあると思う。もしかしたら1と2じゃなくて0と1の組み合わせかもしれない。ぼくの場合はそうだった。
ブルース展開でいうと{R,G,B}{1,2}か{R,G,B}{0,1}ですね。
とりあえず1と2で行きます。
これによって、同時に2つのLEDの状態を制御できます。RGB2つ分ですね。
で、セクションの上の列と下の列のLEDをそれぞれ同時に光らせることができます。
なので、一回のデータ送信で、セクションの上の列と下の列の一番左のLEDを光らせられるとのこと。これを32回繰り返します。
なので、たとえば1列目を白色に交互に点灯、17列目を赤青緑交互に光らせたい場合は以下のようになります。
ちなみに送信するごとにのクロックは、接続端子CLKから送るようです。これもSLCKとか色々呼び方があるようす。
あと、送信データは逆の値(負論理)、つまり光らせたかったらLOW、消したかったらHIGHらしいです。
送信 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | … | 32 |
---|---|---|---|---|---|---|---|---|---|
R1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | … | 1 |
G1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | … | 1 |
B1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | … | 1 |
上の色 | 白 | 消 | 白 | 消 | 白 | 消 | 白 | … | 消 |
|
| R2| 0 | 1 | 1 | 0 | 1 | 1 | 0 | … | 0 |
| G2| 1 | 0 | 1 | 1 | 0 | 1 | 1 | … | 1 |
| B2| 1 | 1 | 0 | 1 | 1 | 0 | 1 | … | 1 |
|下の色|赤|緑|青|赤|緑|青|赤|…|青
セクションの選び方
これで同時に離れた2列を表示できるようになりました。次はセクションを選ぶ必要があります。
接続端子にABC(D)があると思うのですが、これがセクションを選ぶ4ビットになります。
2進数で、0000から1111です。これで1セクションから16セクションまでを選択するとのこと。
最終的なピンの操作順序
1. 全ピンをLOWにする。(最初だけ)
2. R1 G1 B1 R2 G2 B2をそれぞれ上に書いたようにLOWかHIGHにする。
3. CLKをHIGHにする。
4. CLKをLOWにする。これでLED2個分が書き込まれた。
5. これと同じように、2~4をあと31回繰り返す。これで1セクションのデータ分書き込み終わる。
6. ABCDの4bit使って送り込みたいセクションを決める。最初は0000とか。
7. OEをHIGHにする。画面表示有効のフラグらしい。
8. LAT(STB)をHIGHにする。これでLEDが光る。
9. LAT(STB)をLOWにする。
10. OEをLOWにする。
11. 以上、2~10をセクションを変えながら8回分繰り返す。これを高速で繰り返すことで画面を全部表示できる。ちなみに止めたらその瞬間消える(たぶん)
参考
https://hima-tubusi.blogspot.jp/2017/05/hub75_30.html
https://gist.github.com/CLCL/4509360739cccfca8f64
https://www.thingiverse.com/thing:1508087
https://cdn-learn.adafruit.com/downloads/pdf/32x16-32x32-rgb-led-matrix.pdf