ゲームパッド
ゲームパッドを Linux で使うのには少し手間がかかるかもしれません。サポートが薄いためではなく、あなたのゲームパッドを動かすのにロードすべきモジュールを見つける必要があり、そしてそれがわかりづらいことがあるからです。
目次
- 1 ゲームパッド入力システム
- 2 必要なモジュールの確認
- 3 設定のテスト
- 4 デッドゾーンとキャリブレーションの設定
- 5 ゲームパッドのマウス操作を無効にする
- 6 ゲームパッドでキーストロークを送る
- 7 特定のデバイス
- 8 トラブルシューティング
ゲームパッド入力システム
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 する必要があります。usbhid
と joydev
です。USB マウスやキーボードを使っている場合、usbhid
は既にロードされるので joydev
モジュールだけをロードしてください。
設定のテスト
モジュールがロードされたら、新しいデバイスが認識されるはずです: /dev/input/js0
。また、/dev/input/by-id
ディレクトリに -event-joystick
で終わるファイルが作られます。デバイスを cat
することで動作するか確認できます。スティックを動かして、全てのボタンを押して下さい。画面に文字化けが表示されるはずです。
Wine での確認とテストは基本的に wine control joy.cpl
で両方できます。
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-gitAUR の jstest-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
ゲームパッドでキーストロークを送る
qjoypadAUR や antimicroAUR などゲームパッドでキー操作するプログラムがあり、どれも 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
特定のデバイス
ほとんどのゲームパッド (特に 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 ボタンを同時に押すことでゲームパッドをペアリングモードに移行して、通常通りにペアリングすることもできます。
ゲームを遊び終わったらコントローラは切断するようにしてください。コントローラが接続したままだとバッテリーが消費されます。
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 クライアントに付属しているような汎用の設定ツールを使うことができます。
一部のデスクトップ環境ではオンスクリーンキーボードで文字を入力しようしたときにフリーズすることがあります。原因はウィンドウのフォーカスです。ウィンドウマネージャの設定から、新しいウィンドウを自動的にフォーカスしたり、マウスに従ってフォーカスすることができないか確認してください。
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 には新しい無線コントローラーで問題が起こります:
- ボタンマッピングがおかしい (discussion in Steam bugtracker)。
- 同期が動作しない。4つの赤い LED が点滅しますが、コントローラーは動作します (discussion in Arch Forum)。
解決方法は xboxdrvAUR を使うことです。これはユーザースペースで動作するもうひとつのドライバーです。システムサービスとして起動することができます。もしくは SteamOS のパッチがあたった xpad (steamos-xpad-dkmsAUR) も以上の問題を修正しています。
コントローラーを使ってマウスの制御や、ボタンのキーへのマッピングなどをしたい場合、xf86-input-joystick
パッケージを使う必要があります (設定のヘルプは man joystick
で見れます)。マウスが隅で固まってしまうときは、/etc/X11/xorg.conf.d/50-joystick.conf
の MatchDevicePath
を /dev/input/event*
から /dev/input/js*
に変更すれば直るでしょう。
SteamOS の xpad
デフォルトの xpad
カーネルモジュールで問題がおこる場合、AUR の steamos-xpad-dkmsAUR でインストールできる SteamOS バージョンを使うことができます。Xbox360 コントローラと GameMaker Studio で作成されたゲームには互換問題が存在します。この問題が発生したときは、xboxdrv を使うしかありません。YoYo Games はこの問題を彼らの製品のバグとして認めておらず、修正される見込みは僅かです。
インストールする前に、DKMS をインストールして実行してください。それから修正版のカーネルモジュール steamos-xpad-dkmsAUR を AUR からインストールして下さい。インストール中に新しい 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-utils と bluez-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
トラブルシューティング
ゲームパッドでマウスが動く
ときどき 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