EMC2 Ver.2.4.x Ver.2.5のlinuxCNCでアナログコントローラを使って制御する

LinuxCNC.orgのwikiには,ゲーム用のアナログコントローラ(向こうではジョイパッド/joypadと呼ばれるようだが)

を使った手動コントロールの設定例が公開されています.

Using A Joypad To Move Your CNC Machine

で,HALの2相エンコーダ機能を用いた,なかなか勉強になる構成がされています.

しかし,ページはじめに追記されているように,Ver.2.4.xからhal_joypadモジュールはinput(1)に統合され,

アナログスティック向けの機能も追加実装されたようです.

(hal_joypadはなくなった模様)

現在、公開されている2.4.x向けのコントローラ制御例は

Simple Remote Pendant using a $10-20 joypad with halui and hal_input

で報告されていますが,デジタル制御のみでアナログスティックを生かせていません.

海外のBBSでは利用している方はいるようなのですが,表だって設定例を出しているサイトが見つけられませんでした.

そこで,これら2つの実施例とHAL_UIについてのドキュメントを参考に、アナログジョイパッドで3軸の手動動作設定を構築してみました.

以下に設定例を示します.これを(使うゲームパットに固有する製品名やボタン配置の問題は解決する必要がありますが)

1. 使用しているマシンの.halファイルの末尾に追加します

2.ページ下部に置いてある「analogjoypad.hal」をダウンロードして設定ファイルと同じディレクトリに置き、

設定名.ini」ファイルの[HAL]セクションの中から,"HALFILE = custom.hal"を探し,

その次の行に,「HALFILE = analogjoypad.hal」と入力することで設定ファイルを呼び出すことで利用します.

のどちらかで実現します.

設定ファイルが長くなるとどこに何がセットされているかわかりにくくなることから2.をお勧めしています.

2.の場合,同じコントローラで,そのコンピュータに1つだけしかコントローラを接続していないのなら,

そのままで動作する可能性が高いです.

違う構成の場合は,適宜書き換えて使用します.

今回使用したゲームパッドは,ELECOMの無線パッド JC-U3412S ですが,

実際のところ、Linuxが認識してくれれば別にどのメーカのどんなものでも構わないです

(残念なことに,パッケージにはLinuxへの対応情報は書いていないことが多いです.

手元に転がっているコントローラで試していただいたり,

余裕のある方には体当たりしていただけると日本での実績ができて参入障壁が下がると思います).

デジタルボタンは多いほうがたくさんの機能が割り当てできて良いです.

今回は無線にしてしまいましたが,配線が許すなら有線のもの,

無線品の場合は省電力モードから復帰しやすいもののほうが良いです,事故時に動作しないと慌てるので..

その点では今回使用したコントローラは、modeボタンを一回押さないと無操作スリープから復帰しないので微妙..

こっちの有線のほうが信頼できるかもしれません

設定です.

まず,Linuxの端末で

less /proc/bus/input/devices

と入力する・

接続されている入力デバイスが表示されるので,ジョイパッドらしき記述を見つけるまでキーボードのカーソルキーで送る.

(lessから抜けるにはキーボード「q」を押す)

今回は以下のような形式で表示された.

I: Bus=0003 Vendor=05b8 Product=1006 Version=0110

N: Name="Elecom Wireless Gamepad"

P: Phys=usb-0000:00:1d.3-1/input0

S: Sysfs=/devices/pci0000:00/0000:00:1d.3/usb5/5-1/5-1:1.0/input/input4

U: Uniq=

H: Handlers=event4 js0

B: EV=1b

B: KEY=1fff0000 0 0 0 0 0 0 0 0 0

B: ABS=30027

B: MSC=10

これをメモしておく.

.halファイルに記述を追加する (#以降はコメント)

----------------------------------------------------------------------------------------------------

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

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

loadusr -W hal_input -KRAL Gamepad

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

## 今回は他にパッドがない,無線マウスがある,等からGamepadとした.

-----------------------------------------------------------------------------------------------------------------------------------------------------

ここまで記述されていれば,EMC2で認識される.認識名はP:欄が P: Phys=usb-0000:00:1d.3-1/input0ならば 「input0」となる.

EMCを起動し,ツール「HAL meter」を使って,「input.0.btn-xx」等がどのボタンに対応しているか確認しメモをとる.

手元では以下のようになった.

引き続き.halへの記述を続ける.

-------------------------------------------------------------------------------------------------------------------------------------------------------

## 使用するリアルタイムモジュールの呼び出し count= の値は,利用したい論理が、宣言した個数だけ確保される

loadrt and2 count=10

loadrt not count=5

loadrt mux2

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

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

setp halui.jog-speed 1000

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

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

setp halui.jog-deadband 0.005

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

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

setp input.0.abs-rz-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-rz-position => halui.jog.2.analog

----------------------------------------------------------------------------------------------------------------------------------------------------------

これで,左スティックでX-Y,右スティック縦でZ軸の手動制御が可能になった.

保存してEMCを起動し,起動中にエラーが出ないか確かめる.

ボタンでのデジタル制御の設定も行う.

--------------------------------------------------------------------------------------------------------------------------------------------------------

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

#クーラント (=[F8])

## 現在の状態を入力し,その状態とボタン操作とで論理をとることで同じボタンでon-offする.

## この方式のメリットは使用ボタン数が削減できること,欠点はチョン押ししないと2回押したと判定されてしまうこと.

net flood-is-on halui.flood.is-on => and2.0.in0

net flood-is-on halui.flood.is-on => not.0.in

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

net button-a input.0.btn-a => and2.0.in1

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

net floodOff and2.0.out => halui.flood.off

net floodOn and2.1.out => halui.flood.on

## 使うことにしたand2ふたつとnotひとつをservo-threadの間隔ごとに実行する.

## 起きうる最大の実行遅れ時間は「USB通信と信号解釈の時間+servo-thread間隔の時間」となる

addf and2.0 servo-thread

addf and2.1 servo-thread

addf not.0 servo-thread

##以下,同様に設定していく

#Spindle On-Off スピンドル(主軸)のオンオフ (=[F9/F10])

net spindle-is-on halui.spindle.is-on => and2.2.in0

net spindle-is-on halui.spindle.is-on => not.1.in

net not-spindle-is-on not.1.out => and2.3.in0

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

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

net spindleOff and2.2.out => halui.spindle.stop

net spindleOn and2.3.out => halui.spindle.start

addf and2.2 servo-thread

addf and2.3 servo-thread

addf not.1 servo-thread

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

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

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

net not-paused not.2.out => and2.5.in0

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

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

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

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

addf and2.4 servo-thread

addf and2.5 servo-thread

addf not.2 servo-thread

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

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

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

net not-M1-is-on not.3.out => and2.7.in0

net button-tl2 input.0.btn-tl2 => and2.6.in1

net button-tl2 input.0.btn-tl2 => and2.7.in1

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

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

addf and2.6 servo-thread

addf and2.7 servo-thread

addf not.3 servo-thread

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

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

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

net not-program-is-running not.4.out => and2.9.in0

net button-c input.0.btn-c => and2.8.in1

net button-x input.0.btn-x => and2.9.in1

net StopProgram and2.8.out => halui.program.stop

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

addf and2.8 servo-thread

addf and2.9 servo-thread

addf not.4 servo-thread

-------------------------------------------------------------------------------------------------------------------------------

設定してみて分かるのは,クーラントやスピンドル,オプショナルストップM1等はいつでもon-off可能だが,

いくつかのコマンドでは「マニュアルモードでは機能しない」警告が出ることがある.

プログラムスタート,ステップ実行など,自動モードへ移行するものは拒否されるようだ.

プログラムがスタートしてしまえば,一時停止や停止,プログラムアボート(緊急停止に相当)は動作するので,

リモートペンダントとしては十分に機能する.

また,原点復帰動作も割り当て可能だが,すでに原点をとっていても強制でhomingする(画面上で確認されない)ので

割り当てボタンの配置には注意のこと.