ゲームパッド
ゲームパッドを Linux で使うのには少し手間がかかるかもしれません。サポートが薄いためではなく、あなたのゲームパッドを動かすのにロードすべきモジュールを見つける必要があり、そしてそれがわかりづらいことがあるからです。
目次
ゲームパッド入力システム
実は Linux には異なる2つのゲームパッドの入力システムが存在します。オリジナルの 'Joystick' インターフェイスと新しい 'evdev' ベースのインターフェイスです。
/dev/input/jsX
は 'Joystick' API インターフェイスに /dev/input/eventX
は 'evdev' インターフェイス (こちらにはマウスやキーボードなど他の入力デバイスも含まれます) にそれぞれマップされています。
ほとんどの新しいゲームは 'evdev' インターフェイスをデフォルトで使います。しかしながらこのページで触れているツール (jscal, jstest, jstest-gtk) の多くは旧式の 'Joystick' でしか動作せず、これらのツールによる調整やマッピングがほとんど無駄になってしまうでしょう。'evdev' はリマッピングやキャリブレーションをサポートしておらず、サポートしているアプリケーションに任せっきりになっています。
SDL_JOYSTICK_DEVICE=/dev/input/js0
環境変数を設定することで 'Joystick' API を使うように SDL を強制させることができます。これは X3 などのゲームで役に立ちます。
wine での確認とテストは基本的に wine control joy.cpl
で両方できます。
また、xorg ドライバー xf86-input-joystick というのも存在します。これはゲームパッドを使って xorg のマウス・キーボードを操作できるようにするだけのもので、ほとんどの人にとっては望んでいたものではないとなるでしょう。ゲームでの調整やボタンマッピングのために xorg.conf.d
ファイルを編集するのは無意味ということです。
必要なモジュールの確認
Linux における全てのゲームパッド関連のモジュールの広範な外観を見るには、Linux カーネルのソースを紐解く必要があります -- 特に Documentation セクションがそれです。残念ながら、pacman のカーネルパッケージには必要なドキュメントが含まれていません。カーネルソースをダウンロードした場合、Documentation/input/joystick.txt
を見て下さい。また、kernel.org から使用しているカーネルの "cgit" (git フロントエンド) リンクをクリックして、上部の "tree" リンクをクリックすることでカーネルのソースツリーをブラウズすることができます。こちらはカーネル 3.12.6 のドキュメントのリンクです。
Microsoft Sidewinder コントローラー (sidewinder
) や Logitech デジタルコントローラー (adi
) など、特定のモジュールを必要とするゲームパッドも存在します。多くの古いゲームパッドはシンプルな analog
モジュールで動作します。サウンドカードによるゲームポートにゲームパッドを接続している場合、サウンドカードドライバーをロードする必要があります - しかしながら、カードによっては、Soundblaster Live など、特定のゲームポートドライバーを持っているものもあります (emu10k1-gp
)。古い ISA サウンドカードは ns558
モジュールを必要とします。これは標準のゲームポートモジュールです。
Linux でゲームパッドを動作させるのに関連するモジュールは多々あるため、ここでは全てを説明することはできません。詳細については上記のドキュメントを見るようにしてください。
モジュールのロード
ゲームポートのモジュール (ns558
, emu10k1-gp
, cs461x
, など)、ゲームパッドのモジュール (analog
, sidewinder
, adi
, など)、そしてカーネルジョイスティックデバイスドライバー (joydev
) をロードする必要があります。これらを /etc/rc.conf
に追加するか、modprobe してください。gameport
モジュールは他のモジュールの依存モジュールとして、自動でロードされるはずです。
設定のテスト
モジュールがロードされたら、新しいデバイスが見つかるはずです: /dev/input/js0
。デバイスを cat
することで動作するか確認できます - スティックを動かして、全てのボタンを押して下さい。例えば Logitech Thunderpad Digital には2つのボタンが存在しますが analog
モジュールでは動作しません。ドキュメントには、このコントローラーのための固有の adi
モジュールが載っています。教訓として、最初に動作しなかったときも、諦めてはいけません。ドキュメントを隅々まで読んでみましょう。ドキュメントを見つけるまでは何も動かせないこともあります。
テストする他の方法は AUR の joyutilsAUR パッケージの jstest
を使うことです。このパッケージにはデバイスのキャリブレーションのための jscal
も入っています。一行では設定できないほどの多数のボタンや軸がある場合や、パッドに加速度センサが付いている場合は (何も起こってない時も新しいイベントを送り続けます) グラフィカルツールを使って下さい。AUR にはそのための jstest-gtk-gitAUR が存在します。sixaxis のテストとトラブルシューティングには必須です。
USB ゲームパッド
USB を動作させて、ジョイスティックドライバーを modprobe する必要があります。usbhid
と joydev
です。
usb マウスやキーボードを使っている場合、usbhid
は既にロードされるので joydev
モジュールだけをロードしてください。
PS3 コントローラー
Sixaxis ゲームパッドは USB で接続された時に設定なしで動作します (操作を開始するには PS ボタンを押さなくてはなりません)。振動機能はカーネル 3.14 からサポートされています。
Steam は PS3 パッドとして正しく認識し、PS ボタンで Big Picture を起動することが可能です。Big Picture やゲームによっては 360 コントローラーのように振る舞うことができます。ゲームパッドによるマウス操作はデフォルトでオンになっています。ゲームをプレイする前にオフにしたいときは、下を見て下さい。
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 バージョンを使うことができます。
インストールする前に、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 で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 コントローラーに見せかけるために、以下のコマンドを使うことができます:
sudo 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 コントローラーのように使うにはいくつかのボタンとトリガーを交換する必要があります:
sudo 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 プログラムを試すことができます:
#!/bin/bash sudo xboxdrv \ --evdev /dev/input/by-id/usb-Sony_Computer_Entertainment_Wireless_Controller-event-joys> --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 \ "$@"
デッドゾーンの設定
アナログ入力のデッドゾーンを設定したいときは、xorg (マウス・キーボードエミュレート用) とカーネルドライバー (ゲーム用) で別に設定する必要があります。
Xorg でデッドゾーン
/etc/X11/xorg.conf.d/50-joystick.conf
の EndSection
の前に以下のような行を追加してください:
Option "MapAxis1" "deadzone=1000"
1000 はデフォルトの値で、0 から 30000 の間で設定できます。軸番号を取得する方法はこの記事の #設定のテスト セクションを参照。
問題の軸で既にオプションを設定している場合は、スペースで区切ったパラメータの最後に deadzone=value
を入力してください。
カーネルドライバーでデッドゾーン
一番簡単な方法は jstest-gtk-gitAUR を使うことです。編集したいコントローラーを選択して、ダイアログの下にあるキャリブレーションボタンをクリックしてください。ジョイスティックやアナログスティックには CenterMin と CenterMax の値を、トリガーには RangeMin を設定します。設定したら 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
を使って下さい。
最後に SDL にジョイスティックデバイスを知らせるようにしてください。そうしないと無視されて固有の設定が使われるようになってしまいます。
以下を ~/.bashrc
に追加してください:
export SDL_JOYSTICK_DEVICE=/dev/input/jsX
(X はデバイスの番号に置き換えてください。)
ゲームパッドのマウス操作を無効にする
コントローラーを使ってゲームを遊びたいとき、ゲームパッドによるマウスカーソルの操作を無効にすると良いかもしれません。無効にするには、以下のように /etc/X11/xorg.conf.d/50-joystick.conf
を編集してください:
/etc/X11/xorg.conf.d/50-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
トラブルシューティング
ゲームパッドでマウスが動く
ときどき USB ゲームパッドが HID マウスとして認識されることがあります (X 内のみで、/dev/input/js0
としてもインストールされる)。カーソルがゲームパッドによって動いたり、接続した後に画面の右端に逃げていくのは既知の問題です。アプリケーションが自力でゲームパッドを検出できる場合は、xf86-input-joystick パッケージを削除することができます。
もっと平和的な解決方法はゲームパッドのマウス操作を無効にすることです。
ゲームパッドでキーストロークを送る
rejoystickAUR と qjoypadAUR という2つのゲームパッドでキー操作するプログラムがあり、どちらも X.org の設定をせずとも問題なく動作します。
X.org で
This is a good solution for systems where restarting Xorg is a rare event because it's a static configuration loaded only on X startup. I use it on my media PC running XBMC controlled with Logitech Cordless RumblePad 2. Due to a problem with the d-pad (a.k.a. "hat") being recognized as another axis, I used to run Joy2key as a workaround. Since I upgraded to XBMC 11.0 and joy2key 1.6.3-1, this setup no longer worked for me. I ended up taking a more direct approach and let Xorg handle joystick events.
First, make sure you have xf86-input-joystick installed. Then, create /etc/X11/xorg.conf.d/51-joystick.conf
like so:
Section "InputClass" Identifier "Joystick hat mapping" Option "StartKeysEnabled" "True" #MatchIsJoystick "on" Option "MapAxis5" "keylow=113 keyhigh=114" Option "MapAxis6" "keylow=111 keyhigh=116" EndSection
ゲームパッドがどのプログラムからも認識されない
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 デバイスが外されても、番号は予約されています。ただしファイルは扱われます。