WS2812用コントローラのソフト開発中

2013年11月23日 by admin | Filed under 電子工作.

妙楽堂で販売を開始したデジタル制御LED、WS2812ですが、結構制御が面倒です。通信は特殊なシリアルとなっており、

データビット1の場合 350nSのHの後、800nSのL
データビット0の場合 700nSのHの後、600nSのL

を出すというものです。しかも精度は±150nSが要求されています。これは8ビットマイコンにとって、相当荷の重い処理です。で、SPIなどで接続できるコントローラをマイコンベースで作ろうと思うと、水晶発振子を外付けでつけないほうが使いやすいに決まっていますし、AVRでやるとなると、内臓のRC発振を使うことになり最高動作周波数は8MHzになります。これは動かせるかどうか微妙なトコロだと思います。

まず、上の通信仕様なのですが、データ1の場合と0の場合で長さが違いますし、動作周波数8MHzで割り切れないので、求められている精度(±150nS)の範囲で都合の良いように変更してみます。内臓RC発振の誤差はないものとして計算しています。まあ1%あっても大丈夫です。

データビット1の場合、375nS(3クロック)のHの後、875nS(7クロック)のL
データビット0の場合、750nS(6クロック)のHの後、500nS(4クロック)のL

このように変更すれば、10クロックでループすれば良いことが判ります。動作周波数が8MHzということは1クロックは125nS、10クロックは1.25μ秒になります。これで、8ビット出力すると、ちょうど10μ秒かかることになります。

RGB3バイト(出力は、G,R,Bの順番ですが)を出力するとなると1LEDあたり30μ秒くらいかかる計算になります。

こうなるとアセンブラで書くしかないです。で、こちょこちょっと実験コードを書いてみました。実機デバッグまだしてませんので、ひとまずキャプチャのみ上げておきます。

cap066

転送終了時に50μ秒の時間待ちが必要なので、これをループで作り(正確な発振があると仮定して50.25μ秒)3バイト出力にかかる時間をシミュレータのストップウォッチで計ってみたところです。(表示は80.25μSなので、あっているようです)

普通にコーディングした場合、このような処理であれば、ビット単位のループを内側に、バイト単位のループを外側にという二重ループで書くことになると思いますが、1ビット処理に使えるクロックが10で、そのうち3クロックはIO出力そのものに費やすことになり、二重ループを書くのは難しそうです。ビット7とビット0をはずして、ビット6~ビット1の間の6ビットだけなら、ループにできるかもしれません。これができると、ファームのサイズが少し小さくなりますが、ATTINY4313を使うとして、プログラムエリアはきっと十分余ってますから、誰も誉めてくれそうにありません。これより小さいマイコンだと、RAM容量が少なくなってしまうという問題点があります。例えば、WS2812を64個接続するとすると、バッファメモリは3×64で、192バイト必要であり、ATTINY2313では実現できないことになってしまいます。

WS2812は妙楽堂電子パーツショップで発売中です。

← Previous