| 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]] |
| 12 | WS2822Sの利点、WS2812Sとの比較は[http://mag.switch-science.com/2015/02/04/ws2822s/ こちら] |
| 13 | |
| 14 | [[Image(s-ws2822s_8.jpg)]] |
| 15 | |
| 16 | == 通信方法 == |
| 17 | WS2822Sの通信方法にはDMX512という通信規格の拡張方式を用いています。[[BR]] |
| 18 | DMX512とは舞台照明や演出機器などのコントロールに使われる規格で、512チャンネルx8bitの情報を扱えます。[[BR]] |
| 19 | WS2822Sの通信規格では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]] |
| 39 | ADRIピンにアドレスの情報が入力され、アドレス情報を受け取った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 | |
| 66 | Ws2822s LED(LED_PIN , ADR_PIN, PIXEL_NUM); |
| 67 | |
| 68 | void setup() |
| 69 | { |
| 70 | |
| 71 | } |
| 72 | void 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]] |
| 81 | LEDの先頭から順番にアドレスをつけていくと1、4、7…となりますが、ライブラリ上では0、1、2…となるようにしてあります。[[BR]] |
| 82 | setAddress(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 | |
| 103 | Ws2822s LED(LED_PIN , PIXEL_NUM); |
| 104 | |
| 105 | void write_color() |
| 106 | { |
| 107 | LED.send(); |
| 108 | } |
| 109 | |
| 110 | void setup() |
| 111 | { |
| 112 | MsTimer2::set(100,write_color); |
| 113 | MsTimer2::start(); |
| 114 | } |
| 115 | void 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 | |
| 135 | Ws2822s LED(LED_PIN,PIXEL_NUM); で色情報の送信に使うピンが決まり、色情報を保存する配列が作られます。[[BR]] |
| 136 | |
| 137 | LED.setColor(アドレ,赤,緑,青);で作られた配列に色情報を書き込みます。アドレスに指定できる値は0 ~ PIXEL_NUM-1 の範囲です。[[BR]] |
| 138 | |
| 139 | 色情報の送信は LED.send()で行います。用意した配列に書き込まれた色の情報を送信します。[[BR]] |
| 140 | |
| 141 | WS2822Sは最長でも1秒以内に色情報を書き直す必要があるので、[http://playground.arduino.cc/Main/MsTimer2 MsTimer2ライブラリ]を使用して100ms毎に色情報を書き込んでいます。[[BR]] |
| 142 | LEDに送信された色情報が反映されてLEDがその色に光るのは、その次の色信号のBreakが送られたタイミングのようです。[[BR]] |
| 143 | ですので、一度色信号を送っただけでは光りません。 |
| 144 | |
| 145 | |
| 146 | === 注意点 === |
| 147 | 規格上は1本の信号線で1024個のLEDをコントロールできますが、このライブラリはArduinoのSRAMに色情報保存用の配列を展開しているので、[[BR]] |
| 148 | メモリ不足で1024個まではコントロールできません。 Arduino Unoで多くても200個ほどが限界の目安です。[[BR]] |