Armadillo-460のPC/104バスにパルスモータコントローラボードHT3035(梅沢無線電機製)を接続して使用する方法を紹介します。
HT3035は、1ボードで4軸制御可能なPC/104接続のパルスモータコントローラボードです。HT3035の詳細な仕様等は、梅沢無線電機ホームページでごらんください。
Armadillo-460にPC/104ボードを接続して使用する場合、そのボード専用のデバイスドライバを作成するというのが、本来の方法です。しかしながら、Linuxカーネル用のデバイスドライバを作成するのはなかなかハードルが高い作業です。そこで、本Howtoではサンプルプログラムをユーザーランドで動作するアプリケーションプログラムとして実装します。このように、Armadillo-460では簡単なPC/104ボードであれば、デバイスドライバを作成せずとも、制御することができるようになっています。
以下はサンプルアプリケーションの主な仕様です。
- 1軸または複数軸を+方向に定量/連続ドライブ可能
- 速度カーブは、定速/直線加減速/完全S字加減速を指定可能
- 割り込みは未使用
- I/Oベースアドレスは0x280固定(出荷デフォルト)
- 論理位置を表示可能
本Howtoでのおおまかな手順は以下のようになります。
動作確認に使用したソフトウェアは以下の通りです。
- ユーザーランドイメージ: romfs-a460-1.00.img.gz
- Linux カーネルイメージ: linux-a460-1.00.bin.gz
- HT3035サンプルアプリケーション: ht3035.tar.gz
Armadillo-460に関連するマニュアルの最新版は、製品マニュアルからダウンロードすることができます。
1. 事前準備
1.1. HT3035のジャンパ設定を確認する
HT3035ではPC/104のI/Oアドレス空間のどこを使用するか、ジャンパで設定できるようになっています。今回のサンプルアプリケーションでは0x280から0x28eを使いますので、ジャンパ(JP1)が以下のように設定されていることを確認してください。設定値はHT3035基板上にシルク印字されています。
JP1:
ピン | 設定値 |
---|---|
A10 | 0 |
A9 | 1 |
A8 | 0 |
A7 | 1 |
A6 | 0 |
A5 | 0 |
A4 | 0 |
その他の設定をする場合は、ソースファイルの以下の行に定義されているI/Oベースアドレスを編集する必要があります。
ht3035/ht3035.h
#define HT3035_BASE (0x280)
また、HT3035では加減速ドライブ中に定速が開始された場合など、いくつかの要因で割り込みを発生させることができますが、今回のサンルアプリケーションでは使用しません。JP2が全てオープンに設定されていることを確認してください。
JP2:
ピン | 設定 |
---|---|
IRQ2 | オープン |
IRQ3 | オープン |
IRQ4 | オープン |
IRQ5 | オープン |
IRQ6 | オープン |
IRQ7 | オープン |
1.2. Armadillo-460にスペーサを取り付ける
HT3035を接続する前に、Armadillo-460の四隅に付属のスペーサ(15mm)を取り付けてください。PC/104用のピンは比較的長いため、スペーサを取り付けていないとボードの重みでピンが曲がってしまうことがあります。
1.3. HT3035をArmadillo-460に接続する
最後に、Armadillo-460に電源が入っていないことを確認してから、HT3035をArmadillo-460に接続してください。
以上で事前準備は完了です。
2. サンプルアプリケーションのビルド
サンプルアプリケーションのソースコードアーカイブは、http://download.atmark-techno.com/armadillo-460/sample/ht3035.tar.gz から取得できます。wgetコマンドで開発PC上にダウンロードし、tarコマンドで展開してください。
[atde3 ~]$ wget http://download.atmark-techno.com/armadillo-460/sample/ht3035.tar.gz
[atde3 ~]$ tar zxvf ht3035.tar.gz
[atde3 ~]$ cd ht3035
[atde3 ~/ht3035]$ ls
Makefile ht3035.c ht3035.h
ht3035.cがソースコード、ht3035.hがヘッダファイルです。ht3035.cの中身を見てみると、コマンドライン引数のパース処理や、レジスタ値の計算以外の処理は以下に示すように単純な処理しか行っていません。これだけで、PC/104ボードのレジスタを読み書きすることができます。
- /dev/memをopen()
- Armadillo-460のPC/104 I/O空間(8bitアクセス用)をmemmap()
- memmap()した空間のうち、HT3035のI/Oベースアドレス分移動した空間へアクセス
サンプルアプリケーションをビルドするには、makeコマンドを実行してください。ファイル"ht3035"が、ビルドによって生成されたサンプルアプリケーションの実行可能ファイルです。
[atde3 ~/ht3035]$ make
arm-linux-gnueabi-gcc -Wall -Wextra -O2 -march=armv5te -c -o ht3035.o ht3035.c
arm-linux-gnueabi-gcc ht3035.o -o ht3035
[atde3 ~/ht3035]$ ls
Makefile ht3035 ht3035.c ht3035.h ht3035.o
3. サンプルアプリケーションの転送
Howto: ftpでファイルを送受信するを参照し、サンプルアプリケーションの実行可能ファイルを開発用PCからArmadillo-460に転送してください。 転送が完了したら、Armadilloの端末上で以下のように実行権限を付与し、パスの通ったディレクトリへ実行可能ファイルを移動してください。
[armadillo ~]$ cd /home/ftp/pub
[armadillo /home/ftp/pub]$ chmod +x ht3035
[armadillo /home/ftp/pub]$ mv ht3035 /usr/bin
※ もし、ビルド済みのatmark-distがある場合は、以下の手順で本サンプルアプリケーションを含んだユーザランドイメージファイルを作ることもできます。ユーザランドイメージファイルをフラッシュメモリに書き込む方法については、「Armadillo-400シリーズ ソフトウェアマニュアル」を参照してください。
[atde3]$ ls
atmark-dist-[version] ht3035
[atde3]$ cd ht3035
[atde3]$ make ROOTDIR=../atmark-dist-[version] romfs
[atde3]$ cd ../atmark-dist-[version]
[atde3]$ make image
4. サンプルアプリケーションの実行
サンプルアプリケーションの書式は以下に示す通りです。
書式: ht3035 軸オプション 速度カーブオプション [オプション]
オプションのうち、制御する軸を指定する「軸オプション」と、速度カーブを 指定する「速度カーブオプション」の指定は必須です。「速度カーブオプショ ン」では、設定可能な、定速/直線加減速/完全S字加減速の全てでドライブ速 度を指定する"-v"オプションと、初速度を指定する"-i"オプションの指定は必 須です。
軸オプション
制御する軸を指定します。同時に複数の軸を指定することが可能です。
-x X軸を制御します。
-y Y軸を制御します。
-z Z軸を制御します。
-u U軸を制御します。
速度カーブオプション
速度カーブを決定します。軸指定オプションで指定した軸に対してのみ有効
です。
-v, --velocity=NUM
NUMに(PPS)単位でドライブ速度を指定します。-aや-sオプションを
指定しなかった場合定速ドライブとなります。定速ドライブの場合
は初速度よりも大きな値を設定する必要があります。設定可能な値
は、1から4000000ですが設定値によっては誤差が生じる可能性があ
ります。
-i, --initial-speed=NUM
NUMに(PPS)単位で初速度を指定します。-aや-sオプションを指定し
なかった場合定速ドライブとなります。定速ドライブの場合はドラ
イブ速度よりも小さな値を設定する必要があります。設定可能な値
は、1から4000000ですが設定値によっては誤差が生じる可能性があ
ります。
-a, --acceleration=NUM
NUMに(PPS/SEC)単位で加速度を指定します。このオプションを指定
し、-s オプションを指定しなかった場合、直線加減速ドライブとな
ります。初速度をドライブ速度以下に設定することはできません。
定量ドライブ時の減速度にもこの値が使用されます。設定可能な値
は、125から500000000ですが設定値によっては誤差が生じる可能性
があります。
-s, --s-curve
このオプションを指定した場合、完全S字加減速ドライブとなります。
このオプションを指定する場合は、"-a"、"-i"、"-v"が指定されて
いる必要があります。初速度をドライブ速度以下に設定することは
できません。
その他のオプション
-p, --pulse=NUM
NUMに出力パルス数を指定します(デフォルトは0)。設定可能な値は、
0から268435455です。NUMに1以上の値を指定した場合は定量ドライ
ブになります。NUMに0を指定した場合は連続ドライブになり、
Ctrl-cを押下するまでドライブを停止しません。軸オプションと速
度カーブオプションが適切に設定されている必要があります。
-d, --debug
全ての軸の論理位置とドライブ開始からの経過時間を表示します。
ドライブが終了した時点で表示を終了します。軸オプションと速度
カーブオプションが適切に設定されている必要があります。
-h, --help
使用方法メッセージを出力してプログラムを終了します。このオプ
ションは単独で指定することができます。
コマンドの実行例は次のようになります。
定速ドライブ
定速ドライブでは、ドライブ開始から終了まで一定速度でドライブパスルを出 力します。980(PPS)で全軸をドライブする場合は以下のようにコマンドを実行 します。
[a460]$ ht3035 -xyzu -v 980 -i 980
直線加減速ドライブ
直線加減速ドライブでは、ドライブ開始の初速度からドライブ速度までを、一 時直線で加速します。全軸を初速度500(PPS)から、ドライブ速度15000(PPS)ま でを約0.3秒で加速する場合は以下のようにコマンドを実行します。
[a460]$ ht3035 -xyzu -v 15000 -i 500 -a 48333
加速が完了すると、15000(PPS)での定速ドライブになります。
以下では、加速度の計算方法を説明します。加速中の速度(v), 初速度(sv), 加速度(a)と、時刻(t)は以下の式を満します。
v = a * t + sv
上記より、加速度は以下のように求められます。
a = (v - sv) / t = (15000 - 500) / 0.3 = 48333
完全S字加減速ドライブ
完全S字加減速ドライブでは、ドライブ開始の初速度からドライブ速度まで加 速するまでの間、加速度が時間の経過と共に常に変化します。
全軸を初速度10(PPS)から、ドライブ速度40000(PPS)までを約0.4秒で完全S字 加速する場合は以下のようにコマンドを実行します。
[a460]$ ht3035 -xyzu -v 40000 -i 10 -a 200000 -s
加速が完了すると、40000(PPS)での定速ドライブになります。
以下では、加速度の計算方法を説明します(計算を簡略化するために、初速度 は0PPSとして計算します)。
この例で示す完全S字加速では、0秒時点での速度と加速度は0です。0.2秒まで の間に速度は半分の20000(PPC)まで二次曲線で、加速度はaまで一時直線で増 加します。その後、0.4秒までの間に速度は40000(PPS)まで二次曲線で増加、 加速度は0まで一時直線で減少します。
時刻、速度、加速度の関係は以下の表の通りです。
時刻(秒) | 速度(PPS) | 加速度(PPS/SEC) |
---|---|---|
0 | 0 | 0 |
0.2 | 20000 | a |
0.4 | 40000 | 0 |
加速度は一時直線で増減するため、速度(v), 加速度(a)と、時刻(t)は以下の式を満します。
v = 0.5 * a * t
上記より、加速度は以下のように求められます。
a = 2 * v / t = 2 * 20000 / 0.2 = 200000
論理位置の表示
-dオプションを使用すると、全軸の論理位置と、ドライブ開始からの経過時間 を表示を表示することができます。「軸オプション」で指定した軸のみドラ イブ開始時に論理位置がクリアされます。
[a460]$ ht3035 -z -v 10000 -i 1000 -a 200000 -s -d
Press Ctrl-c to stop display debug message.
--- time --- ---- X ---- ---- Y ---- ---- Z ---- ---- U ----
0.010115 747 747 11 747
0.020385 747 747 23 747
0.030714 747 747 36 747
0.041031 747 747 53 747
0.051358 747 747 75 747
0.061672 747 747 101 747
0.071986 747 747 135 747
0.082303 747 747 176 747
0.092617 747 747 225 747
0.102929 747 747 284 747
0.113239 747 747 353 747
0.123551 747 747 429 747