やたらと多ボタンなアナログコントローラをLinuxCNC2.5.1用に

制御対象が多い工作機械コントロールだと,ある意味ボタン数勝負みたいなところがあり,

エレコムの12ボタン,バッファローの16ボタンと順調に進歩してきたわけです.

もっと多いものを探していたところ目に止まったのが,

12+14ボタンのエクサー製 コントローラ「EXAPRIZE USB GAMEPAD」(以下,EXPAD)ですよ.

なんだかいろんなゲームとタイアップしているらしく,同じ形式で色違いパッケージ違いが多数あるようですが、

今回Shimalithが2個ゲットしたのは「鉄鬼」というゲームのものだそうです.

話題のオンラインゲームって書いてありますが,全く知りませんでした.

おまけで入ってきた無料アイテムチケットをゴミ箱に放り込みつつLinuxでの認識状況を確認したところ,

ファンクションキーは本当にファンクションキーである

事が判明.内部的にはキーボードのFnキー部分とゲームパッド部が全く別のものとして認識されており,

一切のカスタマイズが出来ない状態でした.

また,L3,R3キーは専用のドライバを入れないと使用不可(Linux用は,ない)

ため,ファンクションキー+12ボタンしかマトモに利用できません.

いいもん,LinuxCNCはファンクションキーに多くの操作の割り当てが標準搭載されているからいいもんっ(泣

てなわけで,それ以外の機能をボタンに実装する形にしました.

動作デモはこちら!

.halファイルは以下に.

※現在設定ファイルの再構築中であり,フライトスティックの設定で得た経験を反映中です.

近いうちにアップデートされた設定ファイルに書き換わる可能性が高いです.

##################################################################################

# for remote joypad control アナログ軸を含むコントローラ設定

##less /proc/bus/input/devices の結果

# I: Bus=0003 Vendor=f766 Product=0016 Version=0110

# N: Name="XPAD EX 0016 GAME PAD"

# P: Phys=usb-0000:00:1d.3-2/input1

# S: Sysfs=/devices/pci0000:00/0000:00:1d.3/usb5/5-2/5-2:1.1/input/input6

# U: Uniq=

# H: Handlers=event6 js0

# B: EV=1b

# B: KEY=fff 0 0 0 0 0 0 0 0 0

# B: ABS=30027

# B: MSC=10

loadusr -W hal_input -KRAL XPAD

## "XPAD"の部分は各自のゲームパッドのN:欄 Name= から,必ずただ一つ識別できるようなキーワードにする.

## 今回は十分にユニークな名前なのでXPADとした.

## 使用するリアルタイムモジュールの呼び出し

## count= の値は,利用したい論理が、宣言した個数だけ確保される

loadrt and2 count=10

loadrt not count=5

loadrt mux2

########################################################################################

## アナログ軸に関わるパラメータの設定

## 最大送り速度.ここの値はjoypadでのみ利用される(画面ボタンでのjog速度と独立)

setp halui.jog-speed 1000

## デッドバンド(禁止帯)の設定.あまり小さいと,スティックのニュートラルがずれると機械が静止しなくなる.

## 大きすぎる/未設定の場合,移動速度変化の分解能が少なくなる.

setp halui.jog-deadband 0.010

## y軸とz軸がイメージと逆に動いたので,以下行を追加した.

setp input.0.abs-y-scale -127.5

setp input.0.abs-z-scale -127.5

## 入力ピンの設定.-1から1までの少数値をとる「input._.abs-_-position」を設定する.

net analogX input.0.abs-x-position => halui.jog.0.analog

net analogY input.0.abs-y-position => halui.jog.1.analog

net analogZ input.0.abs-z-position => halui.jog.2.analog

#####################################################################################

#digital-btn on-off デジタルボタンの設定

#feed-override

net button-L1 input.0.btn-pinkie => halui.feed-override.increase

net button-R1 input.0.btn-top2 => halui.feed-override.decrease

#emergency-stop

net button-A input.0.btn-top => halui.estop.activate

#optional stop M1 (=[Alt+M 1]) オン時のみGコード中のM1コードで停止してくれる,オプショナルストップのオンオフ

net M1-is-on halui.program.optional-stop.is-on => and2.0.in0

net M1-is-on halui.program.optional-stop.is-on => not.0.in

net not-M1-is-on not.0.out => and2.1.in0

net button-select input.0.btn-base5 => and2.0.in1

net button-select input.0.btn-base5 => and2.1.in1

net M1Off and2.0.out => halui.program.optional-stop.off

net M1On and2.1.out => halui.program.optional-stop.on

addf and2.0 servo-thread

addf and2.1 servo-thread

addf not.0 servo-thread

#pause/resume (=[P/S]) ※止まるけど復帰はコントローラからはできないかも,マウスかキーボードでリスタートしてください..

net pause-is-on halui.program.is-paused => and2.2.in0

net pause-is-on halui.program.is-paused => not.1.in

net not-paused not.1.out => and2.3.in0

net button-start input.0.btn-base6 => and2.2.in1

net button-start input.0.btn-base6 => and2.3.in1

net PauseProgram and2.2.out => halui.program.pause

net ResumeProgram and2.3.out => halui.program.run

addf and2.2 servo-thread

addf and2.3 servo-thread

addf not.1 servo-thread

#program abort/homing (=[R/ESC]) ※プログラムスタートはコントローラから動かない?

net program-is-running halui.program.is-running => and2.4.in0

net program-is-running halui.program.is-running => not.2.in

net not-program-is-running not.2.out => and2.5.in0

net button-X input.0.btn-thumb => and2.4.in1

net button-X input.0.btn-thumb => and2.5.in1

net StopProgram and2.4.out => halui.abort

net RunProgram and2.5.out => halui.home-all

addf and2.4 servo-thread

addf and2.5 servo-thread

addf not.2 servo-thread