YouDuck.ai

ゲームパッドのペアリング

最終更新

パッド 1 台につき一度だけ。以降は padd.service が起動時から、接続されたパッドを自動で扱います。手動で起動するものはなく、ssh セッションが切れても止まりません。

パッドをペアリングモードにする

Xbox コントローラーでは 2 回の操作が必要で、間違えるのは決まって 2 回目です。

  1. Xbox ボタンを短く押して電源を入れる。長押しは電源オフです。
  2. 上面の小さな Sync ボタンを、ランプが速く点滅するまで押す。ゆっくりの点滅は「電源が入っているだけ」です。

DualSense の場合は Create と PS を同時に長押しし、ライトバーが点滅するまで待ちます。

ペアリングする

sudo robotctl pad pair
sudo robotctl pad pair 78:86:2E:BB:13:28
sudo robotctl pad pair --timeout 5

MAC アドレスは不要です。ロボットがペアリングモードのパッドを探し、見つけたものを取り込みます。paired だけでなく trusted にもなり、これが再起動後に誰もログインしていなくても自動で再接続できる理由です。

2 台が同時にペアリングモードにあると、推測せずに拒否して両方のアドレスを表示します。アドレス指定は、ロボットがゲームパッドと認識しない機器をペアリングする方法でもあります。

2 台目に 1 台目の削除は不要

すでにボンドされたパッドは範囲内にあり毎回のスキャンに現れるため、ロボットはペアリングモードのものを優先します。両方とも paired のまま残り、padd は接続されたほうを扱います。

代わりに、新しいパッドがペアリングモードにない状態で再実行すると、検索時間を使い切ってから既存のパッドを報告します。信頼関係を作り直すだけなら --timeout 5 を付けてください。

確認する

robotctl pad status
pad     Xbox Wireless Controller 78:86:2E:BB:13:28  connected
padd    active — driving whatever pad connects

2 行なのは、両者が別々に壊れるからです。接続済みのパッドと死んだドライバの組み合わせは、外から見ると「無視されている」のと区別がつきません。

paired but NOT trusted は覚えておく価値のある状態です。いまは使えますが再起動後に自動再接続しません。再接続の承認にはエージェントが必要で、起動時には存在しないためです。pad pair を再実行すれば直ります。

解除する

sudo robotctl pad forget 78:86:2E:BB:13:28

これはロボット側のボンドだけを削除します。ロボットが消せるのはその半分だけです。

パッドは自分側の鍵を保持するため、再ペアリングにはもう一度ペアリングモードに入れる必要があります。そうしないとロボットが持っていない鍵を持って接続してきて、拒否されます。

Xbox パッドが保持できるホストボンドは 1 つだけで、途中で失敗したペアリングはこのボードにもう存在しない鍵を残します。この失敗は、ボードが壊れている場合とまったく同じに見えます。

ペアリングが繰り返し失敗するなら、一度ノート PC にペアリングしてから PC 側で削除してください。この操作がボンドスロットを消費して解放します。ペアリングモードに入れるだけでは確実には解放されません。

そもそもボンドできない場合

aic8800 無線チップでは、btd がアドバタイズしている間は新しいボンドを作成できません。該当するボードは --pause-btd-on-pair で再プロビジョニングします。

./scripts/provision-board.sh --pause-btd-on-pair pierre@192.168.1.42

/var/lib/robot/weird-ble にマーカーを残すだけで、他は何も変えません。このマーカーがあるボードでは sudo robotctl pad pair が残りを自分で処理します(btd を停止、アダプタを電源再投入、ペアリング、btd 再開)。既存のボンドには影響しません。

一部の個体は Privacy 設定も必要

btd を止めても BlueZ の既定 Privacy = off ではボンドできない個体があります。それらには --weird-ble が必要で、これは一時停止を含み、さらに Privacy = device を設定します。

まず一時停止だけを試してください。 一時停止だけで足りるボードに Privacy = device を設定すると、何も付けないより悪い失敗になります。パッドはボンドできるものの Encryption Change: PIN or Key Missing (0x06) で切断を繰り返し、入力デバイスが作られません。

このエラーが出たら --weird-ble を外し、一時停止だけを残します。

そのボードで手動ペアリングする場合

sudo systemctl stop btd
sudo bluetoothctl power off && sudo bluetoothctl power on

ペアリング後に sudo systemctl start btd

電源再投入は省略できません。 btd を止めただけでは、そのアドバタイズとペアリングエージェントがコントローラーに設定した IO capability が残り、パッドは依然としてボンドを拒否します。

走行中に切れる場合

リンクをその場で観察します。robotctl monitor を実行し p を押すと、パッドの生入力ストリーム(evdev レポートと、その間隔)が見えます。

無線が停止したことが分かるのはここだけです。padd からは見えない故障があります。リンクは接続されたまま、ロボットが古いコマンドで歩き続ける状態で、入力レポートの間隔を見ないと気づけません。

この画面はロボットがなくても動きます。サーボに電源が入っていないボードでは、monitor は拒否せずパッドのブロックを開きます。

関連