はじめに
最近ラズパイとArduinoでシリアル通信をしてArduinoからモータに信号を出したり、Arduinoに繋いだセンサの値をラズパイで処理したりしています。なんだかんだで安定動作させるまで時間がかかったのでメモしておきます。ちなみに初投稿です。
使用環境・ライブラリ
Raspberry Pi3 modelB+
・node.jsを使用。シリアルポートの制御にNode Serialportというnodeモジュールを使用
Arduino UNO
いつもながらのCっぽい専用言語。
ラズパイ側
serialTest.js
var SerialPort = require('serialport');
var port = new SerialPort('/dev/ttyACM0');
var flag = false;
/*Arduinoからの応答を受け取るdataイベントを登録*/
port.on('data',function(data){
/*Arduinoを初期化する時、そのシリアルポートが準備されているか確認*/
if(data.readInt8(0) == -1){
flag = true;
console.log("ready");
}
/*不正な値を検出して停止*/
else if(data.readInt8(0) == -2){
flag = false;
console.log("abnormal stop");
}
});
/*以降、flagを用いて処理を分ける。シリアルポートへの書き込みにはport.write(data)を使う*/
Arduino側
serialTest.c
byte dataAry[n];
void setup() {
Serial.begin(9600);
//シリアルポートの準備ができるまで待機
while(!Serial){}
//準備完了時に-1を送信
Serial.write(-1);
}
void loop() {}
//シリアルポートにデータがある時呼び出される。
void serialEvent(){
while(Serial.available()){
//dataAryの先頭nバイトにシリアルからのデータが読み込まれる。
Serial.readBytes(dataAry,n);
}
}
ラズパイ側からシリアルポートを開く命令が届いてからArduinoの準備ができるまで、ラズパイからデータが届かないように注意しましょう。