近々WS2822SというシリアルLEDチップを使った製品がスイッチサイエンスから発売予定です発売しました。今回はそのWS2822Sを光らせてみました。過去にも似たような記事があるのですが、それとは別のものです。
今までもWS2812SやWS2812BというシリアルLEDチップとそれを用いたテープLEDを扱っていたのですが、WS2812とWS2822Sでは使い方に違いがあります。
WS2812(従来品)の場合
WS2812は先頭のLEDが24ビットの色の情報を受け取ったら、次に来た24ビットの信号を次のLEDにパスします。そうすることで次々と後のLEDに色の情報が伝わっていきます。バケツリレーのように次々と後のLEDに情報が伝わるので信号の流れが1本ですみます。
その代わり、途中で一つでもLEDが故障してしまった場合その後ろに控えているLEDにも信号が届かなくなってしまいます。これがWS2812の弱点です。
WS2822S(新商品)の場合
WS2822Sは信号の流れが2本あります。一つは色の情報を伝える信号、もう一つはアドレスを指定する信号です。
WS2822SはそれぞれのLEDにアドレスを設定することができるのです。
アドレスの信号はWS2812の色の信号のように先頭のLEDから順番に受けとり、自分のアドレスを受け取ったLEDは次からくるアドレス情報を後にパスします。アドレス情報は一度設定したら電源を切っても消えません。
この例では先頭から順番に1,2,3,4,5とアドレスを割り当てていますが、順番でなくてもかまいません。
(アドレスの番号は説明のために簡略化されています)
色の信号はアドレスとは別の線で送ります。WS2812のようなバケツリレーではなく全てのLEDに同時に同じ信号が送られます。WS2822Sは何個分の色データが送られてきたのかカウントしていて、自分のアドレスと同じだけカウントしたところの色情報を自分のものとして取り込みます。例えばアドレス4のLEDは4番目に送られてきた色情報を反映して光ります。
どれか一つが故障したとしても、他のLEDには影響がでません。もちろんアドレスの書き換えはできなくなってしまいますが、一度アドレスを書き込めていたら電源を切ってもアドレス情報は消えないので書き換えたくならない限り問題はありません。
WS2822SをArduino Unoでコントロールするためのライブラリは近日公開予定です公開しました。ライブラリのダウンロード元や使い方はWS2822SシリアルLEDの使い方をご覧ください。
そのライブラリを使ってLED10個をコントロールしてみました。
#include "Ws2822s.h" #define PIXEL_NUM 10 //使用するWS2822Sの数 #define LED_PIN 13 //WS2822SのDAIピンにつなげるArduinoのピン番号 Ws2822s LED(LED_PIN , PIXEL_NUM); void setup() { } void loop() { for(int i=0;i<PIXEL_NUM;i++){ LED.setColor(i ,0xFF,0x00,0x00); LED.setColor((i+1)%PIXEL_NUM,0xFF,0xFF,0x00); LED.setColor((i+2)%PIXEL_NUM,0x00,0xFF,0x00); LED.setColor((i+3)%PIXEL_NUM,0x00,0xFF,0xFF); LED.setColor((i+4)%PIXEL_NUM,0x00,0x00,0xFF); LED.setColor((i+5)%PIXEL_NUM,0xFF,0x00,0xFF); LED.setColor((i+6)%PIXEL_NUM,0x00,0x00,0x00); LED.setColor((i+7)%PIXEL_NUM,0x00,0x00,0x00); LED.setColor((i+8)%PIXEL_NUM,0x00,0x00,0x00); LED.setColor((i+9)%PIXEL_NUM,0x00,0x00,0x00); LED.send(); delay(300); } }
この動画で使っているWS2822SシリアルLEDスティックモジュールはスイッチサイエンスのウェブショップで販売しています。