MicroPythonのNeoPixelライブラリを使ってみた

neopixel.jpg

ESP32用MicroPythonでは、電子工作で近年人気の「NeoPixel」を制御するライブラリがデフォルトでインストールされています。
NeoPixelはRGB LEDとコントローラ用ICを一体化したものです。
1本の信号線で制御し、数珠つなぎにすることができます。

コントローラ用ICは「WS2812B」という型番で、この型番で検索すると製品がいろいろ見つかります。
それほど安いものでもないので(8LEDのモジュールが秋月電子で600円)、これまで入手せずにいたのですが、最近Aliexpressで買えば安く入手できることに気づき、別の買い物のついでに1つ購入してみました。ちなみに8LEDのモジュールで$1程度でした。安いところを探せば、$0.6くらいで見つかります。
8×8のモジュールでも$6以下で入手できます。(送料はかかりますが)

neopixel2.jpg

裏面に電極がありますので、ブレッドボードでの実験用にL字型のピンヘッダを取り付けました。
DOUTに別のモジュールのDINを接続すれば、カスケード接続ができるようです。

neopixel3.jpg

ESP32との接続は、GND、3.3V、任意のI/Oピン(私はIO25で実験しました)をそれぞれモジュールのGND、VDC、DINにつなぎます。
モジュールには、電源電圧は4V~7Vとありますので、3.3Vは微妙に規格外なのですが、問題なく動作しました。

neopixel4.jpg

MicroPythonでのライブラリの使用方法は、以下のページに解説があります。

11. Controlling NeoPixels — MicroPython 1.8.2 documentation

インスタンス生成の際のパラメータは、信号用のPinおよび連結したNeoPixelの個数です。
生成されたオブジェクトは配列の形をしており、1つの要素が1つのNeoPixelにあたります。
要素に対して、(R,G,B)形式のタプルで色を設定し、write()でデータをLEDに転送します。
0番から7番までのピクセルを順に光らせるサンプルはこんな感じです。

このWS2812Bの制御ですが、データシートはAdafruit等からダウンロードできます。

Downloads | Adafruit NeoPixel Überguide | Adafruit Learning System

1bitのデータを1つのパルスで送信し、0か1かの判別はパルスのHの時間(TH)に対する閾値で行なわれます。
1bitは TH+TL=1.25µs±600nsで送り、0を送る場合はTH = 0.4µs±150ns、1を送る場合はTH = 0.8µs±150nsでなければなりません。
データは1ピクセルあたり24ビット、GRBの順で上位ビットから送信です。
また、50µs以上長いLはリセットと見なされます。
カスケード接続する場合は、自分が使った分のデータの次のデータから、後方のNeoPixelへ送られます。
シンプルですが、数珠繋ぎの個数が増えてくると、個数×24bit分のデータの転送に乱れが生じてはいけないのが若干厳しいところですね。
少し詳しい解析記事が以下のリンクにありました。

秋月でWS2812B買ってしまったので動かないかも知れないけれど作ってみた

WS2812B + LPC810

ESP32版MicroPythonでは、このデータ転送の部分はCで記述されています(port/esp32/espneopixel.c)。
割り込みを禁止して一気にデータを送信しています。

コメント