yutaponのブログ

javascript界隈の興味あるネタを備忘録的に残しておく場所

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

それっぽい値が取れるようになりました。

おわりに

いろんなセンサーをArduinoに取り付けて、その値をNode.js側で受け取ることができました。
これで現在の室温をTwitterでつぶやくとか簡単にできそうです。

しかし問題があって、今のままだとPCとArduinoがUSB接続されていないといけません。
この解決方法として、

  1. PCをRaspberry Piとかつかって超小型化する
  2. Arduino用イーサネットシールド買ってLANに繋ぐ

が思いつきますが、イーサネットシールドってArduino本体よりも高いんですよね。

ということでそのうちRaspberry Piもいじっていきたいです。