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個用ではまともに動きませんでした,,,。コンパイル,ダウンロード時に「動作が不安定になりますよ」警告が出ていたのを無視していたのですが,本当でした(^^;;;;;
グローバル変数は使用量が把握できますが,ローカル変数は掴めず,案外思ったより多めに何かにメモリが使われているようですね。
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個用ではまともに動きませんでした,,,。コンパイル,ダウンロード時に「動作が不安定になりますよ」警告が出ていたのを無視していたのですが,本当でした(^^;;;;;
グローバル変数は使用量が把握できますが,ローカル変数は掴めず,案外思ったより多めに何かにメモリが使われているようですね。