Raspberry Pi に接続するLEDパネルを作りました。
64x32ピクセルのLEDパネルを3x3で合計9台マトリックス状に並べています。
1つのモジュールが25.6cm x 12.8cm. それを 3x3 で 76.8cm x 38.4cm になります。 192 x 96 pixelです。HDMI 信号の、左上の 192 x 96 の部分だけをそのまま出せるので Raspberry Pi の GUI でさくっと電光掲示板が作れると。
64x32のLEDパネル
64x32-P4 として売られているもの
外形128*256mm
P4とは、ドットピッチが4mmという意味。
裏側
型番が書いている。
P4-2121-64*32-16S-HL1.1
どうやら、
P4:ピッチ4mm
2121:2121メトリック( 2.1mm x 2.1mm )のLED素子
64*32ドット
という意味らしい
黒のコネクタはHUB75と呼ばれる16ピンフラットケーブルヘッダです。
電源は5Vで動きます
デコーダー&ドライバ
ICN2037
16-Channel Constant Current LED Sink Driver with Dual Latch
http://en.chiponeic.com/content/details36_245.html
ICN2012
8-Channel Power Switch
http://en.chiponeic.com/content/details37_459.html
ICN74HC245
CMOS 8-Channel 双方向バスバッファ
HUB75 と HUB12
HUB12
シングルカラーインターフェース
OE | 1 | 2 | A |
GND | 3 | 4 | B |
GND | 5 | 6 | C |
GND | 7 | 8 | CLK |
GND | 9 | 10 | LAT |
GND | 11 | 12 | R |
GND | 13 | 14 | G |
GND | 15 | 16 | NC |
HUB75
RGB インターフェース
R1 | 1 | 2 | G1 |
B1 | 3 | 4 | GND |
R2 | 5 | 6 | G2 |
B2 | 7 | 8 | GND |
A | 9 | 10 | B |
C | 11 | 12 | D |
CLK | 13 | 14 | LAT |
OE | 15 | 16 | GND |
だそうです。
電源
5V単一電源でした。結構容量が必要。
PC用の電源を使い、ATX コネクタの Power On 信号をGNDにショートさせて使うことにしました。
動かすためにはどうするか?
駆動方法
ぱっと思いつくのはArduinoなどで駆動すること。しかしながらネットワークストリームなどを流したいとすれば、RaspberryPiで駆動したいです。
ArduinoにもRaspberryPiにもこのようなものを駆動するライブラリはあります。しかしながらRaspberryPiではチラツキが発生するということを聞きました。
また、デコーダ、ドライバのICや結線が様々なものがあるらしい。
これは後に述べるRCGファイルというものですが、これらそれぞれ内部のデバイス構造が異なっていたりします。このように形式が数多くあり、今後ロット入手するときに同じものが手に入る保証がないことから、RaspberryPiのGPIOなどで直接動かしてもロットが変わればプログラムをまた書き直さなければならなくなる可能性大です。このやりかたはあきらめて別の方法を取ることにしました。
Linsn のコントロールカードを使う
LEDのパネルの信号はそんなに難しいものではないのだけれど、タイミングがシビアです。リアルタイム性を担保しようとするとFPGAとかを使いたくなります。
さて、中国のLEDパネル関連製品の大手に Linsn という会社があります。その Sender Card と Receiving Card のたぐいを組み合わせるのが定番らしいです。
Sender Card は FPGA で制御し、LEDパネルのデコード方法にあわせて設定を変更できるらしいです。先の RCG ファイルで対応できればいちいちプログラム書かなくていいでしょう。このやりかたで作ることにしました。
Sender Card
TS802Dというものを使いました。
PCIの形のPCカードぽいですが、カードエッジを調べてみたらPCIバスの機能はつかっておらず、電源を供給する役目しかありませんでした。電源コネクタが別にあるので、そこから5Vを供給すればカード単体で動作します。
Receiever Card
RV908 というタイプを使いました。1台のTS802Bに複数のRV908がつながるらしいです。
配線
LEDパネルは横にカスケード接続できます。
信号送り元になるケーブルには Reciever Card をつなぎます。RV908は12チャンネルの信号が出せます。
RV908も5V単一電源で動作します。
Sender Card と Reciever CardはLANの線でつなぎます。
USB-Bコネクタを使って、WindowsPCに接続し、設定をします。
右側のDVIコネクタは、映像信号入力です。変換ケーブルを使えばHDMIなどの信号を入力できます。PCなどのディスプレイコネクタにつなげると、このカードがディスプレイデバイスとして見えます。
ソフトウェアで設定する
- Linsnのカードに付属するソフトウェアは2種類。LedSetとLEDStudio。
- それぞれ MS-Windows でしか動作しない。
- LEDSet は LEDパネルにあわせてSender Card を設定し、画面解像度など指定するもの。
- LEDStudio WindowsPCの画面そのものにコンテンツを表示管理するもの。WindowsPCの本来のディスプレイと、Sender Card のディスプレイデバイスの機能をミラーさせておいて、例えばノートPCのディスプレイに出したコンテンツと同じものをLEDパネルに出すような方法を取る。
- ここではLedSetを使う。
起動エラーの対処
x64でも動くけれども、日本語対応していない。そもそも日本語Windowsだと起動しない。なので英語環境にして起動する。
英語環境にするとこのような起動画面が出る。
あらかじめ、Sender Card と PC を USBで接続しておく。仮想COMポートでやりとりしているみたい。適当にCOMポートを設定しておくと、「Serial port State: Connected」となり、認識したモデル名などが出る。
その状態で、「Screen Configuration」を押す。
Screen Configuration画面になったら、ここで仮想ディスプレイの解像度を設定する。
仮想ディスプレイの設定を行う
ここで、PC等の映像供給元から見た時のディスプレイの解像度などを指定する。
LEDパネルに合わせた設定を行う
Reciever タブで、LEDパネルの設定をする。設定に合わせて、FPGAによる信号が作られる。
LEDパネルに合わせた RCG ファイルという設定ファイルを読み込むことができる。
合うRCGファイルがあったり、ベンダーからRCGファイルを入手できればいいのだけれど、叶わなかったので IntelligentSetup で作成した。
IntelligentSetup
先に見たデコーダーチップに合わせる。P4-2121-64*32-16S-HL1.1には、ICN2012がパネルあたり4つありました。Column 2 x Row 2 っぽい配置だったので、Data Input port QTY を 2にしたら当たりでした。
ここから先は、LEDパネルに出てくる信号を見ながら対話的に設定していきます。
Windowsの画面左上の領域が点滅して、それに伴うLEDパネルの動作を見て Display status を選択します。
カラーコントロールをLEDパネルの動作に合わせて選択します。
↓この画面ははじめは何のことやらわからなかったのですが、LEDパネルに点滅ドットが現れるのでそれに対応するセルを指定していきます。64x32全部指定しないといけないかなと思いましたが、Column + Row をそれぞれ1列ずつ指定するだけで良かったです。
LEDパネルを3x3使っているので、ここで3x3にするのかと思ったがそうではないようだ。デコーダーボードやドライバボードが複数台ある時に使うっぽい。
設定が終わったら
以上の設定は dot by dot 設定。64x32のパネルを縦横3つずつ並べて 192x96 のディスプレイになっている。一旦設定が終わったら、ボード内部に記憶してくれるのでその設定を使ってRaspberryPiやスマホなどにもつなげることができる。
以下はRaspberryPiのHDMIにつなげた例。
顕微鏡の映像をRaspberryPiカメラで撮影しています。10円玉の裏の鳳凰の像を拡大しているところです。