ゲームパッド

提供: ArchWiki
ジョイスティックから転送)
ナビゲーションに移動 検索に移動

ゲームパッドを Linux で使うのには少し手間がかかるかもしれません。サポートが薄いためではなく、あなたのゲームパッドを動かすのにロードすべきモジュールを見つける必要があり、そしてそれがわかりづらいことがあるからです。

目次

ゲームパッド入力システム

Linux には異なる2つのゲームパッドの入力システムが存在します。オリジナルの 'Joystick' インターフェイスと新しい 'evdev' ベースのインターフェイスです。

/dev/input/jsX は 'Joystick' API インターフェイスに /dev/input/event* は 'evdev' インターフェイス (こちらにはマウスやキーボードなど他の入力デバイスも含まれます) にそれぞれマップされています。また、これらのデバイスのシンボリックリンクが /dev/input/by-id//dev/input/by-path/ に存在し、古い 'Joystick' API には -joystick という名前が付き、'evdev' には -event-joystick という名前が付きます。

ほとんどの新しいゲームは 'evdev' インターフェイスをデフォルトで使います。'evdev' インターフェイスの方がボタンや軸の詳しい情報を得ることができ、フォースフィードバックもサポートしているためです。

SDL1.x はデフォルトで 'evdev' インターフェイスを使用しますが SDL_JOYSTICK_DEVICE=/dev/input/js0 環境変数を設定することで 'Joystick' API を使うように SDL を強制させることができます。これは X3 などのゲームで役に立ちます。SDL2.x は新しい 'evdev' インターフェイスだけをサポートしています。

必要なモジュールの確認

ゲームポートやプロプライエタリな USB プロトコルを使用する、旧時代のゲームパッドを使うというのでなければ、一般的な USB ヒューマンインターフェイスデバイス (HID) モジュールだけで足ります。

Linux における全てのゲームパッド関連のモジュールの広範な外観を見るには、Linux カーネルのソースを紐解く必要があります -- 特に Documentation セクションがそれです。残念ながら、pacman のカーネルパッケージには必要なドキュメントが含まれていません。カーネルソースをダウンロードした場合、Documentation/input/joystick.txt を見て下さい。また、kernel.org から使用しているカーネルの "cgit" (git フロントエンド) リンクをクリックして、上部の "tree" リンクをクリックすることでカーネルのソースツリーをブラウズすることができます。こちらは 最新カーネルのドキュメント のリンクです。

Microsoft Sidewinder コントローラー (sidewinder) や Logitech デジタルコントローラー (adi) など、特定のモジュールを必要とするゲームパッドも存在します。多くの古いゲームパッドはシンプルな analog モジュールで動作します。サウンドカードによるゲームポートにゲームパッドを接続している場合、サウンドカードドライバーをロードする必要があります - しかしながら、カードによっては、Soundblaster Live など、特定のゲームポートドライバーを持っているものもあります (emu10k1-gp)。古い ISA サウンドカードは ns558 モジュールを必要とします。これは標準のゲームポートモジュールです。

Linux でゲームパッドを動作させるのに関連するモジュールは多々あるため、ここでは全てを説明することはできません。詳細については上記のドキュメントを見るようにしてください。

アナログデバイスのモジュールのロード

ゲームポートのモジュール (ns558, emu10k1-gp, cs461x, など)、ゲームパッドのモジュール (analog, sidewinder, adi, など)、そしてカーネルジョイスティックデバイスドライバー (joydev) をロードする必要があります。これらを /etc/modules-load.d/ のファイルに追加するか、modprobe してください。gameport モジュールは他のモジュールの依存モジュールとして、自動でロードされるはずです。

USB ゲームパッド

USB を動作させて、ジョイスティックドライバーを modprobe する必要があります。usbhidjoydev です。USB マウスやキーボードを使っている場合、usbhid は既にロードされるので joydev モジュールだけをロードしてください。

設定のテスト

モジュールがロードされたら、新しいデバイスが認識されるはずです: /dev/input/js0。また、/dev/input/by-id ディレクトリに -event-joystick で終わるファイルが作られます。デバイスを cat することで動作するか確認できます。スティックを動かして、全てのボタンを押して下さい。画面に文字化けが表示されるはずです。

Wine での確認とテストは基本的に wine control joy.cpl で両方できます。

ヒント: 入力デバイスのグループはデフォルトでは input グループになります。pcsx2 などは権限がないとゲームパッドにアクセスすることができません。あなたのユーザーが input グループに属していることを確認してください。

Joystick API

Joystick API をテストするアプリケーションはたくさんあります。joyutils パッケージの jstest が一番シンプルなアプリケーションです。一行では設定できないほどの多数のボタンや軸がある場合や、パッドに加速度センサが付いている場合は (何も起こってない時も新しいイベントを送り続けます) グラフィカルツールを使って下さい。KDE4 にはシステム設定の入力デバイスパネルにテスト用のツールが含まれています。また、jstest-gtk-gitAUR を使うこともできます。

jstest の使い方はとても簡単です。jstest /dev/input/js0 と実行すると軸 (倒していない状態で {-32767,32767}) とボタンの状態が全て出力されます。

jstest-gtk を実行すると、接続されているゲームパッドのリストが表示されるので、どれか一つを選択して Properties を押して下さい。

evdev API

新しい 'evdev' API は SDL2 のゲームパッドテストアプリケーションや community リポジトリに入っている evtest を使うことでテストできます。sdl2-jstest-gitAUR をインストールしてから sdl2-jstest --test 0 を実行してください。複数のコントローラーを接続している場合に他のコントローラーの ID を取得したいときは sdl2-jstest --list を使います。

デバイスのフォースフィードバックをテストするには、linuxconsole パッケージに含まれている fftest を使って下さい:

$ fftest /dev/input/by-id/usb-*event-joystick

デッドゾーンとキャリブレーションの設定

アナログ入力のデッドゾーンを設定したい (または完全にデッドゾーンを削除したい) ときは、xorg (マウス・キーボードエミュレート用) と Joystick API と evdev API で別に設定する必要があります。

Wine のデッドゾーン

以下のレジストリエントリを追加して 0 から 10000 までの値に設定してください (全ての軸に影響します):

HKEY_CURRENT_USER\Software\Wine\DirectInput\DefaultDeadZone

ソース: UsefulRegistryKeys

Xorg のデッドゾーン

/etc/X11/xorg.conf.d/51-joystick.conf に以下のような行を追加してください (ファイルが存在しない場合、作成してください):

/etc/X11/xorg.conf.d/51-joystick.conf
Section "InputClass"
    Option "MapAxis1" "deadzone=1000"
EndSection

1000 はデフォルトの値で、0 から 30000 の間で設定できます。軸番号を取得する方法はこの記事の #設定のテスト セクションを参照。問題の軸で既にオプションを設定している場合は、スペースで区切ったパラメータの最後に deadzone=value を入力してください。

Joystick API のデッドゾーン

一番簡単な方法は jstest-gtk-gitAURjstest-gtk を使うことです。編集したいコントローラーを選択して、ダイアログの下にある Calibration ボタンをクリックしてください (Start Calibration をクリックしてはいけません)。デッドゾーンの中心を指定する CenterMin と CenterMax の値や、デッドゾーンの終末を指定する RangeMin と RangeMax を設定します。キャリブレーション設定はアプリケーションがデバイスを開いたときに適用されるので、ゲームを再起動する必要があります。

デッドゾーンを設定したら jscal を使って新しい値をシェルスクリプトに出力してください:

$ jscal -p /dev/input/jsX > jscal.sh # replace X with your joystick's number 
$ chmod +x jscal.sh

そして udev ルールを作成して (例えば /etc/udev/rules.d/85-jscal.rules) コントローラーを接続した時に自動的にスクリプトが実行されるようにします:

SUBSYSTEM=="input", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="c268", ACTION=="add", RUN+="/usr/bin/jscal.sh"

idVendor と idProduct を取得するには udevadm info --attribute-walk --name /dev/input/jsX を使って下さい。

複数のコントローラーを使用する場合は `/dev/input/by-id/*-joystick` デバイス名を使います。

evdev API のデッドゾーン

evdev API のキャリブレーションを変更できるスタンドアロンのアプリケーションは存在しません。ただし VDrift ゲームと一緒に配布されている G25manage を使うことでセンターデッドゾーンを変更できます。

G25manage を入手する一番簡単な方法は VDrift の github を開いて、全てのファイルをダウンロードして make を使ってビルドすることです。

ビルドしたら、次のコマンドでデバイスの設定を確認できます:

$ ./G25manage --showcalibration /dev/input/by-id/usb-*-event-joystick

軸のデッドゾーンを変更するには、次のコマンドを使います:

$ ./G25manage --evdev /dev/input/by-id/usb-*-event-joystick --axis 0 --deadzone 0

コントローラーが接続されたときに自動的に設定を行いたいときは udev ルールを使って下さい。

カーネルの中では、値の名前は flatness となっており、EVIOCSABS ioctl を使って設定します。

デフォルト設定は以下のようになります:

$ ./G25manage --showcalibration /dev/input/by-id/usb-Madcatz_Saitek_Pro_Flight_X-55_Rhino_Stick_G0000090-event-joystick
Supported Absolute axes:
   Absolute axis 0x00 (0) (X Axis) (min: 0, max: 65535, flatness: 4095 (=6.25%), fuzz: 255)
   Absolute axis 0x01 (1) (Y Axis) (min: 0, max: 65535, flatness: 4095 (=6.25%), fuzz: 255)
   Absolute axis 0x05 (5) (Z Rate Axis) (min: 0, max: 4095, flatness: 255 (=6.23%), fuzz: 15)
   Absolute axis 0x10 (16) (Hat zero, x axis) (min: -1, max: 1, flatness: 0 (=0.00%), fuzz: 0)
   Absolute axis 0x11 (17) (Hat zero, y axis) (min: -1, max: 1, flatness: 0 (=0.00%), fuzz: 0)

以下のようにすることで適切な設定ができます (他の軸でも同じコマンドを実行してください):

$ ./G25manage --evdev /dev/input/by-id/usb-Madcatz_Saitek_Pro_Flight_X-55_Rhino_Stick_G0000090-event-joystick --axis 0 --deadzone 512
Event device file: /dev/input/by-id/usb-Madcatz_Saitek_Pro_Flight_X-55_Rhino_Stick_G0000090-event-joystick
 Axis index to deal with: 0
 New dead zone value: 512
 Trying to set axis 0 deadzone to: 512
   Absolute axis 0x00 (0) (X Axis) Setting deadzone value to : 512
 (min: 0, max: 65535, flatness: 512 (=0.78%), fuzz: 255)

ゲームパッドのマウス操作を無効にする

コントローラーを使ってゲームを遊びたいとき、ゲームパッドによるマウスカーソルの操作を無効にすると良いかもしれません。無効にするには、以下のように /etc/X11/xorg.conf.d/51-joystick.conf を編集してください (ファイルが存在しない場合は作成してください):

/etc/X11/xorg.conf.d/51-joystick.conf
Section "InputClass"
        Identifier "joystick catchall"
        MatchIsJoystick "on"
        MatchDevicePath "/dev/input/event*"
        Driver "joystick"
        Option "StartKeysEnabled" "False"       #Disable mouse
        Option "StartMouseEnabled" "False"      #support
EndSection

ゲームパッドでキーストロークを送る

qjoypadAURantimicroAUR[リンク切れ: パッケージが存在しません] などゲームパッドでキー操作するプログラムがあり、どれも X.org の設定をせずとも問題なく動作します。

X.org

Xorg の再起動をあまりしないような環境では、X の起動時にのみロードされる静的な設定なので良い設定手段でしょう。

まず、xf86-input-joystickAUR をインストールします。そして、以下のように /etc/X11/xorg.conf.d/51-joystick.conf を作成:

 Section "InputClass"
  Identifier "Joystick hat mapping"
  Option "StartKeysEnabled" "True"
  #MatchIsJoystick "on"
  Option "MapAxis5" "keylow=113 keyhigh=114"
  Option "MapAxis6" "keylow=111 keyhigh=116"
 EndSection
ノート: MatchIsJoystick "on" 行は必ずしも必要ではありませんが、アンコメントしてもかまいません。

特定のデバイス

ほとんどのゲームパッド (特に USB を使っているコントローラー) は何も設定しなくても動作しますが、ゲームパッドによっては設定が必要な場合があります。最初に試してみて動かなかったときでも、諦めずにドキュメントを読んでみて下さい。

ダンスパッド

ほとんどのダンスパッドが動作しますが、一部のダンスパッド (特にアダプタを使用してビデオゲームコンソールと接続するタイプ) は矢印ボタンがジョイスティックとしてマッピングされてしまうことがあり、左右や上下を同時に押すことができなくなります。xpad で認識されるデバイスならモジュールオプションを使って挙動を修正できます:

# modprobe -r xpad
# modprobe xpad dpad_to_buttons=1

Logitech Thunderpad Digital

analog モジュールを使っている場合 Logitech Thunderpad Digital は全てのボタンを表示しません。このコントローラーを使う場合は adi モジュールを使って下さい。

Nintendo Gamecube コントローラー

Dolphin Emulator には公式の Nintendo USB アダプタと GameCube コントローラーを使う方法を説明した ページ を wiki に用意しています。この設定はスイッチを "Wii U" に設定した場合の Mayflash Controller Adapter でも使えます。

デフォルトでは、コントローラーは udev で登録されますが、root ユーザーしか読み取ることができません。以下の udev ルールを追加することで修正できます:

/etc/udev/rules.d/51-gcadapter.rules
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="057e", ATTRS{idProduct}=="0337", MODE="0666"

上記は特定のベンダー・プロダクト ID (公式 USB アダプタ) の USB デバイスにマッチします。デバイスファイルのパーティションを 0666 に設定することで root で実行したプログラムでなくてもデバイスの入力を読み込めるようになります。

以下を実行することで新しい設定で udev をリロードできます:

# udevadm control --reload-rules

PlayStation 3/4 コントローラー

DualShock 3, DualShock 4, Sixaxis ゲームパッドは USB で接続された時に設定なしで動作します (操作を開始するには PS ボタンを押さなくてはなりません)。振動機能はカーネル 3.14 からサポートされています。また、Bluetooth でワイヤレスに使うことも可能です。

Steam は PS3 パッドとして正しく認識し、PS ボタンで Big Picture を起動することが可能です。Big Picture やゲームによっては 360 コントローラーのように振る舞うことができます。ゲームパッドによるマウス操作はデフォルトでオンになっています。ゲームをプレイする前にオフにしたいときは、#ゲームパッドのマウス操作を無効にする を見て下さい。

Bluetooth で接続

bluez, bluez-plugins, bluez-utils パッケージをインストールしてください。sixaxis プラグインが含まれています。そして bluetooth.service起動して、USB でコントローラーを接続してください。プラグインが PC の bluetooth アドレスを自動的にコントローラーに書き込みます。

また、share ボタンと PlayStation ボタンを同時に押すことでゲームパッドをペアリングモードに移行して、通常通りにペアリングすることもできます。

ゲームを遊び終わったらコントローラは切断するようにしてください。コントローラが接続したままだとバッテリーが消費されます。

ノート: コントローラが接続されない場合、bluetooth インターフェイスの電源が入っていること、コントローラを信用済みとしていることを確認してください (Bluetooth を参照)。

iPEGA-9017s などの Bluetooth ゲームパッド

Android や iOS デバイス向けに作られた iPEGA-9017s などの bluetooth ゲームパッドを使用したい場合 xboxdrvAUR, bluez, bluez-plugins, bluez-utils が必要です。ゲームパッドモードで接続する必要があります (他のモードがあった場合、ゲームパッドモードを選択してください)。技術的には使用できる状態でも、大抵のゲームはスマートフォン用ゲームパッドを認識しないため、アプリケーションごとに個別にマッピングしてやる必要があります。全てのアプリケーションで使いたい場合 xboxdrvAUR を使用して Microsoft X360 コントローラに偽装させるのが一番簡単です。接続したら udev ルールを作成して永続的な名前を割り当てることで、設定が楽になります。

/etc/udev/rules.d/99-btjoy.rules
#Create a symlink to appropriate /dev/input/eventX at /dev/btjoy
ACTION=="add", SUBSYSTEM=="input", ATTRS{name}=="Bluetooth Gamepad", ATTRS{uniq}=="00:17:02:01:ae:2a", SYMLINK+="btjoy"

"Bluetooth Gampad" は使用しているデバイスの名前、"00:17:02:01:ae:2a" はデバイスのアドレスに置き換えてください。

そして、xboxdrvAUR 用の設定を以下のように作成します:

~/.config/xboxdrv/ipega.conf
#iPEGA PG-9017S Config 

[xboxdrv]
evdev-debug = true
evdev-grab = true
rumble = false
mimic-xpad = true

[evdev-absmap]
ABS_HAT0X = dpad_x
ABS_HAT0Y = dpad_y

ABS_X = X1
ABS_Y = Y1

ABS_Z  = X2
ABS_RZ = Y2

[axismap]
-Y1 = Y1
-Y2 = Y2

[evdev-keymap]
BTN_EAST=a
BTN_C=b
BTN_NORTH=y
BTN_SOUTH=x
BTN_TR2=start
BTN_TL2=back
BTN_Z=rt
BTN_WEST=lt

BTN_MODE = guide

利用可能なオプションについては xboxdrv のマニュアルを参照してください。

設定が完了してデバイスを接続したら以下のように xboxdrvAUR を起動します:

# xboxdrv --evdev /dev/btjoy --config .config/xboxdrv/ipega.conf

これで xboxdrv が動作している間に bluetooth ゲームパッドを使えるようになります。

Steam コントローラー

steam パッケージ (バージョン 1.0.0.51-1 以上) はコントローラを認識して、Steam が起動している間、キーボード/マウス/ゲームパッドのエミュレーションを行います。ゲームパッドのエミュレーションを使うには Steam のゲーム内オーバーレイを有効にする必要があります。パッケージをインストールして Steam を起動してもコントローラが動作しない場合、root 権限で udevadm trigger を実行したりドングルを抜き差ししてみてください。どうやっても動作しない場合、ドングルを接続したままコンピュータを再起動してください。

Steam コントローラを動作させることができなかった場合は#Steam コントローラーがペアリングできないを見てください。

python-steamcontroller-gitAUR をインストールすることで、Steam がなくてもコントローラを使うことができます。また、sc-controllerAUR をインストールすれば Steam クライアントに付属しているような汎用の設定ツールを使うことができます。

一部のデスクトップ環境ではオンスクリーンキーボードで文字を入力しようしたときにフリーズすることがあります。原因はウィンドウのフォーカスです。ウィンドウマネージャの設定から、新しいウィンドウを自動的にフォーカスしたり、マウスに従ってフォーカスすることができないか確認してください。

ノート: 同梱ランタイムを使わずに Steam を起動している場合、特定のゲームでコントローラを使うのにオーバーレイを無効にする必要があります (Rocket Wars, Rocket League, Binding of Isaac など)。ライブラリからゲームを右クリックして "Properties" を選択し、"Enable Steam Overlay" のチェックを外してください。

Wine

python-steamcontroller-gitAUR を使うことで Wine で動作するゲームでも Steam コントローラを利用することが可能です。xbox360cemu.v.3.0 (例: https://github.com/jacobmischka/ds4-in-wine/tree/master/xbox360cemu.v.3.0) アプリケーションをダウンロードしてください。そして dinput8.dll, xbox360cemu.ini, xinput1_3.dll, xinput_9_1_0.dll ファイルをゲームの実行ファイルがあるディレクトリにコピーしてください。xbox360cemu.ini を編集して [PAD1] の値を変更することで Steam コントローラを Xbox コントローラとしてマッピングできます。

xbox360cemu.ini
Right Analog X=4
Right Analog Y=-5
A=1
B=2
X=3
Y=4
Back=7
Start=8
Left Thumb=10
Right Thumb=11
Left Trigger=a3
Right Trigger=a6

設定したら Xbox360 モードで python-steamcontroller を起動してください (sc-xbox.py start)。xbox360cemu.v.3.0 から XInputTest.exe を同一ディレクトリにコピーして Wine で起動することで、マッピングが正しいかどうかテストすることができます。ただしマウスやキーボードのエミュレーションは機能しません。

また、sc-controllerAUR (github) を使うことで steam の設定ツールと同じようにグラフィカルな設定が可能です。現時点ではバグが多少ありますが、簡単にコントローラの設定ができます。

Xbox 360 コントローラー

このコントローラーはパッケージを別にインストールしなくても動作しますが、無線コントローラーには無線レシーバーが必要です (charge-and-play ケーブルはコントローラとの通信に使えません)。有線コントローラーと無線レシーバーはどちらも xpad カーネルモジュールによってサポートされています。

デフォルトで、コントローラーと関連付けられたデバイス (例: /dev/input/event14) は root に所有されます。これは root グループに入っており、所有者にしかデバイスを読み書きすることが許可されません (600)。結果として、アプリケーションはスーパーユーザー権限で実行しないかぎりコントローラーを使用できなくなります。これを修正するため、以下の udev ルールを作成してください。

/etc/udev/rules.d/50-event.rules
KERNEL=="event*", GROUP="games", MODE="660"

この udev ルールは games グループのメンバーであるユーザーがコントローラーを使えるようにします。

残念ながら xpad には新しい無線コントローラーで問題が起こります:

解決方法は xboxdrvAUR を使うことです。これはユーザースペースで動作するもうひとつのドライバーです。システムサービスとして起動することができます。もしくは SteamOS のパッチがあたった xpad (steamos-xpad-dkmsAUR) も以上の問題を修正しています。

コントローラーを使ってマウスの制御や、ボタンのキーへのマッピングなどをしたい場合、xf86-input-joystick パッケージを使う必要があります (設定のヘルプは man joystick で見れます)。マウスが隅で固まってしまうときは、/etc/X11/xorg.conf.d/50-joystick.confMatchDevicePath/dev/input/event* から /dev/input/js* に変更すれば直るでしょう。

ヒント: TLP 電源管理デーモンを使っている場合、Microsoft の無線アダプタの接続に問題が発生することがあります (例: インジケータ LED がアダプタを接続した数秒後に消えてしまい、コントローラーの接続が失敗する)。これは TLP の USB 自動サスペンド機能が原因です。この機能を完全に無効化するか、Microsoft の無線アダプタのデバイス ID を機能のブラックリストに追加することで問題は解決します (詳しくは TLP configuration をチェック)。

SteamOS の xpad

デフォルトの xpad カーネルモジュールで問題がおこる場合、AURsteamos-xpad-dkmsAUR でインストールできる SteamOS バージョンを使うことができます。Xbox360 コントローラと GameMaker Studio で作成されたゲームには互換問題が存在します。この問題が発生したときは、xboxdrv を使うしかありません。YoYo Games はこの問題を彼らの製品のバグとして認めておらず、修正される見込みは僅かです。

インストールする前に、DKMS をインストールして実行してください。それから修正版のカーネルモジュール steamos-xpad-dkmsAURAUR からインストールして下さい。インストール中に新しい xpad カーネルモジュールがカーネルに結び付けられるのが確認できると思います:

Creating symlink /var/lib/dkms/steamos-xpad-dkms/0.1/source ->
                 /usr/src/steamos-xpad-dkms-0.1
 
DKMS: add completed.
 
Kernel preparation unnecessary for this kernel.  Skipping...
 
Building module:
cleaning build area....
make KERNELRELEASE=3.12.8-1-ARCH KVERSION=3.12.8-1-ARCH....
cleaning build area....

再起動すれば動作するようになります。

xboxdrv

xboxdrv は xpad の代わりとなるドライバーで、特定のコントローラでは多くの機能を提供します。ユーザー空間で動作し、システムサービスとして起動できます。

xboxdrvAUR パッケージでインストールして、xboxdrv.service起動有効化してください。

コントローラが認識されるのに Steam のゲームで機能しない場合やマッピングが間違っている場合、以下のように設定を修正してください:

/etc/default/xboxdrv/
[xboxdrv]
silent = true
device-name = "Xbox 360 Wireless Receiver"
mimic-xpad = true
deadzone = 4000

[xboxdrv-daemon]
dbus = disabled

修正したら xboxdrv.service を再起動してください。

xboxdrv で2つのコントローラーを使う

xboxdrv は多数のコントローラーをサポートしていますが、デーモンモード でしか動作しません。 一番シンプルな方法はサービスとして xboxdrv をデーモンモードで起動して:

ExecStart = /usr/bin/xboxdrv -D -c /etc/conf.d/xboxdrv

設定ファイルに2番目のコントローラーのサポートを追加することです:

[xboxdrv]
silent = true
next-controller = true
[xboxdrv-daemon]
dbus = disabled
Xbox 360 コントローラーに偽装する

xboxdrv を使うことで --mimic-xpad スイッチによってあらゆるコントローラーを Xbox 360 コントローラーとして登録することができます。Xbox 360 コントローラーをサポートしていて、他のゲームパッドでは問題がおこるゲームでありがたい機能です。

まず、コントローラーのボタンやスティックの名前を確認する必要があります。evtest を使えば確認できます。evtest を実行してコントローラーに対応するデバイスのイベント ID 番号 (/dev/input/event*) を選択してください。コントローラーのボタンを押したりスティックを動かしてボタンやスティックの名前を調べます。

以下は出力の例です:

Event: time 1380985017.964843, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90003
Event: time 1380985017.964843, type 1 (EV_KEY), code 290 (BTN_THUMB2), value 1
Event: time 1380985017.964843, -------------- SYN_REPORT ------------
Event: time 1380985018.076843, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90003
Event: time 1380985018.076843, type 1 (EV_KEY), code 290 (BTN_THUMB2), value 0
Event: time 1380985018.076843, -------------- SYN_REPORT ------------
Event: time 1380985018.460841, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90002
Event: time 1380985018.460841, type 1 (EV_KEY), code 289 (BTN_THUMB), value 1
Event: time 1380985018.460841, -------------- SYN_REPORT ------------
Event: time 1380985018.572835, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90002
Event: time 1380985018.572835, type 1 (EV_KEY), code 289 (BTN_THUMB), value 0
Event: time 1380985018.572835, -------------- SYN_REPORT ------------
Event: time 1380985019.980824, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90006
Event: time 1380985019.980824, type 1 (EV_KEY), code 293 (BTN_PINKIE), value 1
Event: time 1380985019.980824, -------------- SYN_REPORT ------------
Event: time 1380985020.092835, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90006
Event: time 1380985020.092835, type 1 (EV_KEY), code 293 (BTN_PINKIE), value 0
Event: time 1380985020.092835, -------------- SYN_REPORT ------------
Event: time 1380985023.596806, type 3 (EV_ABS), code 3 (ABS_RX), value 18
Event: time 1380985023.596806, -------------- SYN_REPORT ------------
Event: time 1380985023.612811, type 3 (EV_ABS), code 3 (ABS_RX), value 0
Event: time 1380985023.612811, -------------- SYN_REPORT ------------
Event: time 1380985023.708768, type 3 (EV_ABS), code 3 (ABS_RX), value 14
Event: time 1380985023.708768, -------------- SYN_REPORT ------------
Event: time 1380985023.724772, type 3 (EV_ABS), code 3 (ABS_RX), value 128
Event: time 1380985023.724772, -------------- SYN_REPORT ------------

上記の場合 BTN_THUMB, BTN_THUMB2, BTN_PINKIE がボタンで、ABS_RX が右アナログスティックの X 軸になります。 そしてこの名前を使って次のようなコマンドで Xbox 360 コントローラーにみせかけることができます:

$ xboxdrv --evdev /dev/input/event* --evdev-absmap ABS_RX=X2 --evdev-keymap BTN_THUMB2=a,BTN_THUMB=b,BTN_PINKIE=rt --mimic-xpad

上の例は不完全です。デモンストレーション用に1つの軸と3つのボタンしかマップしません。xboxdrv --help-button を使って Xbox コントローラーのボタンと軸を見て、上のコマンドに拡充してそれぞれ割り当てて下さい。軸のマッピングは --evdev--absmap の後に、ボタンのマッピングは --evdev-keymap の後に記述します (カンマで区切り、スペースは使いません)。

デフォルトで、xboxdrv は全てのイベントをターミナルに出力します。これによってマッピングが正しいかどうかテストすることが可能です。--silent オプションを追加すると出力がされなくなります。

USB で接続した Playstation 3 コントローラー

PS3 コントローラーを使っていて USB で接続している場合、xboxdrv には初めから組み込まれたマッピングが存在します。次のプログラムを実行 (して動作中のドライバを取外) すれば動作するようになります。

# xboxdrv --silent --detach-kernel-driver
Bluetooth で接続した Playstation 3 コントローラー

bluetooth を通してプレイステーション3のコントローラーを使うには sixpairAUR ユーティリティをインストールする必要があります。

sixpair をインストールした後はコントローラーを USB ケーブルで接続して sixpair を実行してください:

# sixpair

USB からコントローラーを切断して5分間待機してください (本当に待機する必要があるのかは定かでない)。

そして bluez でペアリングを行います。bluez-utilsbluez-plugins パッケージが必要です。

全ての bluetooth ユーティリティ (bluedevil や bluemon) を無効にしてください。

bluetoothctl ユーティリティを実行します:

# bluetoothctl

bluetooth のプロンプトが表示されます。

プレイステーションボタンを押して、接続・切断のメッセージを見てデバイスのアドレスをコピーしてください (例: 38:C0:96:56:4D:AA)。

ランプの点滅が止まるまで待って下さい。

そして、以下を入力してください:

agent on
default-agent
discoverable on
pairable on

もう一度プレイステーションボタンを押して、点滅している間に次を入力します:

connect <device_addr>

デバイスが利用可能にならない場合 (接続と切断を繰り返します) 以下のような表示がされるまで上のコマンドを試し続けてください:

[CHG] Device <device_addr> Modalias: usb:v054Cp0268d0100
[CHG] Device <device_addr> UUIDs:
       00001124-0000-1000-8000-00805f9b34fb
       00001200-0000-1000-8000-00805f9b34fb

そしてデバイスを認証してください:

trust <device_addr>

これで完了です。

次からはプレイステーションボタンを押せば自動的に接続されます。

また、無効にした bluetooth アプレット・モニターをもう一度有効にすることができます。.

コントローラーを使わないときは切断するのを忘れないで下さい。接続したままにしておくと、バッテリーを消費します。

xboxdrv を使って xbox360 コントローラーをエミュレートする場合は udev ルールを作成するのが良いでしょう。

udev ルールを作成する

以下の内容で新しい udev ルールを作成してください (例えば 99 または 98-dualshock.rules を /etc/udev/rules.d/ に配置):

KERNEL=="event*", SUBSYSTEM=="input", ATTRS{uniq}=="<device_addr_you_got_on_pairing>", SYMLINK+="input/dualshock3"

xboxdrv を新しいデバイスで実行します:

xboxdrv --evdev /dev/input/dualshock3 --mimic-xpad

mimic-xpad が動作しない場合は、xboxdrv [1] による設定ファイルを使用して xboxdrv セクションに以下を追加してください:

mimic-xpad = true

そして evdev 行を以下のように置き換えてください:

evdev = /dev/input/dualshock3 (or whatever other name you gave in the udev_rule)

設定したら、xboxdrv を実行します:

# xboxdrv -c config_file

楽しい時間をお過ごしください。

Playstation 2 アダプタ

PS2 デュアルアダプターのボタンマッピングを修正して Xbox コントローラーに見せかけるために、以下のコマンドを使うことができます:

# xboxdrv --evdev /dev/input/event* \
  --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_RZ=x2,ABS_Z=y2,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \
  --axismap -Y1=Y1,-Y2=Y2 \
  --evdev-keymap   BTN_TOP=x,BTN_TRIGGER=y,BTN_THUMB2=a,BTN_THUMB=b,BTN_BASE3=back,BTN_BASE4=start,BTN_BASE=lb,BTN_BASE2=rb,BTN_TOP2=lt,BTN_PINKIE=rt,BTN_BASE5=tl,BTN_BASE6=tr \
  --mimic-xpad --silent
Logitech Dual Action

Logitech Dual Action ゲームパッドは PS2 のパッドと似ているマッピングを持っていますが、Xbox コントローラーのように使うにはいくつかのボタンとトリガーを交換する必要があります:

# xboxdrv --evdev /dev/input/event* \
  --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_RZ=x2,ABS_Z=y2,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \
  --axismap -Y1=Y1,-Y2=Y2 \
  --evdev-keymap BTN_TRIGGER=x,BTN_TOP=y,BTN_THUMB=a,BTN_THUMB2=b,BTN_BASE3=back,BTN_BASE4=start,BTN_BASE=lt,BTN_BASE2=rt,BTN_TOP2=lb,BTN_PINKIE=rb,BTN_BASE5=tl,BTN_BASE6=tr \
  --mimic-xpad --silent
Playstation 4 コントローラー

PS4 コントローラーのボタンマッピングを修正するために、xboxdrv で以下のコマンドを使用するか、または ds4drv プログラムを試すことができます:

# xboxdrv \
  --evdev /dev/input/by-id/usb-Sony_Computer_Entertainment_Wireless_Controller-event-joystick\
  --evdev-absmap ABS_X=x1,ABS_Y=y1                 \
  --evdev-absmap ABS_Z=x2,ABS_RZ=y2                \
  --evdev-absmap ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \
  --evdev-keymap BTN_A=x,BTN_B=a                   \
  --evdev-keymap BTN_C=b,BTN_X=y                   \
  --evdev-keymap BTN_Y=lb,BTN_Z=rb                 \
  --evdev-keymap BTN_TL=lt,BTN_TR=rt               \
  --evdev-keymap BTN_SELECT=tl,BTN_START=tr        \
  --evdev-keymap BTN_TL2=back,BTN_TR2=start        \
  --evdev-keymap BTN_MODE=guide                    \
  --axismap -y1=y1,-y2=y2                          \
  --mimic-xpad                                     \
  --silent

ヒントとテクニック

ネットワークを介して Gamepad を使う

他のコンピュータからネットワークを介して Gamepad を使いたい場合、USB/IP または netstick-gitAUR を使用することで可能です。

トラブルシューティング

ゲームパッドでマウスが動く

ときどき USB ゲームパッドが HID マウスとして認識されることがあります (X 内のみで、/dev/input/js0 としてもインストールされる)。カーソルがゲームパッドによって動いたり、接続した後に画面の右端に逃げていくのは既知の問題です。アプリケーションが自力でゲームパッドを検出できる場合は、xf86-input-joystick パッケージを削除することができます。

もっと平和的な解決方法はゲームパッドのマウス操作を無効にすることです。

FNA/SDL ベースのゲームでゲームパッドが機能しない

マイナーなゲームパッドを使っていると、SDL ベースのゲームで、ゲームパッドが認識されないという問題が発生することがあります。2015年5月14日 から、FNA はゲームの実行フォルダに gamecontrollerdb.txt をおけるようになっています (例: SDL_GameControllerDB)。

古いバージョンの FNA や SDL の場合の対処方法としては、http://libsdl.org/ から SDL のソースコードをダウンロードして自分でマッピングすることができます。/test/ を開いて、controllermap.c プログラムをコンパイル (あるいは controllermapAUR をインストール) してテストを実行してください。controllermap テストを完了すると、guid が生成されるので SDL_GAMECONTROLLERCONFIG 環境変数に設定することで SDL/FNA のゲームから使うことができます。例:

$ export SDL_GAMECONTROLLERCONFIG="030000008f0e00000300000010010000,GreenAsia Inc. USB Joystick,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,"

ゲームパッドがどのプログラムからも認識されない

Steam など、ソフトウェアによっては最初に接続されたゲームパッドしか認識しないことがあります。Microsoft の無線周辺機器デバイスのドライバーにバグが存在するため、bluetooth ドングルでもこの問題が起こることがあります。/dev/input/js*/dev/input/event* がキーボードの bluetooth トランシーバーに属していることが確認できたら /etc/udev/rules.d/99-btcleanup.rules を作成することで自動的に排除することができます:

/etc/udev/rules.d/99-btcleanup.rules
ACTION=="add", KERNEL=="js[0-9]*", SUBSYSTEM=="input", KERNELS=="...", ATTRS{bInterfaceSubClass}=="00", ATTRS{bInterfaceProtocol}=="00", ATTRS{bInterfaceNumber}=="02", RUN+="/usr/bin/rm /dev/input/js%n"
ACTION=="add", KERNEL=="event*", SUBSYSTEM=="input", KERNELS=="...", ATTRS{bInterfaceSubClass}=="00", ATTRS{bInterfaceProtocol}=="00", ATTRS{bInterfaceNumber}=="02", RUN+="/usr/bin/rm /dev/input/event%n"

KERNELS=="..." はあなたのデバイスに合わせて置き換えてください。次を実行することで正しい値が確認できます:

# udevadm info -an /dev/input/js0

問題のデバイスは /dev/input/js0 と仮定しています。ルールを記述したらルールをリロードしてください:

# udevadm control --reload

そして問題のデバイスを再接続します。joystick や event デバイスが外されても、番号は予約されています。ただしファイルは扱われます。

Steam コントローラーがペアリングできない

どんな状況に発生するのかは不明ですがパッケージに含まれている Steam コントローラの udev ルールが機能しないことがあります (FS#47330)。最も信頼性のある対応方法はコントローラを読み取り専用にすることです。/usr/lib/udev/rules.d/80-steam-controller-permission.rule ルールを /etc/udev/rules.d にコピーして MODE="0666" を設定:

/etc/udev/rules.d/80-steam-controller-permission.rule
#USB devices
SUBSYSTEM=="usb", ATTRS{idVendor}=="28de", MODE="0666", TAG+="uaccess"
KERNEL=="uinput", SUBSYSTEM=="misc", OPTIONS+="static_node=uinput", TAG+="uaccess"

無線・有線接続のホットスワップやマイクロ USB ケーブルを使ってドングルの接続時に Steam コントローラが認識されるようにしたい場合、もっと複雑な udev ルールが必要です。上記のルールではコントローラが動作しなくなったりマウスやキーボードとして認識されてしまう可能性があります。Valve の開発者は以下のルールを提案しています [2]:

/etc/udev/rules.d/99-steam-controller-perms.rules
# This rule is needed for basic functionality of the controller in Steam and keyboard/mouse emulation
SUBSYSTEM=="usb", ATTRS{idVendor}=="28de", MODE="0666"

# This rule is necessary for gamepad emulation
KERNEL=="uinput", MODE="0660", GROUP="steamcontroller", OPTIONS+="static_node=uinput"

# DualShock 4 wired
SUBSYSTEM=="usb", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="05c4", MODE="0666"
# DualShock 4 wireless adapter
SUBSYSTEM=="usb", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="0ba0", MODE="0666"
# DualShock 4 slim wired
SUBSYSTEM=="usb", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="09cc", MODE="0666"

# Valve HID devices over USB hidraw
KERNEL=="hidraw*", ATTRS{idVendor}=="28de", MODE="0666"

# Valve HID devices over bluetooth hidraw
KERNEL=="hidraw*", KERNELS=="*28DE:*", MODE="0666"

# DualShock 4 over bluetooth hidraw
KERNEL=="hidraw*", KERNELS=="*054C:05C4*", MODE="0666"

# DualShock 4 Slim over bluetooth hidraw
KERNEL=="hidraw*", KERNELS=="*054C:09CC*", MODE="0666" 

Steam コントローラユーザーのグループを作成:

# groupadd steamcontroller

使用しているユーザーをグループに追加:

# gpasswd -a $USER steamcontroller