ゼミのお話/アルマジロゼミ/Linux組み込みボードでのサーボの取り扱い の変更点


#contents
----
*概要 [#la6605f3]
-Linux組み込みボードのシリアルデバイス経由でプログラムによりサーボを動作させる.ここで,Linux組み込みボードのシリアルデバイスに接続する機器として以下のものがある.
--Linux組み込みボードのシリアルデバイス
---RS-232Cレベルの信号を扱うシリアルデバイスである.具体的には,-15V〜15Vの範囲を扱い,論理0が+3V〜+15V,論理1が-15V〜-3Vである.
--AGB65-RSC
---シリアルポート経由で受けた指令を元にサーボを制御する機器である.この機器が扱うシリアルデバイスはTTLレベル信号であり,論理0が0V,論理1が5Vである.
--AGB65-232C
---RS-232Cレベルの信号とTTLレベルの信号には電圧互換がないため,変換処理が必要となる.AGB65-232CはRS-232Cレベルの信号とTTLレベルの信号の変換処理を行う機器である.
--サーボモータ
---物体の位置などを制御量として目標値に追従するように自動で作動するモータ.

*準備 [#t1cbbb8a]
**接続 [#r7a7ad46]
+Armadillo-300とAGB65-232Cを接続する.(接続ケーブル:ピンソケット-3ピン2mmピッチコネクタ)
+AGB65-232CとAGB65-RSCを接続する.(接続ケーブル:付属の4ピンケーブル・電源ケーブル)
+AGB65-RSCのHVピンをジャンパピンで短絡させる.
+サーボを接続する.
+サーボ用電源にバッテリーを接続する.

#ref(connection_servocontroller.png,,67%);
--図 サーボ接続図

-Armadillo-300とAGB65-RSCのシリアル信号は電圧レベルが違うため,電圧変換のためにAGB65-232Cを使用する.~
--Armadillo-300は232Cレベル
--AGB65-RSCはTTLレベル

#ref(DSC_0280.jpg,zoom,320x160)
--図 部品配置

#ref(DSC_0281.jpg,zoom,320x160)
--図 部品接続

*プログラム1 [#qb576910]
**AGB65-RSC の簡単な使い方 [#q311f4a9]
-以下のように配列を定義して値を代入する.
-- unsigned char output[7] = {255,3,4,2,0,127,20};
|シンクロバイト(255)|RSCにデータの通信開始を知らせるデータで,常に「255」で始まる.|
|ID(3)|RSCに設定された固有のID(AGB65シリーズを複数接続したときの判別用.RSCの場合,出荷時のIDは「3」.)|
|送信バイト数(4)|送信される命令の(バイト)数.シンクロバイト,ID,送信バイト数は数えない.|
|命令1(2)|個別サーボ駆動設定|
|命令2(0)|サーボ番号.0はRSC基板上のP0に対応|
|命令3(127)|角度(min:0,max:255で,絶対位置を指定)|
|命令4(2)|指定した角度まで移動する速度(x15ms)|
-この配列をシリアル送信する.


**AGB65-RSCへの命令値とサーボ角度の関係について [#jd3c1bf8]
-命令値は0から255まで.
-命令値に対するサーボの可動角は0°から180°まで.(0°の位置はサーボによる.)

**対話的サーボ制御プログラムの作成 [#j1764aef]
-下記のプログラムを入力
#ref(servo_control.c)

--0から255までの値を入力すると、その値に応じてサーボモータの角度が変わる.
--0-255以外の値を入力するとプログラムは終了する.

 01:#include <sys/types.h>
 02:#include <sys/stat.h>
 03:#include <sys/ioctl.h>
 04:#include <fcntl.h>
 05:#include <termios.h>
 06:#include <unistd.h>
 07:#include <stdio.h>
 08:#include <stdlib.h>
 09:#include <string.h>
 10:
 11:#define SERIAL_PORT     "/dev/ttyAM1"
 12:
 13:int main(){
 14:  int fd;
 15:  fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY);s
 15:  fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY);
 16:  if(fd < 0){
 17:    printf("%s doesn't open it\n",SERIAL_PORT);
 18:    return -1;
 19:  }
 20:
 21:  struct termios oldtio, newtio;
 22:  tcgetattr(fd, &oldtio);
 23:  newtio = oldtio;
 24:
 25:  /* 通信方式の設定・非カノニカル入力処理選択 */
 26:  newtio.c_iflag = IGNPAR;
 27:  newtio.c_lflag = 0;
 28:
 29:  /* read関数での文字待ちうけの設定 */
 30:  newtio.c_cc[VTIME] = 0; /* 値x0.1秒待つ */
 31:  newtio.c_cc[VMIN] = 1; /* 値の文字分だけ入力されるまで待つ*/
 32:
 33:  /* 通信速度の設定 */
 34:  cfsetspeed(&newtio, B9600);
 35:
 36:  /* シリアルデバイス初期化処理 */
 37:  tcflush(fd, TCIFLUSH);
 38:  tcsetattr(fd, TCSANOW, &newtio);
 39:
 40:  /* サーボ指令の雛形 */
 41:  /* 個別サーボ駆動モード, サーボコントローラID:3, サーボ番号:0 */
 42:  unsigned char output[7] = {255,3,4,2,0,127,20};
 43:
 44:  /* input(入力):サーボへの角度指令:有効範囲0(0°)-255(180°) */
 45:  /* 入力が有効範囲内の間,サーボをコントロール */
 46:  int input;
 47:  while(1){
 48:    printf("input value from 0 to 255[-1:end]:");
 49:    scanf("%d", &input);
 50:    if(input < 0 || input > 255){ /* サーボコントロール終了 */
 51:      break;
 52:    }
 53:    /* output[5]がサーボへの角度指令 */
 54:    output[5] = (unsigned char)input;
 55:    write(fd, output, sizeof(output));
 56:  }
 57:
 58:  /* シリアルデバイス終了処理 */
 59:  tcsetattr(fd, TCSANOW, &oldtio);
 60:  close(fd);
 61:  return 0;
 62:}

*プログラム2 [#ga8d55fc]
**お題 [#qfaaae8a]
-数値を入力するとメーター上の対応する値を指すようにサーボモータを制御するプログラムの作成
--メーターに合うように値を変換する必要がある.

*参考 [#x0d86e92]
**AGB65-RSC 命令仕様 [#sab072e6]
-マスタ(Armadillo-300)からRSCへの指示は,4〜17バイトの数値データで送る.
-バイトサイズ(8ビット)なので,表される数値は0〜255の256種類.
-数値は10進数.~
-&color(red){注)データは文字データではなく,数値(バイナリ)データで送る.};

***基本形 [#u771de03]
-データの基本形は次の通り.[ ]内は1バイトを表す.()内は送りえる数値の範囲.

 [シンクロバイト(255)] [ID(0-3)] [送信バイト数(1-14)] [命令1] [命令2] [命令3] ...
|シンクロバイト|RSCにデータの通信開始を知らせるデータで,常に「255」で始まる.|
|ID|RSCに設定された固有のID(AGB65シリーズを複数接続したときの判別用.RSCの場合,出荷時のIDは「3」.)|
|送信バイト数|送信される命令の(バイト)数.シンクロバイト,ID,送信バイト数は数えない.|
|命令|RSCに動作させたい命令.詳細は以下の表.|


***命令の説明 [#g6a71357]
|命令値|動作|方向|フォーマット|
|1|全サーボ駆動|送信|[255][ID][長(14)][命令(1)][P0][P1]...[P10][P11][Speed]|
|2|個別サーボ駆動|送信|[255][ID][長(4)][命令(2)][サーボ番号][サーボ位置][Speed]|
|3|全サーボパルス停止|送信|[255][ID][長(1)][命令(3)]|
|4|指定サーボパルス停止|送信|[255][ID][長(2)][命令(4)][サーボ番号]|
|5|180°モード|送信|[255][ID][長(1)][命令(5)]|
|6|255解像度モード(default)|送信|[255][ID][長(1)][命令(6)]|
CENTER:(*)[Speed]は指定したサーボ位置までにかかる時間.[Speed]×15ms.