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


[[ゼミのお話/ロボット工学者養成所]]
--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:}