ORANGE pico には、IchigoJam と異なり、WS2812B (フルカラーLED) の色を設定する信号を送る機能は無い。
しかし、PWM機能を使えば、幅広い周期とデューティー比の信号を送ることができる。
今回は、この機能を用い、ORANGE pico と WS2812B でLチカを行う。
※IchigoJamはjig.jpの登録商標です。
IchigoJam が送出する制御信号の観察
きちんと WS2812B のデータシートを参照して送信する信号の仕様を決めてもいいが、面倒なので今回は IchigoJam が送出する制御信号をパクることにした。
IchigoJam (1.4.3) で以下のプログラムを実行し、LED端子に出力される信号をロジックアナライザで観察した。
10 LET[0],0,0,0,#FF,#FF,#FF
20 WS.LED 2
すると、以下の信号が得られた。
今回は、まず全消灯を表す信号を送り、次に全点灯を表す信号を送っている。
全消灯を表す信号
全消灯を表す信号の長さは、35.5μsである。
全消灯を表す信号の1周期の長さは 1458.3ns、周波数は685714Hzである。
全消灯を表す信号の1周期のうちHIGHの長さは416.7ns、デューティー比は 28.57% である。
全点灯を表す信号
全点灯を表す信号の長さは、34.9μsである。
(最後の「0」の部分を数えていないので、これは正確ではない。全消灯を表す信号と同じ35.5μs程度だろう)
全点灯を表す信号の1周期の長さは 1458.3ns、周波数は685714Hzである。
全点灯を表す信号の1周期のうちHIGHの長さは1000.0ns、デューティー比は 68.57% である。
まとめ
全点灯・全消灯のためのPWMのパラメータは、以下のように設定すればよいことがわかった。
LED 1個分の信号の長さは35.5μsなので、1ms間信号を送信するとLED約28個分になることがわかる。
制御 | 周波数 [Hz] | デューティー比 [%] |
---|---|---|
全消灯 | 685714 | 28.57 |
全点灯 | 685714 | 68.57 |
ORANGE pico による WS2812B の制御
WS2812B を制御するには、制御対象の WS2812B が無ければならない。
今回のPWMによる制御では、明るさや点灯させる数を細かく制御できず、繋がっていれば多数のLEDをフル点灯させることになるので、LEDが多いモジュールを用いると明るくなりすぎてしまうことが予想できる。
そこで、今回は WS2812B が4個搭載された以下のモジュールを制御対象として選んだ。
NEO Pixel WS2812BフルカラーLEDモジュール 4素子タイプ / LEDM226-12B4
以下のプログラムにより、点灯の信号と消灯の信号を約500msおきに交互に送信することで、Lチカを行う。
10 pwm_port=2
20 ioctrl pwm_port,200
30 ' WS2812B ON
40 pwm pwm_port,685714,68.57
50 pause 1
60 pwm pwm_port,1,0
70 pause 500
80 ' WS2812B OFF
90 pwm pwm_port,685714,28.57
100 pause 1
110 pwm pwm_port,1,0
120 pause 500
130 goto 30
公式のコマンド一覧の pwm
の説明には
周波数に0を指定するとPWM出力を停止します。
とあるが、周波数0を用いると
- ポートの出力がHIGHの状態で止まる
- そもそも信号が出ないことがある
という問題が起きたので、信号の停止には周波数1Hz、デューティー比0%という設定を用いた。
プログラムを実行すると、PORT2 から以下の信号が出ていることが観測できた。
PWMの開始から停止までに1msの待ちを入れているはずなのに、なぜか500μsしか信号が出力されていない。
しかも、信号のあとに、しばらく HIGH になっている時間ができている。
それでも、WS2812B モジュールを接続すると、狙い通りLチカをすることができた。