ふるお〜と!- FullAuto

AI・ロボットが普及しBI(ベーシックインカム)が早急に実現されることを願う元ニートのブログ

ふるお〜と!-FullAuto

LinuxとArduinoでLチカをしてみた

Linux PCとArduinoでLチカをしてみる。

環境

・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

続く nullpo24.hatenablog.com

参考

Linux のシリアル通信において termios 構造体で設定可能なパラメータをまとめる (C/C++) - siar