目次

ライントレーサチェック

 IchigoJam体験会で使うライントレーサを動かしてみます。



 センサーは3ビットで、デジタル入力にIN_1、IN_2、IN_4に接続。
 センサーからの情報を10進数に変換するサブルーチンを定義。

200 ' get sensor
210 LET [1],IN(2),IN(4),IN(1)
220 IF [1]=1 LET [1],0 ELSE LET [1],1
230 IF [2]=1 LET [2],0 ELSE LET [2],1
240 IF [3]=1 LET [3],0 ELSE LET [3],1
230 LET [0],[1] * 4 + [2] * 2 + [3]
240 RTN

 センサーの出力値は、以下。

 DCモータを動かすには、論理値の'1'を与えればよいので
 OUT_2、OUT_4から出力します。

 センサー値により、OUT_2、OUT_4の出力論理値を決めて
 配列に格納しておけばよいでしょう。

 1変数に左右の出力論理値を同時に格納します。

100 ' initialize
110 LET [10],1*2 + 1
120 LET [11],0*2 + 1
130 LET [12],1*2 + 0
140 RTN

 センサー値により、DUTY比を設定するサブルーチンを定義。

300 ' set logical value
310 LET A,[10]
320 IF [0]=1 LET A,[11]
320 IF [0]=3 LET A,[11]
340 IF [0]=4 LET A,[12]
350 IF [0]=6 LET A,[12]
360 LET [20],(A >> 1) & 1: LET [21],A & 1
370 OUT 2,[20] : OUT 4,[21]
380 WAIT 60
390 RTN

 モータの回転を止めるためのサブルーチンも
 定義しておきましょう。

400 ' stop
410 OUT 2,0: OUT 4,0
420 RTN

 動作シーケンスを考えると、以下。
  1. モータ停止
  2. DUTY比格納
  3. センサー情報入力
  4. DUTY比設定
  5. ボタンが押されていたら、7に分岐
  6. 3にもどる
  7. モータ停止
 これをBASICコードに変換。 10 ' Jam Car 20 GOSUB 400 30 GOSUB 100 ' initialize 40 GOSUB 200 ' get sensor 50 GOSUB 300 ' set duty ratio 60 IF BTN() GOTO 80 70 GOTO 40 80 GOSUB 400 ' stop 90 END  まとめます。 10 ' Jam Car 20 GOSUB 400 30 GOSUB 100 ' initialize 40 GOSUB 200 ' get sensor 50 GOSUB 300 ' set duty ratio 60 IF BTN() GOTO 80 70 GOTO 40 80 GOSUB 400 ' stop 90 END 100 ' initialize 110 LET [10],1*2 + 1 120 LET [11],0*2 + 1 130 LET [12],1*2 + 0 140 RTN 200 ' get sensor 210 LET [1],IN(2),IN(4),IN(1) 220 IF [1]=1 LET [1],0 ELSE LET [1],1 230 IF [2]=1 LET [2],0 ELSE LET [2],1 240 IF [3]=1 LET [3],0 ELSE LET [3],1 230 LET [0],[1] * 4 + [2] * 2 + [3] 240 RTN 300 ' set logical value 310 LET A,[10] 320 IF [0]=1 LET A,[11] 320 IF [0]=3 LET A,[11] 340 IF [0]=4 LET A,[12] 350 IF [0]=6 LET A,[12] 360 LET [20],(A >> 1) & 1: LET [21],A & 1 370 OUT 2,[20] : OUT 4,[21] 380 WAIT 60 390 RTN 400 ' stop 410 OUT 2,0: OUT 3,0 420 RTN  ラベルを使って、まとめることも可能。 10 ' Jam Car 20 GSB @POFF:GSB @INIT: 30 @LOOP 40 GSB @GSEN:GSB @SDUTY 50 IF BTN() GOTO @EXIT 60 GOTO @LOOP 70 @EXIT 80 GSB @POFF 90 END 100 @INIT 110 LET [10],1*2 + 1 120 LET [11],0*2 + 1 130 LET [12],1*2 + 0 140 RTN 200 @GSEN 210 LET [1],IN(2),IN(4),IN(1) 220 IF [1]=1 LET [1],0 ELSE LET [1],1 230 IF [2]=1 LET [2],0 ELSE LET [2],1 240 IF [3]=1 LET [3],0 ELSE LET [3],1 230 LET [0],[1] * 4 + [2] * 2 + [3] 240 RTN 300 @SDUTY 310 LET A,[10] 320 IF [0]=1 LET A,[11] 320 IF [0]=3 LET A,[11] 340 IF [0]=4 LET A,[12] 350 IF [0]=6 LET A,[12] 360 LET [20],(A >> 1) & 1: LET [21],A & 1 370 OUT 2,[20] : OUT 4,[21] 380 WAIT 60 390 RTN 400 @POFF 410 OUT 2,0: OUT 3,0 420 RTN  1ビットの論理反転を「!」で扱うと、気がつけば  つぎのようにもできます。 200 @GSEN 210 LET [1],!IN(2),!IN(4),!IN(1) 220 LET [0],[1] * 4 + [2] * 2 + [3] 230 ? [1],[2],[3] 240 RTN  雛形を書いてから、より短いコードにできるかを  考えるのが、スキル向上につながります。

目次

inserted by FC2 system