2012年11月25日日曜日

Maker Faire Tokyo 2012に出展してきます

Maker Faire Tokyo 2012

12月1日(土)・2日(日)に台場の科学未来館にて開催されるMaker Faire Tokyo 2012に、Node.jsを利用したハードウェアを持って出展してきます。

WebブラウザとArduinoでつくるオシロスコープ

Arduinoで電圧を読み、Webブラウザに表示させるオシロスコープを展示・実演します。どんな端末でも表示できる強みをアピールしたいところですが、会場内の無線LANは不安定になりそうなのでスタンドアローンでの実演です。

光るネクタイ

LED電飾を埋め込んだネクタイも展示します。ネクタイの裏にいるArduinoとMacをつなぐZigBeeは無線LANと同じ周波数帯なので、こちらも当日うまく動いてくれるか心配なところ。当日の実演はiPhoneシミュレータを使う予定です。

テーブル配置を確認したところ、ぼくの背中側にはガンガンにキラキラしている方がいらっしゃるようです。負けないようにがんばります。

2012年11月24日土曜日

2012年も東京Node学園祭に行ってきたよ

東京Node学園祭、昨年に続いて参加してきました。しかも今年はLT登壇者として。まさかこんな日が来るとはね。

おもしろハードウェアが増えた

手前みそでございますが、自分の興味ある話に注目しちゃいますよね。去年は、Yahoo!の路線バス追跡と、LTのKinectの2本。今年はリクルートさんの脳波でデバイスをコントロールする話を筆頭に、LTがぼくを含めて3本。いずれもNode.jsをハブとしていろいろな機器・機械を制御するという内容でしたが、Node.jsとその周辺機器とのつなぎ方、動作のトリガーがそれぞれ違っているので、そんなこともできるのか!と思ってもらえれば幸いです。

できるだけ話す側にまわったほうがよい

LT枠にて、「光るネクタイをNode.js経由で制御」という発表をしたのですが、これによって「ああ、あいつね」となりいろいろ話しかけてもらえました。外国の方(すみません名前を聞かなかったです)からjohnny-fiveというArduino制御モジュールを教えてもらったりなど、「他人の発表を聞いて学ぶ」だけじゃなく「自分よりも詳しい人からアドバイスをもらえる」という経験ができました。

知識の増え方が加速するので、「来年こそは」と思った方はぜひ。こういった形で循環が進んでいくといいですね。そして、こんな素敵な経験ができたのは運営の皆様のおかげです。ありがとうございます。

2012年11月4日日曜日

iPhoneとArduinoを、XBeeとNode.jsでつなぐ。その2。

東京Node学園祭2012 アドベントカレンダーの21日目ぶんになります。ひとつまえの記事にて、Node.jsとXBee ZBを使ったiPhone〜Arduinoの無線制御について書きました。このときからのアップデートについてまとめます。

XBeeをAPIモードでつかう

前回の内容では、XBeeを透過モードで使っていました。ここをAPIモードにかえています。これによってXBeeボードに搭載されているAD変換のモニタリングなどが使えるようになる一方、きちんとパケットを組み立てなければならなくなっています。透過モードではシリアルポートに値を入れれば、それがネットワーク内のすべてのXBeeにそのままの値で飛ばされるので、周辺のコードを書く分には楽なのです。が、特定のモジュールにだけ飛ばすとか、XBeeボードのちょっと便利な機能を利用できないという弱点があるのです。

XBeeボードの詳細については、オライリー・ジャパンから出版されているXBeeで作るワイヤレスセンサーネットワークを参照ください。

node-xbeeを使う

Node.js〜XBee〜Arduinoとなりますが、Node.jsとXBeeの間はnode-xbeeという便利なモジュールを使っています。基本的にシリアルポートを経由しての通信はかわらないのですが、0x7Eのパケットの節目ごとに切り取ってくれたり、パケットの中身をオブジェクトに分解してくれたり、送信時には逆にパケット長やパリティを付加してくれたりなど、よきに計らってくれる機能を実装しています。

全体の構成

DaiNagoya_v4.010

APIモードのAD変換機能を、基板上の電源電圧の監視につかっています。XBeeでAD変換の後Node.jsに投げて、WebSocket経由でiPhoneへ飛んでいく部分。ここはオシロスコープの経験を流用しています。ソースコードについてはgithubをごらんください。動かしている様子はこちら。

iPhoneとXBee/Arduinoが直接つながっているように見せたくて、Node.jsの動いているMacは画面の外にしてしまいました。LEDが全部点灯すると引き込まれる電流が増えるため、エネループが電圧降下をおこしている様子がiPhone上のグラフから読めると思います。

さいごに

2011年の東京Node学園祭より。Node.jsという名前の由来について、「グラフ理論のノードが由来。今はまだNode.jsをノードとしたノードは少ないけど,これからそれらがどんどん多くなるのを期待している」とRyan氏。いままでつなげることが難しかったデバイス同士を、Node.jsがノードとなってつなげている例と言ってもよいのではないでしょうか。

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という素敵な友人がいて本当によかった。少しずつ、外の人を巻き込み始めてるじゃん。やるじゃん。

2012年8月31日金曜日

Node.jsとHTML5でつくるオシロスコープ

EventMachine版から半年、Node.jsとWebブラウザでオシロスコープをつくるしくみをまとめます。

処理の流れ

内部の動きを順に並べると、次のようになります。

Arduino

  1. Arduinoのmillis()で時間を読み出す
  2. analogRead()で電圧を読み取る。
  3. "時間,電圧"のように、カンマで区切った文字列を、シリアル通信で送る。

Node.js

  1. Socket.IOでWebSocketサーバをたてる
  2. シリアルポートを監視
  3. シリアルポートにArduinoからデータが来たら、WebSocketでブラウザに送る。

ブラウザ

  1. Socket.IOでWebSocketサーバにつなぐ
  2. WebSocket経由で時間・電圧の文字列を受けたら配列に保存
  3. Canvasを使い、配列からグラフを描画する。
  4. グラフの描画を定期的に繰り返すことで、アニメーションにする。

が、オシロスコープの簡単な流れ。Arduinoで取得した電圧の読み値が若干の遠回りをしているので、微妙に遅れて表示されてしまうのが弱点。

ソースはgithubに載せています。が、もっと汎用性を高めないと。うちの環境の痕跡が若干残っています。課題です。

2012年8月27日月曜日

Make: Ogaki Meeting 2012に出展してきました

8月最後の土日、岐阜県は大垣市で開催されたMake: Ogaki Meeting 2012に個人で出展してきました。

Make: Ogaki Meetingってなんぞ

目にみえる、触れる作品をつくって発表する場なのです。電気回路を利用した作品が多いのだけど、編み物や木工などもあり、自分でつくって楽しんでいるものならみんなで持ち寄って楽しもうという感覚です。個人・団体も関係なければ、仕事も趣味も区別なしといった様相。Makeの動き・取り組みなどの詳細は、オライリー・ジャパンのサイトを参照ください。

こういった集まりはいつも東京開催が主だったのですが、大垣市に拠点を置くIAMAS/情報科学芸術大学院大学を中心に大垣市・岐阜県が力をあわせて、地方開催を行なってくれています。今回は2010年の初開催に続いて2回目。

オシロスコープと光るネクタイを持ち込んで

自分でつくって自慢をしてきました。写真を残していなかったので、Twitterに載せてくれていたものを拝借しています。感謝。

オシロスコープについて。Arduinoで読み取った電圧を、Webブラウザに表示するというだけのもの。電圧の発生源に距離と振動の各センサをつかったので、自分の動きが違う形で見えるってところが特にお子様連れにウケまして。仕組みはわからないけど動くから面白い、みたいな状態になってくれたのはうれしい限り。

ぼくよりもわかる方も当然いらっしゃるわけですが、そういう方ほどぼくの気づいてない指摘・知恵なんかを渡してくれるのです。こうなりたいと思わせる方ばかり。

このオシロスコープ、バックエンドはNode.jsが支えています。Node.js meets Arduinoな展示を行なっている方がちらほらいて、この方向は間違ってなかったなと安心しました。イベント駆動プログラミングとハードウェアは相性が良いと言い続けていてよかったです。

もうひとつ。LEDがチカチカ光るネクタイ。意外にも女性(と女性にみえる男性)から圧倒的支持(感覚的に)をいただきました。「その光っているネクタイかわいいですね!」とか声をかけてくれたりして、"ついに!やってきた!おれの人生の!好景気!"なんて、モテキだったら気分上々ばりにうかれたりもしました。

このネクタイの元ネタはクラフトワークのステージ衣装なのですが、これを一発でわかった方があしやまひろこさん。さすがはLEDエンベデッドなウェディングドレスを展示・着用してらっしゃったかた。このドレスがすごかった。設計はくとのさんなのですが、見た目はもちろん、複数段のヒューズなど安全対策の回路の作り込みも素晴らしい作品です。いろいろ事情があったとのことですが、ぼくら趣味で遊んでいる者が手を抜きがちな地味な部分、表に出ない部分まで作っているのは見習わなければなりません。

反省点

もう少しディスプレイに力を入れるべき。展示物についてとか、動かし方とか、紙などに出力した上で展示しておけばよかったです。ひとりのブースなので、ぼくがいなくなると誰も説明しなくなるということを考えていなかったです。紙なら電源を必要としないので、いろいろな心配をしなくてよいし。

もうひとつ。やはり見せ方なのですが、どうしてもこじんまりしてしまうので、スペースの使い方をうまくかんがえないといけないです。結局は、つくるのは楽しいが、そこで終わりじゃダメってこと。どうやってうまく人に伝えるかを考えないといけませんと学びました。

12月には東京でまた開催されるそう。反省を生かして、もっとおもしろがってもらえるようがんばります。