Immer öfter kam bei mir der Wunsch auf die Maschine auch per Handrad bewegen zu könne, was der Antasten und Auch das setzten der Nullpunkte erleichtern soll, Ich habe mich für ein Kabelloses XHC-WHB04B-6 entschieden:

Danach ging es an die Installation. Zunächst mussten dazu die sourcen von Linuxcnc gezogen werden:

cd ~
git clone https://github.com/LinuxCNC/linuxcnc dev-linuxcnc
cd dev-linuxcnc/src/

danach im Makefile unter subdirs die Zeile “hal/user_comps/xhc-whb04b-6 \” hinzufügen

./autogen.sh
./configure --with-realtime=uspace
make
sudo make setuid
sudo cp ../bin/xhc-whb04b-6 /usr/bin/

Damit sind die Treiber übersetzt, jetzt müssen noch die Udev Regel erstellt werden. Dazu brauchen wir die Informationen vom USB Dongel

lsusb
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 007: ID 8087:0a2a Intel Corp. 
Bus 001 Device 006: ID 0bda:0153 Realtek Semiconductor Corp. 3-in-1 (SD/SDHC/SDXC) Card Reader
Bus 001 Device 005: ID 1c4f:0016 SiGma Micro 
Bus 001 Device 004: ID 2575:0401  
Bus 001 Device 003: ID 046d:c408 Logitech, Inc. Marble Mouse (4-button)
Bus 001 Device 002: ID 10ce:eb93 Silicon Labs 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Der SIlicon Labs Chip ist der, den wir suchen (10ce:eb93 / VendirID:ProductID) wir jetzt legen wir die Udevregel an:

mcedit /etc/udev/rules.d/99-xhc-whb04b-6.rules
und dort tragen wir folgende Zeile ein:
ATTR{idProduct}==”eb93″, ATTR{idVendor}==”10ce”, MODE=”0666″, OWNER=”root”, GROUP=”plugdev”

Dann Udev neu laden:
sudo udevadm trigger
xhc-whb04b-6

Wenn man jetzt das Handrad bewegt oder eine taste drückt sollte es fleißig Daten regnen.

jetzt muss da ganze noch mit Linuxcnc verheiratet werden. Ich habe dafür eine eigene Haldatei gewählt:

loadusr -W xhc-whb04b-6 -H

loadrt ilowpass names=ilowpass.jog.x,ilowpass.jog.y,ilowpass.jog.z,ilowpass.jog.a
addf   ilowpass.jog.x   servo-thread
addf   ilowpass.jog.y   servo-thread
addf   ilowpass.jog.z   servo-thread
addf   ilowpass.jog.a   servo-thread
setp   ilowpass.jog.x.scale 100
setp   ilowpass.jog.y.scale 100
setp   ilowpass.jog.z.scale 100
setp   ilowpass.jog.a.scale 100
setp   ilowpass.jog.x.gain  0.01
setp   ilowpass.jog.y.gain  0.01
setp   ilowpass.jog.z.gain  0.01
setp   ilowpass.jog.a.gain  0.01

loadrt scale names=scale.axis.x,scale.axis.y,scale.axis.z,scale.axis.a
addf   scale.axis.x   servo-thread
addf   scale.axis.y   servo-thread
addf   scale.axis.z   servo-thread
addf   scale.axis.a   servo-thread
setp   scale.axis.x.gain   0.01 
setp   scale.axis.y.gain   0.01 
setp   scale.axis.z.gain   0.01
setp   scale.axis.a.gain   0.01  
setp   scale.axis.x.offset  0
setp   scale.axis.y.offset  0
setp   scale.axis.z.offset  0
setp   scale.axis.a.offset  0

# Estop
net  pdnt.machine.is-on   halui.machine.is-on   whb.halui.machine.is-on
net  pdnt.machine.on   whb.halui.machine.on   halui.machine.on
net  pdnt.machine.off   whb.halui.machine.off   halui.machine.off

# program
net  pdnt.program.is-idle   whb.halui.program.is-idle   halui.program.is-idle
net  pdnt.program.is-paused   whb.halui.program.is-paused   halui.program.is-paused
net  pdnt.program.is-running   whb.halui.program.is-running   halui.program.is-running
net  pdnt.program.resume   whb.halui.program.resume   halui.program.resume
net  pdnt.program.pause   whb.halui.program.pause   halui.program.pause
net  pdnt.program.run   whb.halui.program.run   halui.program.run
net  pdnt.program.stop   whb.halui.program.stop   halui.program.stop

# axis   
net  pdnt.joint.X.select   whb.halui.joint.x.select   halui.joint.0.select
net  pdnt.joint.Y.select   whb.halui.joint.y.select   halui.joint.1.select
net  pdnt.joint.Z.select   whb.halui.joint.z.select   halui.joint.2.select

net  pdnt.axis.0.jog-scale   whb.axis.0.jog-scale   scale.axis.x.in   
net  pdnt.axis.1.jog-scale   whb.axis.1.jog-scale   scale.axis.y.in   
net  pdnt.axis.2.jog-scale   whb.axis.2.jog-scale   scale.axis.z.in  

net  scale.axis.0.jog-scale   scale.axis.x.out   axis.x.jog-scale
net  scale.axis.1.jog-scale   scale.axis.y.out   axis.y.jog-scale
net  scale.axis.2.jog-scale   scale.axis.z.out   axis.z.jog-scale

net  pdnt.axis.0.jog-counts   whb.axis.0.jog-counts   ilowpass.jog.x.in
net  pdnt.axis.1.jog-counts   whb.axis.1.jog-counts   ilowpass.jog.y.in
net  pdnt.axis.2.jog-counts   whb.axis.2.jog-counts   ilowpass.jog.z.in

net  pdnt.ilowpass.jog.0.jog-counts   ilowpass.jog.x.out   axis.x.jog-counts
net  pdnt.ilowpass.jog.1.jog-counts   ilowpass.jog.y.out   axis.y.jog-counts
net  pdnt.ilowpass.jog.2.jog-counts   ilowpass.jog.z.out   axis.z.jog-counts

net  pdnt.axis.0.jog-enable   whb.axis.0.jog-enable   axis.x.jog-enable
net  pdnt.axis.1.jog-enable   whb.axis.1.jog-enable   axis.y.jog-enable
net  pdnt.axis.2.jog-enable   whb.axis.2.jog-enable   axis.z.jog-enable

net  pdnt.axis.0.jog-vel-mode   whb.axis.0.jog-vel-mode   axis.x.jog-vel-mode
net  pdnt.axis.1.jog-vel-mode   whb.axis.1.jog-vel-mode   axis.y.jog-vel-mode
net  pdnt.axis.2.jog-vel-mode   whb.axis.2.jog-vel-mode   axis.z.jog-vel-mode

# macro buttons

net pdnt.macro.1   whb.button.macro-1   halui.mdi-command-01
net pdnt.macro.2   whb.button.macro-2   halui.mdi-command-02
net pdnt.macro.3   whb.button.macro-3   halui.mdi-command-03
net pdnt.macro.4   whb.button.macro-4   halui.mdi-command-04
net pdnt.button.m-home   whb.button.m-home   halui.mdi-command-05
net pdnt.macro.6   whb.button.macro-6   halui.mdi-command-06
net pdnt.button.w-home   whb.button.w-home   halui.mdi-command-07   
net pdnt.macro.8   whb.button.macro-8   halui.mdi-command-08
net pdnt.macro.9   whb.button.macro-9   halui.mdi-command-09
net pdnt.macro.10   whb.button.macro-10   halui.mdi-command-10
net pdnt.macro.11   whb.button.macro-11   halui.mdi-command-11
net pdnt.macro.12   whb.button.macro-12   halui.mdi-command-12
net pdnt.macro.13   whb.button.macro-13   halui.mdi-command-13
net pdnt.macro.14   whb.button.macro-14   halui.home-all
net pdnt.macro.15   whb.button.macro-15   halui.mdi-command-15
net pdnt.macro.16   whb.button.macro-16   halui.mdi-command-16
net pdnt.button.safe-z   whb.button.safe-z   halui.mdi-command-17
net pdnt.button.s-on-off   whb.button.s-on-off   halui.mdi-command-18
net  pdnt.button.probe-z   whb.button.probe-z   halui.mdi-command-19
#net pdnt.macro.20   whb.button.macro-20   halui.mdi-command-20

# already connected to halui.estop.{activate, reset} via whb.halui.estop.{activate, reset}
net  pdnt.button.reset   whb.button.reset
# already linked to halui.program.stop via whb.program.stop
net  pdnt.button.stop   whb.button.stop# already connected to halui.program.{run, pause, resume} via whb.halui.program.{run, pause, resume}
net  pdnt.button.start-pause   whb.button.start-pause   
# unused
net pdnt.button.fn   whb.button.fn
net  pdnt.button.mode-continuous   whb.button.mode-continuous
net  pdnt.button.mode-step   whb.button.mode-step

# spindle
net  spindle.is-on   whb.halui.spindle.is-on
net  spindle.stop   whb.halui.spindle.stop
net  spindle.forward   whb.halui.spindle.forward
net  spindle.reverse   whb.halui.spindle.reverse
net  spindle.spindle-override.value   whb.halui.spindle-override.value	halui.spindle.0.override.value
net  spindle.spindle-override.increase   whb.halui.spindle-override.increase	halui.spindle.0.override.increase
net  spindle.spindle-override.decrease   whb.halui.spindle-override.decrease	halui.spindle.0.override.decrease
net  spindle.velocity.abs-rpm   whb.motion.spindle-speed-abs
# mode
net  pdnt.halui.mode.auto   whb.halui.mode.auto   halui.mode.auto
net  pdnt.halui.mode.joint   whb.halui.mode.joint   halui.mode.joint
net  pdnt.halui.mode.manual   whb.halui.mode.manual   halui.mode.manual
net  pdnt.halui.mode.mdi   whb.halui.mode.mdi   halui.mode.mdi
net  pdnt.halui.mode.is-auto   halui.mode.is-auto   whb.halui.mode.is-auto
net  pdnt.halui.mode.is-joint   halui.mode.is-joint   whb.halui.mode.is-joint
net  pdnt.halui.mode.is-manual   halui.mode.is-manual   whb.halui.mode.is-manual
#net  pdnt.halui.mode.is-mdi   halui.mode.is-mdi   whb.halui.mode.is-mdi

# feed
net  pdnt.halui.feed-override.scale   whb.halui.feed-override.scale   halui.feed-override.scale halui.rapid-override.scale
net  pdnt.halui.feed-override.direct-val   whb.halui.feed-override.direct-val   halui.feed-override.direct-value halui.rapid-override.direct-value
net  pdnt.halui.feed-override.counts   whb.halui.feed-override.counts   halui.feed-override.counts halui.rapid-override.counts
net  pdnt.halui.feed-override.count-enable whb.halui.feed-override.count-enable halui.feed-override.count-enable
net  pdnt.halui.feed-override.value   halui.feed-override.value   whb.halui.feed-override.value
setp   whb.halui.feed-override.min-value   [DISPLAY]MIN_FEED_OVERRIDE
setp   whb.halui.feed-override.max-value   [DISPLAY]MAX_FEED_OVERRIDE

net  pdnt.halui.feed-override.increase   whb.halui.feed-override.increase   halui.feed-override.increase halui.rapid-override.increase
net  pdnt.halui.feed-override.decrease   whb.halui.feed-override.decrease   halui.feed-override.decrease halui.rapid-override.decrease
net  pdnt.button.feed-plus   whb.button.feed-plus
net  pdnt.button.feed-minus   whb.button.feed-minus
# axis
net  pdnt.halui.axis.0.pos-feedback   halui.axis.x.pos-feedback   whb.halui.axis.0.pos-feedback
net  pdnt.halui.axis.1.pos-feedback   halui.axis.y.pos-feedback   whb.halui.axis.1.pos-feedback
net  pdnt.halui.axis.2.pos-feedback   halui.axis.z.pos-feedback   whb.halui.axis.2.pos-feedback

net  pdnt.halui.axis.0.pos-relative   halui.axis.x.pos-relative   whb.halui.axis.0.pos-relative
net  pdnt.halui.axis.1.pos-relative   halui.axis.y.pos-relative   whb.halui.axis.1.pos-relative
net  pdnt.halui.axis.2.pos-relative   halui.axis.z.pos-relative   whb.halui.axis.2.pos-relative

Macros und Hal sind bereits passend in der INI hinterlegt:


[HAL]
HALFILE = hallib/core_igor.hal
HALFILE = hallib/xhc-whb04b-6.hal
POSTGUI_HALFILE = hallib/postgui.hal
HALUI = halui

[HALUI]

	MDI_COMMAND=(debug,00)
	MDI_COMMAND=(debug,macro1)
	MDI_COMMAND=(debug,macro2)
	MDI_COMMAND=(debug,macro3)
	MDI_COMMAND=(debug,macro4)  
	MDI_COMMAND=o<go_to_home> call
	MDI_COMMAND=(debug,macro6)
	MDI_COMMAND=o<go_to_workhome> call
	MDI_COMMAND=(debug,macro8)
	MDI_COMMAND=o<probe_z_half> call
	MDI_COMMAND=(debug,macro10)
	MDI_COMMAND=(debug,macro11)
	MDI_COMMAND=(debug,macro12)
	MDI_COMMAND=(debug,macro13)
	MDI_COMMAND=(debug,macro14)
	MDI_COMMAND=(debug,macro15)
	MDI_COMMAND=(debug,macro16)
	MDI_COMMAND=o<go_to_zhome> call
	MDI_COMMAND=(debug,macro18_Spindle_on_of)
	MDI_COMMAND=o<probe_z> call
       # MDI_COMMAND=(debug,macro20)
O<go_to_home> sub

 G53 G0 Z0
 G53 G0 X0 Y0
 
O<go_to_home> endsub

M2
O<go_to_workhome> sub

 G53 G0 Z0
 G0 X0 Y0
 
O<go_to_workhome> endsub

M2
O<probe_z_half> sub
;check for active axis
    	o100 if [#<_hal[whb.axis.0.jog-enable]> eq 1] ;If x-axis active
                G10 L20 P0 X[#<_x>/2]                          ;zero X
	o100 endif
    	o110 if [#<_hal[whb.axis.1.jog-enable]> eq 1] ;If Y-axis active
                G10 L20 P0 Y[#<_y>/2]                          ;zero Y
	o110 endif
    	o120 if [#<_hal[whb.axis.2.jog-enable]> eq 1] ;If Z-axis active
                G10 L20 P0 Z[#<_z>/2]                          ;zero Z
	o120 endif
O<probe_z_half> endsub

M2
O<go_to_zhome> sub

 G53 G0 Z0
 
O<go_to_zhome> endsub

M2
O<probe_z> sub
;check for active axis
    	o100 if [#<_hal[whb.axis.0.jog-enable]> eq 1] ;If x-axis active
                G10 L20 P0 X0                          ;zero X
	o100 endif
    	o110 if [#<_hal[whb.axis.1.jog-enable]> eq 1] ;If Y-axis active
                G10 L20 P0 Y0                          ;zero Y
	o110 endif
    	o120 if [#<_hal[whb.axis.2.jog-enable]> eq 1] ;If Z-axis active
                G10 L20 P0 Z0                          ;zero Z
	o120 endif
O<probe_z> endsub

M2

Damit ist er Retrofit mehr oder weniger abgeschlossen. Es wird nach und nach immer mal wieder Änderungen oder Erweiterungen geben.