目次

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

 センサーからコース情報を入力し、ライントレースする
 プログラムを考えます。

 その前に、移動開始、停止を考えます。
 IchigoJamには、プッシュボタンがひとつあるので
 これで移動開始、停止を扱えるようにしてみます。



 パワーオンで、動作開始したときには、停止状態とします。
 プッシュボタンを押すと、移動→停止→移動と状態を変える
 ので、状態変数を変数Sに入れるとよいでしょう。

 状態遷移は、下図でよいでしょう。



 状態遷移図を参考にすれば、状態変数Sの値は
 次のように変化させられます。

10 '
20 LET S,0
30 IF BTN() GOSUB 500
40 '
50 END
500 '
510 IF S=0 LET S,1 ELSE LET S,0
520 RETURN

 状態変数Sが1になっていれば、センサーからデータを入力して
 移動させます。Sが0であれば、停止させます。

 4センサーを使う場合、センサー情報を10進数で
 表現し、モーターに与えるDUTY比を設定します。

0 0 0 0 =>  0
0 0 0 1 =>  1
0 0 1 0 =>  2
0 0 1 1 =>  3
0 1 0 0 =>  4
0 1 0 1 =>  5
0 1 1 0 =>  6
0 1 1 1 =>  7
1 0 0 0 =>  8
1 0 0 1 =>  9
1 0 1 0 => 10
1 0 1 1 => 11
1 1 0 0 => 12
1 1 0 1 => 13
1 1 1 0 => 14
1 1 1 1 => 15

 センサー値によるDUTY比は、次のサブルーチンで
 設定すればよいでしょう。

100 ' judge
110 IF [0]=6  LET [20],50,0,50,0 ' Forward
120 IF [0]=14 LET [20],0,50,50,0 ' Right
130 IF [0]=7  LET [20],50,0,0,50 ' Left
140 IF [0]=0  LET [20],0,50,0,50 ' Reverse
150 GOSUB 300
160 RETURN

 まとめます。

10 ' MCR
20 LET S,0:LET [20],0,0,0,0
30 IF BTN() GOTO 80
40 IF S=0 GOTO 60
50 GOSUB 200:GOSUB 100:GOTO 70
60 LET [20],0,0,0,0:GOSUB 300
70 GOTO 30
80 END
100 ' judge
110 IF [0]=6  LET [20],50,0,50,0 ' Forward
120 IF [0]=14 LET [20],0,50,50,0 ' Right
130 IF [0]=7  LET [20],50,0,0,50 ' Left
140 IF [0]=0  LET [20],0,50,0,50 ' Reverse
150 GOSUB 300
160 RETURN
200 ' sensor
210 FOR J=0 TO 1 : FOR I=0 TO 1
220   OUT 6,J : OUT 1,I : LET K,10+2*J+I
230   LET [K],(IN(4) << 1) | IN(1)
240 NEXT : NEXT
250 LET [0],([13] << 2) | [12]: LET [0],([0] << 4)
260 LET [0],[0] | ([11] << 2) | [10]
270 RETURN
300 ' motor
310 PWM 2,[20],100 : PWM 3,[21],100
320 PWM 4,[22],100 : PWM 5,[23],100
330 RETURN
500 ' state
510 IF S=0 LET S,1 ELSE LET S,0
520 RETURN

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

10 ' MCR
20 LET S,0:LET [20],0,0,0,0
30 @LOOP
35 IF BTN() GOTO @EXIT
40 IF S=0 GOTO @MEX
50 GSB @SENSE:GSB @JUDGE:GOTO @NEX
60 @MEX
65 LET [20],0,0,0,0:GSB @MOTOR
70 @NEX
75 GOTO @LOOP
80 @EXIT
90 END
100 @JUDGE
110 IF [0]=6  LET [20],50,0,50,0 ' Forward
120 IF [0]=14 LET [20],0,50,50,0 ' Right
130 IF [0]=7  LET [20],50,0,0,50 ' Left
140 IF [0]=0  LET [20],0,50,0,50 ' Reverse
150 GSB @MOTOR
160 RTN
200 @SENSE
210 FOR J=0 TO 1 : FOR I=0 TO 1
220   OUT 6,J : OUT 1,I : LET K,10+2*J+I
230   LET [K],(IN(4) << 1) | IN(1)
240 NEXT : NEXT
250 LET [0],([13] << 2) | [12]: LET [0],([0] << 4)
260 LET [0],[0] | ([11] << 2) | [10]
270 RTN
300 @MOTOR
310 PWM 2,[20],100 : PWM 3,[21],100
320 PWM 4,[22],100 : PWM 5,[23],100
330 RETURN
500 ' state
510 IF S=0 LET S,1 ELSE LET S,0
520 RTN

 センサーを4ビットから6ビット、8ビットと増やした
 場合には、10進数に変換するためのツールが必要です。

 JavaScriptで2進数を10進数に変換するツールは、以下。

<html>
<head>
<script language="javascript">
<!--

function clrArea()
{
  document.genhex.elements[1].value = "" ;
  document.genhex.elements[2].value = "" ;
}

function convertCode()
{
  // get strings length
  linenumber = document.genhex.line0.value.length ;
  // get strings
  edt0 = document.genhex.line0.value;
  // calculate
  rr = 0
  for ( i = 0 ; i < linenumber ; i++ ) {
    // judge
    if ( edt0[i] == '1' ) { rr = rr + 1 }
    // shift
    if ( i < linenumber-1 ) {
      rr = rr * 2 ;
    }
  }
  // show
  document.genhex.line1.value = rr + "\n" ;
}
// -->
</script>
</head>
<body>
<form method="post" name="genhex">
  <input type="button" name="clear"   value="clear" onClick="clrArea()"/><br>
  <div>Binary<input type="text" name="line0" /></div>
  <input type="button" name="convert" value="convert" onClick="convertCode()"/><br>
  <div>Decimal<input type="text" name="line1" /></div>
</form>
</body>
</html>

 ブラウザでHTMLファイルを指定すると、次のGUIを表示



 Binaryの右の欄に、2進数を入力し、「convert」ボタンを
 クリックします。



 Decimalの右の欄に、変換した10進数が表示されます。



 新たに2進数を入力し変換したい場合、「clear」ボタンを
 クリックします。



 終了は、右上の「X」をクリックします。




目次

inserted by FC2 system