Changes between Initial Version and Version 1 of WS2822S


Ignore:
Timestamp:
Mar 26, 2015 4:58:00 PM (9 years ago)
Author:
Ken Suzuki
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • WS2822S

    v1 v1  
     1= WS2822SシリアルLEDの使い方 =
     2
     3== 関連商品 ==
     4 * [https://www.switch-science.com/catalog/2206/ WS2822SシリアルLEDタイルモジュール(5個入り)]
     5 * [https://www.switch-science.com/catalog/2207/ WS2822SシリアルLEDスティックモジュール]
     6
     7
     8== WS2822Sの特徴 ==
     9フルカラーシリアルLEDのWS2822SはEEPROMを内蔵していてそこにアドレス情報を保存することができます。[[BR]]
     10それぞれのLEDがアドレスを持つことで、複数のLEDを1本の信号線で制御できます。[[BR]]
     11信号線は色信号に1本、アドレス信号に1本の合計2本が必要です。[[BR]]
     12WS2822Sの利点、WS2812Sとの比較は[http://mag.switch-science.com/2015/02/04/ws2822s/ こちら]
     13
     14[[Image(s-ws2822s_8.jpg)]]
     15 
     16== 通信方法 ==
     17WS2822Sの通信方法にはDMX512という通信規格の拡張方式を用いています。[[BR]]
     18DMX512とは舞台照明や演出機器などのコントロールに使われる規格で、512チャンネルx8bitの情報を扱えます。[[BR]]
     19WS2822Sの通信規格では3072チャンネルx8bitの情報を扱えます。WS2822Sの色情報は赤緑青の3色x8bitなので、1LEDあたりに3チャンネル分の情報が必要です。[[BR]]
     20つまり最大で1024個のLEDが1本の信号線でコントロール可能です。[[BR]]
     21
     22=== ・色信号 ===
     23色制御信号のフォーマットは次のようになっています。
     24
     25[[Image(s-ws2822s_5.jpg)]]
     26[[Image(ws2822s_color2.jpg)]]
     27
     28色の制御信号は全てのLEDに並列に接続されているので、全てのLEDに同時に届きます。[[BR]]
     29アドレスが1番に設定されたLEDは1、2、3番目の情報を取り込みます。[[BR]]
     30アドレスが4番に設定されたLEDは4、5、6番目の情報を取り込みます。[[BR]]
     31
     32=== ・アドレス信号 ===
     33アドレス設定信号のフォーマットは次のようになっています。
     34
     35[[Image(s-ws2822s_6.jpg)]]
     36[[Image(ws2822s_address.jpg)]]
     37
     38アドレスの設定信号は色の信号と違って並列ではなくLED同士が直列に数珠繋ぎになっています。[[BR]]
     39ADRIピンにアドレスの情報が入力され、アドレス情報を受け取ったLEDは次につながっているLEDのためのアドレス情報をADROから出力します。[[BR]]
     40次の例は先頭のLEDにアドレス4番、その次のLEDに7番を書き込む時の先頭LEDのADRIとADROの波形を表しています。
     41
     42[[Image(s-ws2822s_7.jpg)]]
     43
     44アドレスの値は3byteの情報で表され、組み合わせは次の表のようになっています。
     45
     46[[Image(ws2822s_address3.jpg)]]
     47
     48== ライブラリ ==
     49[https://github.com/SWITCHSCIENCE/WS2822S Arduino用WS2822Sライブラリ]を作成しました。
     50
     51=== 使い方 ===
     52まず最初にアドレスをLEDに書き込みます。
     53
     54{{{
     55//*****************************************************************
     56// WS2822S
     57//
     58// アドレス設定  setAddress(LEDの先頭番号、LEDの末尾番号)
     59//******************************************************************
     60
     61#include "Ws2822s.h"
     62#define PIXEL_NUM 10    //使用するWS2822Sの数
     63#define LED_PIN 13      //WS2822SのDAIピンにつなげるArduinoのピン番号
     64#define ADR_PIN 12      //WS2822SのADRIピンにつなげるArduinoのピン番号
     65
     66Ws2822s LED(LED_PIN , ADR_PIN, PIXEL_NUM);
     67
     68void setup()
     69{
     70   
     71}
     72void loop()
     73{       
     74    LED.setAddress(0,9); // 先頭から0,1,2... 8,9とアドレスを書き込み
     75                         // 一度アドレスを書き込んだらLEDの電源をOFFに
     76    delay(5000);
     77}
     78
     79}}}
     80このスケッチをArduino Unoで実行しました。WS2822SのDAIピンをArduino Unoの13番ピンに、ADRIピンをArduino Unoの12番ピンに接続してあります。[[BR]]
     81LEDの先頭から順番にアドレスをつけていくと1、4、7…となりますが、ライブラリ上では0、1、2…となるようにしてあります。[[BR]]
     82setAddress(0,9); とすると先頭から0123456789と順番にアドレスを割り振ります。[[BR]]
     83
     84アドレスの書き込みに成功するとLEDが白く光ります。一度アドレス書き込みが成功したら電源を切ります。電源を切ってもアドレス情報は消えません。[[BR]]
     85アドレスの変更予定が無ければアドレスの信号線ははずしてしまってもかまいません。[[BR]]
     86
     87次にスケッチを変更してLEDを光らせてみます。
     88
     89{{{
     90//*****************************************************************
     91// WS2822S
     92// 2015/01/29
     93//
     94// 色情報の設定 setColor(LEDの番号、赤、緑、青)
     95// 色情報の送信  send()
     96//
     97//******************************************************************
     98#include <MsTimer2.h>
     99#include "Ws2822s.h"
     100#define PIXEL_NUM 10    //使用するWS2822Sの数
     101#define LED_PIN 13      //WS2822SのDAIピンにつなげるArduinoのピン番号
     102
     103Ws2822s LED(LED_PIN , PIXEL_NUM);
     104
     105void write_color()
     106{
     107    LED.send();
     108}
     109
     110void setup()
     111{
     112    MsTimer2::set(100,write_color);
     113    MsTimer2::start();
     114}
     115void loop()
     116{     
     117  for(int i=0;i<PIXEL_NUM;i++){
     118      LED.setColor(i              ,0xFF,0x00,0x00);
     119      LED.setColor((i+1)%PIXEL_NUM,0xFF,0xFF,0x00);
     120      LED.setColor((i+2)%PIXEL_NUM,0x00,0xFF,0x00);
     121      LED.setColor((i+3)%PIXEL_NUM,0x00,0xFF,0xFF);
     122      LED.setColor((i+4)%PIXEL_NUM,0x00,0x00,0xFF);
     123      LED.setColor((i+5)%PIXEL_NUM,0xFF,0x00,0xFF);
     124      LED.setColor((i+6)%PIXEL_NUM,0x00,0x00,0x00);
     125      LED.setColor((i+7)%PIXEL_NUM,0x00,0x00,0x00);
     126      LED.setColor((i+8)%PIXEL_NUM,0x00,0x00,0x00);
     127      LED.setColor((i+9)%PIXEL_NUM,0x00,0x00,0x00);
     128  }
     129}
     130
     131}}}
     132
     133#define PIXEL_NUM 10 で使用するWS2822Sの数を指定します。[[BR]]
     134
     135Ws2822s LED(LED_PIN,PIXEL_NUM); で色情報の送信に使うピンが決まり、色情報を保存する配列が作られます。[[BR]]
     136
     137LED.setColor(アドレ,赤,緑,青);で作られた配列に色情報を書き込みます。アドレスに指定できる値は0 ~ PIXEL_NUM-1 の範囲です。[[BR]]
     138
     139色情報の送信は LED.send()で行います。用意した配列に書き込まれた色の情報を送信します。[[BR]]
     140
     141WS2822Sは最長でも1秒以内に色情報を書き直す必要があるので、[http://playground.arduino.cc/Main/MsTimer2 MsTimer2ライブラリ]を使用して100ms毎に色情報を書き込んでいます。[[BR]]
     142LEDに送信された色情報が反映されてLEDがその色に光るのは、その次の色信号のBreakが送られたタイミングのようです。[[BR]]
     143ですので、一度色信号を送っただけでは光りません。
     144
     145
     146=== 注意点 ===
     147規格上は1本の信号線で1024個のLEDをコントロールできますが、このライブラリはArduinoのSRAMに色情報保存用の配列を展開しているので、[[BR]]
     148メモリ不足で1024個まではコントロールできません。 Arduino Unoで多くても200個ほどが限界の目安です。[[BR]]