ジョギング用のペンダントに 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つのアナログ入力があります。

マイクロソフト ゲームコントローラー 有線/Xbox/Windows対応 ブラック Xbox360 Controller for Windows 52A-00006 - マイクロソフト

マイクロソフト

5.0 / 5.0

  1. トップ
  2. tech
  3. Machinekit (LinuxCNC) を XBox コントローラを使って機械を動かす。
▲ この日のエントリ