LoginSignup
4
2

More than 3 years have passed since last update.

RaspberryPiにPS3コントローラーを接続する

Posted at

libusb

% sudo apt install libusb-dev

sixpair

sixpairをダウンロードして、コンパイルする。

% mkdir Sixaxis
% cd Sixaxis
% wget "https://help.ubuntu.com/community/Sixaxis?action=AttachFile&do=get&target=sixpair.c" -O sixpair.c
% gcc -o sixpair sixpair.c -lusb

必要なライブラリのインストール

--- pyuic4 ---
% sudo apt install python-qt4 pyqt4-dev-tools qt4-designer
--- jack.h ---
% sudo apt install libjack-jackd2-dev
--- bluetooth.h ---
% sudo apt install libbluetooth-dev

qtsixaのインストール

% git clone https://github.com/falkTX/qtsixa.git
% cd qtsixa
% make
% sudo make install

PS3コントローラーの接続

% sudo sixad -start &

この後にPS3コントローラーをラズパイにUSBケーブルで接続し"PS"ボタンを押すと接続できる。
うまくPS3コントローラーを認識出来るようになった。
本当はこのままUSBケーブルを抜くとRaspberryPiとPS3コントローラーの間がBlueToothで繋がって使えるようになるらしいが、家ではUSBケーブルを抜くとPS3本体の電源が入ってコントローラーがそっちと繋がってしまった。
PS3コントローラーのリセットボタンを押すと対応できるらしいが試してない。

PS3コントローラーが繋がったので、ラズパイ起動時にデーモンが動くようにしておく。

% sudo systemctld enable sixad

ラズパイを再起動する

% sudo reboot

PS3コントローラー情報の取得

こんな感じでPS3のボタンの情報を取得できるgithubのソースはこちら

js_watch.py
import struct

device_path = "/dev/input/js0"

EVENT_FORMAT = "LhBB"
EVENT_SIZE   = struct.calcsize(EVENT_FORMAT)

with open(device_path, "rb") as device :
  event = device.read(EVENT_SIZE)
  while event :
    (ds3_time, ds3_val, ds3_type, ds3_num) = struct.unpack(EVENT_FORMAT, event)
    print("{0}, {1}, {2}, {3}".format(ds3_time, ds3_val, ds3_type, ds3_num))

    event = device.read(EVENT_SIZE)

実行する

% python3 js_watch.py

各ボタンを押して調べた結果がこれgithubにも置いてある
type=1 だとボタンがデジタル値で 0か1の2値
type=2 だとボタンはアナログ値で -32767〜32767 の値
で取得できる。

js_watch.log
up         : num=13, type=1, val=1 or 0
down       : num=14, type=1, val=1 or 0
left       : num=15, type=1, val=1 or 0
right      : num=16, type=1, val=1 or 0

x          : num=0, type=1, val=1 or 0
circle     : num=1, type=1, val=1 or 0
triangle   : num=2, type=1, val=1 or 0
squre      : num=3, type=1, val=1 or 0

L1         : num=4, type=1, val=1 or 0
L2         : num=2, type=2, val=-32767:32767
             num=6, type=1, val=1 or 0
R1         : num=5, type=1, val=1 or 0
R2         : num=5, type=2, val=-32767:32767
             num=7, type=1, val=1 or 0

stop       : num=8, type=1, val=1 or 0
start      : num=9, type=1, val=1 or 0

left stick
left&right : num=0 , type=2, val=-32767:32767
up&down    : num=1 , type=2, val=-32767:32767
push       : num=11, type=1, val=1 or 0

right stick
left&right : num=3 , type=2, val=-32767:32767
up&down    : num=4 , type=2, val=-32767:32767
push       : num=12, type=1, val=1 or 0

いつのまにかBlueToothが使えない

ラズパイを再起動してもBluetoothがうまく使えなくなっていた。
しばらく調べていると、デーモンファイルの実行権がなくなっていたことに気づいた。
実行権をつけることでうまく動くようになった。

% sudo chmod +x /usr/lib/bluetooth/bluetoothd

原因は不明だが、このsixadをインストールしたとにapt upgradeでシステムの更新をしたときに、
うまくアップデートできなくて実行権がなくなった? かもしれない。。。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2