4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

udevでBluetoothとUSBの両方に対応したゲームパッドを同じデバイス名で扱う

Last updated at Posted at 2018-11-28

8Bitdo SN30Proは素晴らしい

コンパクトでUSB HIDとBluetoothに対応しているゲームパッドで、こんな素晴らしい製品があります。
image.png
http://amzn.asia/d/2cOiyGk
精度のよいアナログパッドがついていて、Bluetooth HIDで接続できる、かつコンパクトなゲームパッドってこれぐらいしかないんですよね。
また、ROS でロボットの開発をするときなど、有線でつながっているとロボットに引っ張られてケーブルが切れてしまうこともあり、Bluetoothが便利なのですが、シミュレータの開発などではUSBでつなぐほうが電池切れしないこともあり、両方接続できると便利です。

デバイス名を固定しよう

Linuxだと通常、ゲームパッドデバイスは/dev/input/js*として認識するのですが、時としてこのデバイス名がずれてしまい、非常に面倒くさいです。
また、私の使っているThinkpad Bluetoothキーボードはなぜかjsデバイスとして認識しているので、先にキーボードを接続するか、ジョイスティックをつなぐかで、デバイス名の順番が変わってしまいます。

udev ruleを書いて、bluetoothで接続した時にも、USBで接続したときでも、常に同じデバイス名で扱えるようにしましょう。

/etc/udev/rules.d/99-sn30projoy.rules
KERNEL=="js*", ATTRS{name}=="8Bitdo SN30 Pro", SYMLINK+="input/joy.sn30pro"
KERNEL=="js*", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="028e", SYMLINK+="input/joy.sn30pro"

udevルールをリロードする:

udevadm control --reload

この状態で、ゲームパッドをBluetoothで接続したり、USBで接続したりしてみましょう。
どちらでも、/dev/input/js.sn30proとして認識しているはずです。

SF30 Proでも

image.png
色違い(日本版スーファミカラー)のSF30という製品もあるようなのですが、SN30 ProのBluetoothのデバイス名はSN30 Proになっているので、おそらく外観だけでなくSF30 ProのBluetoothのデバイス名、USBのidVendor / idProduct はSN30 Proとは異なるでしょう。
SF30 Proをお持ちの方は、ぜひBluetoothで接続した場合とUSBで接続した場合のudevadm info -a -n [device name]([device name]は/dev/input/js[あなたの環境で認識しているjs番号])の結果をコメントで頂ければ、追記します。

参考

Arch Linux -udev
https://wiki.archlinux.jp/index.php/Udev#udev_.E3.83.AB.E3.83.BC.E3.83.AB.E3.82.92.E8.A8.98.E8.BF.B0.E3.81.99.E3.82.8B

4
5
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
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?