- ランプの中身(Ruby on Railsのシステム開発)
- ランプの中身(Ruby on Railsのシステム開発)では、株式会社ケイビーエムジェイのRuby on Railsエンジニアが蓄積したノウハウを公開しています。Ruby on Railに関する技術解説や実践的なノウハウなど、開発現場の技術に則したコンテンツを随時追加していきます。 初心者の方でもわかりやすい技術解説を心がけています。リクエスト、ご質問も受け付けいますので、ご気軽にコメントを記述して下さい。
< ケータイWebサイト... | メイン | Rubyを使ってPaSoRi経由でSui... >
遠隔地のチョロQ(キューステア)をUSTREAM.TVのストリーミングビデオで見ながら、Webブラウザ上でのキーボード操作で操縦できるWebアプリを作ってみました。以下、その仕組みについて詳しく解説していきます。

チョロQ(キューステア)操縦Webアプリの動画
動作している様子と仕組みの概要については、以下の動画を見るのがてっとりばやいかも。
http://jp.youtube.com/watch?v=-n3XV6GGdWY
http://www.nicovideo.jp/watch/sm2432398
チョロQ(キューステア)Webアプリ概要図

ustream.tv
ustream.tv
WebカメラとWebブラウザだけで動画配信できてしまうWebサービスです。今回はこのサービスを動画中継に使用しました。
Gainer
GAINER.ccUSBと電子部品の橋渡しをしてくれるI/Oモジュール。FlashやRubyなどから電子部品を簡単に扱えるようになります。今回はミニリレーの制御に使用しています。
Gainerについては以下のショップで購入すると良いかもしれません。
使用方法については、以下の書籍が非常に参考になります。
ミニリレー
電磁石を用いて電気的にスイッチをON/OFFする部品。今回は赤外線リモコンの制御に使用しています。チョロQ(キューステア)
チョロQ(キューステア)付属の赤外線リモコンで制御できるチョロQ(キューステア)。今回はこれを操縦します。
Amazonでも購入することができます。
Webアプリ動作環境
動作環境は MacOSX 10.5 ですが、rubyとgainerの接続ができれば、他のOSでも動作すると思います。
チョロQ(キューステア)-Gainer接続の参考書籍
GainerとチョロQ(キューステア)の接続方法については下記の書籍が詳しいです。
Rails config/environments/development.rb
以下、ソースについて解説していきます。
config/environments/development.rb あたりの最後に以下のような記述を追加してください。
$gainer = Gainer::Serial.new('/dev/cu.usbserial-A2002mcq')
$gainer.digital_output = 0xf
sleep(1)
$gainer.digital_output = 0
sleep(1)
Rails app/controllers/top_controller.rb
class TopController < ApplicationController
def frontleft
$gainer.digital_output[0] = false
$gainer.digital_output[1] = true
$gainer.digital_output[2] = false
$gainer.digital_output[3] = true
end
def front
$gainer.digital_output[0] = false
$gainer.digital_output[1] = true
$gainer.digital_output[2] = true
$gainer.digital_output[3] = true
end
def frontright
$gainer.digital_output[0] = false
$gainer.digital_output[1] = true
$gainer.digital_output[2] = true
$gainer.digital_output[3] = false
end
def stop
$gainer.digital_output[0] = true
$gainer.digital_output[1] = true
$gainer.digital_output[2] = false
$gainer.digital_output[3] = false
end
def backleft
$gainer.digital_output[0] = true
$gainer.digital_output[1] = false
$gainer.digital_output[2] = false
$gainer.digital_output[3] = true
end
def back
$gainer.digital_output[0] = true
$gainer.digital_output[1] = false
$gainer.digital_output[2] = true
$gainer.digital_output[3] = true
end
def backright
$gainer.digital_output[0] = true
$gainer.digital_output[1] = false
$gainer.digital_output[2] = true
$gainer.digital_output[3] = false
end
end
difital_output[0] = true などとすることで、gainerのデジタル出力を操作することができます。
Rails app/views/top/index.rhtml
<script type="text/javascript">
function keyput(event){
switch(event.keyCode){
case 81: key_q(); break;
case 87: key_w(); break;
case 69: key_e(); break;
case 90: key_z(); break;
case 88: key_x(); break;
case 67: key_c(); break;
}
}
function key_q(){
new Ajax.Request('/top/frontleft', {asynchronous:true, evalScripts:true, parameters:'authenticity_token='
+ encodeURIComponent('5c2a0299f9f219731bb72866e9831ce211999fad')}); return false;
}
function key_w(){
new Ajax.Request('/top/front', {asynchronous:true, evalScripts:true, parameters:'authenticity_token=' + enc
odeURIComponent('5c2a0299f9f219731bb72866e9831ce211999fad')}); return false;
}
function key_e(){
new Ajax.Request('/top/frontright', {asynchronous:true, evalScripts:true, parameters:'authenticity_token=
' + encodeURIComponent('5c2a0299f9f219731bb72866e9831ce211999fad')}); return false;
}
function key_z(){
new Ajax.Request('/top/backleft', {asynchronous:true, evalScripts:true, parameters:'authenticity_token='
+ encodeURIComponent('5c2a0299f9f219731bb72866e9831ce211999fad')}); return false;
}
function key_x(){
new Ajax.Request('/top/back', {asynchronous:true, evalScripts:true, parameters:'authenticity_token=' + en
codeURIComponent('5c2a0299f9f219731bb72866e9831ce211999fad')}); return false;
}
function key_c(){
new Ajax.Request('/top/backright', {asynchronous:true, evalScripts:true, parameters:'authenticity_token='
+ encodeURIComponent('5c2a0299f9f219731bb72866e9831ce211999fad')}); return false;
}
function keyputup(event){
new Ajax.Request('/top/stop', {asynchronous:true, evalScripts:true, parameters:'authenticity_token=' + enc
odeURIComponent('5c2a0299f9f219731bb72866e9831ce211999fad')}); return false;
}
document.onkeydown=keyput;
document.onkeyup=keyputup;
</script>
</head>
<body>
<embed width="416" height="340" flashvars="autoplay=true" src="http://ustream.tv/SxQwT0VkmQeydBJKd2fj1pniqS2xUiuz.us
c" type="application/x-shockwave-flash" allowfullscreen="true" />
<embed width="563" height="266" type="application/x-shockwave-flash" flashvars="channel=#gainer&server=chat1.ustream
.tv" pluginspage="http://www.adobe.com/go/getflashplayer" src="http://ustream.tv/IrcClient.swf" allowfullscreen="tru
e" />
<hr>
<table>
<tr>
<td><%= link_to_remote("left", :url => { :action => "frontleft" }) %></td>
<td><%= link_to_remote("front", :url => { :action => "front" }) %></td>
<td><%= link_to_remote("right", :url => { :action => "frontright" }) %></td>
</tr>
<tr>
<td><%= link_to_remote("left", :url => { :action => "backleft" }) %></td>
<td><%= link_to_remote("back", :url => { :action => "back" }) %></td>
<td><%= link_to_remote("right", :url => { :action => "backright" }) %></td>
</tr>
</table>
</body>
</html>
JavaScriptでキーイベントを取得して、AJAXでサーバー側にリクエストを飛ばしています。なのでustreamによる映像配信がページ遷移で途絶えることはありません。
Railsのlink_to_remote()を用いたリンクも用意しています。
USB -> Gainer -> ミニリレー -> 赤外線リモコン 回路
回路については先ほどの書籍と、以下の写真を参考にしてみて下さい。使用しているリレーは941H-2C-5Dというもの。
秋葉原の秋月電子にて1個100円で購入しました。
ミニリレー -> チョロQ(キューステア)赤外線リモコン
リモコン側については以下のようにハンダ付けしています。

キーボード -> JavaScript -> AJAXの様子をFireBugで確認
FireBugを使うと、AJAXによるリクエストの様子が見れます。
AJAX -> Rails をログで確認
操縦中のサーバー側のログについては、こんな感じ。
チョロQ(キューステア) with JavaScript, AJAX, Rails, Gainer, Webカメラ, and USTREAM.TV まとめ
以上、WebブラウザでチョロQ(キューステア)を操縦する仕組みをGainerとRailsを使用して作ってみました。この仕組みを使えば、色々と楽しそうなことができそうですね。
他にも面白いネタを考えています。次回もお楽しみに!
トラックバック URL
トラックバック一覧
≫ 遠隔地のチョロQを操縦する方法 with JavaScript, AJAX, Rails, Gainer, Webカメラ, and USTREAM.TV
おお、おもしろい。同じ会社にこんなハッカーがおるとは。すげぇ、びっくりだ。 ついでに、Remote Control Wrapperを使ってApple Remote経由でチョロQが動かせると楽しいかも... [続きを読む] posted from すめるまん Broken Diary 2008.03.05 01:07この記事にコメントする
TOPICS
2008/06/25
「ZD Net Builder」の連載記事です。第四回は「Rubyでどう書く?:重複したRSSをまとめる」が掲載されました。
2008/05/30
「ZD Net Builder」の連載記事です。第三回は「Rubyでどう書く?:Rubyで特定URLの画像パス一覧を表示する」が掲載されました。
2008/05/07
「ZD Net Builder」に連載を始めました。第二回は「Rubyでどう書く?:RubyでPDF履歴書を作成する」が掲載されました。
2008/04/24
「アットマーク・アイティ」に『 Rubyを使ってPaSoRi経由でSuicaの乗車履歴を取得し、GoogleMapsやGoogleEarthで表示する』が掲載されました。
RoR最新ブログ一覧
カテゴリ
全体のRoR最新ブログ一覧
- Cybozuのスケジュールをmobileme経由でiPhone 3Gに取り込む
- 今週のRuby on Rails最新情報
- Rubyでどう書く?:RubyでWord文書を作成する
- タニタさんの「からだカルテ」を使ってみました
- iPhoneを確保しました
- Edge Railsの最新情報
- Rubyのセキュリティ脆弱性
- mysqlでレコードの中身を一括置換する方法
- 同じappでDBを使い分ける
- Rubyでどう書く?:重複したRSSをまとめる
- TABLEに直接データを入れる便利な方法
- 社内SNSをiPhoneで快適に見るためのCSSを書いてみた
- phpmyadminをセキュアにアクセスする方法
- Rubyプログラムの組み方から、Exeファイルの作成まで
- Ruby、Railsインストール for MacOSX
- will_paginageを使ってみた
- dmgファイルの作り方
- PHP携帯電話の機種情報取得
- Rubyでどう書く?:Rubyで特定URLの画像パス一覧を表示する
- リファラでアクセス制限をしてみた。
- 奇妙な演算子
- RJSを用いて、日付プルダウンメニューを書き換える (2
- railsの実行モードの設定 RAILS_ENV
- postgresでのユーザ権限付与(psql, grant)
- ドロップダウンに簡単にオートコンプリート機能を追加する方法
- Vimの自動補完
- IE6 以前で float に指定した margin が 2 倍になる現象を解消する
- サーバ監視ソフトウェア「ganglia」を使ってみる
- 監視ツールcactiについて
- Rubyでどう書く?:RubyでPDF履歴書を作成する
- グラフを作ってみるか!?
- clearfixでfloat解除
- SELinux無効にしてみる
- Rubyのソースコードから HTML Helpを生成してみよう!
- IEでダイジェスト認証をかけるとエラーになった。
- muninのインストール 〜監視ツールって〜
- Rubyでどう書く?:連続した数列を範囲形式にまとめたい
- RJSを用いて、日付プルダウンメニューを書き換える
- Passenger (mod_rails for apache)での色んな設定値について調べてみた
- docomo の罠
- ローカルで動画変換をする方法
- MacOSにpostgreSQL 8.3をインストール
- Postgres8_3⇔8_1の性能比較してみました
- rake db:migrate すると undefined method `last' for {}:Hash と出る
- ケータイWebサイトに携わっている方へ
- MySQL最大バッファサイズの設定
- railsのand/orを使った機能
- Railsライクなフレームワーク「CakePHP」②
- エラー表示で意図しない改行を解消する−fieldWithErrors、ActionView::Base、field_error_proc
- [mysqlのベンチマーク]MyBenchの設定
- Rubyのコマンドライン引数と環境変数について(初心者向け)
- Rubyを使ってPaSoRi経由でSuicaの乗車履歴を取得し、GoogleMapsやGoogleEarthで表示する
- 簡単&便利 Capistranoのススメ (導入編)
- Rails的コメントアウト
- 使えるvalidate一覧
- せっかくなので、Thin を使って実践
- Xenを用いてCentOS上に仮想CentOSを2つインストールする
- aptanaでrailsをデバッグ実行する
- empty?とblank?の違いって?
- ローカルでコマンドを打つとアスタリスクで囲まれたエラーが出る
- rubyの便利ツールirbをカスタマイズしてみた
- 実行モード "environment"設定の基本
- RadRails(Aptana)のショートカット
- JRubyを触ってみた
- mongrelとの戦い〜503エラー?mongrelが死んだってことさ…
- sshでrootログインの禁止
- database.ymlの設定方法
- Railsライクなフレームワーク「CakePHP」①
- Rails導入でRuby標準クラスへ追加される関数達(String編)
- Rubyのマニュアルを手軽に参照する方法
- railsで画像などファイルをアップロードする方法
- 遠隔地のチョロQを操縦する方法 with JavaScript, AJAX, Rails, Gainer, Webカメラ, and USTREAM.TV
- Ruby on Railsで作られたradMineのカスタマイズ1 ~インストール編~
- MacBook AirのレビューとLet's noteとの比較
- Rails プラグイン : CSS Graphsの使い方(そしてちょっとだけ改造)
- Railsの開発でscreenを使う理由
- ActiveRecordのconditionsを綺麗に書くTips2つ
- [Rails 2.0]起動時のファイルの読み込みの順番がわかった!
- RailsのActionMailer(Tmail)でドットの連続などのRFC違反している携帯メールアドレスに対応する
- スパムを消して消して、もう消しまくって こうなりました。
- Ruby on Railsでacts_as_paranoidを使い倒す
- fastladderをrailroadで図を作ってみる。
- [書評] 他言語開発経験者でも、初心者でも、本屋で「チラ見」して確認してみよう
- ヘルパーメソッド
- Ruby標準csv遅い
- Linux2.6系の脆弱性でroot権限奪ってみた
- railsで開発したダイエットサイトとそのソースコード
- fastladderを試してみました ~rails2.0~
- HeartBeatの設定
- Railsの手動インストール
- Railsで「Lost connection to MySQL server during query」に遭遇した場合の対策
- RadiantCMSのインストール(2)
- Linuxとかのbashで使えるショートカットキーをまとめた一覧
- 長い文字列をカットして表示するプログラム
- SLこまんどの設定
- Rails プラグイン : Rails Widgets >Tabnavの使い方
- Scaffoldはどこからくるの? 後編
- ローカルメールサーバーでRailsでのメール受信のテストを便利に
- HTMLエスケープ
- aptanaのインストールと使い方について
- railroadを用いたER図作成
- RailsでAmazon APIを利用する
- ちょっとしたスペルミスなどで、時間を無駄にした経験があるなら ( カラー表示で編集しやすく )
- ちょー入門、Webサーバ構築で知ってて損をしない用語(2)
- Ruby on Rails ってなになに?
- 最近!流行りの、「Ruby」 知ってますか?
- RubyGems って単語よく出てきますよね?
- CentOS5とaptanaを使ったWindows開発環境 1
- gemコマンドの紹介
- ちょー入門、Webサーバ構築で知ってて損をしない用語(1)
- こんな人がこのブログを書いて・・・
- RadiantCMSのインストール(1)
- RubyでActiveRecordを使わないでDBに接続する方法
- Railsのキャッシュ機能を用いて動的ページを静的ページにする方法を紹介
- Rails 2.0のセキュリティ面の変更点
- DRBDのインストール
- Rails プラグイン : ColumnCommentsの使い方
- Scaffoldはどこからくるの? 前編
- RMagickの使い方
- Ruby on Rails インストール for Windows
ssatoのアーカイブ
プロフィール
- ssato
- 佐藤伸吾(akio0911)です。2008/01からWeb業界に入りました。フィジカルコンピューティングやユビキタスコンピューティングに興味があります。




