目次
前
次
動作テスト(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桁表示で、どうなるのかを調べます。
目次
前
次