目次
前
次
ライントレースマシンテスト
物置で眠りについていたライントレースマシンを
IchigoJamで動かすため、仕事部屋にもって来ました。
電源安定化に利用しているDCDCコンバータ基板に
Z金具をつけ、IchigoJamのU基板を固定。
制御基板は、H8/3048FOneに接続する仕様です。
これをIchigoJam用に変更。
制御基板上のモータードライブ回路に接続している
ケーブルからIchigoJamの電源を貰い、モータ制御
信号を横取りします。
10ピンケーブルの信号アサインを以下としました。
[]が、10ピンケーブルのピン番号。
- 1 IN_1
- 2 IN_2
- 3 IN_3
- 4 IN_4
- 5 Vcc(3.3V)
- 6 GND(0V) [10]
- 7 OUT_1 [3]
- 8 OUT_2 [9]
- 9 OUT_3 [7]
- 10 OUT_4 [2]
10ピンケーブルに5Vの電源があるので、IchigoJamの3.3V電圧を
Zennerダイオードとシリコンダイオードを利用して生成。
モータドライブ回路は単純ですが、負論理で動かします。
PWM波形が与えられると、LEDが点灯します。制御信号モニタと
して、確認に使えます。
モータを停止するときには、'1'を出力するので、PWM波形を
与える場合、DUTY比を100%から引いた値を指定しなければ
おかしな動きになります。
モータを回転する部分をサブルーチンにまとめます。
100 ' send PWM wave
110 LET [2],20 * [20],20 * [21]
120 LET [2],2000 - [2],2000 - [3]
130 PWM 2,[2]:PWM 3,[3]
140 WAIT [22]
150 RETURN
160 ' stop
170 OUT 2,1:OUT 3,1
180 WAIT 120
190 RETURN
配列[20]、[21]、[22]に、右モータDUTY比、左モータDUTY比、待ち
時間カウント(1秒=60)を格納してからサブルーチンを呼出す
コーリングシーケンスを採用。
配列[2]、[3]には、DUTY比に相当するカウント値を計算して
格納しますが、負論理で動かすので、2000からの差分を求め
なければなりません。
停止は、DUTY比を0%とすることもできますが、単純に
論理値'1'を出力することに。
IchigoJam基板上のボタンを押したなら、次の動作をするように
してみます。
大まかな処理を書いておきます。
実際の移動は、サブルーチンに任せると仮定して
定義していきます。
10 ' test MCR machine
20 GSB 160:LET S,1
30 IF BTN() GOTO 50
40 GOTO 30
50 GSB 200:LET S,S+1
60 IF S=9 LET S,1
70 IF BTN() GOTO 90
80 GOTO 50
90 GSB 160:END
ラベルを利用すると、以下。
10 ' test MCR machine
20 GSB 160:LET S,1
30 IF BTN() GOTO 50
40 GOTO 30
50 GSB 200:LET S,S+1
60 IF S=9 LET S,1
70 IF BTN() GOTO 90
80 GOTO 50
90 GSB 160:END
移動のサブルーチンを作成。
200 ' move
210 IF S=2 || S=4 || S=6 || S=8 GOTO 260
220 IF S=1 || S=5 LET [20],50,50,600
230 IF S=3 LET [20],90,10,1800
240 IF S=7 LET [20],10,90,1800
250 GSB 100:GOTO 270
260 GSB 160
270 RETURN
まとめます。
10 ' test MCR machine
20 GSB 160:LET S,1
30 IF BTN() GOTO 50
40 GOTO 30
50 GSB 200:LET S,S+1
60 IF S=9 LET S,S AND 1
70 IF BTN() GOTO 90
80 GOTO 50
90 GSB 160:END
100 ' send PWM wave
110 LET [2],20 * [20],20 * [21]
120 LET [2],2000 - [2],2000 - [3]
130 PWM 2,[2]:PWM 3,[3]
140 WAIT [22]
150 RETURN
160 ' stop
170 OUT 2,1:OUT 3,1
180 WAIT 120
190 RETURN
200 ' move
210 IF S=2 || S=4 || S=6 || S=8 GOTO 260
220 IF S=1 || S=5 LET [20],50,50,600
230 IF S=3 LET [20],90,10,1800
240 IF S=7 LET [20],10,90,1800
250 GSB 100:GOTO 270
260 GSB 160
270 RETURN
このプログラムをテストする前に、次のコードでの
動作チェックをしています。
10 ' test motor (dummy)
20 LET S,1
30 GSB 200
40 GSB 100
50 LET S,S+1:IF S=6 LET S,1
60 IF BTN() GOTO 80
70 GOTO 30
80 OUT 2,0:OUT 3,0:? "exit"
90 END
100 ' motor control
110 FOR I=2 TO 3
120 OUT I,[I]
130 NEXT
135 ? "S = ";S,[2],[3]
138 IF [2]=1 PLAY "C"
139 IF [3]=1 PLAY "A"
140 ? "wait",[3]:WAIT [4]
150 RETURN
200 ' state machine
210 IF S=1 LET [2],1,0,1200
220 IF S=2 LET [2],1,1,600
230 IF S=3 LET [2],0,1,1200
240 IF S=4 LET [2],1,1,600
250 IF S=5 LET [2],0,0,600
260 RETURN
モータ制御信号を表示してわかりやすくしています。
また、状態変数と待ち時間カウンタの値を表示して
ハードウエアに接続しないでも動作がわかるように
しました。
待ち時間の上限を4000カウントとすれば、配列のひとつに
左右のモータに与える信号といっしょにまとめられます。
具体的には、次のように設定します。
LET [10],(1200 << 4) | 3
LET [0],[10]
1200を待ち時間のカウント値、3(2進数では11)を
左右のモータの制御信号にできます。
モータを回すサブルーチンは、次のように書き直します。
100 ' motor control
110 LET [2],([0] & 1),(([0] >> 1) & 1)
120 FOR I=2 TO 3
130 OUT I,[I]
140 NEXT
150 LET [4],([0] >> 2)
155 ? [2],[3]
160 ? "wait",[4]:WAIT [4]
170 RETURN
配列ひとつに、待ち時間、左右のモータ信号を格納する
処理は、次のように簡単になります。
200 ' set parameters
210 LET [11],(1200 << 2) | 2
220 LET [12],(600 << 2) | 3
230 LET [13],(1200 << 2) | 1
240 LET [14],(600 << 2) | 3
250 LET [15],(600 << 2)
260 RETURN
サブルーチンを使う側は、初期化とモータ回転処理を
させるだけ。
10 '
20 GSB 200:LET S,11
30 LET [0],[S]:GSB 100
40 LET S,S+1:IF S=16 LET S,11
50 IF BTN() GOTO 70
60 GOTO 30
70 OUT 2,0:OUT 3,0:? "exit"
80 END
変数Sが、どの配列を使うかを指定します。
配列は、100個ほどのデータを格納できるので
80個をパラメータ設定に費やすと、かなり複雑
な動作をさせられます。
正論理で使うために、74LS04でインバータバッファを用意しました。
接続は、以下。
ラベルを使うと、次のようにも書けます。
10 ' test motor (dummy)
20 S=1
30 @LOOP
40 GSB @SETM:GSB @MTCON
50 S=S+1:IF S=6 S=1
60 IF BTN() GOTO @EXIT
70 GOTO @LOOP
80 @EXIT
85 OUT 2,0:OUT 3,0:? "exit"
90 END
100 @MTCON
110 FOR I=2 TO 3
120 OUT I,[I]
130 NEXT
135 ? "S = ";S,[2],[3]
138 IF [2]=1 PLAY "C"
139 IF [3]=1 PLAY "A"
140 ? "wait",[3]:WAIT [4]
150 RTN
200 @SETM
210 IF S=1 LET [2],1,0,1200
220 IF S=2 LET [2],1,1,600
230 IF S=3 LET [2],0,1,1200
240 IF S=4 LET [2],1,1,600
250 IF S=5 LET [2],0,0,600
260 RTN
目次
前
次