Help us understand the problem. What is going on with this article?

ArduinoとNode.jsでシリアル通信で文字列を送受信するスクリプト

More than 3 years have passed since last update.

低価格なArduino互換機などを使って、サーバーのステータスを電光掲示板やLEDで表したいとか、逆にArduinoの光センサや温度センサの値をサーバーで処理したいってことはよくあるんじゃないかと思います。

その際に、毎回用意するのがUSBを利用したシリアル通信で文字列を送受信する実装です。よく使うのでテンプレートを用意しておきました。

sifue/arduino-serial-js

コードは、以上のリポジトリに置いてあります。

git cloneして、npm install。 serialport をそのまま使っています。

Node.js のコードは、

'use strict';

// シリアルポートに定期的に書き込んではデータを受け取る
// パーストークンは \n
// 1秒おき送信

const SerialPort = require('serialport');
const port = new SerialPort('/dev/cu.usbmodem14141', {
  parser: SerialPort.parsers.readline('\n'),
  baudrate: 9600
});

port.on('open', function () {
  console.log('Serial open.');
  setInterval(write, 1000, 'OK\n');
});

port.on('data', function (data) {
  console.log('Data: ' + data);
});

function write(data) {
    console.log('Write: ' + data);
    port.write(new Buffer(data), function(err, results) {
      if(err) {
        console.log('Err: ' + err);
        console.log('Results: ' + results);
      }
  });
}

こんな感じ。writeメソッドを1000ミリ秒ごとに定期実行してます。ここでは、パーストークンを\nにして、1秒おきに送受信。レートやシリアルポートのパスはArduino IDEとか見つつ適宜書き換えて下さい。

Arduinoのコードは、

#define LED  13
int recieveByte = 0;
String bufferStr = "";
String okStr = "OK";

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

// シリアルポートに定期的に書き込んではデータを受け取る
// パーストークンは \n
// OK を受け取ったら 13 LED点灯、それ以外を受け取ったら削除
// 1秒おきループ

void loop() {
  bufferStr = "";
  while (Serial.available() > 0) {
    recieveByte = Serial.read();
    if (recieveByte == (int)'\n') break;
    bufferStr.concat((char)recieveByte);
  }

  // 受け取ったデータがあるなら送りかえしてスイッチ操作
  if (bufferStr.length() > 0) {
    Serial.print("I received: "); 
    Serial.println(bufferStr);
    if (okStr.compareTo(bufferStr) == 0) {
      digitalWrite(LED, HIGH);
    } else {
      digitalWrite(LED, LOW);
    }
  }

  delay(1000);
}

こんな感じでとりあえず13ピンのLEDの反応だけ書いて、受け取ったものを\nでパースしてそのまま返す感じ。それを1秒おきループで実装。これをコンパイルして送信。

これで、

~/w/arduino_serial_js $ node index.js
Serial open.
Write: OK

Data: I received: OK
Write: OK

Data: I received: OK
Write: OK

こんな感じにArudinoとNode.jsを動かしているマシンでシリアル通信して、文字列をやり取りするようにできます。LEDも送っている文字列がOKならば光ります。これをひな形にいろいろおもしろいもの作っていきましょう。

sifue
N高等学校でプログラミングを教えているプログラマーで、学園のIT担当。「高校生からはじめる プログラミング」著者 ( https://www.amazon.co.jp/dp/4046019557/ ) 。 言語: Scala/JavaScript/Java ゲーム: LoL/フォトナ/クラロワ
https://www.soichiro.org/
dwango
Born in the net, Connected by the net.
https://dwango.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした