24.いたずら(OK命令)S8.【WS2812色相環】

2019年09月17日

S7.【WS2812用サブルーチン】

IchigoJam BASIC ver1.4.1でフルカラーLED(WS2812、WS2811)の命令が追加されました(※2019/12/4)。
部品もアマゾンから手軽に買えるようになりました。

SL1001

 setuzoku










WS2812を光らせるにはWS.LED命令を使います。

WS.LED 光らせるLED数 [, 繰り返し数]

しかし、これだけでは光りません。
予め
配列に色コード(RGB値)をセットしなければなりません。
さらに、1つのLED色を決めるのに3個の配列を使います。
IchigoJamには102個(0〜101まで)の配列があるので、最大102÷3=34個まで制御できます。
また、色はRGBの輝度を0〜255範囲の値で組み合わせます。
作れる色は256×256×256≒1600万色になりますが、LEDの発光能力と人間の目の能力の制限で、もっと少ない色になるでしょう。

---------------------------------------------------------------------------------
1番目LEDのRGB値   2番目のLED値       34番目のLED値
[0] G(緑 0〜255) [3] G(緑 0〜255)
・・・ [99] G(緑 0〜255)
[1] R(赤 0〜255) [4] R(赤 0〜255)・・・ [100] R(赤 0〜255)
[2] B(青 0〜255) [5] B(青 0〜255)
・・・ [101] B(青 0〜255)

---------------------------------------------------------------------------------

次の命令を実行すると、1番目のLEDが緑、2番目のLEDが赤、3番目のLEDが青に光ります(CLV命令を先に実行しておくとよい)。

[0]=100:[1]=0:[2]=0
WS.LED 12

[3]=0:[4]=100:[5]=0
WS.LED 12

[6]=0:[7]=0:[8]=100
WS.LED 12


WS.LED命令は、配列にGRBの値をセットするだけで光らせられるのですが、初歩のプログラミングではちょっと使いづらいです。。
そこで、色を7色に限定して、「色」「明るさ」「位置」の3つの値を決めれば、配列に展開してくれる色設定サブルーチンをつくりました。

----------------------------------------------------------------------------------------
色設定サブルーチン: @SET_WS.LED(I,C,L)
----------------------------------------------------------------------------------------

1000 @SET_WS.LED(I,C,L)
1010 ifI>32I=32
1020 if(L<1 || L>255) && (C%8) L=20
1030 let[I*3],C&1*L,C>>1&1*L,C>>2&1*L:rtn

-----------------
変数 I LED点灯位置
-----------------
0〜33(最大34個。IchigoCakeは最大120個)

-----------------
変数 C 色
-----------------
 0 無 (光らない)
 1 緑 
 2 赤 
 3 黄 
 4 青 
 5 シアン(青緑)
 6 マゼンタ(紅紫)
 7 白 

-----------------
変数 L 輝度
-----------------
1〜255(範囲外は強制的に20)

【説明】
1000行目 ラベル
1010行目 
1020行目 変数L(輝度)が1〜255の範囲外、かつ、変数C(色)があるなら、強制的にL=20にします。
     これで、Lを設定しなくても(0でも)LEDが光るようになります。
     ※輝度0(点灯しない)を使いたいときは以下に置き換えてください。
     IF L<0 OR  L>255 L=20
1030行目 変数I(LED位置)番目にGRBをセットします。
     LEDのG)と変数C(色)の0bit目の論理積を配列[n]番目にセット。
     LEDのR)と変数C(色)の1bit目の論理積を配列[n+1]番目にセット。
     LEDのR)と変数C(色)の2bit目の論理積を配列[n+2]番目にセット。
     それぞれに変数L(輝度)を乗算します。
     たとえば、L=100なら、配列にセットする色の計算結果は、0か100になります。
950行目 サブルーチンの終了。

変数Cの色コードを各bit毎に分解しています。
変数Cを2進数にするとわかりやすいでしょう。
C&1 とすると、0ビット目(G緑の色)を取り出せます。
C&2 で、1ビット目を(R赤の色)を取り出せます。
C&4 で、2ビット目を(B青の色)を取り出せます。
それぞれの値を、配列の1番目、2番目、3番目に代入すると本来の色コードが完成します。

変数 L は輝度で、色コードで取り出した値にかけると明るさになります。

変数 I はLEDを光らせる場所ですが、3倍すると配列の添字になります。


※16000行目以降から始めるとLIST命令では表示されなくなります。メインルーチンを作るときすっきりする(20.透明プログラムを参照)。




【使用例】
10 CLV
20 I=11:C=7:L=34
30 GSB @SET_WS.LED(I,C,L)
40 WS.LED 12
50 END


10 CLV
20 C=2
30 GSB @SET_WS.LED(I,C,L)
40 I=1:C=1:L=200
50 GSB @SET_WS.LED(I,C,L)
60 WS.LED 2,6
70 END






----------------------------------------------------------------------------------------
サンプルプログラム

10 'WS.LED 七色を順番に光らせる1
20 CLV:L=RND(10):L=L*L+5
30 IF C>7 C=1:  STOP
40   IF I>11 I=0
45     PRINT "I=";I,"C=";C,"L=";L,
50     GSB @SET_WS.LED(I,C,L)
60     WS.LED 12
70     WAIT 1
80   I=I+1
90 C=C+1
100 GOTO30



----------------------------------------------------------------------------------------
10 'WS.LED 七色を順番に光らせる2
20 CLV:L=RND(10):L=L*L+5
30 FOR C=1 TO 7
40   FOR I=0 TO 11
45     PRINT "I=";I,"C=";C,"L=";L,
50     GSB @SET_WS.LED(I,C,L)
60     WS.LED 12
70     WAIT 10
80   NEXT
90 NEXT
100 GOTO30








----------------------------------------------------------------------------------------
【OMAKE1】
----------------------------------------------------------------------------------------

LED位置I番の、色と明るさを、変数Cと変数Lに取得します。
現在のWS.LED命令で光っている値を知ることができます。

2000 @GET_WS.LED(I,C,L)
2010 C=([I*3]&&1)+([I*3+1]&&1)*2+([I*3+2]&&1)*4
2020 L=[I*3]|[I*3+1]|[I*3+2]
2030 rtn


サンプルプログラム
10 FOR I=0 TO 11
20 C=RND(8)
30 L=RND(255)
40 GSB @SET_WS.LED(I,C,L)
50 NEXT
60 WS.LED 12
70 FOR I=0 TO 11
80 GSB @GET_WS.LED(I,C,L)
90 ? I,C,L
100 NEXT
110 END


----------------------------------------------------------------------------------------
【OMAKE2】
----------------------------------------------------------------------------------------
文字列変数Sを使用して、一度に色を設定するサブルーチン。
変数Sに色コード(1〜7)を文字列で指定すると、文字コードに応じたRGB値を配列に設定します。
変数Lには、明るさ(1〜255)を入れてください。
値チェックはしていないので、34文字以上は配列外エラー(Index out of range)になります。

3000 @STR_WS.LED(S,(I,C,L))
3010 forI=0tolen(S)-1:C=asc(S+I)-48:let[I*3],C&1*L,C>>1&1*L,C>>2&1*L:next:rtn



サンプルプログラム
10 CLV
20 S="123456700000"
30 L=50
40 GSB @STR_WS.LED(S,(I,C,L))
50 WS.LED 12
60 END


----------------------------------------------------------------------------------------
【OMAKE3】
----------------------------------------------------------------------------------------

WS.LEDで点灯しているLED色を右または左に1つシフトします。
内部的には配列を3個分をずらしています。。
変数Rには通常はWS.LEDの数と同じ値を設定しますが、1以下は意味をなしません。
また、シフトして空いたLED位置には、シフト前の変数R値の値を代入します。つまりR=12のとき、右シフトとなり、12個目LEDの色が、1個目に入ります。
Rが正数(+)だと右、負数(−)だど左にシフトします。
Rの値チェックはしていないので、34以上だと配列外エラーになります。

4000 @SHIFT_WS.LED(R)
4010 ifR>0copy#700,#800,R*6:copy#806,#700,R*6:
LET[0],[R*3],[R*3+1],[R*3+2]:rtn
4040 R=-R:let[R*3],[0],[1],[2]:copy#700,#806,R*6:copy#800,#700,R*6:R=-R:rtn




サンプルプログラム1
CLV:[0]=100:[4]=100:[8]=100:WS.LED 12:WAIT120:R=3:GSB@SHIFT_WS.LED(R):WS.LED 12

サンプルプログラム2
10 CLV
20 S="123456700000"
30 L=50
40 GSB @STR_WS.LED(S,(I,C,L))
50 WS.LED 12
60 WAIT 60
70 R=-LEN(S)
80 GSB @SHIFT_WS.LED(R)
90 WS.LED 12
100 WAIT 30
110 GOTO 80





----------------------------------------------------------------------------------------
【OMAKE4】
----------------------------------------------------------------------------------------

WS.LEDで点灯している輝度を変えるサブルーチン。
V個のLEDを,輝度Lに変える

5000 @LUMINA_WS.LED(L,V,I)
5010 ifV<1||V>32||!Lrtn
5030 forI=0toV*3-1:if[I][I]=L
5040 next:rtn



サンプルプログラム2
10 CLV
20 S="123456700000"
30 L=75
40 GSB @SET_WS.LED(S,(I,C,L))
50 WS.LED12
60 WAIT 60

100 FOR L=100 TO 0 STEP -5
110 V=LEN(S)
120 GSB @LUMINA_WS.LED(L,V)
130 WS.LED12
140 WAIT 10
150 NEXT
160 END



as-180563 at 19:29│ ソフトウェア 
24.いたずら(OK命令)S8.【WS2812色相環】