フルカラーLEDテープはバーやリングなどとともに1本のデータ線でシリアルデータを数珠つなぎに送るタイプが多く,AdafruitがNeoPixelと呼んでいる系統ですね。

この系統はデータを800KHzぐらいの周期でパルスとして送り,そのパルスのHとLの長さで1,0を区別します。パルスを作るのにスピードが必要ですが,Seeeduino-XIAOぐらいならライブラリなしでもできるのではないかとやってみました。

何とか動いているところです(^^)



1.ハード構成

ハード構成は簡単で,XIAOといつやら買ったGroveのLEDテープとデータ線のレベル変換モジュールだけです(^^;;;;;;。

配線も電源以外はデータ信号線1本のみで,LEDマトリックスパネルのHUB75規格などとは大違いです(^^)。今回はXIAOのD0Pinを出力に使いました。




2.データの送り方

1個のLEDのGRBそれぞれに1byteのデータ,計3byte(24bit)を送り,それを接続したLEDの個数分(今回は30個)連続して繰り返し送ります。

下図は説明書からの転載です。1サイクルに3個分しか書かれていませんが,あくまで例で1サイクルの限界ではありません。(私は最初誤解していました,,,)




3.データの1bitの表現法

送るデータは1bitの0,1を1周期のパルス内のHとLの長さで表します。

下図はWS2812の説明書からの転載です。WS2812Bやそのロットによって少しずつ,またRESは極端に違うので注意が必要ですね。





4.1bitのパルスを作ってみる

上図のように1bitの表現のためのパルスの長さはナノ秒の世界になっているのですが,速い割には周期にまで案外幅があって,,少々荒っぽい規格ですね
(^^;;;;;;;;;

ただ速さは必要なのでXIAOではポートコントロールを使ってみました。


1) 普通のdigitalWriteでは間に合わない

下図のようにArduino言語の普通のdigitalWriteを使ったHLで作るパルスでは明らかに間に合いませんでした。




2) ポートコントロールでスピードアップを図る

Arduino言語ではディジタル入出力の高速化やパラレル動作に使えるポートコントロールがあります。XIAOのPinとポートとの関係が分からなかったので,調べていて良いサイトがありました。

Seeeduino XIAO (ATSAMD21G18) のGPIO速度(Sasapea's Lab 投稿者: researcherさん)

試してみると,100ns単位のコントロールはできそうでした。感謝ですね。



ちなみに,IOBUSでポートコントロールを使うと更に速くなりましたが,今回の目的には速すぎました(^^;;;;;;;。


3)ポートコントロールで1byteをパルス化するルーチンを作ってみた

ポートコントロールでパルス の100ns単位の調整ができるので1byte単位でパルス化してみました。




このルーチンの出力例です。




このルーチンを呼び出してLED1個ずつ順にR,G,Bで出力した,最初の画像のプログラム例です。





ま,NeoPixel系LEDはAdafruitのライブラリを使えばとても良くできているのでそれで済むのですが,,オヤジの老化防止策もかねていろいろと知りたい事をやってみているわけです(^^;;;;;

このLEDテープなどはダイナミック点灯ではないのでデータを送るのに速いパルスは必要ですが,送った後はLED側でデータを保持してくれます。別の処理を急がされないのが良いところですね。

また,いつも最後のLEDまでデータを送らなくてはいけないという事もなくて,変更したいLEDのところまでのデータを送れば良いのはうまく使うと面白い効果が速くできそうですね(^^)。