pigpioでNeopixelを使う

Python

Neopixel はAdafruit社が販売しているマイコン内臓フルカラーLEDシリーズです.

NeoPixels : Adafruit Industries, Unique & fun DIY electronics and kits
Adafruit Industries, Unique & fun DIY electronics and kits : NeoPixels - Tools Gift Certificates Arduino Cables Sensors LEDs Books Breakout Boards Power EL ...

通常のRGBLEDではPWMの線が3本と電源(またはGND)用の線がLED1づつに対して必要となります. 一方でNeopixelは電源, GND, 信号用の3本の線で光らせることができ, 各LEDを数珠つなぎにすることができます. 配線が簡単になるため,電子工作でよく使われています.

このNeopixelですが当然, RaspberryPiでも使用可能です.

NeoPixels on Raspberry Pi
Learn how to install and use a Python library that lets you control NeoPixel/WS281x LEDs connected directly to a Raspberry Pi. No microcontroller needed!

ただし,RaspberryPiのGPIO操作によくあるsudoで実行しなければならないコマンドになります. これはROSで使用する場合は非常に面倒なことになります.
今回はsudoなしでGPIO操作ができるpigpioでneopixelを操作していきます.

Neopixelには様々なチップが使われていますが, 今回は最も有名なWS2812Bを使用します.

WS2812Bを含めNeopixelのマイコンは特殊な通信を行っており, 信号線のHIGHの時間とLOWの時間から0か1かを区別しています.

注目すべきは信号の時間的なオーダーです. なんとns(NanoSecond)!これではwaitdigitalWriteによるごり押しはできません. 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 with pigpio

また, 今回の開発に当たり次の記事を参考にさせていただきました. やはり公式サンプルのないマイコンでNeopixelを光らせようとしている人はそれなりにいるようです.

LED Strip - LEDテープ | Mbed

コメント