目次

ハードウエアテスト(その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
 に入れてます。

 サブルーチンを呼び出すループを構成すれば
 うまくいきそうです。シーケンスを考えます。
  1. 全LEDを消灯
  2. 変数Sに0を設定
  3. ボタンの状態を入力
  4. ボタンが押されていないときは、3に戻る
  5. 変数Sの値を増やして、LEDを点灯していく
  6. 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
目次

inserted by FC2 system