PlayStation 4 で
Driving Force GT を使う

PlayStation 3 で使っていた Driving Force GT が PlayStation 4 (PS4) では使えなくなりました。 PS4 用にライセンスされた周辺機器かどうか PS4 がチェックしているのがその理由です。 このチェックを回避する方がいくつかありますが、 手元に Raspberry Pi が余っているので今回はこれを活用して GIMX を使って Driving Force G29 として使用します。

前提条件


GIMX adapter の入手

GIMX を使うためには USB をシリアル通信に変換するアダプターが必要で す。
これは 頑張って自作するGIMX の公式サイト https://blog.gimx.fr/product/gimx-adapter/ から購入するかして入手します。
公式サイトでの購入は到着を待てるのであればお奨めです。 私はイギリスで発注したのですが、 火曜の夜に発注して水曜に受注連絡が来て金曜には物が届きました。
日本では同じようなものをヤフオク等で販売してる人もいるようなので、 それも使えるのかも知れません。


Raspbian のインストール

micro SD カードのフォーマット

SD カードフォーマッター を使って Windows 上でフォーマットします。

NOOBS のインストール

Raspbian のサイトから NOOBS Lite をダウンロードして、フォーマットした micro SD カード上に展開します。

NOOBS の起動

micro SD カードを Raspberry Pi に挿入して起動し、 Raspbian Lite を選択してインストールします。

Raspbian の起動

Raspbian をインストールしたら再起動してログインします。

raspberrypi login: pi
Password: raspberry

最初にやること

最初にファームウエアをアップデートします。

$ sudo rpi-update
$ sudo reboot

続いてソフトウエアのアップデートと必要なソフトウエアのインストールを行います。 なお、pi ユーザのパスワード変更は必ず行いましょう。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install joystick
$ sudo apt-get install tcsh
$ sudo apt-get install vim
$ sudo apt-get install gawk

また、必要に応じて自動アップデートを設定します。

$ sudo apt-get install unattended-upgrades

/etc/apt/apt.conf.d/20auto-upgrades

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

/etc/apt/apt.conf.d/50unattended-upgrades

- //      "o=Raspbian,a=stable";
+       "o=Raspbian,a=stable";

キーボード

/etc/default/keyboard

- XKBMODEL="pc105"
- XKBLAYOUT="gb"
+ XKBMODEL="pc106"
+ XKBLAYOUT="jp"

syslog

daemon.log のローテーションを設定します。

/etc/logrotate.d/rsyslog

/var/log/daemon.log
{
        rotate 2
        daily
        missingok
        notifempty
        delaycompress
        compress
        postrotate
                invoke-rc.d rsyslog rotate > /dev/null
        endscript
}

rsyslogd-2007: action 'action 17' suspended, next retry is ... 対策として以下をコメントアウトします。

/etc/rsyslog.conf

#daemon.*;mail.*;\
#       news.err;\
#       *.=debug;*.=info;\
#       *.=notice;*.=warn       |/dev/xconsole

シリアルコンソールの無効化

デフォルトではシリアルコンソールが有効化されているので、 それを無効化します。

$ sudo raspi-config
Interfacing Options P6 Serial accessible over serialNo
serial port hardwareYes

シリアル通信の高速化

デフォルトでは高速シリアル通信ができないので、 できるようにします。

/boot/config.txt

init_uart_clock=8000000

GIMX のインストール

足りないライブラリもインストールします。

$ wget https://gimx.fr/download/gimx-raspbian -O gimx.deb
$ sudo dpkg -i gimx.deb
$ sudo apt-get -f install

triggerhappy の停止および無効化

$ sudo service triggerhappy stop
$ sudo update-rc.d triggerhappy disable

GIMX の設定

$ mkdir -p /home/pi/.gimx
$ mkdir -p /home/pi/.gimx/config
$ wget https://raw.githubusercontent.com/matlo/GIMX-configurations/master/Linux/LogitechDrivingForceGT_G29.xml -O /home/pi/.gimx/config/LogitechDrivingForceGT_G29.xml

/etc/systemd/system/gimx.service

[Unit]
Description=GIMX  
After=syslog.target network.target

[Service]
User=pi  
Type=simple  
# Replace /dev/ttyUSB0 with /dev/ttyAMA0 when using the on-board UART interface
ExecStart=/usr/bin/gimx -p /dev/ttyUSB0 -c LogitechDrivingForceGT_G29.xml --nograb  
Restart=always  
RestartSec=5

[Install]
WantedBy=multi-user.target

設定を反映させます。

$ sudo systemctl daemon-reload
$ sudo systemctl enable gimx && sudo systemctl start gimx

起動

Raspbian を起動し、GIMX adapter、Driving Force GT、DUALSHOCK4 をそれぞれ Raspberry Pi に USB で接続します。
Raspbian で接続機器を認識したら GIMX adapter につながっている USB ケーブルを PS4 に接続します。

Raspberry Pi GIMX

ログ

input: Sony Interactive Entertainment Wireless Controller as /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4/1-1.4:1.3/0003:XXXX:XXXX.0001/input/input0
hid-generic 0003:XXXX:XXXX.0001: input,hidraw0: USB HID v1.11 Gamepad [Sony Interactive Entertainment Wireless Controller] on usb-3f980000.usb-1.4/input3
logitech 0003:XXXX:XXXX.0002: fixing up Logitech Driving Force report descriptor
input: Driving Force GT as /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5:1.0/0003:XXXX:XXXX.0002/input/input1
logitech 0003:XXXX:XXXX.0002: input,hidraw1: USB HID v1.00 Joystick [Driving Force GT] on usb-3f980000.usb-1.5/input0
input: Driving Force GT as /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5:1.0/0003:XXXX:XXXX.0003/input/input2
logitech 0003:XXXX:XXXX.0003: input,hidraw1: USB HID v1.11 Joystick [Driving Force GT] on usb-3f980000.usb-1.5/input0
logitech 0003:XXXX:XXXX.0003: Force feedback support for Logitech Gaming Wheels

動作確認ゲーム


安定性

GIMX 6.8 を使用していますが、 プレイ中に PS4 でコントローラーを認識しなくなることがあります。 特に Project CARS Game of the Year Edition と F1 2016 をプレイしている時に起こる印象があります。 そういうときは GIMX を再起動します。
それでだめなら Driving Force GT の USB ケーブルを抜き差ししてから GIMX を再起動します。

$ sudo systemctl restart gimx

それでだめなら Raspbian をリブートします。

$ sudo reboot

Driving Force GT による Raspberry Pi のコントロール

GIMX の再起動や Raspbian のシャットダウンのためにいちいちコンソールで操作するのは面倒です。 というわけで、Driving Force GT の操作ボタンで Raspbian を少しだけコントロールできるようにします。
具体的には 時々、失業SEの開発日誌 RaspberryPiでJoypadからコマンド入力 で説明されているやり方を若干変更して実装します。

まず、ハンドルの動作に対応できるように jscmd.awk を若干変更します。

/home/pi/jscmd/jscmd.awk の変更

--- /home/pi/jscmd/jscmd.awk.orig      2017-06-17 20:06:16.726340770 +0100
+++ /home/pi/jscmd/jscmd.awk   2017-06-17 19:38:38.550891714 +0100
@@ -6,6 +6,7 @@
 }

 /^Event: type 1,/ {
+    type = 1;
     n = $7; sub(/,$/,"",n);
     v = $9;
     key = names[n+1];
@@ -14,13 +15,15 @@
 }

 /^Event: type 2,/ {
+    type = 2;
     n = $7; sub(/,$/,"",n);
     v = $9;

-    if (n == 0) {
+    if (n == 3) {
         flag["RIGHT"] = (v>0)?1:0;
         flag["LEFT"]  = (v<0)?1:0;
-    } else {
+    }
+    else if (n == 4) {
         flag["DOWN"] = (v>0)?1:0;
         flag["UP"]   = (v<0)?1:0;
     }
@@ -30,6 +33,7 @@
 func addKey() {
     t = systime();
     if (t > lastModify+2) sequence = "";
+    else if (t >= lastModify && type == 2) sequence = "";
     lastModify = t;

     keys = "";

コマンドシーケンスの設定

デバイスのシーケンスの実装状況をチェックします。

デバイス情報の表示

$ sudo udevadm info -a -p $(udevadm info -q path -n /dev/input/js0) > js0.log
$ sudo udevadm info -a -p $(udevadm info -q path -n /dev/input/js1) > js1.log

DUALSHOCK4

$ jstest /dev/input/js0
Driver version is 2.1.0.
Joystick (Sony Interactive Entertainment Wireless Controller) has 8 axes (X, Y, Z, Rx, Ry, Rz, Hat0X, Hat0Y)
and 14 buttons (BtnX, BtnY, BtnZ, BtnTL, BtnTR, BtnTL2, BtnTR2, BtnSelect, BtnStart, BtnMode, BtnThumbL, BtnThumbR, ?, ?).

Driving Force GT

$ jstest /dev/input/js1
Driver version is 2.1.0.
Joystick (Driving Force GT) has 5 axes (X, Y, Z, Hat0X, Hat0Y)
and 21 buttons (Trigger, ThumbBtn, ThumbBtn2, TopBtn, TopBtn2, PinkieBtn, BaseBtn, BaseBtn2, BaseBtn3, BaseBtn4, BaseBtn5, BaseBtn6, BtnDead, BtnA, BtnB, BtnC, (null), (null), (null), (null), (null)).

チェックしたシーケンスに基づき、 実行するコマンドのシーケンスを設定します。

/home/pi/jscmd/dfgtcmd.conf

BUTTONS=BATSU,SHIKAKU,MARU,SANKAKU,R1,L1,R2,L2,SELECT,START,R3,L3,SHIFTUP,SHIFTDOWN,ENTER,PLUS,DIALRIGHT,DIALLEFT,MINUS,PS,RIGHT,LEFT,DOWN,UP

SHIKAKU+R2+RIGHT = systemctl restart gimx
SANKAKU+R2+LEFT = reboot
SANKAKU+L2+LEFT = shutdown -h now

/home/pi/jscmd/dfgtcmd-start.sh

#!/bin/sh

BASE=`dirname $0`
cd $BASE

if [ -c /dev/input/js1 ]; then
    DEV=/dev/input/js1
elif [ -c /dev/input/js0 ]; then
    DEV=/dev/input/js0
else
    exit 1
fi

jstest --event $DEV | gawk -v CONFIG=dfgtcmd.conf -f jscmd.awk &

/etc/udev/rules.d/99-dfgt.rules

ACTION=="add",\
        SUBSYSTEMS=="usb", \
        KERNEL=="js*", \
        RUN:="/home/pi/jscmd/dfgtcmd-start.sh", \
        OPTIONS+="last_rule"
$ sudo service udev reload

参考