WS2812B LEDマトリクスを Arduino / Raspberry Pi / VB.NET から制御する。

2018/10/20 初版
2022/11/26 追記

7M4MON


WS2812Bを使用したLEDマトリクス(16x16 と 8x32 =256個)を入手したので、
Arduino / Raspberry Pi / VisualBasic.NET からそれぞれ制御してみました。




1.Arduino


SDカードに保存されたBMPファイルをLEDマトリクスに表示します。
SDカードの最大容量は32GBです。

1.1 ハードウェア




使用したハードウェアは Arduino Leonard 互換の Pro micro (ATMEGA32u4)です。
5Vバージョンなので、電源は市販のモバイルバッテリーを利用可能です。
プログラムはUNO / Pro mini (ATMEGA328P)でも入るのですが、
デバッグ用のコードを削除してもRAM残量の警告が出ます。(グローバル変数が81%使用)
電源ON/OFFはPch MOS FET (2SJ349)をスイッチ付きボリュームで制御します。
このボリュームは明るさ制御も兼ねています。
他方のボリュームはスクロール速度を制御します。
ケースはテイシンのTB-55-Bです。高さに余裕がないのでICソケットは不使用です。

1.2 ソフトウェア

電源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に公開しましたのでご自由にどうぞ。




2.Raspberry Pi




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に公開しましたのでご自由にどうぞ。




3.VisualBasic.NET



書き込むフォントを選べたりスクロールしたりSocketServerを持っていてネット経由で操作できたりします。

インターフェースは3Mbaud対応のUARTモジュールから 7-n-1 で制御する自作ライブラリです。

レベルシフトと極性反転のために、インバータを挿入してあります。



SerialPortのプロパティは下記のとおりです。FT234X 使用です。


Color.Blackを送出したとき、配列の中身は 91(dec) = 0b1011011(0x5B) で合っています。

コードはGithubに公開しています。
https://github.com/7m4mon/ws2812b.vb




以上3種類を比較表にまとめるとこんな感じです。



実は、VB.net→RPi→Arduinoの順に開発したのですが、機能は少ないながらも即使えて
シャットダウン処理が不要なArduinoバージョンが一番使い勝手が良いと思います。
---
というわけで、もう一つ作っておきました。
ケースはaitendoのプラケース [C57x55x28]、基板もaitendoの50x50。
小型化のためにマイコンボードはBeetle 32u4を使用。
スクロールスピードのは bfReserved2 で変えられるのでボリュームは廃止しました。
電源コネクタは秋月の電源専用 micro USB [MRUSB-2B-D14NI-S306] を使用しました。