目次
前
次
ライントレースマシンに挑戦(その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」をクリックします。
目次
前
次