Node-SerialPort使って温度センサーの値を読み取る
最近ArduinoとかRaspberry Piとかに興味を持ちだしました。
フィジカルコンピューティングって分野になるっぽいです。
それで取っ掛かりとしてArduinoから電子工作に入門して、
入門書も半分くらい実践してみたところで
Node.jsとArduinoを連携させてみようと思います。
環境について
- MacOSX10.7
- Node.js v0.10.5
- Arduino Uno rev3
Node-SerialPort
Node.jsでシリアル通信できるモジュールです。
voodootikigod/node-serialport · GitHub
ArduinoのIDEでも
Arduino本体 - USB - シリアルモニター
といった感じでデータの取得ができましたが、それを
Arduino本体 - USB - Node.js
で出来るようにするモジュールっぽいです。
とりあえずReadmeに書いてある最低限な部分を試してみます。
温度センサーの値をシリアルポートに出力する(Arduino側)
ほぼ入門書のコードのままです。
下記のスケッチをArduinoIDE立ちあげて
Arduinoに転送しましょう。
※回路図とかは書きません。
#define LM35_IN 0 void setup() { Serial.begin(9600); } void loop() { int temp_in; float temp; temp_in = analogRead(LM35_IN); temp = (float)(temp_in) * (float)(0.0048) * (float)100; Serial.print(temp, DEC); Serial.print("\n"); delay(1000); }
これを実行するとシリアルモニターではこんな感じの値が出力されます。
23.5200023651 23.5200023651 23.5200023651 23.5200023651 23.5200023651
1秒毎に23.5度くらいって数値が出力されてます。
これをNode.js側で読み取りたいわけです。
Node-SerialPort使って読み取る(Node.js側)
実際に読み取ってみます。
とりあえずディレクトリ作ってモジュールを入れます。
$ cd path/to/workspace $ npm install serialport ... (インストール) $ touch app.js
app.jsの中に下記のコードを書く。
var serialport = require("serialport"); var SerialPort = serialport.SerialPort; var sp = new SerialPort("/dev/tty.usbmodem641", { // ここのパスは適宜変更する baudrate: 9600, parser: serialport.parsers.readline("\n") // 1行毎にパースする }, false); sp.open(function () { console.log('open'); sp.on('data', function(data) { console.log('data received: ' + data); }); sp.write("ls\n", function(err, results) { console.log('err ' + err); console.log('results ' + results); }); });
追記できたら実行してみます。
$ node app.js open err undefined results 3 data received: 23.5200023651 data received: 23.5200023651
それっぽい値が取れるようになりました。