入出力を整えた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モジュールはこのようになっています。

littlebits-arduino-module-my-rule001

入力は以下のようになっており、node-serialportで待っていると値が来ます。

littlebits-arduino-module-my-rule010

出力は以下のようになっており、node-serialportからも同様に文字列を送れば反応します。

littlebits-arduino-module-my-rule009

もろもろ調べてみる

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

入力

ボタンを押すと、

littlebits-arduino-module-my-rule004

NodeJSで1が押されたことで、以下のコードのconsole.logが反応します。

console.log('serialport buffer: ' + buffer);
if( buffer == 1 ){
    // /input/1
    console.log('/input/1');

ログとしてはこのように出ます。

littlebits-arduino-node-serialport001

仕組みとしてはこのようになります。

littlebits-arduino-node-serialport002

出力

URLで /output/1 と叩くと

littlebits-arduino-node-serialport003

以下のコードでデータを送ります。第一引数が送る値で、第二引数は完了後のイベントです。

sp.write('2',function(err,results){
    console.log('sp.write');
    console.log(err);
    console.log(results);
})

ログとしてはこのように出ます。

littlebits-arduino-node-serialport004

3行目のundefinedはerr変数。つまりエラーが起きた時に出力されるようです(未だ出会ったことない)。4行目の1はresults変数から出されたもので、おそらく成功の1を意味するようです。(1以外を見たことがない)

以下のようにLEDがつきます。

littlebits-arduino-module-my-rule007

仕組みとしてはこのようになります。

littlebits-arduino-node-serialport006

おわりに

うまくいきました。

それでは、よきNodeJS & Arduino & littleBis Lifeを!