入出力を整えたlittleBits ArduinoモジュールとNodeJS(node-serialport)で連携するメモ
入出力を整えたlittleBits Arduinoモジュールで出来上がったのでNodeJS(node-serialport)で連携してみます。
NodeJS側は以前培ったものを生かしつつ、なるべくシンプルに連携してみます。
目指すところ
- 前回の記事で入出力を整えたlittleBits ArduinoモジュールとNodeJS(node-serialport)で連携
- littleBitsの入力はボタン1を押すことで入力1が反応する。
- NodeJSでconsole.log('/input/1')を出力する。
- littleBitsの出力はURLで /output/1 と叩くとNodeJSがlittleBits出力1に伝える。
- littleBits出力1に3秒間100%の出力が行くのでLED1が光る。
- (3秒間100%の出力はArduino自体に書き込んだプログラムの挙動)
Arduinoモジュール機能おさらい
前回の記事のArduinoモジュールはこのようになっています。
入力は以下のようになっており、node-serialportで待っていると値が来ます。
出力は以下のようになっており、node-serialportからも同様に文字列を送れば反応します。
もろもろ調べてみる
Arduino(シリアルポート)から入力1がくるとNodeJSが反応する
以前の記事、Raspberry PiでArduinoが入ったのでnode-serialportと連携してみるメモをベースに今回は1~3の値が来るので以下のように書きます。
// Serial Port ///////////////////////////////
var serialport = require('serialport');
var portName = 'COM3'; // Win環境
var sp = new serialport.SerialPort(portName, {
baudRate: 9600,
dataBits: 8,
parity: 'none',
stopBits: 1,
flowControl: false,
parser: serialport.parsers.readline("\n")
});
// シリアルポートからの入力
sp.on('data', function(input) {
var buffer = new Buffer(input, 'utf8');
try {
console.log('serialport buffer: ' + buffer);
if( buffer == 1 ){
// /input/1
console.log('/input/1');
} else if( buffer == 2 ){
// /input/2
console.log('/input/2');
} else if( buffer == 3 ){
// /input/3
console.log('/input/3');
}
} catch(e) {
return;
}
});
URLで /output/1 と叩くとNodeJSがlittleBits出力1に伝える
出力1へ送る場合は sp.write を使います。文字列1~3を待っているので合わせます。
// 出力1を反応させる
app.get('/output/1', function(req, res){
res.send("/output/1");
console.log("/output/1");
sp.write('1',function(err,results){
console.log('sp.write');
console.log(err);
console.log(results);
})
});
出力2・出力3も同様に書きます。
実際のコード
// Serial Port ///////////////////////////////
var serialport = require('serialport');
var portName = 'COM3'; // Win環境
var sp = new serialport.SerialPort(portName, {
baudRate: 9600,
dataBits: 8,
parity: 'none',
stopBits: 1,
flowControl: false,
parser: serialport.parsers.readline("\n")
});
// シリアルポートからの入力
sp.on('data', function(input) {
var buffer = new Buffer(input, 'utf8');
try {
console.log('serialport buffer: ' + buffer);
if( buffer == 1 ){
// /input/1
console.log('/input/1');
} else if( buffer == 2 ){
// /input/2
console.log('/input/2');
} else if( buffer == 3 ){
// /input/3
console.log('/input/3');
}
} catch(e) {
return;
}
});
// Server /////////////////////////////////
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.set('port', (process.env.PORT || 5000));
app.use(express.static(__dirname + '/public'));
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.listen(app.get('port'), function() {
console.log("Node app is running at localhost:" + app.get('port'));
});
// 出力1を反応させる
app.get('/output/1', function(req, res){
res.send("/output/1");
console.log("/output/1");
sp.write('1',function(err,results){
console.log('sp.write');
console.log(err);
console.log(results);
})
});
// 出力2を反応させる
app.get('/output/2', function(req, res){
res.send("/output/2");
console.log("/output/2");
sp.write('2',function(err,results){
console.log('sp.write');
console.log(err);
console.log(results);
})
});
// 出力3を反応させる
app.get('/output/3', function(req, res){
res.send("/output/3");
console.log("/output/3");
sp.write('3',function(err,results){
console.log('sp.write');
console.log(err);
console.log(results);
})
});
// root
app.get('/', function(req, res){
res.send("Hello World!!");
console.log("/");
});
実際に試してみる
Arduinoを差し込みしたのを確認してから、サーバーを立ち上げます。
node littlebits.js
入力
ボタンを押すと、
NodeJSで1が押されたことで、以下のコードのconsole.logが反応します。
console.log('serialport buffer: ' + buffer);
if( buffer == 1 ){
// /input/1
console.log('/input/1');
ログとしてはこのように出ます。
仕組みとしてはこのようになります。
出力
URLで /output/1 と叩くと
以下のコードでデータを送ります。第一引数が送る値で、第二引数は完了後のイベントです。
sp.write('2',function(err,results){
console.log('sp.write');
console.log(err);
console.log(results);
})
ログとしてはこのように出ます。
3行目のundefinedはerr変数。つまりエラーが起きた時に出力されるようです(未だ出会ったことない)。4行目の1はresults変数から出されたもので、おそらく成功の1を意味するようです。(1以外を見たことがない)
以下のようにLEDがつきます。
仕組みとしてはこのようになります。
おわりに
うまくいきました。
それでは、よきNodeJS & Arduino & littleBis Lifeを!








