マトリクスＬＥＤパネルの使い方

##はじめに
　最近、Twitterなどで３色ＬＥＤを 64x32 や 64x64 のマトリクス状に配置したマトリクスＬＥＤパネルの書き込みや写真が話題になっているので、便乗して私が分かっている範囲でメモを残したいと思います。
　ＣＱ出版の**Interface誌 2018年10月号「ESP実験コーナー」**にもマトリクスＬＥＤパネルに関する記事を執筆していますので、そちらも参考にしてみてください。
　https://interface.cqpub.co.jp/magazine/201810/
　https://interface.cqpub.co.jp/wp-content/uploads/if10_156.pdf

##マトリクスＬＥＤパネルの種類
マトリクスＬＥＤと一言でいうと多種多様な製品、部品があるのですが、ここでは写真のような３色ＬＥＤを配置し、**HUB-75**というインターフェースを持ったものに絞ります・・・絞りまくって、私の手元にある３種類になるのですが。

###(1) ３２ｘ１６
　以前に秋葉原の**秋月電子通商**にて販売していました。
　横３２ドット、縦１６ドットで６ミリピッチでＬＥＤが配置されています。
　サイズは１９２ｍｍｘ９６ｍｍ。
　**ラインの選択はＡ、Ｂ、Ｃの３ビット、８ライン**で行います。ラインの選択など制御回りの話しは後で記します。
![matled_qiita_3216p6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/70f83777-4614-988a-0937-85a7c45df176.jpeg)
　既に**秋月電子通商**のホームページでは見つけられず、現在だと**akibaピカリ館**で同様の製品が購入できそうです。
　<https://www.akiba-led.jp/product/1161>

###(2) ６４ｘ３２
　前項の**秋月電子通商**で販売していた３２×１６のパネル以外に何か表示に使えるデバイスがないかと探していて、**akibaピカリ館**で見つけました。
　横６４ドット×縦３２ドットとそれまでの４倍のＬＥＤが配置されています。
　**ラインの選択はＡ、Ｂ、Ｃ、Ｄの４ビット、１６ライン**で行います。
　・３ミリピッチ
　　<https://www.akiba-led.jp/product/1160>
　　サイズ１９２ｍｍｘ９６ｍｍ
![matled_qiita_6432p3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/60783abd-ec00-7f7f-cca8-731455503470.jpeg)
![matled_qiita_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/c2ed9050-7973-83ac-8454-2220ac46598a.jpeg)

　・４ミリピッチ
　　<https://www.akiba-led.jp/product/1182>
　　サイズ２５６ｍｍｘ１２８ｍｍ
![matled_qiita_6432p4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/3cbe5b8e-ff29-2229-3474-5681d417eab1.jpeg)
　少しお高めですが、３２ｘ１６が約３０００円で、その４倍のドット数で価格が３倍程度だったので購入しました。ちなみに最初は１枚づつ購入し、その後追加で何枚か購入しています。
　少し高めですが、店頭での購入時は目の前で全点灯チェックをしてくれたり、２回目のときは前にも購入したことを話すとロットにより色味が変わることがあるので、複数枚で大きなパネルを作る場合には同じロットのパネルを選ぶようアドバイスをしてもらえたりしたので、部品単品の価格ではなく、保険＋コンサルタント料が込みの値段と捉えています。
　ちなみにamazonなどのネット通販でも同様のパネルをかなり安価に購入できるようです。接触不良などによる不点灯のリスクもあるように思いますが、まずは値段！という方はネット通販にトライしてもいいかもしれません。

###(3) ６４ｘ６４
　今回の記事を書くきっかけとなった秋葉原の**Shigezone**で販売されているパネルです。
　<https://twitter.com/ShigezoneAkiba>
　<https://twitter.com/ShigezoneAkiba/status/1152776969274064896>
　<https://twitter.com/ShigezoneAkiba/status/1143660456927625216>
　横６４ドットｘ縦６４ドットで２．５ミリピッチでＬＥＤが正方形に配置されています。
　サイズは１６０ｍｍｘ１６０ｍｍ。
　**ラインの選択はＡ、Ｂ、Ｃ、Ｄ、Ｅの５ビット、３２ライン**で行います。
![matled_qiita_6464p2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/a12ffe99-0191-b5ed-033d-67d7fe6d09b4.jpeg)

##インターフェース
今回紹介したマトリクスＬＥＤパネルは全て **HUB-75** というインタフェースで外部から制御することができます。
パネルのコネクタは**２ｘ８**の**１６ピン**で、パネル側のピン配置は以下のようになります。パネルの種類による大きな違いはありませんが、制御するライン数の違により 制御するライン位置を決めるピンが **A/B/C**、**A/B/C/D**、**A/B/C/D/E** と変わります。
　　![matled_qiita_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/a0e7ad74-169b-abe7-9ab1-7522f966b990.jpeg)
・ピンの説明

```
| ピン|   　　　　　　意味
|:---:|:----------------------------------------------
| R1  | 上半分の赤(RED)ＬＥＤのＯＮ／ＯＦＦの信号ピン
| G1  | 上半分の緑(GREEN)ＬＥＤのＯＮ／ＯＦＦの信号ピン
| B1  | 上半分の青(BLUE)ＬＥＤのＯＮ／ＯＦＦの信号ピン
| R2  | 下半分の赤ＬＥＤのＯＮ／ＯＦＦの信号ピン 
| G2  | 下半分の緑ＬＥＤのＯＮ／ＯＦＦの信号ピン 
| B2  | 下半分の青ＬＥＤのＯＮ／ＯＦＦの信号ピン 
| A   | 制御するラインを選択するデコーダのビット０のピン
| B   | 制御するラインを選択するデコーダのビット１のピン
| C   | 制御するラインを選択するデコーダのビット２のピン
| D   | 制御するラインを選択するデコーダのビット３のピン
| E   | 制御するラインを選択するデコーダのビット４のピン
| CLK | R1/G1/B1/R2/G2/B2のON/OFFを次段へ送るクロックピン
| LAT | １ライン分のデータを確定させる信号ピン
| OE  | １ライン分のデータのＬＥＤへの出力の有効／無効の信号ピン
```

##マトリクスＬＥＤパネルの制御
　今のところ私はマトリクスＬＥＤパネルの制御方法の仕様書やデータシートを見つけられていません。代わりに電子工作向けの部品などを販売している**Adafruit**が同様のマトリクスＬＥＤを扱い、サンプルプログラムを公開していたので、そのプログラムを参考に自分用のプログラムを作成しています。
　今ですと以下のページが参考になると思います。
　<https://github.com/adafruit/RGB-matrix-Panel>

＜手順＞
　LAT と OE は「0」で有効状態なので初期状態では「1」に設定されているものとします。
　また CLKは初期状態では「0」に設定されているものとします。

① パネル上半分側の一番左上のＬＥＤへ出力したい 0/1 を R1,G1,B1に設定します。
② パネル下半分側の一番左上のＬＥＤへ出力したい 0/1 を R2,G2,B2に設定します。
![matled_qiita_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/1396dd8a-c4e5-582a-a125-0d12d642685c.jpeg)
③ CLK を (0)→ 1→ 0へ変化させます。
④ ①～③の操作を１ライン分のドット数分（64x64のパネルなら６４回）、繰り返します。
これは、ある１ラインを表示させるため、右側からデータをセットして CLK１回の変化で１つ左へシフトさせる操作の繰り返しになります。

```　
　　　　　　　↓１個目のデータをセット
－ － － － .... － － － －  ← ①
　　　　　　　↓ CLKを(0)→ 1→ 0へ変化
－ － － － .... － － － ①
　　　　　　　↓２個目のデータをセット
－ － － － .... － － － －  ← ②
　　　　　　　↓ CLKを(0)→ 1→ 0へ変化
－ － － － .... － － ① ②
　　　　　　　↓３個目のデータをセット
－ － － － .... － － ① ②  ← ③
　　　　　　　↓ CLKを(0)→ 1→ 0へ変化
－ － － － .... － ① ② ③
　　　　　　　：
　　　　　　　：
　　　　　　　↓６４個目のデータをセット
－ ① ② ③ .... ＊ ＊ ＊ ＊  ← 64
　　　　　　　↓ CLKを(0)→ 1→ 0へ変化
① ② ③ ④ .... ＊ ＊ ＊ 64
```
⑤ LAT と OE を (0 or 1)→ 1 へ変化させます。
⑥ ①～④まででセットしたデータを表示させたいラインを A,B,C,D,E（パネルのライン数により D,E は未使用）で選択します。
上記は各表示領域の最上段を想定しているので (A,B,C,D,E) = (0,0,0,0,0)を設定します。
![matled_qiita_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/fa41bb67-08dc-182c-4c14-da910d389338.jpeg)
⑦ LAT と OE を (1) → 0 へ変化させ、①～④まででセットしたデータを⑥で設定したラインへ表示します。
⑧ ①～⑦までの操作を全ライン数分繰り返します。

 なお、ここで紹介したマトリクスＬＥＤパネルは、上記の①～⑧の操作を止めると表示が止まる、もしくは、操作を止める直前に操作したラインだけが表示されたままになります。
 これは**ダイレクト・ドライブ**と呼ばれる出力方式で、ＬＥＤを表示させるデータを保持するたに必要なメモリなどを減らして回路を簡単にすることで、パネルのコストを抑えることができます。
 また、表示は各ラインを高速で切り替えることで、人の目には残像によりパネル全体が表示されているように見えます。
 さらに、各ドットのＲＧＢの各色の明るさをオン／オフにより巧く制御することで、明るさや微妙な色の変化を作り出すことができます。ただし、微妙な色の変化を出すためには高速でオン／オフを制御しないと「**ちらつき**」が目立つようになります。

＜パネルの延長＞
　ここで紹介したマトリクスＬＥＤパネルは、通常、写真のように入力用のピンの他に、出力用のピンが用意されています。ピン配置は入力用と同じですが、全てのピンにはデータが出力されます。
![matled_qiita_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/c21f1a41-f4b5-f253-743f-372aa24443e7.jpeg)
　「手順」④で１ライン分のドット数分を繰り返すと説明していましたが、それ以上繰り返すとこの出力ピンへ初めの方にセットしたデータが**R1,G1,B1, R2,G2,B2**に出力されます。
　その他のピンは入力されたものと同じ信号が出力されます。これにより、例えば「32x16」のパネルにもう１枚「32x16」のパネルをつなげると、**64ドットx 16ドット**のパネルとして扱うことができます。
　以下は「32x16」のパネルを４枚つないで「128x16」のパネルにした例です。
![matled_qiita_6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/cc5e6ac5-3682-86e6-3e75-3b4099c678d4.jpeg)
![matled_qiita_7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/6c363a67-6afd-788f-9543-8d1c8f04169d.jpeg)

##おわりに
　今回紹介したマトリクスＬＥＤパネルは、異なるサイズでも概ね同じような操作で表示させたり延長したりできます。電子工作で使用するパネルを変更してもプログラムを大きく変更することなく対応できると思います。
　ただし、ライン数が変わるようパネルを変更した場合、特に少ないライン数から多くすると使用する制御線が１～２本増えることになります。また、既製のコントローラを使っている場合、ライン数の多いパネルに対応していないと、写真のようにそれまで連続していた部分が離れて表示されます。パネルの上端側と下端側で異なるグループになっているため（R1/G1/B1とR2/G2/B2）、出ている制御線の操作ぐらいでは対応できないと思います。
　同じHUB-75でも使用するコントローラがどのライン数まで対応しているのか理解し、使用するパネルが何ラインなのか確認するようにした方がよいと思います。
![matled_qiita_8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/1ba1a960-20c6-3f69-9e52-d0e533ea89c3.jpeg)
－ 以上 －