ジョギング用のペンダントに USB の XBox コントローラを使う話です。
基本的には LinuxCNC Documentation Wiki: Simple Remote Pendant でいいんですが、これだけだとちょっと気に入らないので、結構がんばる必要があります。
仕様
- 左アナログパッドに X/Y軸
- 右アナログパッドに Z軸
が割り当てられています。これが基本ですが、事故防止のため左右のトリガーを押している間しか動作しないようになっています。
- 左トリガーを押しながら軸操作をすると低速移動
- 右トリガーを押しながら軸操作をすると高速移動
アナログパッド自体にも傾きによって速度調節が入りますので、トリガーの役割は「最大速度の設定」です。
また、X/Y軸が同一アナログパッドにある弊害として、このままだと意図せずに移動したい軸ではない軸を動かしてしまうという問題があります。これに対処するため、
- Xボタンを押している間はX軸のみ動く (Y軸の移動が抑制される)
- Yボタンを押している間はY軸のみ動く(X軸の移動が抑制される)
としてあります。Z軸は独立していて問題ないので、これで意図した軸を確実に動かせます。
まだ L, R, A, B, Back, Start ボタンと十字キーとスティック押し込みが余っています。probe はどこかに入れたいですが、残りは特に思いついてません。
.hal
# X-BOX USB コントローラジョギング設定 # abs-hat0x, abs-hat0y: デジタル十字キー 1 か 0 か -1 # abs-rx, abs-ry: 右アナログスティック # abs-rz: 右アナログトリガー (RT) # abs-x, abs-y: 左アナログスティック # abs-z: 左アナログトリガー (LT) # btn-a: Aボタン # btn-b: Bボタン # btn-mode: XBox ボタン # btn-select: BACK ボタン # btn-start: スタートボタン # btn-thumbl: 左スティック押し込み # btn-thumbr: 右スティック押し込み # btn-tl: 左上側ボタン (LB) # btn-tr: 右上側ボタン (RB) # btn-x: Xボタン # btn-y: Yボタン loadusr -W hal_input -KRAL 360 loadrt deadzone count=5 loadrt scale count=2 loadrt mux2 count=3 loadrt flipflop count=1 addf flipflop.0 servo-thread addf mux2.0 servo-thread addf mux2.1 servo-thread addf mux2.2 servo-thread addf deadzone.0 servo-thread addf deadzone.1 servo-thread addf deadzone.2 servo-thread addf deadzone.3 servo-thread addf deadzone.4 servo-thread addf scale.0 servo-thread addf scale.1 servo-thread setp deadzone.0.center 0.0 setp deadzone.0.threshhold 0.2 setp deadzone.1.center 0.0 setp deadzone.1.threshhold 0.2 setp deadzone.2.center 0.0 setp deadzone.2.threshhold 0.2 setp deadzone.3.center 0.0 setp deadzone.3.threshhold 0.2 setp deadzone.4.center 0.0 setp deadzone.4.threshhold 0.2 # トリガーをひかない限り動かないようにする # また、トリガーのアナログ値によって最大スピードを制限する # 左トリガー setp input.0.abs-z-offset 0 setp input.0.abs-z-scale 255 net joy-speed-jog-dead-l input.0.abs-z-position deadzone.3.in setp scale.0.gain 80 setp scale.0.offset 0 net joy-speed-jog-scale-l deadzone.3.out scale.0.in net joy-speed-jog-final-l scale.0.out mux2.0.in0 # 右トリガー setp input.0.abs-rz-offset 0 setp input.0.abs-rz-scale 255 net joy-speed-jog-dead-r input.0.abs-rz-position deadzone.4.in setp scale.1.gain 800 setp scale.1.offset 0 net joy-speed-jog-scale-r deadzone.4.out scale.1.in net joy-speed-jog-final-r scale.1.out mux2.0.in1 # 左か右いずれかを有効にする。ただし左が優先 net joy-flipflop-reset input.0.abs-z-is-pos flipflop.0.reset net joy-flipflop-set input.0.abs-rz-is-pos flipflop.0.set net joy-select-maxspeed flipflop.0.out mux2.0.sel net joy-selected-maxspeed mux2.0.out halui.jog-speed # X-BOX のコントローラの Scale は 127.5 ではないので気をつけよう # 軸方向反転の設定 # setp input.0.abs-rx-scale -32767.5 setp input.0.abs-ry-scale -32767.5 setp input.0.abs-y-scale -32767.5 # 左アナログパッドはX/Y軸 # 右アナログパッドはZ軸 net joy-x-jog-dead input.0.abs-x-position deadzone.0.in net joy-y-jog-dead input.0.abs-y-position deadzone.1.in net joy-z-jog-dead input.0.abs-ry-position deadzone.2.in # XボタンまたはYボタンを押しているときは、それぞれX軸またはY軸のみ移動可能にする # 予め net はしておくが、ボタンが押されたときは他軸の移動を抑制する形 net joy-x-jog-mux deadzone.0.out mux2.1.in0 setp mux2.1.in1 0 net joy-y-jog-mux deadzone.1.out mux2.2.in0 setp mux2.2.in1 0 net joy-x-brake input.0.btn-y mux2.1.sel net joy-y-brake input.0.btn-x mux2.2.sel net joy-x-jog mux2.1.out halui.jog.0.analog net joy-y-jog mux2.2.out halui.jog.1.analog net joy-z-jog deadzone.2.out halui.jog.2.analog # X-BOX ボタンでマシンが起動するぞ net joy-btn-xbox input.0.btn-mode halui.machine.on
備考:deadzone の設定
アナログスティックを離していてもいずれかの方向に多少傾いていて入力されてしまうので、中央付近に不感帯をつくっておく必要があります。
備考:XBox コントローラのアナログスティック類は 16bit
なので各種 scale に入ってる値が 32767.5 になっている。うっかり符号を変えようとして -127.5 とか入れると大変なことになるので注意が必要。
XBox コントローラは、2つの2軸アナログパッドと、2つのトリガーが16bitアナログなため、合計で6つのアナログ入力があります。