Raspberry PiにPS3 DUALSHOCK3を接続してRapiroを動かしてみる

Raspberry Pi と繋いで遊べるロボット Rapiro が家にやってきてから、少しずつ遊びながら環境を整えている。
今回はついに Raspberry Pi を Rapiro に搭載して、PS3 DUALSHOCK3 を接続して Rapiro を動かしてみた!のだけど…。
因に、今までの記事のリストはこんな感じ。

 Raspberry Pi で DUAL SHOCK 3 を使えるようにする

USB 接続なら DUAL SHOCK 3 を使えるようにするのは簡単。
サクっと DUAL SHOCK 3 を Raspberry Pi の USB ポートに接続すれば良い。
で、lsusb して認識されているかどうかを確認。

[root@archangelpi ~]# lsusb
Bus 001 Device 077: ID 054c:0268 Sony Corp. Batoh Device / PlayStation 3 Controller
Bus 001 Device 004: ID 0411:01a2 BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. SMC9512/9514 USB Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
[root@archangelpi ~]#

一番上に出てくるのが DUAL SHOCK 3。
というわけで、問題なく認識されました。

 サンプルアプリ rapiro_ps3.py を動かしてみる

Rapiro の Download ページから、サンプルアプリの rapiro_ps3.py をダウンロードします。

[root@archangelpi ~]# curl -O http://www.kiluck.co.jp/rapiro/rapiro_ps3.py

で、早速 python で起動してみると…

[root@archangelpi ~]# python rapiro_ps3.py
  File "rapiro_ps3.py", line 21
    if len(data) == 8:
                     ^
TabError: inconsistent use of tabs and spaces in indentation
[root@archangelpi ~]#

はい、エラー。
インデントにタブとスペースが混じっています。
というわけで、全てのスペースでのインデントをタブに修正してから再トライ。
今度は問題なく起動しました。
早速コントローラーのキーを押してみると…

[root@archangelpi ~]# python rapiro_ps3.py
Traceback (most recent call last):
  File "rapiro_ps3.py", line 19, in <module>
    for character in file.read(1):
  File "/usr/lib/python3.3/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0x81 in position 6: ordinal not in range(128)
[root@archangelpi ~]#

あ〜 python の面倒なやつキタ〜!
というわけで、今回はシリアルポートからの読み込みをバイナリとして読み込ませることにして回避。
更にシリアルポートへの書き込み部分も修正して再度トライ。(書き換えたコードはコチラ

[root@archangelpi ~]# python rapiro_ps3.py
You pressed the UP button
You released the UP button
You pressed the LEFT button
You released the LEFT button
You pressed the L2 button
You released the L2 button
You pressed the DOWN button
You released the DOWN button
You pressed the CIRCLE button
You released the CIRCLE button
You pressed the TRIANGLE button
You released the TRIANGLE button
You pressed the SQUARE button
You released the SQUARE button
You pressed the CROSS button
You released the CROSS button
You pressed the R1 button
You released the R1 button
You pressed the L1 button
You released the L1 button
You pressed the R2 button
You released the R2 button
You pressed the L2 button
You released the L2 button
You pressed the L3 button
You released the L3 button
You pressed the R3 button
You released the R3 button
You pressed the START button
You released the START button
You pressed the SELECT button
You released the SELECT button
^CTraceback (most recent call last):
  File "rapiro_ps3.py", line 22, in <module>
    for character in file.read(1):
KeyboardInterrupt
[root@archangelpi ~]#

今度はコントローラーのボタンを押すとちゃんと認識してボタンの状態を表示してくれました。
とりあえず、一通りのボタンは認識されている様なので、次は Rapsberry Pi を Rapiro に搭載します。

 Rapiro に Raspberry Pi を搭載してみる

Rapiro の6極コネクタと Rapsberry Pi のコネクタの接続方法は、先日のお知らせメールに写真付きで載っていました。
こんな感じで接続します。

で、いよいよ Rapsberry Pi を Rapiro に搭載しようとしたら問題発生!
支柱?の先端の出っ張りが邪魔してピタっとハマりません。

この支柱の先の出っ張り、余計じゃない???
おかしいな〜と思ってtweetしてみると、@kanpapa さんから自分のはちゃんとハマってますという情報が写真付きで送られてきました!(ありがとうございます。)
あれ? 支柱の出っ張りがないの? と、思って調べてみると、どうやら Rapsberry Pi の基盤にはバージョンがあるみたいです。

で、自分の Rapsberry Pi を調べてみると…

[root@archangelpi ~]# cat /proc/cpuinfo
processor : 0
model name  : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS  : 2.00
Features  : swp half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part  : 0xb76
CPU revision  : 7
Hardware  : BCM2708
Revision  : 0002
Serial    : XXXXXXXXXXXXXXXX
[root@archangelpi ~]#

やっぱりバージョン1.0で、基盤に穴の開いていないタイプでした。
というわけで、基盤が Rapiro にピタリとハマらないので、頭を付けずに Rapsberry Pi を載せた状態で動かしてみることに。

結果、とりあえず上下左右ボタンで動くことは確認できましたが、アナログスティックは反応しません…。
なんで?
あと、かなり頻繁に PySerial が OSError で止まります。

You pressed the UP button
Traceback (most recent call last):
  File "/usr/lib/python3.3/site-packages/serial/serialposix.py", line 499, in write
    n = os.write(self.fd, d)
OSError: [Errno 5] Input/output error
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "rapiro_ps3.py", line 47, in <module>
    com.write(b"#M1")
  File "/usr/lib/python3.3/site-packages/serial/serialposix.py", line 518, in write
    raise SerialException('write failed: %s' % (v,))
serial.serialutil.SerialException: write failed: [Errno 5] Input/output error

う〜ん、Python 3 でエラー出ないように書き換えたつもりだけど、たぶん何かおかしいんだろうな〜。
というわけで、もうお手上げ!
で、無理せずに Python 2 でトライしようと思ったのだけど、なぜか pacman -S python2 しても sqlite がダウンロードできなくてインストールできなかった…。

[root@archangelpi ~]# pacman -S python2
resolving dependencies...
looking for inter-conflicts...
Packages (2): sqlite-3.8.3-1  python2-2.7.6-1
Total Download Size:    9.00 MiB
Total Installed Size:   59.35 MiB
:: Proceed with installation? [Y/n] Y
:: Retrieving packages ...
error: failed retrieving file 'sqlite-3.8.3-1-armv6h.pkg.tar.xz' from mirror.archlinuxarm.org : The requested URL returned error: 404 Not Found
warning: failed to retrieve some files
 python2-2.7.6-1-armv6h     8.6 MiB   216K/s 00:41 [######################] 100%
error: failed to commit transaction (unexpected error)
Errors occurred, no packages were upgraded.
[root@archangelpi ~]# pacman -S python2

困ったな。
やっぱり 16G のカードを Rapiro に使って Raspbian でトライし直そうかな〜?

 Rapiro のバッテリー消耗早い

Raspberry Pi を繋いだらあっという間にバッテリーなくなって、Rapiro がギギギと良いながら捻れる。
で、このバッテリーなくなってきた時の捻れる動作、なんか可哀想で見るのが辛い…。
やっぱり AC アダプタ用意するかな?
と、思ったけど、Rapiro に Raspberry Pi が固定できない状態ってのもなんだしな〜。

Leave a Reply

Your email address will not be published. Required fields are marked *