[企画・制作] ZEPエンジニアリング
WS2812B フルカラーシリアルLEDの使い方
光の三原色である赤(R)・緑(G)・青(B)、3色のLEDとその制御回路をワンチップ化したLEDデバイスをフルカラーシリアルLEDと呼び、照明や各種装飾に用いられるLEDテープライト*1 等に用いられています。フルカラーシリアルLEDは、「マイコン内蔵RGB LED」、「NeoPixel(Adafruit社の登録商標)」、「アドレッサブルRGB LED」とも呼ばれます。 同様にLEDテープライトは、「LEDストリップライト」、「LEDリボンライト」とも呼ばれます。またシート状にフルカラーシリアルLED配置した「LEDシ-ト」という製品もあります。
今回は、フルカラーシリアルLEDの代表格であるWorldsemi社のWS2812B*2 の基本的な仕様と使い方、Raspberry Pi PicoやArduino、M5Stackで制御する方法について紹介します。
WS2812Bの外形図とピンアサインを示します。プリント基板を設計する方はSolder Padの図面を参考にしてください。
WS2812B外形図とピンアサイン
端子は、電源ピン2本(VDD, VSS)と制御信号入出力2本(DIN, DOUT)の計4ピンで構成されています。以下の図のように複数のWS2812B をカスケード接続(数珠つなぎ)することによって1本の制御線ですべてのWS2812Bを制御することができます。LEDテープライトは、このように多数のデバイスを一定の間隔で並べ、テープ状の形にラミネートした構造になっており、好きな長さに切って使用します。LEDシートは、同様にシート状にしたものです。
*1:LEDテープライトとは、多数のLEDを配線とともに平たいテープ状に加工した装飾用照明器具。
*2:WS2812Bと制御互換があり、形状や仕様が異なる製品が多数あり、同様に制御して使用することができる。
フルカラーシリアルLEDのカスケード接続図
WS2812Bのデータシートには、WS2812B内部のブロックダイアグラムは記載されていませんが、データシートの記述から推測すると以下のような構成になっていると考えられます。(あくまでも著者の推測であり、実際と異なる可能性があります)
WS2812B内部ブロック図
DINより入力された制御信号は、シフトレジスタに送られ24ビット分がたまるとそのデータをラッチして、そのデータを用いてLEDに流れる電流を調整して各LEDを光らせます。自デバイス用の24ビットに続くデータは、信号整形増幅回路を経てDOUTへ出力され、次デバイスへと渡されます。信号整形増幅回路によって、次のデバイスへの波形ひずみが蓄積しないことが特徴であるとデータシートに書かれています。これにより、外部回路を付加することなしに5mを超える長さ(距離)の信号転送が可能となります。
WS2812Bの制御の仕方
WS2812BのDIN入力は、次のように入力するパルスの幅によって3つの状態を認識します。
WS2812B通信タイミング図
データ転送レートは、800Kbps、つまり1ビット当たり1250nS転送となりますが、そのうちのパルス幅が220nS~380nSのときは、データ0と認識し、580nS~1μSのときは、データ1と認識します。
DINを250μS以上lowレベルに保つとリセット(リフレッシュサイクルの始まり)と認識します。
データは、Reset codeを送った後、1デバイス当たりRGB LEDの輝度を表す8ビットずつのデータ計24ビットを送信します。転送するデータは、次の図のようにRGBの順でなくGRBの順であることに注意してください。※ただし使用するフルカラーシリアルLEDの種類によってはこの配列が異なる場合 があるのでそのデバイスのデータシートを参照してください。
転送するデータの順番
WS2812Bをカスケード接続している場合は、24ビットずつカスケード接続した分だけ続けてデータを送信します。DOUTからは、自デバイスで使用したデータ以降のデータが次のWS2812Bへ送信されます。
カスケード接続の場合:24ビットずつカスケード接続した分だけ続けてデータを送信する
カスケード接続するときは全体の消費電流に注意
WS2812Bのデータシートには消費電流の記載がありませんが、RGBそれぞれのLEDを最大輝度で光らせた場合の消費電流を実測してみると50mAを超える電流が流れました。このためカスケード接続する場合は、供給可能な電源容量を考慮して、合計の消費電流に注意する必要があります。RGB設定値と消費電流の実測値とグラフ化しものを次に示します。なお測定は、テスターで簡易測定した値のため誤差を含んできることをご承知おきください。
この測定結果から、例えば100個のWS2812Bをカスケード接続した場合、その消費電流は5Aを超えることになり、しっかりとした電源供給が必要となります。逆に100個のWS2812Bの消費電流を例えば1A以内に収めたい場合は、1デバイス当たりの消費電流を10mA以下にする必要があるため、グラフからRGBそれぞれの輝度設定値として48(16進数で30H)以下にしておけば、最大でも約860mAと1A以内に収めることができます。同様にUSBポートから給電し、100個のWS2812B全体を300mAに収めたければ、最大の輝度設定値を16(16進で10H)にすれば実現できます。ちなみに設定値16でもかなり明るく光ります。
マイコンでフルカラーシリアルLEDを制御する
ここからは、WS2812Bをマイコンで制御する方法について書きます。なおフルカラーシリアルLEDの多くのものは、WS2812Bと互換性のある制御プロトコルを用いていますので同じように制御することができます。
(1) Raspberry Pi Picoで制御する
今回は、Raspberry Pi PicoのPython環境での制御方法について取り上げます。
Raspberry Pi PicoはMicroPython環境をサポートしており、その詳しい使い方は、「Raspberry Pi Pico Python SDK」に記載されています。Python環境構築についても同ドキュメントを参照してください。
Raspberry Pi Pico Python SDKには、「3.9.2. WS2812 LED (NeoPixel)」という項があり、フルカラーシリアルLEDを動かすサンプルプログラムがあります。今回はそれを動かしてみます。
・Raspberry Pi PicoとフルカラーシリアルLEDの接続
今回はマルツで購入できる「LEDシート 8x8 RGB色(EM-LEDS-8X8-RGB)」という、WB2812Bを8×8の計64個をカスケード接続してシート状に並べたものを接続してみました。
Raspberry Pi PicoでWB2812Bを動かす:接続図と外観
最大輝度で全点灯した場合、最大で4A近くの電流が流れるため、Raspberry Pi PicoのVBUS(USBの電源端子に接続されている)から電源を供給することができないため外部電源が必要です。
・プログラムの入手と実行
制御プログラムは、先の「Raspberry Pi Pico Python SDK」の「3.9.2. WS2812 LED (NeoPixel)」にあるものをそのまま使います。ThonnyなどのPythonコンソールからプログラムを入力します。LEDシートに搭載されているWS2812Bの数は全部64ですから、プログラムの8行目を以下のように書き換えて実行します。
NUM_LEDS = 64
上手く動作すると以下のように光ります。
・好きなパターンで光らせる
SDKのサンプルプログラムの35行目以降を変更することで、光らせ方を自由にプログラミングすることができます。このサンプルプログラムでは、arという配列変数にカスケードされた数分のRGBの輝度情報をセットして、関数「sm.put(ar, 8)」 を実行することにより、光らせることができます。配列に収める数値は24ビットの整数で、輝度情報を上位からGRBの順で8ビットずつセットします。RGBの順でないことに注意してください。
ar[0] = g0 * 65536 + r0 * 256 + b0 #g0, r0, b0 は、0~255の整数
ar[1] = g1 * 65536 + r1 * 256 + b1 #最大消費電流を制限する場合は上限値に注意
・
・
sm.put(ar, 8)
・Raspberry Pi Pico単体で動作させる
出来上がったプログラムをパソコンと切り離してRaspberry Pi Picoで単体で動作させたい場合は、出来上がったPythonプログラムを「main.py」の名称でRaspberry Pi Picoに保存することによって実現することができます。
(2) Arduinoで制御する
Arduino環境では、Adafruit社のNeoPixelライブラリを使用することによって、Raspberry Pi Picoと同様に簡単にフルカラーシリアルLED、LEDテープライトを制御することができます。Arduinoにもマルツで購入できる「LEDシート 8x8 RGB色(EM-LEDS-8X8-RGB)」を接続してみました。
・ArduinoとフルカラーシリアルLEDの接続
Adafruit社のNeoPixelライブラリのサンプルプログラムでは、Arduinoのデジタルピン6が使用されているので、そこにDINを接続します。今回はArduino UNOを接続してみましたが、他のArduinoシリーズも使用できると思います。
ArduinoでWB2812Bを動かす:接続図と外観
・プログラムの入手と実行
まず、Adafruit社のNeoPixelライブラリをArduino IDEに組み込みます。Arduino IDEを起動して、スケッチ ⇒ ライブラリをインクルード ⇒ ライブラリを管理 を選択してライブラリマネージャを起動します。検索欄に「NeoPixel」と入力し、「Adafruit NeoPixel/Arduino library for controlling single-wire-based LED pixels and strip.」をインストールします。
NeoPixelライブラリをインストールする
続いて、Adafruit社のNeoPixelライブラリのサイトからライブラリのサンプルプログラム、「Simple」があるので、それを入力し、WS2812Bの数が64ですから、6行目を以下のように変更し、実行します。
#define NUMPIXELS 64
なお、他にもNeoPixel用のいろいろなサンプルプログラムがありますので、参照していろいろ試してみましょう。
(3) M5Stackで制御する
M5StackもArduino IDE環境であればAdafruit社のNeoPixelライブラリが使用できます。環境構築はArduino編と同様ですので前述の「(2) Arduinoで制御する」も参照ください。
・M5StackとフルカラーシリアルLEDの接続
DINへ接続するポートは、ピン16を使用しました。
M5StackでWB2812Bを動かす:接続図と外観
・プログラムの入手と実行
前述のArduino編と同様にAdafruit社のNeoPixelライブラリをArduino IDEに組み込みます。サンプルプログラム「Simple」も同一のものが使用できますが、5行目、6行目を以下のように変更します。
#define PIN 16
#define NUMPIXELS 64
以上の変更のみで動作します。他のサンプルについても試してみてください。
マルツで購入できるフルカラーシリアルLED、LEDテープライト
マルツで購入できるフルカラーシリアルLED、LEDテープライトは、こちらのリンクをクリックしてください。多数表示されますが、今回紹介したWS2812B互換以外のシリアルLED、LEDテープライトも含まれますのでご注意ください。必ず各製品のデータシートを参照して、仕様や制御プロトコルをご確認ください。