入出力を整えた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を!