arduinode(旧名:Node-Arduino-General-IO) v0.0.6を公開しました。
続きはWebで↓
今回のアップデートで大きな機能が追加されました。
その名は”Stream API"!!
node.jsのstreamと名前が被ってて紛らわしくてごめんなさい。
こいつを使うと、Arduinoが自動的にデータを送信してくれます。
詳細を説明する前に、背景を説明します。
今まで、Arduinoのポートの値を読み出すときは、読み出す度にAPIを操作していました。
アナログ値を読む場合なら上の様な感じで
デジタル値を読むなら下の様な感じでした。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// AI0の値の読み込み | |
arduinode.analogRead(0, function(err, reuslt){ | |
if(err) throw err; | |
console.log(result); | |
// {"msg":"OK", "port":0, "val":200} | |
}); | |
//DI2の値の読み込み | |
arduinode.digitalRead(2, function(err, result){ | |
if(err) throw err; | |
console.log(result); | |
// {"msg":"OK", "port":2, "val":0} | |
}); |
Arduinoとnode.jsのやり取りを図示するとこんな感じです。
毎回リクエストを出していて面倒くさいですね。
ここで実際にArduinoを活用するシーンを考えてみます。
Arduinoにセンサーなどを繋げた場合は”特定のポートを一定間隔(例えば100msec)で読み出し続けたい”という使い方をすることが多いと思います。
そういう場合に、node.js側でsetTimeout()を使って一定間隔でArduinoに指示を出しても良いのですが、なんか面倒くさいです。
そこでStream APIの出番です。
こいつは以下のように指定したポートを指定した間隔(msec)で値を読み取るという感じで指示が出せます。
下の例だとD0ポートを500msec周期で読み取るという具合です。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var port = 0; | |
var interval = 500; // 500[ms] | |
arduinode.digitalStreamOn(port, interval, function(err, result){ | |
if(err) throw err; | |
console.log(result); | |
// {"msg":"OK", "port":0, "val":1} | |
}); | |
// data event. | |
arduinode.on("event", function(data){ | |
console.log(data); | |
}); |
後はArduinoが勝手に時間を計り、読み込んだポートの値をnode.js側に送信してくれます。
node.js側では"event"というイベントが発行されるので、そいつを捕まえて、よしなに処理すれば良いことになります(上のコード参照)。
図示するとこんな感じです。
いちいちリクエストを出さなくて良いので、大変簡単・簡潔ですね。
実際の使い方はAPIのドキュメントがあるので、そちらを参照して下さい。
また、当然のことながら過去のAPIとの併用も可能です。
AというポートはStream APIで、Bというポートは今までのAPIでというアクセスも可能ですし、Stream APIで使っているAというポートに対して、今までのAPIで値を読み込むことも可能です。
更に今回のアップデートに伴って、サンプルプロジェクトも更新しました。
今まではnode.jsからArduinoに対してポーリングしていましたが、Stream APIを使って書き直しました。
これによってArduinoからnode.jsにデータがStream APIでpushされ、更にnode.jsからブラウザにWeb Socketを使ってpushするという大変ハイテクな仕様になりました。
他にもこちらに置いてあるテストコードのうち"stream_test.js"や"heatrun.js"がStream APIを使ったテストコードになっています。
Stream APIの参考用に合わせてご活用下さい。
また、試験的ではありますがArduino Mega (ADK)にも対応しています。
最初の一回目の通信に失敗するという不具合を孕んでいますが、調査中です。
正式にサポートしているのは今のところArduino Unoのみになります。
そんなこんなで、Arduinoとnode.jsで通信したいとお考えの方は是非ともご活用下さい。
0 件のコメント:
コメントを投稿