2019年3月28日木曜日

PIC10F222でWS28xx

 いわゆる「マイコン内蔵フルカラーLED」をサクッと制御したい、と思って、PIC10F222を引っ張り出してきた。

 このマイコンは、内部クロックを使って、8MHzか4MHzで駆動できる。
 ところで、PICは1サイクル4クロックなので、8MHzに設定した場合は、実際には2Mcycle/secの処理速度で、1命令500マイクロ秒になる。

 WS28xxは、0.4us, 0.85us, 0.8us, 0.45usの4種類の長さを作り、パルス幅変調を行う必要がある。また、それぞれ最大±0.15usの誤差が認められている。
 チップによって細かい違いがあったり、他に制限があったりするが。

 さて、1サイクル0.5usのマイコンから制御する場合、例えばHi0.5us, Low1.0usのパルスや、Hi1.0us, Low0.5usのパルスを生成できる。
 ということで、原理的には、8MHzのPICからでもWS28xxを制御できる。

 ただし、最初に試したときはうまく動かなかった。

 これは、オシレータの誤差の関係で、1サイクルが0.5usを上回ったために、LEDが正しくパルス幅を認識できる範囲を超えてしまったため。
 OSCCALレジスタに0x7Eを設定することにより、クロックが最大になるように強制し、これによって、かろうじてLEDが認識できるパルス幅の範囲に収まった。

 ただし、これはPICの製造誤差に依存する動作であり、また温度や電圧等にもある程度影響を受けると思われる。

 また、LED4個分(96bit)の固定パターンを送出するプログラムだけで、マイコンのROM(512ワード)の75%を使用してしまっており、追加でのパターンを表示することができない。

 このため、PIC10F222でWS28xxを使用するのは、不可能ではないにしろ、実用的ではない、という結論に至った。

***

 今回は、手軽に試すために、秋月で買ったときに付属してきたDIP8を使用した。


 マクロレンズほしい。。。
 この写真は望遠ズームの望遠端で撮影してトリミングした写真。寄るならiPadのカメラでマクロ撮影とかのほうが写りが良いかも。望遠は望遠で、周りが写らないので、汚い机を晒さなくて済むとか、利点もあるんだけどね。

***

 ある程度のパターンを表現しようとすると、ある程度余裕のあるマイコンが必要になる。
 手持ちで10F222の上だと、16F88あたりか。それでも内蔵オシレータなら8MHz駆動しかできないから、10F222と同程度だし、メモリも8倍くらいだから、固定パターン8種類程度しか表現できない。
 その上だと、STM32F042K6Tが手持ちにあるかな? コイツなら内部に48MHzクロックを持ってるし、精度が足りないなら12MHz発振器を外付けすればいい。タイマで転送できるはずなのでお手軽だし、RAMが扱えるので表現力も高い(固定パターンの繰り返しを行う必要がなく、計算でパターンを生成できる)。
 ただし、STM32は3.3V動作だが、LEDは5V程度が必要なので、外部に3.3Vレギュレーターが必要だったり、電源周りが面倒だったり、何よりQFP32を扱うのは面倒。

 PIC16F88とかは、テキトーな電源突っ込めば動くのが楽でよかったよなぁ。
 STM32もコイン電池1個とか、乾電池2本とかでも動くわけだけど、やはりパスコンやQFPを扱わなきゃいけないのが面倒。

 WS28xxを2-5個程度制御したい、という用途だとイマイチいい方法が思いつかないなぁ。
 色変化を伴う表現はあきらめて、フルカラーLEDを適当な色に合成し、ロウソクICで明滅させる、あたりが落とし所だろうか。

 ハードウェアが、PIC並みに簡単に扱えるSTM32があれば一番いいんだが。

***
追記
 転送1バイト程度を関数に分割し、いくつかの固定パターンを送信する関数を呼び出せば、ROM使用量がかなり削減できた。
 カリカリに削ればそれなりの表現はできそうな気がしてきた。とはいえ、プログラミングはもっとのびのびとやりたいなぁ。

0 件のコメント:

コメントを投稿