2014年6月6日金曜日

Wiiリモコンハック with Raspberry Pi


今回はRaspberry Pi と Wiiリモコンを使って、コントローラ入力レコーダーと、コントローラ入力再生機を作ってみます。
とはいってもいろんな技術をガッツリ使うものなので、回数に分けて段階的に紹介していきます。


【 必要なもの 】

 - Raspberry Pi
 - Bluetooth USBドングル(Wiiリモコンの通信用)
 - SDカード(RaspbianOSのインストール用)
 - Wiiリモコン


【 やりたいこと 】

 ① Wiiリモコンからの入力をRaspberry Pi でレコーディング
 ② レコーディングした入力データを再生してみる
 ③ 再生した入力をトリガーにして何か面白いことを実行してみる
   (今回はカメラモジュールを使った写真撮影をします)


① Wiiリモコンからの入力をレコーディング

まずはWiiリモコンとRaspberry Piを接続するところから。
これはcwiidと呼ばれるライブラリを使えば驚くほど簡単にできます。
 cwiid 本家
 cwiid @ github

接続するためにはRaspberry Pi 側に種々の必要なライブラリをセットアップ必要があります。
今回の入力レコーダーで必要なライブラリとしては numpy, cwiid, bluetooth です。
numpyは行列演算とかを容易にするライブラリ。ボタン入力処理を賢くサクッと書くために使います。
cwiidはWiiリモコンとの接続を簡単に行うためのAPIがたくさん用意されています。
bluetoothはBTドングルのデバイスドライバです。
ライブラリの追加インストール手順については以下のリンクが参考になりました。
    http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/robot/downloads/

めんどくせぇ、英語よくわかんねぇって人は以下のコマンドをおもむろにコピペするがいい
$ sudo apt-get install python-smbus ipython bluetooth bluez-utils \python-cwiid python-scipy python-numpy python-pygame \python-setuptools libsdl-dev
 コピペしてインストールが完了すればRaspberry Pi側のセットアップは完了です。
今度はBluetoothドングルの機能が正しく使えるかテストしよう。


$ sudo service bluetooth status
以下のレスポンスが帰ってくればOKです。

[ ok ] bluetooth is running.
あとはこちらのサイトにあるサンプルスクリプトを実行してみる。
http://www.raspberrypi-spy.co.uk/2013/02/nintendo-wii-remote-python-and-the-raspberry-pi/

ご丁寧にwgetでダウンロードできるよ!って書いてあるんでこれを実行してローカルに落とす。


$ wget http://www.raspberrypi-spy.co.uk/archive/python/wii_remote_1.py
落としたスクリプトを下記の通り実行

1
python wii_remote_1.py
実行したあと、Wiiリモコンの1,2ボタンを同時押しして接続。
接続が成功したログがでたらボタン押下してみて入力が正しく取得できていることを確認。

サンプルスクリプトだと、多少delayは入れてくれているけど、ボタン押している間、ダラダラログがでてくるのがいただけない。。
レコーディングするデータの冗長性はどうしても省きたいので、「ボタン入力のステートに変化があった時だけ記録する」方針を立てる。
といっても実装は簡単で、一フレーム前のボタンデータを現在のボタンデータが違ったら記録するだけ。
レコーディングのフォーマットはこんな感じ。
# Timing, Button
3.17495703697,1024
3.27394509315,0
6.9152610302,2048
6.94527006149,0
6.95132398605,512
6.98429703712,0
7.00630521774,1024
7.09829521179,0
7.18631219864,2048
7.29432606697,2304
7.32930803299,2048
7.37030911446,0
7.37931108475,512
7.50533699989,0
9.30555820465,512
9.35757017136,0
11.710750103,8
11.7407782078,0
11.9258739948,8
12.0262951851,0
12.1567862034,8
12.2268311977,0
12.3577971458,8
    *              , *
    *              , *

実装しているスクリプトはgithubにおいています。
https://github.com/ks6088ts/python/tree/master/WiiRemoteProject

速さ重視で即席で作ったのでモジュール化がいまいちだったり、リファクタリングできてなかったりでひどいソースですがとりあえず動作することは確認しました。
# レコーディングと並行して入力データを元にGPIO経由でデバイス制御もしてます。
# 関係ないソースコードがあったりしますがご了承下さい。。


0 件のコメント:

コメントを投稿