沼津高専 電子制御工学科
MIRSMG3D 制御プログラム取扱説明書
MIRSMG3D-MTCB-0007
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2009.3.20 片瀬 内堀 初版


目次






1.はじめに

このドキュメントは、モータ制御ボードをコントロールするに当たってのデバイスドライバへのアクセスの仕方を述べるものである。



2.サンプルプログラム

ここではサンプルプログラムを交えながら解説するので適宜参照すること。
モータ制御ボードのコントロールはデバイスファイルを介して行われる。



2.1 デバイスのオープン

main()関数の中でデバイスをオープンしている。
デバイスをオープンすることで通信を行うことができるようになる。

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>

    #define FNAME "/dev/mirS1"

    int fd;
    // モータとの通信用デバイスを開く.
    fd = open(FNAME, O_RDWR);
    if ( fd < 0 ) {
      perror("Open");
      return -1;
    }

なお、二行目からのif文はデバイスのオープンに失敗した際のエラー処理である。



2.2 通信

モータ制御ボードと通信を行う際のプロトコルをTable 1に示す。

Table 1 通信プロトコル
コマンド名 送信データ 受信データ 動作・備考
コマンド データ1 データ2 データ3 応答 データ1 データ2 データ3
クリア
0x00 - - - 0x80 - - - 総回転角度をクリアする。

制御パラメータ設定
0x01 目標速度 Kp Ki 0x81 - - - 制御パラメータを変更する。
速度[回転角/周期]
モータパラメータ取得
0x02 - - - 0x82 現在速度 PWM 総回転角度 モータパラメータを取得する
速度[回転角/周期]、回転角度[deg]
スタート
0x04 - - - 0x84 - - - ストップ状態を解除する。

ストップ
0x08 - - - 0x08 - - - ストップ状態へ移行する。

制御周期変更
0x20 カウンタ初期値
(下位)
カウンタ初期値
(上位)
- 0xA0 - - - Timer割込みの周期を変更する。
NCK
上記以外 - - - 0x4X - - - 不正応答
(Negative Acknowledgment)


次の例は、制御パラメータを設定するパケットを生成するものである。
	#define MG3_MOTOR_PKT_PING  	0x00
	#define MG3_MOTOR_PKT_SETCTL	0x01
	#define MG3_MOTOR_PKT_GETST 	0x02
	#define MG3_MOTOR_PKT_START 	0x04
	#define MG3_MOTOR_PKT_STOP  	0x08
	#define MG3_MOTOR_PKT_PERIOD  	0x20
	#define MG3_MOTOR_PKT_ACK   	0x80

	// PI制御用の各ゲイン
	#define KP 30
	#define KI 5

	struct {
		uint8_t command;
		uint8_t spped;
		uint8_t kp;
		uint8_t ki;
	} request = {MG3_MOTOR_PKT_SETCTL, 18, KP, KI};
この作成されたパケットを用いて通信する際の手順を解説する。

motor_request()関数を参照すると何やら幾つか書かれているが、この中で重要なのは次に挙げる3つである。

    void *req = &request;
    size_t req_len = sizeof(request);

    // リクエストを送信する.
    err = write(fd, req, req_len);
    if ( err < 0 ) {
      return err;
    }

    // 返答を受信する.
    err = read(fd, res, res_len);
    if ( err < 0 ) {
      return err;
    }

    // 返答がACKであるか確認する.
    if ( *(uint8_t *)res != (*(uint8_t *)req | MG3_MOTOR_PKT_ACK) ) {
      errno = EBADRQC; // 不正なリクエストコード
      return -1;
    }

write()によって制御ボードに対するリクエストを送信し、read()によって制御ボードからの応答を受信する。
最後に応答パケットの先頭データが正しい応答(MG3_MOTOR_PKT_SETCTL | MG3_MOTOR_PKT_ACK)になっているかを確認する。



2.3 デバイスのクローズ

入口と出口をちゃんとするからこそ秩序が生まれ…という話はさておき、開いたものは必ず閉じなければ成らない。
コレを怠ってはならない。どうせ一行で終わるので面倒くさいなどと思わないこと。

    close(fd);



3.おわりに

基本的にデバイスファイルを用いるといっても、ファイルに入出力するのと同様に扱うことができる。
通信する際には、決められたパケットを用いなければならない。
なお詳細はサンプルプログラムを参照して下さい。
この文書が制御プログラムを作成する際の参考になれば幸いである。



関連文書