目次

ライントレースマシンテスト

 物置で眠りについていたライントレースマシンを
 IchigoJamで動かすため、仕事部屋にもって来ました。




 電源安定化に利用しているDCDCコンバータ基板に
 Z金具をつけ、IchigoJamのU基板を固定。

 制御基板は、H8/3048FOneに接続する仕様です。
 これをIchigoJam用に変更。

 制御基板上のモータードライブ回路に接続している
 ケーブルからIchigoJamの電源を貰い、モータ制御
 信号を横取りします。



 10ピンケーブルの信号アサインを以下としました。
 []が、10ピンケーブルのピン番号。

 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


目次

inserted by FC2 system