Rapiro(ラピロ)をDualshock3のBluetoothを使ってリモートで動してみる

前回、USBでRapiroにDUALSHOCK3を繋いで動かしてみたので、いよいよBluetoothをつかってリモートでRapiroを動かしてみました!動画は見づらいですが、自分の子供にRapiroを動かしてみたところです。 電源入れたら自動的にプログラムを受け付けるようにするのがやや面倒でしたが、なんとか動かす事ができました。ゲームをするようにロボットを操る事できて興奮して、毎日のように「ラピロ、ラピロ動かしたい!」というようになってきましたので、いよいよ次はラピロにしゃべらせようと思います!子供の名前しゃべらせたら、どんな反応するのか考えるだけでワクワクします。USBにマイクとりつけてまずはしゃべらせたあとに、ちゃんとスピーカーを取り付けてロボットらしくしようかなぁ等と迷う毎日でございます。以下ではRapiroを作っている人たちの少しでもお役にたてるように以下からはどのような設定をしたか記載していきたいと思います。※ 一度全ての作業を終えてから思い出して記載しているので手順の抜け漏れがあるやもしれませんが、そこは柔軟に対応をお願いします。  

Bluetoothの設定

RapiroでBluetoothの信号を受け付けるための設定を行います。作業については特に記載がない限りrootユーザーで行っています。参考URL:http://junkroom2cyberrobotics.blogspot.jp/2013/03/raspberry-pi-dualshock3-bluetooth.html今回は以下Bluetooth USBアダプタを使用して作業をしました。PLANEX Bluetooth Ver.4.0+EDR/LE対応 USBアダプタ (省エネ設計) BT-MICRO4 

Bluetooth USBアダプタをRaspberry Pi に認識させる

Raspberry Pi に Bluetooth USBアダプタを差していない状態で
# lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
とコマンド入力をしてまだBluetooth USBアダプタが認識されていない事を確認します。その後、Bluetooth USBアダプタをRaspberry Pi にさして再度同じコマンドを入力すると
Bus 001 Device 005: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
が表示されました。これでBluetooth USBアダプタは正常に認識されました。 

Bluetooth関連のライブラリ登録

Dualshock3のBluetoothを扱うためのライブラリをRaspberry Piにインストールします。
# apt-get install bluetooth bluez-utils bluez-compat bluez-hcidump
# apt-get install libusb-dev libbluetooth-dev joystick checkinstall
その後、Bluetoothが動いている事を確認。
# /etc/init.d/bluetooth status
[ ok ] bluetooth is running.
 

Bluetooth USBアダプタとDualshock3のペアリング

Bluetooth USBアダプタとDualshock3のペアリングを行うためにツールを準備。
wget "http://www.pabr.org/sixlinux/sixpair.c" -O sixpair.c
gcc -o sixpair sixpair.c -lusb
その後、USBケーブルでDualShock3とRaspberry Piを接続して、DualShock3のPSボタンを押した後に、以下コマンドでBDアドレスを認識します
# ./sixpair
Current Bluetooth master: xx:xx:xx:xx:xx:xx
Setting master bd_addr to xx:xx:xx:xx:xx:xx
 続けてQtSixA のソースコードをダウンロードして、sixadの部分をコンパイル
# wget https://sourceforge.net/projects/qtsixa/files/QtSixA%201.5.1/QtSixA-1.5.1-src.tar.gz/download -O QtSixA-src.tar.gz
# tar zxvf QtSixA-src.tar.gz
# make
# make install
 これでRaspberry Pi でBluetooth信号を受け付ける準備が整いました。Dualshock3のコマンドを受け付けるために以下のコマンドを実行
# sixad -start
sixad-bin[2246]: started
sixad-bin[2246]: sixad started, press the PS button now
その後にDualshock3 の PSボタンを押すと続けて
sixad-bin[2278]: unable to connect to sdp session
sixad-bin[2278]: Connected Sony Computer Entertainment Wireless Controller (xx:xx:xx:xx:xx:xx)
と表示されます。上記表示されればRaspberry PiにDualshock3からBluetoothの信号が受け付けれるようになっているはずです。電源を入れたらコマンドを入力しなくても自動でBluetooth信号を受けつけるように自動起動の設定をしておきましょう。
# update-rc.d sixad defaults
  

Bluetooth信号でRapiroを動かすように設定する

Rapiroサイトで落としたサンプルプログラム rapiro_ps3.py を少し修正し、電源を入れたら自動でこのプログラムを起動するようにします。 

サンプルプログラムの修正

修正ポイントは、電源を入れたらBluetooth信号を受け付けるようにデーモン化する点と、例外が発生(大概/dev/input/js0がないとException発生)しても、プログラムが停止しないようにします。詳細な例外処理はしません!DaemonContextというPythonライブラリを使用してプログラムをデーモン化して、例外が発生してもtry exceptで例外をキャッチした修正の部分を以下に記載しておきます。
#!/usr/bin/python
# -*- coding: utf-8 -*-

from __future__ import with_statement

import sys
import serial
import os
import time
import datetime

from daemon import DaemonContext
from lockfile.pidlockfile import PIDLockFile

dc = DaemonContext(
pidfile=PIDLockFile('/tmp/rapiro.pid'),
stdout=open('/var/log/rapiro_console.txt', 'w+'),
stderr=open('/var/log/rapiro_err_console.txt', 'w+')
)

def run():
file = open('/dev/input/js0','r')
data = []
:
:
:
:
if dif > 200 and mode == "analog":
com.write("#PS02A" + str(RUD).zfill(3) + "S03A" + str(RLR).zfill(3) + "S05A" + str(LUD).zfill(3) + "S06A" + str(LLR).zfill(3) + "T001\r\n")
now = datetime.datetime.now()
before_time = now.minute * 60000 + now.second * 1000 + now.microsecond/1000

sys.stdout.flush()
data = []

if __name__ == '__main__':
with dc:
while True:
try:
run()
except Exception as e:
time.sleep(10)
 あとはプログラムが自動起動するように/etc/init.d/rapiro という名前で以下起動スクリプトを作成しておきました。
#! /bin/sh
### BEGIN INIT INFO
# Provides: rapiro
# Required-Start: $all
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description:
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

. /lib/lsb/init-functions

EXEFILE="/root/rapiro/rapiro_ps3.py"
PIDFILE="/tmp/rapiro.pid"

do_start () {
log_daemon_msg "Starting Rapiro" "rapiro"
/usr/bin/python $EXEFILE
log_end_msg $?
}

do_stop () {
log_daemon_msg "End Rapiro" "rapiro"
kill -9 `cat $PIDFILE`
log_end_msg $?
}

case "$1" in
start|"")
do_start
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
stop)
do_stop
rm -f $PIDFILE
;;
*)
echo "Usage: rapiro [start|stop]" >&2
exit 3
;;
esac

exit 0
:
chkconfigコマンドで自動起動の設定をしておきます。
# chkconfig rapiro on
# chkconfig --list rapiro
rapiro 0:off 1:off 2:on 3:on 4:on 5:on 6:off
これで電源を入れ直すと、自動起動になるはずです。思い出しながら手順を記載しているので多少抜けはあると思いますが、参考になれば幸いです。

Makuake

プロジェクトを始めたい方、支援したい方に情報を発信中! イベント情報やリリース情報などもお届けします。 FB・TW・Instagram・LINE でも発信中! http://blog.makuake.com/posts/919350

0コメント

  • 1000 / 1000