RAPIROをWiiリモコンで制御する

解決!

ということで、WiiリモコンでRAPIROを制御できるようになりました。

今のところ(2014/3/1時点)、本家にはDualshock 3でRAPIROを制御するためのサンプルプログラムが公開されています … が、残念ながら自分はPS3を持っていないので、コントローラを持ち合わせておりません。購入するのが手っ取り早いですが、結構なお値段がするようです。最近色々買い過ぎて懐が大変お寒いので、ここでは代わりに、お家に余っていたWiiリモコン で制御できるようにしてみました。複雑な動作をさせようと思ったら両手持ちのDualshock 3の方が適切な気がしますが、Arduinoにプリセットしてあるモーションを呼ぶぐらいなら、片手で制御できるWiiリモコンの方がお手軽です。何より白いRAPIROには白いWiiリモコンが似合うと思います。

では、作業記録です。

(5/18 追記)
このあたりの手順をまとめなおしたものを、こちらに記載しておきました。よくわからなければ、そちらも参照してみてください。

0. Raspberry PiのSDのバックアップを作成

作業を始める前に、Raspberry Piのバックアップをとっておくことを強くオススメします。なぜかと言いますと、Raspberry PiのOFFの仕方は、本来ソフト的に終了(GUIでシャットダウン or CUIでshutdownかhalt)してから電源を落とすのが正しい手順ですが、RAPIROに組み込んで使うときは、それを気にせずにバシバシ電源をOFFしてしまうことが多いと思います。その結果、SDカードのデータが破壊されてしまうと、Raspberry Piが起動しなくなってしまい、今までやってきたWi-Fi設定やらsamba設定やらがすべて吹っ飛んでしまいます。ということで、RAPIROで色々試す前に、必ずバックアップをとっておきましょう。以下あたりが参考になると思います。

(3/29追記:Mac版は上記のリンクだけだと復元がうまくできないかもしれませんので、別記事でバックアップ&復元方法の記事を書きました)

1. 開発環境準備

Raspberry Pi上で直接開発するのは、いろんなケーブルの取り回し的にも、ハードウェアスペック的にもしんどいところがあると思うので、まずクロス開発できる環境を整えます。基本的には

$ sudo raspi-config

の設定画面のAdvanced Options -> SSHでSSHサーバを有効にしておくだけでOK(初期設定で有効になっている)です。あとは、開発用PCのコンソールからsshでログイン(ユーザがpiなら、$ ssh pi@xxx.xxx.xxx.xxx)すれば、Raspberry Piにアクセスできます。IPアドレスについては、事前に固定IPにしておくと指定がラクです(←Wi-Fiでの固定IPの設定方法はこちらに記載しています)。

さらに、Raspberry Pi側でSambaを設定しておくと、GUIでファイルのやりとりができるようになるので便利です。必要な場合は、Raspberry Piのapt-getでsambaをインストールしましょう。

$ sudo apt-get -y install samba
$ sudo apt-get -y install samba-common-bin

インストールした後は、/etc/samba/smb.confの末尾に以下を追記します。

[pi]
comment = pi's home
path = home/pi
public = Yes
read only = No
writable = Yes
quest ok = Yes
force user = pi
directory mode = 0777
create mode = 0666

上の記述はセキュリティについてはケアしていないので、知識がある人は適宜変更してください。追記が済んだら、以下を実行します(ユーザ名:pi、パスワード:raspberry の場合)。

sudo smbpasswd -a pi
smb pass: raspberry
sudo service samba restart

このあたりの設定については、雑誌『Interface (インターフェース) 2014年 01月号 』を参考にさせていただきました。Macでsambaに接続する場合は、「Finder -> 移動 -> サーバへ接続」でアクセスできるようになります。

また、これまではWiFiモジュールとして『GW-USNANO2A 』を使用していましたが、今回新たにWiiリモコンでの制御(Bluetooth通信)も行いますので、新たにWiFi/Bluetoothコンボモジュール『BT-Micro3H2X 』を使います。これは、RAPIROの制作者の方がこちらの紹介記事で使用しているものなので、安心して利用できます。自分が使用してみた感じでは、安定してモジュールを動作(通信を維持)させようと思ったらセルフパワータイプのUSBハブが必須ですが、ちょっとしたデモ動作ぐらいならRaspberry Piへの直挿しでも大丈夫そうです。WiFiを使ってクロス開発する間は、必ずセルフパワータイプのUSBハブに挿して使うようにしましょう。

2. Wiiリモコンを使えるようにする

基本的には以下を参照すればOKです。簡単。

$ sudo apt-get install –no-install-recommends bluetooth

ではなく、

$ sudo apt-get install –-no-install-recommends bluetooth

なことだけ注意(日本語版は、ハイフンが一個足りない)。同じところに置いてあるサンプルプログラム(wii_remote_1.py)が正しく動作すればOKです。

3. Arduinoへのシリアル通信部分を作る

RAPIROの本家サイトにあるDualshock 3用のソースコードから、シリアル通信に必要な部分だけをとってきて、先ほどのwii_remote_1.pyに組み込んでやればOKです。ボタンは11個あるので、好きなモーション(“#M0″〜”#M9”)を好きなボタンに割り振りましょう。こんな感じになります。

import cwiid
import time

import serial
com = serial.Serial('/dev/ttyAMA0', 57600, timeout = 10)
button_delay = 0.5
  ...
  if (buttons & cwiid.BTN_UP):
    print 'Up pressed'
    com.write("#M1") # Forward
    time.sleep(button_delay)
  if (buttons & cwiid.BTN_DOWN):
    print 'Down pressed'
    com.write("#M2") # Back
    time.sleep(button_delay)
  ...

なお、”import serial”が必要なので、実行前に以下のインストールが必要です。

$ sudo apt-get install phtyon-serial

4. Raspberry PiのSerial Consoleを無効にする

ここが、自分が一番ハマったところでした。Raspberry PiのSerial Consoleを無効にしておかないと、UARTを通してRaspberry PiからArduinoに対して常時、謎のデータが送られてしまいます。その結果、Arduinoに送信するコマンドが破棄されてしまったり、そもそもRaspberry Piが起動しなくなったりします(自分はなりました)。この問題については、RAPIROのフォーラムで質問した結果、oga様のアドバイスにより解決することができました。この場を借りてお礼申し上げます。以下、解決方法です。

主に後者を参考に、インストール、Serial Console無効化、再起動で準備完了です。

5. Wiiリモコンを接続する

3.で作成したファイル(ここではrapiro_wii.pyとする)を、sudoで実行します。

$ sudo python rapiro_wii.py

あとは、2.で試したサンプルプログラムと同じ操作方法で制御できるはずです。

4.でハマりさえしなければとても簡単に実装できるので、とりあえずリモコンでRAPIROを操ってみたい人にオススメです。