目次

動作テスト(Forth)

 Arduinoと同じ基板を利用して、Forthインタプリタを
 動かせます。

 Forthインタプリタに、AmForthを使うことにします。
 仕様は、次のように決めました。

 ポートBにモータドライバICのSN754410NEをつけ
 ポートCに路面センサーの出力が接続されている
 という条件を設定。

 ポートBのビット割当ては、以下。

 PB5 (output)LED
 PB4 (input) MODE
 PB3 (input) TRG
 PB2 (output)XEN
 PB1 (output)left_motor
 PB0 (output)right_motor

 MODEは、テストモード(1)か走行モード(0)とします。
 TRGは、スタートトリガの入力。
 XENは、モータドライバICのイネーブルで利用。

 スタートトリガは、マシン後方にあるスイッチと連動です。



 ポートBを、操作できるようにするための設定は、以下。

$00 PORTB c!{enter}
$E7 DDRB c!{enter}

 ポートCは、次のようにセンサー値を
 入力できるようにします。

  PC5 (input)
  PC4 (input)
  PC3 (input)
  PC2 (input) sensor_2
  PC1 (input) sensor_1
  PC0 (input) sensor_0

 ポートCを、操作できるようにするための設定は、以下。

$FF PORTC c!{enter}
$00 DDRC c!{enter}

 ポートCは、内蔵プルアップ抵抗をもつので
 プルアップするためにPORTCに値を書き込んで
 います。

 I/Oの初期化をまとめて、ワードにします。

: INITIO $00 PORTB c! $E7 DDRB c! $FF PORTC c! $00 DDRC c! ;

 路面センサーから情報を取得するには
 ポートCの値を読み込んで、3ビット
 にすればよいので、次のワードでよい
 でしょう。

: GETS PINC @ $07 AND ;

 路面センサーの情報は、スタックに入っているので
 この情報を利用し、モータドライバICへと論理値を
 出力することにします。

 モータドライバICとの接続は、以下。



 モータを回すときには、ポートBの3ビットを
 操作すればよいのでモータを動かす専用ワード
 を定義します。

: PMOT PORTB C@ $FC AND OR 4 OR PORTB C! ;

 PORTBの値を一度スタックに入れてから、下位3ビット
 を0にして、指定論理値で2ビット確定します。
 最後にXENに相当するビットをセットしてからPORTBに
 書き出し終了。

 使うときには、次のように1、2、3のいずれかを
 与えます。

1 PMOT{enter}
2 PMOT{enter}
3 PMOT{enter}

 1は左回転、2は右回転、3は直進。

 スタックには、1、2、3のいずれかが
 入っているので、その値をPORTBの下位
 2ビットにします。



 路面センサーの情報とモータ制御に使う
 数値の対応をまとめると、以下。

0(?????) 直進  3 PMOT{enter}
1(右はみだし) 左回転 2 PMOT{enter}
2(?????) 直進  3 PMOT{enter}
3(?????) 直進  3 PMOT{enter}
4(左はみだし) 右回転 1 PMOT{enter}
5(?????) 直進  3 PMOT{enter}
6(?????) 直進  3 PMOT{enter}
7(?????) 直進  3 PMOT{enter}

 右と左の回転をするために、スタック上の値を
 判定して、ワードPMOTに値を渡せばよいと判断
 して、専用ワードを定義します。

: S1 1 = IF 2 PMOT THEN ;
: S4 4 = IF 1 PMOT THEN ;
: N14 DUP 1 <> SWAP 4 <> AND ;
: NS14 N14 IF 3 PMOT THEN ;

 ワードN14は、スタックに入っている値が1、4の
 どちらでもないときに、0でない値を返します。

 スタックでは、どんなことが起きているのかは
 紙にスタックに入っている値の変化をトレース
 してみれば、わかります。

     (3)
DUP  (3 3)
1    (3 3 1)
<>   (3 1)
SWAP (1 3)
4    (1 3 4)
<>   (1 1)
AND  (1)

 ワードN14は、論理値をスタックに返すので
 ワードNS14は、スタックに1、4でない値が
 入っていれば、判定結果に0でない値を置く
 ことになります。

 これらのワードを利用して、路面センサーからの
 情報を使ってモータを動かすには、次のように
 すればよいはず。

GETS dup dup S1 S4 NS14{enter}

 ワードGETSで、スタックに5が入ったとして
 どんな動作になるのかをトレースしてみます。

     (5)
DUP  (5 5)
DUP  (5 5 5)
S1   (5 5)
S4   (5)
NS14 ()

 スタック操作では、何も発生しませんが副作用で
 モータドライバICに対して、信号が出力されます。

 モータを少しの間、回転させて置かないと移動
 できないので、テストにはソフトウエアの遅延
 を入れて対応します。

: XWAIT 255 0 do i . loop ;

 0から255の整数を表示するだけですが
 これで無駄時間を稼げます。

 路面センサーから情報を取得して、移動するには
 次のようにワードを並べるだけになります。

: XMOVE GETS dup dup S1 S4 NS14 XWAIT ;

 ここまで操作ができれば、使うワードとしてのテストは完了。

 AmFORTHは、プログラムメモリの中にワードを埋め込む
 ので、試行錯誤してワードを動かすときには不向き。
 WIN32FORTHを利用して、PC上での動作を確認していきます。

 配列を利用して、センサーからのデータが得られたとき
 定義したワードが規定通りに動いているのかを確認。

 ワードcreateを使って、センサーデータを用意します。
 16バイトのデータを用意して、値を格納後、表示して
 みると、以下。



 センサー値を取得して、移動に使うワードに渡して
 どうなるのかをテストしてみます。



 センサー値が1か4のとき、対応した回転をして
 それ以外では、直進することがわかります。

 配列にセンサー値を格納しておけば、マシンが
 なくても、制御信号が正しく与えられているか
 を、確認できます。

 10進数での表示が、わかりにくいときには、2進数
 で表示してみるとよいでしょう。

 2桁→4桁→8桁とワード処理を連ねます。



 2進数の4桁表示で、どうなるのかを調べます。




目次

inserted by FC2 system