Raspberry PiでArduinoが入ったのでnode-serialportと連携してみるメモ

Raspberry PiでArduinoが入ったのでnode-serialportと連携してみるメモです。littleBitsのArduinoモジュールにお馴染みの左右レバーをつけて値を取得してみます。
node-serialportをグローバルにインストール
npm install -g serialport
任意のフォルダにnode作業場を作る
今回はデスクトップに作成しました。
mkdir ~/Desktop/test-serialport
移動します。
cd ~/Desktop/test-serialport
serialportをリンクして使えるようにします。このあたりはローカルにインストールしてもいいかもしれませんが、今回はこれで。
npm link serialport
このようなログが出ます。
> serialport@1.6.3 install /home/pi/Desktop/serialport2/node_modules/serialport
> node-pre-gyp install --fallback-to-build
[serialport] Success: "/usr/local/node/lib/node_modules/serialport/build/serialport/v1.6.3/Release/node-v11-linux-arm/serialport.node" already installed
Run pass --build-from-source to compile
/home/pi/Desktop/serialport2/node_modules/serialport -> /usr/local/node/lib/node_modules/serialport
こちらでいうリンクとはnode_moduleにシンボリックリンク(ショートカット)が生成される形でグローバルと関連付けがされるようです。
シリアルポートの名前はRaspberry PiのArduinoから調べておきます
Arduinoコード
Arduinoは以下のように書きました。
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
if(sensorValue>0){
Serial.println(sensorValue);
}
delay(1);
}
Nodeコード
直下にapp.jsとしてNodeを書きます。Arduinoが吐き出すSerial.println(sensorValue)の値をnode-serialportが受け取る仕組みです。
こちらの記事にあるコード参考にしました。
node-serialportを使ってNode.jsでArduinoと通信する - 人と技術のマッシュアップ
というかほぼ同じですが、よりシンプルに値を出しています。
var serialport = require('serialport');
// Serial Port
var portName = '/dev/ttyACM0';
var sp = new serialport.SerialPort(portName, {
baudRate: 9600,
dataBits: 8,
parity: 'none',
stopBits: 1,
flowControl: false,
parser: serialport.parsers.readline("\n")
});
// data from Serial port
sp.on('data', function(input) {
var buffer = new Buffer(input, 'utf8');
var sensorValue;
try {
sensorValue = JSON.parse(buffer);
console.log('input: ' + sensorValue);
} catch(e) {
return;
}
});
動かしてみる
nodeで先ほどのapp.jsを実行してみます。
node app.js
ミニモニターに画面いっぱいにコンソールを出して表示しています。
無事動きました!
おわりに
いかがでしたでしょうか。
Windowsで連携するとVisual Studioを入れたりPythonを入れたりと手間がかかった印象ですが、Raspberry Pi(Linux)はすんなり動かすことが出来ました。Arduinoまわりの検証もRaspberry Piで独立させるのも手かもしれないですね。
Nodeで連携ができると受け取った値をexpressやsocket.ioと連携して効率よくネットワークに載せることができるので夢が広がります!
それではよきArduino & Raspberry Pi & littleBits Lifeを!