(再まとめ)Raspberry Piの設定からラピロのWiiリモコン制御まで

th_rapiro_fight

というわけで(?)、いざ!ラピロを再起動させようと思います。現状は、ラピロの本体は組み上がっていて、Raspberry Piには素のRaspbianのインストールまでが終わっている状態です。作業予定は以下。

  1. 無線LANの設定
  2. ファイル共有(Samba)の設定
  3. Raspberry Piのシリアル設定の変更
  4. Wiiリモコン利用可能設定
  5. WiiリモコンでのArduino制御プログラム作成
  6. SDカードのバックアップ(絶対!)
  7. ラピロの動作テスト

どれも一度自分が記事にしてきたことなので、適宜参照しながらやっていきたいと思います(過去の自分よ、ありがとう)。二回目ということで、これまでよりもまとまった形の記事にはできるかと思います。

まずはじめの注意事項として、Raspberry Piの設定をする1.〜5.のステップでは、まだRaspberry Piとラピロ本体のArduino基盤は接続しません。Raspberry Piに直接電力供給した方がRasbperry Piが安定して動作しますし、Arduino基盤経由で電源供給していると、その間にサーボモータには電力が供給され続けて、あまり部品によろしくなさそうなので。Raspberry PiとArduinoボードを接続するのは、最後の7.のステップまでお預けです。

 

1. 無線LANの設定

WiFi/Bluetoothコンボモジュール『PLANEX BT-Micro3H2X』を使用。モジュールをセルフパワータイプのUSBハブに挿して、USBハブをRaspberry Piに挿す(WiFiモジュールは結構電力をくうので、設定中にRaspberry Piが電力不足で落ちたりしないようにするため)。

Raspberry Piを起動させたら、デスクトップのWiFi Configアイコンから、WiFi設定GUIを起動(デスクトップ画面が立ち上がらない場合は、コマンドラインでログイン後、”startx”)。

  • Adapterの欄にwlan0が表示されていることを確認
  • “Manage Networks”タブを選択して、”Scan”をクリック
  • 自宅のアクセスポイントが検出されたら、ダブルクリック
  • 暗号化キーを入力、”Add”
  • “Current Status”タブを選択して、”Connect”で接続

これでSSH接続できるようになる(<–Raspberry Piの初期設定で意図的にSSHをOFFにしていなければ)ので、以後はデスクトップPC(自分の場合はMac)のターミナルからSSHでログインして作業をする(その方が何かと動作が軽快だし、何よりこの記事を書きながら作業しやすいので。。。)。デスクトップPCからログインするために、Raspberry Piの現在のIPアドレスを覚えておく(先ほどのWiFi ConfigのGUIから確認するか、コマンドラインで”ifconfig”で確認)。

初めてRaspberry Piの環境をつくったときには、今後SSHとかで接続しやすくなるように、ここから頑張って固定IPを割り振るように設定したのだけれど、今回は別のアプローチで、Bonjourとやらを使ってみることにする。自分も全然知らなかったのですが、IRKitがこの仕組みを使っているということで、初めて知りました。DNSなしで、IPアドレスではなくホスト名で接続できるようにしてくれるらしい。

ということで、Bonjourの設定をする。参考は、こちらの記事。Bonjour互換のavahiというサービスが使えるらしい。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install avahi-daemon
$ sudo reboot

これで接続がいったん切れるので、再起動されるのを待つ。ここで、自分の環境では何故かRaspberry Piの再起動が途中でフリーズ。wlan0の設定の後に止まったようなので、いったんWiFiモジュールを抜いて、ログイン後にWiFiモジュールを挿し、ifconfigでモジュールが認識されていることを確認(*次立ち上げたときは普通に起動した。謎)。

デスクトップPCのターミナルに戻って、以下のコマンドを実行。

$ ssh pi@raspberrypi.local

これで繋がる…はずなんだけど、繋がらない。IPアドレスの指定ではSSH接続できるので、avahiサービスがうまく起動していない模様。

もう少し調べてみた結果、どうやらavahi用の設定ファイルを書き足してやらなくてはいけない。参考はここの後半、”The flexible way: set up avahi / zeroconf. “の項目。

“/etc/avahi/services/multiple.service”のファイルを作る。内容はとりあえず丸写しで。

<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
        <name replace-wildcards="yes">%h</name>
        <service>
                <type>_device-info._tcp</type>
                <port>0</port>
                <txt-record>model=RackMac</txt-record>
        </service>
        <service>
                <type>_ssh._tcp</type>
                <port>22</port>
        </service>
</service-group>

ファイルを作成できたら、avahi-daemonを再起動。

$ sudo /etc/init.d/avahi-daemon restart

これで、いったんログアウトしてから改めて

$ ssh pi@raspberrypi.local

を試すと、無事ログインできました。意外と時間かかってしまった。。。

 

2. ファイル共有(Samba)の設定

次に、GUIでも簡単にファイルをやりとりできるように、Sambaを設定する。ラピロをいじる上で必須ではないですが、できるようにしておくといろいろ便利なので。

これは一度、自分でやっているので、そのまま同じことをする。

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

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

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

追記が済んだら、以下を実行(ユーザ名:piの場合)。

$ sudo smbpasswd -a pi
New SMB password:
Retype new SMB password:
Added user pi.
$ sudo service samba restart

Macでsambaに接続する場合は、「Finder -> 移動 -> サーバへ接続」でアクセス可能。1.でBonjour (avahi)の設定をしている場合は、サーバアドレスは”smb://raspberrypi.local”になる。

これで、GUIでファイルのやりとりができるようになりました。

 

3. Raspberry Piのシリアル設定の変更

Raspberry Piを、 ラピロ本体のArduino基盤と接続するために必要な処理。これをやっておかないと、Raspberry PiからラピロのArduino基盤にメッセージがうまく送れず、動作を制御できない(*少なくとも自分が初めて動かしたときはそうだったけれど、今はどうなっているのかは不明)。

これも、前に一度やっているので、そのまま同じことをする。

以前書いたときは「ここを見てね」でかなり省略してしまったので、今回はもう少し丁寧に書きます。

$ sudo wget https://raw.github.com/lurch/rpi-serial-console/master/rpi-serial-console -O /usr/bin/rpi-serial-console
$ sudo chmod +x /usr/bin/rpi-serial-console

これで、必要なソフトのインストールは完了。次に、現在のシリアルコンソールの状況を確認する。

$ rpi-serial-console status
Serial console on /dev/ttyAMA0 is enabled

これがenabledだとよろしくないので、disabeldに変えます。

$ sudo rpi-serial-console disable
Serial console has been disabled, a reboot is required to make this take effect

要求通りに再起動して、SSHで再接続、状態を確認。

$ rpi-serial-console status
Serial console on /dev/ttyAMA0 is disabled

これでOK。

 

4. Wiiリモコン利用可能設定

Raspberry PiがWiiリモコンを受け付けるようにする。これまた前に一度やっているので、そのまま同じことをする。

ここも、以前書いたときは「ここを見てね」で省略してしまったので、今回はもう少し丁寧に。

$ sudo apt-get install --no-install-recommends bluetooth
$ sudo apt-get install python-cwiid

必要なソフトのインストールは以上。次に、Raspberry PiでBluetoothが有効になっているかを確認。

$ sudo service bluetooth status
[ ok ] bluetooth is running.

Wiiリモコンが発見できるかの確認。Wiiリモコンの1ボタンと2ボタンを同時押しして、LEDが点滅している状態にしてから、

$ hcitool scan
Scanning ...
    00:19:1D:A0:86:23    Nintendo RVL-CNT-01

こんな感じの表示がでればOK。次にサンプルソースをダウンロード。

$ wget http://www.raspberrypi-spy.co.uk/archive/python/wii_remote_1.py

これを実行。

$ python wii_remote_1.py
Press 1 + 2 on your Wii Remote now ...
Wii Remote connected...

Press some buttons!

Press PLUS and MINUS together to disconnect and quit.

Button 1 pressed
Button 2 pressed
...

こんな感じの表示がでればOK。

 

5. WiiリモコンでのArduino制御プログラム作成

4. で取得したサンプルソース(wii_remote_1.py )にちょっと手を加えて、ラピロの制御信号を遅れるようにする。

これについては、以前にちゃんと書いているので、以下、そのまま転載。

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 python-serial

これで、準備OK。

すぐさまラピロを動かしたいところですが、はやる気持ちを抑えて、ここでいったんRaspberry PiのSDカードのバックアップをとります。

 

6.  SDカードのバックアップ(絶対!)

Raspberry PiとArduino基盤を接続して、頭の部品も完全にねじ止めしてしまうと、Raspberry Piの画面出力ができなくなるので、Raspberry Piのデバッグが難しくなります。その状態で、不用意にラピロ(Raspberry Pi)の電源をON/OFFしていると、 SDカードのデータが破壊されて起動できなくなることは充分に起こりえます(起こりました)。

というわけで、ここまでやってきたことを無駄にしないために、 SDカードのバックアップをとります。Mac環境でのやり方は、以下に詳しく書きました。

Windows環境での方法は、他にいくらでも書いてくれているところがあると思うので、そちらを参照してください。

 

7. ラピロの動作テスト

さて、バックアップをとったらいよいよラピロの動作テストです。Arduino基盤とRaspberry Piを接続して、頭部をねじ止めします。

th_rapiro_connect

 ラピロの電源を入れて、Rasbperry Piが起動したと思われるまで待ったら(このへん、できたらLEDか何かで判断できるようにしたい)、SSHで遠隔ログイン。SSHでログインできない場合は、起動に失敗していると思われるので、いったんWiFiモジュールを抜いた状態で立ち上げてからWiFiモジュールを挿すか、ちょっとごちゃごちゃしますがセルフパワーUSBハブ経由WiFiモジュールを挿す、等を試してみる。

無事にログインできたら、5.で作成したファイル(ここでは、rapiro_wii.pyとする)を実行します。

$ python rapiro_wii.py

あとは、Wiiリモコンの1ボタンと2 ボタンを同時に押し続ければ、接続が確立されるハズ。1ボタンか2ボタンに何かラピロの動作を割り振っていれば、繋がった瞬間にその動作を実行してくれるので、わかりやすいです。

th_rapiro_start

自分の場合は、繋がったらラピロがバンザイします(1ボタンに”#M5″を割り当てているので)。かわいい。

歩かせてみます。かわいい。

th_rapiro_walking

以上です。自分は記事を書きながら調べながらなので4時間ぐらいかかりましたが、作業するだけなら多分2時間かからないと思います。

一ヶ月半ぶりぐらいに動かしてみましたが、やっぱりかわいいです、ラピロ。