8x8の64コ並べたWS2812Bを自在に操れるWS2812BドライバのType3を開発!
自分で並べて作ってもokですし(5x5の作り方)、600円くらいで8x8のマトリクス状のものが手に入ります(例、送料込み$5.78)。
IchigoJam BASICで16進数を表記する記号 # を使って、3文字、3桁でRGB(赤、緑、青)の強さを16段階で指定し、USRのパラメータで送信個数を指定。
最初のLEDを赤く光らせるサンプルコード
(WS2812BとIchigoJam 5V-VCC, DIN-OUT1, GND-GND と3本接続)
10 POKE#700,240,181,114,182,8,36,36,2,9,25,18,76,11,120,27,9,0,240,14,248,11,136,27,10,0,240,10,248,11,120,15,34,19,64,0,240,5,248,2,49,1,56,239,209,98,182,240,189,128,37,255,34,34,96,3,39,9,38,43,66 20 POKE#73C,1,208,9,39,3,38,1,63,253,209,0,34,34,96,1,62,253,209,109,8,239,209,112,71,4,0,1,80 RUN [0]=#F00:U=USR(#700,1)
最初から3つを赤、緑、青で光らせる
LET[0],#F00,#0F0,#00F:U=USR(#700,3)
弱く最初から3つを赤、緑、青で光らせる
LET[0],#300,#030,#003:U=USR(#700,3)
64コ(8x8)の内、どこか1つを白く光らせる
[RND(64)]=#FFF:U=USR(#700,64)
プログラムでキラキラさせよう!
30 CLV:[RND(64)]=RND(#1000) 40 U=USR(#700,64) 50 GOTO 30 RUN
ゆっくりキラキラ
45 WAIT 30 RUN
赤くキラキラ 30 CLV:[RND(64)]=#F00
キラキラを4つに増やす
30 CLV:FORI=1TO4:[RND(64)]=RND(#1000):NEXT
全体をいろんな色に!(RND(#1000)とすると明るすぎるので、0〜3までの4段階)
30 FORI=0TO63:[I]=RND(4)<<8+RND(4)<<4+RND(4):NEXT
文字を表示(色:#024)
30 C=RND(256) 35 FORI=0TO7:P=PEEK(C*8+I):FORJ=0TO7:[I*8+J]=P>>(7-J)&1*#024:NEXT:NEXT
アルファベットだけを表示
30 C=ASC("A")+RND(26)
IchigoJamと表示
30 S="IchigoJam ":C=ASC(S+N):N=(N+1)%LEN(S)
表示するたびに色を変える
35 FORI=0TO7:P=PEEK(C*8+I):FORJ=0TO7:[I*8+J]=P>>(7-J)&1*L:NEXT:NEXT 36 IF N=0 L=RND(4)<<8+RND(4)<<4+RND(4)
信号出力先を変更する方法(下記のいずれかを追加)
'for OUT2 25 POKE#754,8 'for OUT3 25 POKE#754,16 'for OUT4 25 POKE#754,32 'for SOUND 25 POKE#754,16,0,0,80,2,73,8,104,4,34,16,67,8,96,112,71,0,128,0,80:U=USR(#758,0)
数値が88コ並ぶ、マシン語コードが気になる人へ
WS2812Bを操るマシン語プログラムの元、asm15でアセンブリ言語で作ったプログラムの紹介です。(マシン語入門)
asm15表記のArmマシン語コードはちょっと長くなって88byte(前回は64byte)
' OUT1用 WS2812B @OUTを変更でOUT1-4で変更可能 ' R0 - data count - 最大102 ' R1 - data address (RGB1,RGB2,....) #800からひとつずつ、1つRGB 4bit ' R2 - temp OUT value 0/#FF, & 15 ' R3 - data value ' R4 - GPIO address ' R5 - bit count ' R6 - wait count buf ' R7 - wait count @WS2812B PUSH {LR,R4,R5,R6,R7} CPSID R4=8 R4=R4<<8 R1=R1+R4 R4=[@OUT]L @LOOP_DATA R3=[R1] ' G R3=R3>>4 GOSUB @SEND_BYTE R3=[R1]W ' R R3=R3>>8 GOSUB @SEND_BYTE R3=[R1] ' B R2=15 R3&=R2 GOSUB @SEND_BYTE R1+=2 R0-=1 '+6clock IF !0 GOTO @LOOP_DATA CPSIE POP {PC,R4,R5,R6,R7} @SEND_BYTE R5=#80 ' R3=R3<<1 ' if you want get x2 bright or more @LOOP_BIT R2=#FF [R4]L=R2 R7=3 '(3*4+1)=13 <- 16.8+-7.2 R6=9 '(9*4+1)=37 <- 43.2+-7.2 R3&R5 IF 0 GOTO @SKIP R7=9 '(9*4+1)=37 <- 43.2+-7.2 R6=3 '(3*4+1)=13 <- 16.8+-7.2 @SKIP R7-=1 'wait R7*4+1 clock IF !0 GOTO -1 R2=0 [R4]L=R2 R6-=1 'wait R6*4+1 clock IF !0 GOTO -1 R5=R5>>1 IF !0 GOTO @LOOP_BIT RET @OUT DATA L #50010004
配列(#800)だと102コまでですが、画面VRAM(#900)は768byteあるので、最大384コ分の信号を送れるので制御できるようになります。(上記マシン語コード R4=8 を R4=9 に変更、26 POKE#704,9 で上書きするとok)
16x16の256コのWS2812Bフルカラーマトリクスで何創る?
「Amazon.co.jp: Kuman Arduino用RGB LED フレキシブル WS2812B 5050 個別アドレス可能 レインボー マトリックス ビデオボード 256画素 SMD ディスプレイ スクリーン LCD パネル WS02(16*16 LED): ホーム&キッチン」
日本のAmazonで、4,800円!
links
- 広がるプログラミングと電子工作、こども、おじいちゃん、校長、そして、ギャル!見事にちょうどいいカセットテープ x IchigoJam
- 5つ星、官民連携、こども力で活かそう、オープンデータ!新潟経済同友会と新発田市から、ご来鯖!+WS2812B新ドライバ