M5Atom/M5Stamp PICOのオンボードカラーLEDを直接制御
M5Atom LITE/M5Stamp PICOのオンボードカラーLEDをライブラリなしで直接制御します。
オンボードのフルカラーシリアルLEDはカタログとメーカーサイトで型格が食い違ていて
WS2812BだったりSK6812だったりしますが、どちらでもインターフェイス仕様は大体同じです。
▼のようにHIGH/LOWシグナルの長さで1Bitを表現、GRB各8ビット(計24Bit)を送信すれば色を設定できます。


ArduinoIDEではタイマの最小単位は1μ秒なので、普通にやったのでは0.3μ秒は計れません。
ライブラリでやっているように無駄にループを回してタイミングをとるしかないのですが コンパイラが無駄に賢くて、ループ内で値が変化しない、変化がループ外に波及しないコードは省略されてしまい、タイミング取りには使えません。
なので、最適化出来ない処理をループしてタイミングをとる必要があります。
I/O関連の処理は最適化されない筈ですので digitalRead()にかかる時間でタイミングを取ってみました。
幸いな事にM5Atom LITE / M5Stamp PICOには読み取るのに丁度よいデバイス(ボタン)が付いています。
1000回繰り返して300μ秒±150μ秒に収まるようにdigitalRead()の回数を調整ます。
1000回で300μ秒なら1回あたり0.3μ秒だねって理屈です。
ボタン状態の読み込み回数で1.5μ秒間隔単位くらいの調整ができるので、0Bit、1Bitの時間調整を行います。
±1.5μ秒の余裕があるので、近い値に寄せれば大丈夫です。 ※実際にはもうちょっと余裕があるっぽい。
スケッチ
以下、二つのスケッチ・M5Atom LITE / M%Stamp PICO オンボードのカラーLED 色を変えるデモプログラム
・タイミング調整用のテストプログラム
