目次
前
次
ライントレースマシンに挑戦(その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の中に、ラインセンサーの状態を入れられました。
値がどういうことを表現しているのかをまとめます。
- 0(000) ラインなし
- 1(001) 右端にラインあり
- 2(010) 中央にラインあり
- 3(011) 中央と右端にラインあり
- 4(100) 左端にラインあり
- 5(101) 両端にラインあり
- 6(110) 中央と左端にラインあり
- 7(111) ラインあり
8通りの状態があるので、それぞれのパターンで
どういう走行をするのかを決めていきます。
- 0(000) 後退<ラインなし>
- 1(001) 右モータの回転数を上げる<右端にラインあり>
- 2(010) 左右モータの回転数を同じに<中央にラインあり>
- 3(011) 右に回転<中央と右端にラインあり>
- 4(100) 左モータの回転数を上げる<左端にラインあり>
- 5(101) ???<両端にラインあり>
- 6(110) 左に回転<中央と左端にラインあり>
- 7(111) ???<ラインあり>
???は、コース面の状況で変えることになるので
実際に走行させてから考えます。
パターンによるモータに与えるDUTY比を指定します。
- IF S=0 LET [0],50, 0,50, 0
- IF S=1 LET [0], 0,50, 0,80
- IF S=2 LET [0], 0,50, 0,50
- IF S=3 LET [0], 0,50,50, 0
- IF S=4 LET [0], 0,80, 0,50
- IF S=5 LET [0], 0,50, 0,80
- IF S=6 LET [0],50, 0, 0,50
- IF S=7 LET [0], 0,30, 0,30
この処理をサブルーチンにしておきます。
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
目次
前
次