Neopixel はAdafruit社が販売しているマイコン内臓フルカラーLEDシリーズです.
通常のRGBLEDではPWMの線が3本と電源(またはGND)用の線がLED1づつに対して必要となります. 一方でNeopixelは電源, GND, 信号用の3本の線で光らせることができ, 各LEDを数珠つなぎにすることができます. 配線が簡単になるため,電子工作でよく使われています.
このNeopixelですが当然, RaspberryPiでも使用可能です.

ただし,RaspberryPiのGPIO操作によくあるsudo
で実行しなければならないコマンドになります. これはROSで使用する場合は非常に面倒なことになります.
今回はsudoなしでGPIO操作ができるpigpioでneopixelを操作していきます.
Neopixelには様々なチップが使われていますが, 今回は最も有名なWS2812Bを使用します.
WS2812Bを含めNeopixelのマイコンは特殊な通信を行っており, 信号線のHIGHの時間とLOWの時間から0か1かを区別しています.
注目すべきは信号の時間的なオーダーです. なんとns(NanoSecond)!これではwait
とdigitalWrite
によるごり押しはできません. pigpioのWave機能もμsec単位なので,利用できません. そこで使うのがSPIです. WS2812Bへの矩形波をデジタル信号だと解釈してMOSIピンから送信させます. この時重要なのが, SPIのWord当たりbit数と周波数です. このWordはSPIで送信するデータの最小単位です(パケットのようなものだと考えてください).
今回はデフォルトの8bit/wordで考えていきます. このとき, 1Word当たりの送信時間が1250±650nsになるように設定します.
1250nsで8bit送るとすると,8[bit]*1e9/1250 = 6400000 bpsとなります. 続いて,WS2812B用の0と1をByteで表現します.
- WS2812B-0 : 0b11100000,0xE0 -> [468.75 781.25] ns, error [ 68.75 -68.75]
- WS2812B-1 : 0b11111000,0xF8 -> [781.25 468.75] ns, error [-18.75 18.75]
上記のように0と1をバイトで表現すると規定の時間内に収まります.
WS2812Bでは色をRGBで各色8bitずつで表現します. データを送る際は各色8bitを2進数と解釈して各ビットを上記のWordに置き換えて送信します. このとき, 色の並びとビットの並び(MSBかLSBか)に注意します.
以上の諸々を実装したのが次のプログラムです.
ダウンロードして次のように配線し, 実行してください. 動画のように光ります.
RASPI WS2812B
5V — +5V
MOSI(pin 10) — DIN
GND — GND
sudo pigpiod
python piNeopixel.py
iPhone5sのカメラだとLEDからの直接の光は白くなっていますので, モニターに映っている色を参考にしてください.
また, 今回の開発に当たり次の記事を参考にさせていただきました. やはり公式サンプルのないマイコンでNeopixelを光らせようとしている人はそれなりにいるようです.
コメント