環境
・Ubuntu18.04
・Arduino Mega 2560
単純なLチカ
Arduino側の実装
Linuxから送られてきたデータ(コマンド)を読み込みます。
'o'で点灯。
'p'で消灯。
void setup(){ pinMode(LED_BUILTIN, OUTPUT); // シリアルポートを9600 bps[ビット/秒]で初期化 Serial.begin(9600); } // 繰り返し処理 void loop(){ int inputchar; // シリアルポートより1文字読み込む inputchar = Serial.read(); if(inputchar != -1 ){ // 読み込んだデータが -1 以外の場合 以下の処理を行う switch(inputchar){ case 'o': // 読み込みデータが o の場合 Serial.print("LED ON\n"); digitalWrite(LED_BUILTIN, HIGH); break; case 'p': // 読み込みデータが p の場合 Serial.print("LED OFF\n"); digitalWrite(LED_BUILTIN, LOW); break; } } else { // 読み込むデータが無い場合は何もしない } }
Arduino IDEを使用し、上記スケッチをArduinoへ書き込みます。
Linux側の実装
Cで実装します。
(Arduino IDE付属のシリアルモニタでもコマンドを送信できます。)
<main.c>
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <termios.h> #include <unistd.h> #define SERIAL_PORT "/dev/ttyACM0" //Arduinoのシリアル通信用deviceファイル名 int main(int argc, char *argv[]) { unsigned char buf[255]; int fd; struct termios tio; int baudRate = B9600; int i; int len; int ret; int size; fd = open(SERIAL_PORT, O_RDWR); if (fd < 0) { printf("open error\n"); return -1; } tio.c_cflag += CREAD; // 受信有効 tio.c_cflag += CLOCAL; // ローカルライン(モデム制御なし) tio.c_cflag += CS8; // データビット:8bit tio.c_cflag += 0; // ストップビット:1bit tio.c_cflag += 0; // パリティ:None cfsetispeed( &tio, baudRate ); cfsetospeed( &tio, baudRate ); cfmakeraw(&tio); // RAWモード tcsetattr( fd, TCSANOW, &tio ); // デバイスに設定を行う ioctl(fd, TCSETS, &tio); // ポートの設定を有効にする // 送信処理ループ while(1) { // ターミナルで入力を待つ。 printf("o/p?>"); fgets(buf, 255, stdin); write(fd, buf, sizeof(buf)); if(buf[0] == 'q') break; } close(fd); // デバイスのクローズ return 0; }
実行
ターミナル上で、上記のmain.cをコンパイルして実行します。
$ gcc main.c -o main $ ./main # 点灯 o/p?>o # 消灯 o/p?>p # quit o/p?>q
参考
Linux のシリアル通信において termios 構造体で設定可能なパラメータをまとめる (C/C++) - siar