福野泰介の一日一創 - create every day

FFF?40F?16進数3桁で色を決めよう、WS2812BのIchigoJam用マシン語ドライバで電光掲示!

2018/01/31
#ws2812b #IchigoJam #KidsIT #maker 

光るカセットテープで子供にも大人にも人気なWS2812Bを使った光る電子工作 x IchigoJam シリーズ。
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新ドライバ

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image