LEDでナナイロづくり

1.ルーレット(光をうごかす)

Mission1の応用として、簡単なルーレットを作ってみました。

光が回って見えるようにするには少し工夫が必要です。
50行目で、現在のLED位置に紫色(C=6)を設定してLEDを光らせます。
80行目で、今度はLED位置に無色(C=0)に設定してLEDを消しています。
このように、1つ目のLEDを光らせる→消す、2つ目のLEDを光らせる→消す、というのを繰り返すことで、動いているように見えるのです。

ルーレットを止めるときは、[ESC]キーを押します。
しかし、この方法では問題が起きることがあります??。なにが問題なのか探してみてください。

サブルーチンの呼び出先や、GOTOの行先も、行番号からラベルに変えてみました(参考:ラベル)。

10 ‘M.5 ルーレット
20 CLV: L=15
30 @LOOP

40 FOR I=0 TO 11
45 PRINT “I=”;I
50 C=6: GSB @SET_WS.LED(I,C,L)
60 WS.LED 12

70 WAIT 3
80 C=0: GSB @SET_WS.LED(I,C,L)
90 WS.LED 12

100 NEXT
110 GOTO @LOOP



※BEEP命令を追加すると、ルーレットに合わせて音も出せます(参考:BEEP命令)。
60 WS.LED12: BEEP 5,10

※このプログラムで、ルーレットをESCキーで止めると、LEDが消えてしまうことがあります。
これは、LEDが消灯しているときにESCキーを押されると起きてしまいます。
そこで、LEDが点灯しているときに止まるように改良します。
ルーレットを止めるのも、ESCキーではなく、IchigoJam基板のタクトスイッチにします(参考:BTN命令 IF命令)。
??に入る行番号を探してください(ヒント:LEDが光ったあとに押す・・・)。
?? IF BTN()=1 THEN END

【プロのわざ 2】
FOR~NEXT命令の使い方は分かってきたでしょうか。
ところで、FOR I=0 TO 11: NEXTの繰り返し処理中に、変数Iの値を変えるとどうなるのでしょうか。
ルーレットプログラムを次のようにしてみました。

20 CLV: L=15
30 @LOOP
40 FOR I=0 TO 11
45 PRINT “I=”;I
50 C=6: GSB @SET_WS.LED(I,C,L)
60 WS.LED 12
70 WAIT 3
80 C=0: GSB @SET_WS.LED(I,C,L)
90 WS.LED 12
95 IF BTN()=1 I=0
100 NEXT
110 GOTO @LOOP


95行目に、IchigoJam基板のタクトスイッチを押したとき、変数Iをゼロにするプログラムを追加しました。
タクトスイッチを押すとどうなるか試してみてください。

今度は、次のプログラムではどうでしょうか。
FOR~NEXTは2回ループして止まるはずですが、いつまでたっても止まりません。

10 FOR I=0 TO 1
20 PRINT “I=”;I
30 I=BTN()
40 NEXT



このように、FOR~NEXT命令の途中で、使用した変数を変更すると思わぬ動作になりますので、通常は変更しないように使います。
しかし、逆にこの特徴を利用すると、FOR~NEXTから意図的に抜けたり、繰り返し数を可変にしたりすることもできるのです。