- 2009-03-22 (日)
- 技術
前に胎児がTwitterにPostする? - kickbeeでBluetooth経由でお腹にいる赤ちゃんのキックをPostするというのを紹介したのですが、ためしにWiiのリモコンからやってみても面白いかも!ってことで試してみました。
最終的にはWiiリモコンの押したボタンをTwitterにPostするようにしてみます。
開発環境
まずは今回試した環境を以下に記載します。
- OS
- Mac OS X Leopard
- JDK
- 1.5以降
- BlueTooth
- 必須
- コントローラー
- 任天堂Wiiリモコン
JDKが1.5以降となっているのは、今回使ったライブラリが1.5以降を必須としているためです。
どうやって通信するの?
Wiiリモコンと会話するにはBlueToothが必須になります。
そしてBlueToothから来たパケットを処理してどのボタンが押されたのか、または今どの座標にいるかなどを取得する必要がありますが、そういった基本機能はすでにライブラリとして提供されています。
なのでまずは簡単にライブラリの説明をして、その後実際にコードを書いてみたいと思います。
BlueCove - JSR082 API
JSR082 APIというのはBlueToothにアクセスする基本的なインターフェースを提供してくれます。
そしてMacやPC用に作られたオープンソースなライブラリは、「BlueCove」になります。
以下からbluecove-2.1.0.jarをダウンロードしました。
Downloads - bluecove - Google Code
WIIREMOTEJ
WiiRemoteJはMac OS XとWiiリモコンを繋ぐインターフェースを提供してくれるライブラリです。
先ほどのJSR 82を使ってWiiリモコンを探し出し、細かいプロトコルの変換なども自動で行ってくれるすぐれたライブラリです。
以下からWiiRemoteJ v1.6.zip.gzをダウンロードしました。
Index of /WiiRemoteJ
WiiリモコンとMacを繋いでみる
ボクは今回Eclipseを使って開発を行いましたのでその手順を以下に記載します。
まずは上記2つのライブラリをプロジェクトにドラッグし、ビルドパスを通しておきます。
WIIREMOTEJをダウンロードすると付属してくるファイルの中から
- WRLImpl.java
- Audio.au
をプロジェクトに追加します。
WRLImpl.javaはWiiリモコンとの基本的な操作が書かれたサンプルで、この中に今回使うエッセンスがぎっしり詰まっています。
またAudio.auは40秒間のサウンドクリップになりますが、JavaからWiiリモコンに音を出すときに使います。
もし音は出さなくてもよいという人はプロジェクトに含めなくても大丈夫です。
そしてWRLImpl.javaを実行してみます。
BlueCove version 2.1.0 on mac
とコンソールに表示されると思います。
このタイミングでWiiリモコンの1ボタンと2ボタンを同時押しします。
するとWiiリモコンの4つのライトが点滅しますので、コンソールを見て少し待ちます。
少しするとコンソールにいろいろ出力されますが、
java.lang.IllegalStateException: Devices are already being found! Only one "find" operation may run at once.
と表示されいっこうにスタンバイ状態にならなかったので、ハマりましたw
調べてみると海外の人で同じ現象になってる人がいました。
WiiLi.org java.lang.IllegalArgumentException: PCM values restricted by
に書いてあったのですが、
をMainメソッドの一番初めて入れればうまく動きました。
これでまた先ほどと同様にWRLImpl.javaを実行し、Wiiリモコンの1ボタンと2ボタンを押してみます。
Javaが起動してから3秒後くらいにボタンを押すとエラーになりにくくなりますが、もしうまく接続できない場合は何度か試してみてください。(なかなか一発で繋がりません・・・)
エラー内容が、
Failed to connect remote. Trying again.
の場合は一回Java側を停止さえてもう一度起動したほうが早く繋がるようになると思います。
とりあえず遊んでみる!
繋がったらWiiリモコンを振ってみたり、各ボタンを押してみるとコンソールにその情報が表示されると思います。
この時点ですげ〜感動!!
振ると画面の表示もこの画像のようになると思います。
とりあえずこれでうまく繋がりました。
TwitterにPostしてみる
先ほどのWRLImpl.javaをサンプルにして、以下のコードを書いてみました。
WiiRemoteJ.findRemote()が実際にWiiリモコンを探し出すコードです。このメソッドを呼ぶだけでWiiリモコンと繋がるなんてめちゃくちゃ便利!
addWiiRemoteListenerにリスナーをセットし、buttonInputReceivedメソッドは、ボタンを押したら呼ばれる部分になります。
なので、この部分にどのボタンを押したかをTwitterにPostする処理を入れています。
TwitterにPostする処理はTwitter4Jを使わせていただきました。
結果:
ほとんど自分でコードを書かなくてもこれぐらいのことができちゃうのがすごいですね。
番外編 - Wiiリモコンから音を出してみる
先ほどのAudio.au音楽ファイルを使ってWiiリモコンから音を出すサンプルです。
まぁWiiリモコンのスピーカーなので、あんまり音はでないですが、とりあえず何となく音は聞こえたのでよしとします。
YouTubeでWiiリモコンからナイトライダーを流す動画がありました。
こんなにちゃんと音出るのかな?
Knight Rider Wii Remote
まとめ
ライブラリが充実していてほとんど自分でコードを書かなくてもこれぐらいのことができちゃうのはやっぱりすごいことですね。
動かなくて四苦八苦はしましたが、ハマるというのもこうゆう遊び感覚のコーディングの楽しいところです。
あとSourceForge.net: DarwiinRemote: Filesというアプリを使うとWiiリモコンでマウス操作ができるようになるのですが、ボクの環境なのかほとんど使いもんにならなかったですw
■参考リンク
・WiiLi.org Wii Linux - JP:WiiremoteJ/Installation
・WiiLi.org Wii Linux - JP:WiiremoteJ/ReadMe
・JavaとWiiリモコンをBluetoothでつなげてみよう - ブログ: 岡崎 - Okazaki's blog
・BlueCoveConfigProperties ( bluecove 2.1.1 -スナップショットAPI )を
- Newer: Movable Typeで最新の投稿をJSONPで返す方法
- Older: JavaScriptで関数内のthisを文字列にする方法
Comments:0
Trackback:0
- TrackBack URL for this entry
- http://hisasann.com/cgi-bin/mt/mt-tb.cgi/1164
- Listed below are links to weblogs that reference
- WiiリモコンからTwitterにPostしてみた from HouseTect, JavaScript Blog


