できあがったゲーム機!
ブレッドボードにタクトスイッチを2つ、LED1つ、サウンダーを搭載し、改造かわくだりゲームを作りました!
中学生向けの2時間の講座、エルチカゲームからかわくだりゲームの基本コースに加え、ブレッドボードとフルカラーLEDを扱う高専スペシャル!(資料、ゲーム機を作ろうPDF)
コントローラーにするのにちょうどいい!
続いて、演出用のフルカラーLEDをまずははんだづけ!
そして今回の最難関、フルカラーLED、APA102Cを使った「SparkFun Lumenati」用プログラムの写経!
全員完走!色とりどりに光るLEDをゲット!
今回はBASICでフルカラーLEDを制御しましたが、フルパワーで毎秒5000万回計算するCPUをフルに使うマシン語を使うと、150倍速以上の制御が可能です!
BASIC、SPIの8bit送信を一部マシン語化、制御部分をフルアセンブラで実装の3パターン、速さの違いをぜひご覧ください!
配列の[0]から[7]に10進数3桁で色の三原色、RGBを入れてGSB@Lで呼び出す、BASICのAPA102フルカラーLED制御プログラムとデモがこちら。
30 CLV:GSB@L:FORI=0TO7:[I]=RND(1000):NEXT:CLT:GSB@L:?TICK():CONT 200 @L:N=0:FORI=0TO3:GSB@S:NEXT 210 FORI=0TO7:N=255:GSB@S:M=[I]:N=M%10:GSB@S:N=M/10%10:GSB@S:N=M/100:GSB@S:NEXT 220 N=255:FORI=0TO3:GSB@S:NEXT:RTN 230 @S:FORJ=7TO0STEP-1:OUT1,0:OUT2,N>>J&1:OUT1,1:NEXT:RTN
8コ点灯するのに155カウント、2.5秒かかります。順番に変わっていく様子が分かりやすい。
230行のCIに向けてオン・オフしながらDIにデータを8bit送るSPIという制御部分をマシン語化してみましょう。
@SPIW8BIT R3=[@GPIO1]L R1=1<<7 @LOOP R2=0 R0&R1 'F=N>>(7-I)&1 IF 0 GOTO @SKIP R2=2 @SKIP [R3+`11]L=R2 ' OUT1,0:OUT2,F R2+=1 [R3+`11]L=R2 ' OUT1,1 R1=R1>>1 IF !0 GOTO @LOOP @END RET @GPIO1 DATA L #50010000
asm15でアセンブルして、28byteのマシン語を書き込み、@Sの中をマシン語に変更すると20倍速!
10 POKE#700,5,75,128,33,0,34,8,66,0,208,2,34,218,96,1,50,218,96,73,8,246,209,112,71,0,0,1,80 230 @S:U=USR(#700,N):RTN
8コ分の制御をまるっとマシン語に置き換えてしまうことで、更に高速化!
@APA102C PUSH {PC,R4,R5,R6,R7} R4=8 R4=R4<<8 R4+=R1 R5=8 ' num of LEDs R6=#F R7=@SPIW8BIT R7-=1 ' for Thumb +1 or -1 R3=[@GPIO1]L R0=0 GOSUB R7 GOSUB R7 GOSUB R7 GOSUB R7 @LOOP R0=255 ' brightness `11100000+max31 GOSUB R7 R0=[R4]W R0&=R6 GOSUB R7 R0=[R4]W R0=R0>>4 R0&=R6 GOSUB R7 R0=[R4]W R0=R0>>8 GOSUB R7 R4+=2 R5-=1 IF !0 GOTO @LOOP R0=255 GOSUB R7 GOSUB R7 GOSUB R7 GOSUB R7 POP {LR,R4,R5,R6,R7} @SPIW8BIT 'setting:R3 param:R0 use:R1,R2 R1=1<<7 @LOOP R2=0 R0&R1 'F=N>>(7-I)&1 IF 0 GOTO @SKIP R2=2 @SKIP [R3+`11]L=R2 ' OUT1,0:OUT2,F R2+=1 [R3+`11]L=R2 ' OUT1,1 R1=R1>>1 IF !0 GOTO @LOOP @END RET @GPIO1 DATA L #50010000
96byteのマシン語で制御できました!(色の指定は、16進数3桁、例えば #F00 で赤)
10 POKE#700,240,181,8,36,36,2,12,68,8,37,15,38,14,167,1,63,18,75,0,32,184,71,184,71,184,71,184,71,255,32,184,71,32,136,48,64,184,71,32,136,0,9,48,64,184,71,32,136,0,10,184,71,2,52,1,61,240,209,255,32 20 POKE#73C,184,71,184,71,184,71,184,71,240,189,128,33,0,34,8,66,0,208,2,34,218,96,1,50,218,96,73,8,246,209,112,71,0,0,1,80 30 CLV:U=USR(#700,0):FORI=0TO7:[I]=RND(#1000):NEXT:CLT:U=USR(#700,0):?TICK():CONT
一瞬で8コの色を変更できるので、いろんな演出ができそうですね!
マシン語に興味を持ったら「IchigoJamマシン語入門」をどうぞ!