RubyとArduino(Gainer)ではじめるフィジカルコンピューティング(名古屋Ruby会議01)
名古屋Ruby会議で「RubyとArduinoで始めるフィジカルコンピューティング」というテーマでLTを行いました。ここでは発表のデモのうち、「はてなスターがついたらパトライト点灯」のリベンジと、解説を行いたいと思います。なお、Arduinoが故障した都合で、このデモはGainerで行いました。
僕のブクマにスターをつけるとパトランプつきますよ。(連続、同一箇所だとWebHookが飛びません。連続で遊びたいときは別の場所にスターをつけて下さい。)
http://www.ustream.tv/channel/toyosystem
10/14 デモ終了しました
概要

上記の図がすべてです
(1)誰かが僕のはてなブックマークにスターをつける
(2)はてなWebHookというはてなの機能で、指定URLにPOSTリクエストが送られる
(3)webrick+sinatraのスクリプトがデータを受け取り、dRubyサーバにキューを送る
(4)Gainerを操るRubyはdRubyで待機(take)しているので、データを受け取りパト点灯
という流れになっています。以下順を追って説明します。
(1)(2)はてスタが付、WebHook起動
はてなブックマークの設定のデータ管理というところで行えます。
(3)webrick+sinatraのスクリプトがデータを受け取り、rinda(dRuby)にキューを送る
初めてsinatraを使ったのですが、簡潔さに驚いた。なんと必要なコードは以下だけ
-
require 'rubygems'
-
require 'sinatra'
-
require 'drb/drb'
-
-
post '/' do
-
DRb.start_service
-
$ts = DRbObject.new_with_uri('druby://:12345')
-
$ts.write(['data',params[:username].to_s.untaint])
-
end
dRubyサーバ
こっちも簡単すぎて泣けるっていうか、irb上で動いていました
-
irb>require 'drb/drb'
-
irb>require 'rinda/tuplespace'
-
irb>$ts = Rinda::TupleSpace.new
-
irb>DRb.start_service('druby://:12345', $ts)
-
rb>DRb.thread.join
(4)データを受け取りパト点灯
-
require 'drb/drb'
-
require 'funnel'
-
include Funnel
-
-
DRb.start_service
-
$ts = DRbObject.new_with_uri('druby://:12345')
-
gio = Gainer.new()
-
loop {
-
p $ts.take(["data", nil])
-
-
gio.aout(0).value = 1
-
sleep(5)
-
gio.aout(0).value = 0
-
}
まとめ
・dRuby+sinatra+Gainerは強力
・入門にはRuby+Arduinoは敷居が高いので、素直にArduino IDEを使うかGainerをオススメしたい
(導入でつまづくのってもったいないですからね)
・デモでスター付けてくれた人有難う!

