NeoPixel系のフルカラーLEDは800KHzの独自の通信方式でナノ秒のコントロールが必要です。

PICAXEのような遅いマイコンからも使えるように,ATtiny202を使ってシリアル接続のモジュールにしようと試してみました。


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





1.ハード構成
 ハードはPICAXE-20M2,ATtiny202とNeoPixel系のRGB_LEDが24個のリングです。PICAXEが指令を出し,ATtiny202がコントロールパルスに変換してLEDを光らせる,という感じです(^^)。



 今回は電源をUSBからの5Vだけで全て賄っていますが,LEDは別電源にした方が良いかもしれません。


2.シリアル通信
 PICAXEから一方的にデータを送り,ATtiny202はソフト的に処理しています。
汎用性は求めていないというか,,複雑なものは考えが及ばないので速度は9600bps, 1 stop bit で固定です。

下図の上段がPICAXEから送信した1バイトのデータ信号,下段がATtiny側の読み取りタイミングを示すパルスと得られたデータをエコーで示したものです。




9600bpsはゆっくりしていて,1ビットのパルス幅は約104uSなのでソフトで対応できますね。

用意されているUARTを使うと,バッファなどでメモリ領域をかなり使うようなので,ここは遅いながらミニミニUARTで1byteバッファでやってみました。



3.PICAXEからの送信データ
 PICAXEから送るデータはLED1個毎のコントロールを条件に,毎回次の5バイトを送信することに固定し,コマンドなどは複雑になるので使わないようにしました。

1. データ書込み開始LED番号
2. データ書込み最終LED番号     
3. R値
4. G値
5. B値

例えば24個のLEDを使うときのデータは
全部赤色:0,23,255,0,0
3番-5番を黄色:3,5,255,255,0
15番だけ白色:15,15,255,255,255
という具合になります(^^)。

今回動かしてみたPICAXEのBASIC言語でのプログラムです。



このプログラムの実行結果です。
リングもフルで光らせるとまぶしいぐらい明るさがありますね。






4.ATtiny202のデータ受信とLEDコントロール

1) LEDの個数分のデータバッファを設定
 コントロールするLEDの個数X3(RGB)バイトのデータバッファ(aDATA)を持っています。
PICAXEからのデータはこのバッファに書き込まれ,バッファを介してLEDに送られます。







2) メイン部
5バイトのシリアルデータを受信し,その指示に従ってデータバッファ書き込み,その後LEDに送信します。






3) NeoPixel系RGB_LEDにコントロールパルスを送る
 ATtiny202やSeeeduino-XIAOぐらいのスピードがあると,アセンブラを書かなくてもポートコントロールでパルスが出せますV(^^)。

ATtiny202でポートコントロールを使ってナノ秒のパルスが出せるか試してみた







以上,ATtiny202を間に挟みモジュール化することで,やっとPICAXEからNeoPixel系のLEDがコントロールできるメドがつきましたV(^^)。

ま,UARTが使える機種なら特に相手は選ばないですかね。


なお,SRAM128バイトのATtiny202ではデータバッファにメモリを多く使用する今回の方式は,どうもこの24個x3バイトぐらいが限界のようです。

LED30個用ではまともに動きませんでした,,,。コンパイル,ダウンロード時に「動作が不安定になりますよ」警告が出ていたのを無視していたのですが,本当でした(^^;;;;;

グローバル変数は使用量が把握できますが,ローカル変数は掴めず,案外思ったより多めに何かにメモリが使われているようですね。