目次

ライントレースマシンに挑戦(その5)

 ライントレースマシンを動かすため、センサー情報を
 どう扱うのかを考えます。

 距離センサーはスタートゲートの開閉を検知して
 移動開始と前面の壁に衝突するのを回避するため
 の情報として使います。

 距離センサーは、0から1023の値を出力してくるので
 これ以上近づくと衝突と判断ができるように値を決め
 対応します。

 距離センサーのテストプログラムをサブルーチンにして
 値を返して貰うようにします。

100 ' measure
110 LET A,ANA(2)
120 RETURN

 ラインセンサーはIN1、IN3、IN4からの入力を扱いますが
 ラインとの関係を見て判断できるようにします。

 床のラインとセンサーの出力値の関係を考えます。


 IN1を左、IN3を中央、IN4を右としてラインの状態を
 捕らえます。

 3センサーの状態を別々に扱うと面倒なので、合体
 させた値で判断できるようにします。

 サブルーチンで、センサー値を変数Sに入れるように
 してみます。

130 ' concatenate
140 LET [10],IN(1),IN(3),IN(4)
150 LET S,[10]*4+[11]*2+[12]
160 RETURN

 変数Sの中に、ラインセンサーの状態を入れられました。
 値がどういうことを表現しているのかをまとめます。

 8通りの状態があるので、それぞれのパターンで
 どういう走行をするのかを決めていきます。

 ???は、コース面の状況で変えることになるので
 実際に走行させてから考えます。

 パターンによるモータに与えるDUTY比を指定します。

 この処理をサブルーチンにしておきます。

300 ' judge
310 IF S=0 LET [0],50, 0,50, 0
320 IF S=1 LET [0], 0,50, 0,80
330 IF S=2 LET [0], 0,50, 0,50
340 IF S=3 LET [0], 0,50,50, 0
350 IF S=4 LET [0], 0,80, 0,50
360 IF S=5 LET [0], 0,50, 0,80
370 IF S=6 LET [0],50, 0, 0,50
380 IF S=7 LET [0], 0,30, 0,30
390 RETURN

 左右のモータのDUTY比を設定するサブルーチンを
 書いておきます。

200 ' set each duty ratio
210 PWM 2,[0],100:PWM 3,[1],100
220 PWM 4,[2],100:PWM 5,[3],100
230 RETURN

 スタートするのは、自動でもよいですが
 ボタンを押すことでいけるようにしても
 よいでしょう。

10 ' car control
20 LET R,0:LET [0],0,0,0,0:GOSUB 200
30 GOSUB 100:IF A>500 LET R,1
40 IF BTN() GOTO 60
50 GOTO 70
60 IF R=0 LET R,1 ELSE LET R,0
80 IF R=1 GOTO 400
90 END

 400行から移動処理を書いておけばよいはず。
 まとめます。

10 ' car control
20 LET R,0:LET [0],0,0,0,0:GOSUB 200
30 GOSUB 100:IF A>500 LET R,1
40 IF BTN() GOTO 60
50 GOTO 70
60 IF R=0 LET R,1 ELSE LET R,0
80 IF R=1 GOTO 400
90 END
100 ' measure
110 LET A,ANA(2)
120 RETURN
130 ' concatenate
140 LET [10],IN(1),IN(3),IN(4)
150 LET S,[10]*4+[11]*2+[12]
160 RETURN
200 ' set each duty ratio
210 PWM 2,[0],100:PWM 3,[1],100
220 PWM 4,[2],100:PWM 5,[3],100
230 RETURN
300 ' judge
310 IF S=0 LET [0],50, 0,50, 0
320 IF S=1 LET [0], 0,50, 0,80
330 IF S=2 LET [0], 0,50, 0,50
340 IF S=3 LET [0], 0,50,50, 0
350 IF S=4 LET [0], 0,80, 0,50
360 IF S=5 LET [0], 0,50, 0,80
370 IF S=6 LET [0],50, 0, 0,50
380 IF S=7 LET [0], 0,30, 0,30
390 RETURN
400 ' control
410 GOSUB 130 ' get road state
420 GOSUB 300 ' generate duty ratio
430 GOSUB 200 ' move
440 WAIT 120
450 IF BTN() GOTO 20
460 GOTO 410

 ラベル利用で、次のようにも書けます。

10 ' car control
15 @LOOP
20 LET R,0:LET [0],0,0,0,0:GSB @PDUTY
30 GSB @MEASURE:IF A>500 LET R,1
40 IF BTN() GOTO @MEX
50 GOTO 70
60 @MEX
60 IF R=0 LET R,1 ELSE LET R,0
80 IF R=1 GOTO @XCON
90 END
100 @MEASURE
110 LET A,ANA(2)
120 RTN
130 @COCAT
140 LET [10],IN(1),IN(3),IN(4)
150 LET S,[10]*4+[11]*2+[12]
160 RTN
200 @PDUTY
210 PWM 2,[0],100:PWM 3,[1],100
220 PWM 4,[2],100:PWM 5,[3],100
230 RTN
300 @JUDGE
310 IF S=0 LET [0],50, 0,50, 0
320 IF S=1 LET [0], 0,50, 0,80
330 IF S=2 LET [0], 0,50, 0,50
340 IF S=3 LET [0], 0,50,50, 0
350 IF S=4 LET [0], 0,80, 0,50
360 IF S=5 LET [0], 0,50, 0,80
370 IF S=6 LET [0],50, 0, 0,50
380 IF S=7 LET [0], 0,30, 0,30
390 RTN
400 @XCON
410 GSB @COCAT ' get road state
420 GSB @JUDGE ' generate duty ratio
430 GSB @PDUTY ' move
440 WAIT 120
450 IF BTN() GOTO @LOOP
460 GOTO @XCON


目次

inserted by FC2 system