0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ORANGE picoAdvent Calendar 2023

Day 23

ORANGE pico で WS2812B (フルカラーLED) をなんちゃって制御する

Posted at

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

すると、以下の信号が得られた。

IchigoJam による制御信号

今回は、まず全消灯を表す信号を送り、次に全点灯を表す信号を送っている。

全消灯を表す信号

全消灯を表す信号の長さは、35.5μsである。

全消灯を表す信号

全消灯を表す信号の1周期の長さは 1458.3ns、周波数は685714Hzである。

全消灯を表す信号 1周期

全消灯を表す信号の1周期のうちHIGHの長さは416.7ns、デューティー比は 28.57% である。

全消灯を表す信号 HIGHの部分

全点灯を表す信号

全点灯を表す信号の長さは、34.9μsである。
(最後の「0」の部分を数えていないので、これは正確ではない。全消灯を表す信号と同じ35.5μs程度だろう)

全点灯を表す信号

全点灯を表す信号の1周期の長さは 1458.3ns、周波数は685714Hzである。

全点灯を表す信号 1周期

全点灯を表す信号の1周期のうちHIGHの長さは1000.0ns、デューティー比は 68.57% である。

全点灯を表す信号 HIGHの部分

まとめ

全点灯・全消灯のための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チカをすることができた。

ORANGE pico + WS2812B でLチカ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?