2012年10月18日木曜日

Node.jsとXBeeの助けを借りて、iPhoneからArduinoを動かす

iPhoneからArduinoを動かしたいとき、iPhoneには自作の外部ハードウェアをほとんどつなげられないことが障壁になります。そこで頼りになるのがご存知Node.js。iPhoneからNode.jsへはWebSocketを使い、Node.jsからArduinoへはnode-serialportを使います。今回はArduinoも無線の先におきたかったので、Node.js→シリアル通信→XBee→Arduinoといった形をとっています。最終的にiPhoneからArduinoのLED点滅パターンを変えてみます。

全体の流れ

  • iPhone
    Node.jsの提供するWebSocketサーバに接続。制御コマンド(アルファベット1文字+数字1文字)を送る。制御コマンドはアルファベット1文字+数字1文字で、自分で勝手にきめたもの。
  • Node.js
    WebSocketサーバを立てて、iPhoneからのコマンドを受信。node-serialportを通してXBeeモジュールに送る。
  • XBee
    透過モード。Node.jsが投げた文字をそのままもう一方のXBeeモジュールへ投げるだけ。
  • Arduino
    XBeeモジュールとはシリアル通信で接続。読み取ったコマンドをもとに、LEDを光らせる。

Arduino側

IMG_0800

XBeeで作るワイヤレスセンサーネットワークを参考に、ArduinoとXBeeモジュールとをシリアルで接続しています。XBeeのパケットからコマンドをよみとり、それに合わせてLEDの点滅パターンを変えています。

Node.js側

var express = require('express')
  , app = express()
  , server = require('http').createServer(app)
  , io = require('socket.io').listen(server);

server.listen(3000);

app.configure(function(){
 app.use(express.static('static'));
 app.use(express.logger());
 app.use(express.bodyParser());
});

app.get('/', function(req, res){
 // index.html に、iPhoneで表示するボタンやスライダーを配置
 res.sendfile(__dirname + '/index.html');
});

// シリアルポートの準備
var serialport = require('serialport');
var SerialPort = serialport.SerialPort;
var sp = new SerialPort('/dev/tty.usbserial-AE01CQBA', {
 parser: serialport.parsers.readline('\r\n')
});

io.sockets.on('connection', function(socket){
 // iPhoneからWebSocketのパケットが来たら……
 socket.on('value', function(data) {
  // 書き込みデータをつくって
  var xbeewrite = [data.state.charCodeAt(0), Math.pow(2,data.value)-1];
  // XBeeに送信
  sp.write(xbeewrite);
 });
});

WebSocketサーバ+Webサーバ。Webサーバは、WebSocketを送るためのインタフェースを出すだけ。ボタンやスライダーで、iPhoneから制御しやすくするためです。

WebSocketを受け取ったあとは、node-serialportのWriteを使ってXBeeへ送ります。配列に入れているのは、write関数の実装によるもの。.lengthを参照できるものでないとダメなので、文字列or配列ならOKだけど、整数や数値1つはダメ。1バイトだけ送るときも[かっこ]でくくって配列にしないとダメなのです。

最後にデモ動画を

2012年10月6日土曜日

ITコミュニティで発表するようになって変わったこと

カルカルのITコミュニティ秋祭りに知っている人が2人も出ていたので、触発されてぼくの経験を書いておこう。

そのまえに、ぼくのお仕事について。名古屋から少し離れた田舎で、ハードウェアの設計と評価をしています。コードをお仕事で触ることといえば、マイコンの中に書き込むソフトウェアを少しいじる程度。まったくITとは関係のないお仕事で、IT的なことと言えば仕事以外の時間にWebアプリやArduinoをつかったおもちゃを作っているくらい。学生のころからPerlはちょいちょい触っていまして、IT屋さんの採用面接にiPhone(当時は3Gが出た直後)で動くWebアプリを持ち出したりなどしていましたが。

最初に参加したコミュニティ

昨年…と思ったら一昨年でした。2010年8月開催の「名古屋でPerlをゆるく語る会」の2回目。2010年に今の会社に入ってからすぐに、この環境に居続けたくないなーと思い始めまして。IT勉強会カレンダーで名古屋の勉強会を探していたらそんな名前の勉強会(?)が。「ゆるいならいいかなー」くらいの気持ちで出ていって、Nagoya.pmが立ち上がるまでぽつぽつ顔を出していました。「名古屋でPerlをゆるく語る会」は、今はなき栄のCafeどえりゃあ(電源・無線LANが使える)にて、ごはんを食べつつPCを持ち寄って文字通りゆるく語る場で、特に発表とかはないものでした。

最初の発表

最初の発表はNagoya.pmの第2回にて。MIDIシンセサイザーでHTMLをいじる発表をしたのが最初です。まだ1年経ってないんだねえ。

この発表の前にちょっと転機がありまして。2011年になってからかな。その場で常連参加者の@trinityCRZさんがしきりに「Node.jsはいい」と言っていたところからNode.jsを知り、Arduinoと組み合わせたりなどしていました(この辺の時系列はよく覚えていません)。ついカッとなって東京Node学園祭に行ったりもしました。Node学園祭の発表がすごかったと@do_akiくん(上記秋祭りの登壇者ですね)に話したところ、「すごいのはわかった。ところで君は何をやったの?」と。受けるだけじゃなくて、出していかないとと。この言葉はかなり響きました。で、先の発表につながっていったのです。みんなIT系の人っぽいから、ハードウェア屋さんってところを推していこうかなーという方向も、この頃から出てきていました。

やっぱり人生が変わってきてる

ちょっとかっこよく言うと、そんな感覚なのです。マジで。

特に東京Node学園 7時限目で、その他ちょこちょことブラウザで動くオシロスコープの発表をして、少しずつ人生が変わってきてるかなと。発表を聞いて面白がってもらえているという感覚がまず嬉しいし、発表を続けていって似たようなことをやっている人が他にもいるとわかることが自信と動力につながっていくのです。ぼくの場合は外での発表がお仕事でやっていることではないので、次々と新しい内容には出来ないけれど、自分が好きでやっていることを面白がってもらえるなんて嬉しいし盛り上がるし最高じゃないですか。

Node.js+ハードウェア(+Web)っていうIT屋さんがあまりやっていない分野に、ハードウェア屋の俺様がしゃしゃり出ていくというやり方。まだしばらく続けていこうと思います。ソフトも面白いけど、回路だって面白いぞという気持ちをこめて。あまりやってる人がいないから、埋もれないしね。

そして、@do_akiという素敵な友人がいて本当によかった。少しずつ、外の人を巻き込み始めてるじゃん。やるじゃん。