ゼミのお話/ロボット工学者養成所/一覧/シリアル通信によるデバイス制御/サーボ駆動プログラム作成

2018-04-16 (月) 15:53:00 (840d)

概要

  • armadillo300のシリアルデバイス経由でプログラムによりサーボを動作させる.ここで,armadillo300のシリアルデバイスに接続する機器として以下のものがある.
    • armadillo300のシリアルデバイス
      • 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レベルの信号の変換処理を行う機器である.
    • サーボモータ
      • 物体の位置などを制御量として目標値に追従するように自動で作動するモータ.
  • 各デバイスの接続は図1のようになる
connection_servocontroller.png
  • 図1 各デバイス接続図

実験前準備等

準備・確認

  • 全ての電源が入っていることを確認
  • TeraTerm?でarmadillo300にログインできていることを確認
  • 演習用のディレクトリを作成し,そのディレクトリに移動していることを確認
    • 演習後は消すこと
    • 演習用ディレクトリにて,プログラムファイルを作成し,コンパイル,実行を行うこと.
    • コンパイル例:プログラムファイル:sample.c, 実行ファイル:sample
      • gcc sample.c -o sample
    • 実行
      • ./sample

AGB65-RSC簡易使用方法

  • 以下のように配列を定義して値を代入する.
    • 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命令値とサーボ角度の関係について

  • 命令値は0から255まで.
  • 命令値に対するサーボの可動角は「だいたい」0°から180°まで.(0°の位置はサーボによる.)

プログラミング演習

  • 下記のプログラムを作成,実行してサーボの制御について学ぶ.

対話的サーボ制御プログラム

  • 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);
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:}

対話的メータ表示プログラム

  • お題のプログラムを考え,作成してみよう

お題

  • 数値を入力するとメーター上の対応する値を指すようにサーボモータを制御するプログラムを作成する
    • ポイント:メーター上の数値に合うように入力値を変換する必要がある.

参考情報

AGB65-RSC命令仕様

  • マスタ(Armadillo-300)からRSCへの指示は,4〜17バイトの数値データで送る.
  • バイトサイズ(8ビット)なので,表される数値は0〜255の256種類.
  • 数値は10進数.
  • 注)データは文字データではなく,数値(バイナリ)データで送る.
  • データの基本形
    • データの基本形は次の通り.[ ]内は1バイトを表す.()内は送りえる数値の範囲.
[シンクロバイト(255)] [ID(0-3)] [送信バイト数(1-14)] [命令1] [命令2] [命令3] ...
シンクロバイトRSCにデータの通信開始を知らせるデータで,常に「255」で始まる.
IDRSCに設定された固有のID(AGB65シリーズを複数接続したときの判別用.RSCの場合,出荷時のIDは「3」.)
送信バイト数送信される命令の(バイト)数.シンクロバイト,ID,送信バイト数は数えない.
命令RSCに動作させたい命令.詳細は以下の表.
  • 命令の説明
命令値動作方向フォーマット
全サーボ駆動送信[255][ID][長(14)][命令(1)][P0][P1]...[P10][P11][Speed]
個別サーボ駆動送信[255][ID][長(4)][命令(2)][サーボ番号][サーボ位置][Speed]
全サーボパルス停止送信[255][ID][長(1)][命令(3)]
指定サーボパルス停止送信[255][ID][長(2)][命令(4)][サーボ番号]
180°モード送信[255][ID][長(1)][命令(5)]
255解像度モード(default)送信[255][ID][長(1)][命令(6)]
(*)[Speed]は指定したサーボ位置までにかかる時間.[Speed]×15ms.