目次
前
次
ハードウエアテスト(その19)
Go/Stop装置は、タイムトライアル競技の
スタートの合図を送ります。
装置の動作を、状態遷移図で示すと、以下。
ランプが4個必要なので、IchigoJam基板上のLEDを使い
外部には3LEDで済ませます。
OUT1、OUT2、OUT3にLED_3、LED_2、LED_1を接続して
正論理で点灯させます。全LEDの消灯と指定LEDの点灯
を担当するサブルーチンを定義します。
全LEDの消灯
LED_0だけは、命令LEDで制御できるので、他のOUTに
接続されているLEDはOUTで指定。FOR文を利用。
FOR I=1 TO 3:OUT I,0:NEXT:LED 0
指定LEDの点灯
一度全LEDを消灯してから、指定されたLEDを
点灯するようにすれば、できそう。
LEDに番号がつけられているので、IF文とOUT命令を
組み合わせて、処理すればよいはず。
LEDの番号を、変数Sに入れて処理します。
GOSUB 170
IF S=4 LED 1
IF S=3 OUT 1,1
IF S=2 OUT 2,1
IF S=1 OUT 3,1
WAIT 60
RETURN
最下位の処理を定義したので、行番号を入れてまとめます。
160 ' all LEDs off
170 FOR I=1 TO 3:OUT I,0:NEXT:LED 0
180 RETURN
200 ' LED handling
210 GOSUB 170
220 IF S=4 LED 1
230 IF S=3 OUT 1,1
240 IF S=2 OUT 2,1
250 IF S=1 OUT 3,1
260 WAIT 60
270 GOSUB 170
280 RETURN
変数Sを使い、LEDの点灯は指定できるので
変数Sの値を順次増やして、サブルーチン
を呼び出せば、よいでしょう。
300 ' sequencer
310 FOR I=1 TO 4
320 LET S,I
330 GOSUB 200
340 NEXT
350 RETURN
残りは、IchigoJamの基板上のボタンを利用して
押されたかを判断する処理を定義します。
100 ' check trigger
110 LET A,0
120 LET [1],BTN():WAIT 30
130 LET [2],BTN():WAIT 30
140 IF [1]=0 AND [2]=1 LET A,1
150 RETURN
時間をおいて、ボタンの出力値を記憶して
組み合わせで、押されたかどうかを変数A
に入れてます。
サブルーチンを呼び出すループを構成すれば
うまくいきそうです。シーケンスを考えます。
- 全LEDを消灯
- 変数Sに0を設定
- ボタンの状態を入力
- ボタンが押されていないときは、3に戻る
- 変数Sの値を増やして、LEDを点灯していく
- 1に戻る
BASICのコードに変換すると、次のようにすればよいでしょう。
10 ' start signal handling
20 GOSUB 170
30 LET S,0
40 GOSUB 100
50 IF A=0 GOTO 40
60 GOSUB 300
70 GOTO 20
80 END
まとめると、以下。
10 ' start signal handling
20 GOSUB 170
30 LET S,0
40 GOSUB 100
50 IF A=0 GOTO 40
60 GOSUB 300
70 GOTO 20
80 END
100 ' check trigger
110 LET A,0
120 LET [1],BTN():WAIT 30
130 LET [2],BTN():WAIT 30
140 IF [1]=0 AND [2]=1 LET A,1
150 RETURN
160 ' all LEDs off
170 FOR I=1 TO 3:OUT I,0:NEXT:LED 0
180 RETURN
200 ' LED handling
210 GOSUB 170
220 IF S=4 LED 1
230 IF S=3 OUT 1,1
240 IF S=2 OUT 2,1
250 IF S=1 OUT 3,1
260 WAIT 60
270 GOSUB 170
280 RETURN
300 ' sequencer
310 FOR I=1 TO 4
320 LET S,I
330 GOSUB 200
340 NEXT
350 RETURN
Go/Stop装置では、音を出すこともできます。
音関係の命令を使うには、EXとGNDに圧電サウンダの
2ピンを接続しておかないと駄目。
高い音(周波数が高い)は、スタート時に使い
低い音(周波数が低い)を他の場面で利用すれば
よいでしょう。
BEEP命令では、低い音の場合に大きな数値を入れて
高い音では小さな数値を使います。
これがわかれば、300行から始まるサブルーチン内で
周波数に相当する数値を指定すれば、このルーチン
の処理はOK。
300 ' sequencer
310 FOR I=1 TO 4
320 LET S,I:LET B,100
330 IF I=4 LET B,50
340 GOSUB 200
350 NEXT
360 RETURN
LEDの点灯を担当するサブルーチン内部で
音の出力も操作すればよいでしょう。
200 ' LED handling
210 GOSUB 170
220 IF S=4 LED 1
230 IF S=3 OUT 1,1
240 IF S=2 OUT 2,1
250 IF S=1 OUT 3,1
260 BEEP B,60
270 GOSUB 170
280 RETURN
音の出力まで対応するコードとしてまとめます。
10 ' start signal handling
20 GOSUB 170
30 LET S,0
40 GOSUB 100
50 IF A=0 GOTO 40
60 GOSUB 300
70 GOTO 20
80 END
100 ' check trigger
110 LET A,0
120 LET [1],BTN():WAIT 30
130 LET [2],BTN():WAIT 30
140 IF [1]=0 AND [2]=1 LET A,1
150 RETURN
160 ' all LEDs off
170 FOR I=1 TO 3:OUT I,0:NEXT:LED 0
180 RETURN
200 ' LED handling
210 GOSUB 170
220 IF S=4 LED 1
230 IF S=3 OUT 1,1
240 IF S=2 OUT 2,1
250 IF S=1 OUT 3,1
260 BEEP B,60
270 GOSUB 170
280 RETURN
300 ' sequencer
310 FOR I=1 TO 4
320 LET S,I:LET F,100
330 IF I=4 LET F,50
340 GOSUB 200
350 NEXT
360 RETURN
ラベル利用だと、次のようになります。
10 ' start signal handling
20 @LOOP
30 GSB @LOFF
40 LET S,0
50 @REP
55 GSB @TRG
60 IF A=0 GOTO @REP
70 GSB @SEQ
80 GOTO @LOOP
90 END
100 @TRG
110 LET A,0
120 LET [1],BTN():WAIT 30
130 LET [2],BTN():WAIT 30
140 IF [1]=0 AND [2]=1 LET A,1
150 RTN
160 @LOFF
170 FOR I=1 TO 3:OUT I,0:NEXT:LED 0
180 RTN
200 @LHND
210 GSB @LOFF
220 IF S=4 LED 1
230 IF S=3 OUT 1,1
240 IF S=2 OUT 2,1
250 IF S=1 OUT 3,1
260 BEEP B,60
270 GSB @LOFF
280 RTN
300 @SEQ
310 FOR I=1 TO 4
320 LET S,I:LET F,100
330 IF I=4 LET F,50
340 GSB @LHND
350 NEXT
360 RTN
目次
前
次