WS2812Bを使用したLEDマトリクス(16x16 と 8x32 =256個)を入手したので、
Arduino / Raspberry Pi / VisualBasic.NET からそれぞれ制御してみました。
SDカードに保存されたBMPファイルをLEDマトリクスに表示します。
SDカードの最大容量は32GBです。
使用したハードウェアは Arduino Leonard 互換の Pro micro (ATMEGA32u4)です。
5Vバージョンなので、電源は市販のモバイルバッテリーを利用可能です。
プログラムはUNO / Pro mini (ATMEGA328P)でも入るのですが、
デバッグ用のコードを削除してもRAM残量の警告が出ます。(グローバル変数が81%使用)
電源ON/OFFはPch MOS FET (2SJ349)をスイッチ付きボリュームで制御します。
このボリュームは明るさ制御も兼ねています。
他方のボリュームはスクロール速度を制御します。
ケースはテイシンのTB-55-Bです。高さに余裕がないのでICソケットは不使用です。
電源ONでSDカードにアクセスし、ルートフォルダのファイルに順にアクセスします。
ファイルの属性をチェックし、ヘッダが32bitのBMPファイルだったならば、
幅と高さを確認して、OKだったらファイルに1バイトずつアクセスして、
R,G,Bを順に読み込み、明るさを調整して、LEDマトリクスの配列に格納します。
アニメーションを実現するには、LEDマトリクスの大きさ毎に画像を配列した
BMPファイルを作成します。
BMPファイルのヘッダのReserve領域①(bfReserved1)に『LEDマトリクスの幅−1』
(LEDマトリクスの幅が16ならば15 = 0x0F)を入力します。
ビットマップファイルのヘッダはリトルエンディアンなので、0x0F,0x00です。
アニメーション表示、スクロールスピードはReserve領域②(bfReserved2)に値を入れて制御します。
その他の値と同様、リトルエンディアンで入力します。
追加のポーズ時間が200msなら、0xC8, 0x00 です。
予約領域に入れた値は画像編集ソフトで保存すると0に上書きされてしまうので
要注意です。また、Windowsの『ペイント』は24bit Bitmapで保存するので
他のソフトで32bit(ARGB)で保存し直す必要があります。
コードはgithubに公開しましたのでご自由にどうぞ。
Raspberry PiではPythonを使用し、ライブラリは rpi_ws281x というものを使用しました。
普通に起動すると指定されたフォルダの指定されたファイルを順々に表示します。
アニメーションは showImageFile 関数の第4引数にLEDマトリクスの幅を指定します。
例
filename = './image/mario-anim.png'
showImageFile(filename, 500,220,16)
オプション -s を指定してWebサーバーモードで立ち上がります。
画像を指定したり、任意の文字列を表示することが出来ます。
I/Oは3.3Vなのでレベル合わせのためにダイオードで0.6V電源電圧を落としたTC7S04Fを
一個挿入しています。よって、出力は LED_INVERT を指定しています。
横のボタンを押すとシャットダウン処理を行うようにしてみましたが………
コードはgithubに公開しましたのでご自由にどうぞ。
書き込むフォントを選べたりスクロールしたりSocketServerを持っていてネット経由で操作できたりします。
インターフェースは3Mbaud対応のUARTモジュールから 7-n-1 で制御する自作ライブラリです。
レベルシフトと極性反転のために、インバータを挿入してあります。
コードはGithubに公開しています。
https://github.com/7m4mon/ws2812b.vb