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.