NeoPixelLEDを大量に使うときの注意?
とある目的で、NeoPixelLED(WS2812B)が連結されている4m240LEDと5m300LEDの2種類のテープLEDを使っています。
そこで、いろいろ詰んだ話とその対策をメモ程度に残しておきます。
自分がググって、日本語のサイトには書かれていないようなこともあります。
1.使用環境
使用ライブラリはAdafruitのNeoPixelライブラリを初期は使っており、今はFastLEDという様々なLEDに対応したライブラリを使っています。
・大きめの電源
自分は無線用の直流安定化電源GZV4000を使用。
2.物理的?注意
・電源とマイコンのGNDは共有する
当たり前なんですが、これしないとLEDがわけわからない点灯をしてびっくりします。焦らず、電源とマイコンのGNDを共有してください。
・電流流しすぎると壊れるかも...
4m240LEDが突然壊れたことがありました。結局原因不明なのですが、可能性として過電流が考えられました。
4m240LEDを明るさMAX(255)の白色で点灯させると10A以上必要になります。しかし、テープLEDの配線は細いです...10A。LEDも発熱しますし、電源接続部はかなり熱くなりました。明るさはせめて半分の128、私はすべてを光らせるときは64で使ってます。
・信号線は短く
開発中などは、すぐそばにマイコンとLEDがあると思いますが、もし何かのイベントなどで光らせることがあればマイコンとLEDが離れてしまうかもしれません。
しかし、あまりにも信号線が長すぎると信号が減衰し、うまく制御できません。
私の環境では、2mを超えると怪しい挙動をしました。
3.プログラムとしての注意
・プログラム上のLEDの定義数は確認する
まず、NeoPixelLEDは1つでマイコンのSRAMを3Byte消費します。個数が少なければいいのですが、大量に使うときは注意が必要です。
Arduino UNOはSRAMは2KBしかなく600個程度しか定義できません。しかし、AdafruitのNeoPixelライブラリを使うと、Arduino IDEのコンパイル時に表示されるスケッチの使用率?は正しくありません。よって、SRAMに入りきらない数を定義するとLEDは制御できず光らなくなります。しかし、コンパイルエラーは出ないので厄介です。
ということがあって、私はNeoPixelからFastLEDに使用ライブラリを変えています。スケッチの使用率は正しく出ますし、色の指定をRGBとHSVの2種類でできるので使いやすいと思ってます。
大量にLEDを使うときはSRAMが8KBのArduino MEGAやTeensyなどといったようなArduinoとしても使えるもっと高性能なマイコンを使う必要があります。
・NeoPixelLEDのデータレートは遅い
このLEDは、データを受け取ったら次のLEDに渡すというバケツリレー方式をとっています。よってLEDが多ければ多いほどすべてのLEDにデータが転送されるまで時間がかかります。この、転送速度が速ければいいのですが、NeoPixelLEDのデータレートは800KHzだったと思います。そんなに速くないです。
私の環境だと、順番にLEDを点灯させる(for文で回す)としてLED1000個で30秒、2000個で2分ほどかかります。
一応、非公式ですが友人がラズパイでクロックを速くしていったところ1200KHzぐらいまではLEDが制御できると話していました。私はArduinoで試していないので、クロックを速くできる方法があれば誰か教えて...(自分でプログラム書けって話)。
今のところこれぐらいです。また何かあったら付け足します。