LinuxCNC 2.7 vs. Logitech Joggy Thing

The old Atom running LinuxCNC for the Sherline finally stopped booting, so I popped the Optiplex 760 off the stack and did a live-USB trial run. The latency / jitter worked out around 25 µs, slightly worse than before, but still Good Enough, and the StepConf utility coerced the motors into working OK.

What didn’t work was the old Eagle-to-HAL code defining the Logitch Gamepad as a Joggy Thing to allow smooth joystick jog control. Well, stuff changes over the course of eight years, but, in this case, the fix turned out to be a one-liner: the probe_parport module isn’t needed nowadays.

With that out of the way, it runs fine:

LinuxCNC - Sherline Mill - Logitech Gamepad
LinuxCNC – Sherline Mill – Logitech Gamepad

The INI and HAL files defining the Sherline configuration as a GitHub Gist:

# HAL config file automatically generated by Eagle-CAD ULP:
# [/mnt/bulkdata/Project Files/eagle/ulp/hal-write-2.5.ulp]
# (C) Martin Schoeneck.de 2008
# Charalampos Alexopoulos 2011
# Mods Ed Nisley KE4ZNU 2010 2013
# Path [/mnt/bulkdata/Project Files/eagle/projects/LinuxCNC for M2/]
# ProjectName [LinuxCNC Sherline Configuration]
# File name [/mnt/bulkdata/Project Files/eagle/projects/LinuxCNC for M2/LinuxCNC Sherline Configuration.hal]
# Created [11:17:21 17-Feb-2013]
####################################################
# Load realtime and userspace modules
loadrt trivkins
loadrt [EMCMOT]EMCMOT key=[EMCMOT]SHMEM_KEY num_joints=[TRAJ]AXES base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD traj_period_nsec=[EMCMOT]SERVO_PERIOD
# not needed in 2.7
# loadrt probe_parport
loadrt hal_parport cfg="[PARPORT]ADDRESS out"
loadrt stepgen step_type=0,0,0,0
loadrt pwmgen output_type=0
loadusr -W hal_manualtoolchange
loadusr -W hal_input -KA Dual
loadrt logic count=1 personality=0x104
loadrt constant count=13
loadrt and2 count=17
loadrt conv_float_s32 count=1
loadrt flipflop count=4
loadrt mux2 count=5
loadrt mux4 count=1
loadrt not count=8
loadrt or2 count=14
loadrt scale count=7
loadrt timedelay count=1
loadrt toggle count=1
####################################################
# Hook functions into threads
addf stepgen.make-pulses base-thread
addf pwmgen.make-pulses base-thread
addf parport.0.read base-thread
addf parport.0.write base-thread
addf parport.0.reset base-thread
addf logic.0 base-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
addf stepgen.update-freq servo-thread
addf stepgen.capture-position servo-thread
addf pwmgen.update servo-thread
addf constant.0 servo-thread
addf constant.1 servo-thread
addf constant.2 servo-thread
addf constant.3 servo-thread
addf constant.4 servo-thread
addf constant.5 servo-thread
addf constant.6 servo-thread
addf constant.7 servo-thread
addf constant.8 servo-thread
addf constant.9 servo-thread
addf constant.10 servo-thread
addf constant.11 servo-thread
addf constant.12 servo-thread
addf and2.0 servo-thread
addf and2.1 servo-thread
addf and2.2 servo-thread
addf and2.3 servo-thread
addf and2.4 servo-thread
addf and2.5 servo-thread
addf and2.6 servo-thread
addf and2.7 servo-thread
addf and2.8 servo-thread
addf and2.9 servo-thread
addf and2.10 servo-thread
addf and2.11 servo-thread
addf and2.12 servo-thread
addf and2.13 servo-thread
addf and2.14 servo-thread
addf and2.15 servo-thread
addf and2.16 servo-thread
addf conv-float-s32.0 servo-thread
addf toggle.0 servo-thread
addf flipflop.0 servo-thread
addf flipflop.1 servo-thread
addf flipflop.2 servo-thread
addf flipflop.3 servo-thread
addf timedelay.0 servo-thread
addf or2.0 servo-thread
addf or2.1 servo-thread
addf or2.2 servo-thread
addf or2.3 servo-thread
addf or2.4 servo-thread
addf or2.5 servo-thread
addf or2.6 servo-thread
addf or2.7 servo-thread
addf or2.8 servo-thread
addf or2.9 servo-thread
addf or2.10 servo-thread
addf or2.11 servo-thread
addf or2.12 servo-thread
addf or2.13 servo-thread
addf not.0 servo-thread
addf not.1 servo-thread
addf not.2 servo-thread
addf not.3 servo-thread
addf not.4 servo-thread
addf not.5 servo-thread
addf not.6 servo-thread
addf not.7 servo-thread
addf scale.0 servo-thread
addf scale.1 servo-thread
addf scale.2 servo-thread
addf scale.3 servo-thread
addf scale.4 servo-thread
addf scale.5 servo-thread
addf scale.6 servo-thread
addf mux2.0 servo-thread
addf mux4.0 servo-thread
addf mux2.1 servo-thread
addf mux2.2 servo-thread
addf mux2.3 servo-thread
addf mux2.4 servo-thread
####################################################
# Set parameters
setp parport.0.reset-time [PARPORT]RESET_TIME
setp stepgen.0.maxaccel [AXIS_0]STEPGEN_MAXACCEL
setp stepgen.0.maxvel [AXIS_0]MAX_VELOCITY
setp stepgen.0.dirhold [PARPORT]DIRHOLD
setp stepgen.0.dirsetup [PARPORT]DIRSETUP
setp stepgen.0.steplen [PARPORT]STEPLEN
setp stepgen.0.stepspace [PARPORT]STEPSPACE
setp stepgen.0.position-scale [AXIS_0]SCALE
setp parport.0.pin-03-out-reset FALSE
setp parport.0.pin-05-out-reset FALSE
setp parport.0.pin-07-out-reset FALSE
setp parport.0.pin-09-out-reset FALSE
setp parport.0.pin-17-out-reset FALSE
setp stepgen.1.maxaccel [AXIS_1]STEPGEN_MAXACCEL
setp stepgen.1.maxvel [AXIS_1]MAX_VELOCITY
setp stepgen.1.dirhold [PARPORT]DIRHOLD
setp stepgen.1.dirsetup [PARPORT]DIRSETUP
setp stepgen.1.steplen [PARPORT]STEPLEN
setp stepgen.1.stepspace [PARPORT]STEPSPACE
setp stepgen.1.position-scale [AXIS_1]SCALE
setp stepgen.2.maxaccel [AXIS_2]STEPGEN_MAXACCEL
setp stepgen.2.maxvel [AXIS_2]MAX_VELOCITY
setp stepgen.2.dirhold [PARPORT]DIRHOLD
setp stepgen.2.dirsetup [PARPORT]DIRSETUP
setp stepgen.2.steplen [PARPORT]STEPLEN
setp stepgen.2.stepspace [PARPORT]STEPSPACE
setp stepgen.2.position-scale [AXIS_2]SCALE
setp stepgen.3.maxaccel [AXIS_3]STEPGEN_MAXACCEL
setp stepgen.3.maxvel [AXIS_3]MAX_VELOCITY
setp stepgen.3.dirhold [PARPORT]DIRHOLD
setp stepgen.3.dirsetup [PARPORT]DIRSETUP
setp stepgen.3.steplen [PARPORT]STEPLEN
setp stepgen.3.stepspace [PARPORT]STEPSPACE
setp stepgen.3.position-scale [AXIS_3]SCALE
setp parport.0.pin-04-out-invert TRUE
setp parport.0.pin-06-out-invert TRUE
####################################################
# Set constants
setp constant.0.value 0.1
setp constant.1.value 20
setp constant.2.value [TRAJ]MAX_LINEAR_VELOCITY
setp constant.3.value [TRAJ]MAX_ANGULAR_VELOCITY
setp constant.4.value 60
setp constant.5.value 0.50
setp constant.6.value 1.00
setp constant.7.value 0.10
setp constant.8.value 0.10
setp constant.9.value 0.0
setp constant.10.value -1.0
setp constant.11.value 0.020
setp constant.12.value 0.000
####################################################
# Connect Modules with nets
net a-amp-enable logic.0.in-03 axis.3.amp-enable-out stepgen.3.enable
net a-analog halui.jog.3.analog mux2.4.out
net a-button-minus or2.0.in0 input.0.btn-joystick and2.7.in0
net a-button-plus or2.0.in1 input.0.btn-thumb2 and2.8.in0
net a-buttons-active or2.0.out or2.1.in0 or2.11.in1
net a-direction parport.0.pin-08-out stepgen.3.dir
net a-disable not.7.out and2.13.in1
net a-enable or2.11.in0 flipflop.3.out not.7.in mux2.4.sel
net a-jog input.0.abs-z-position mux2.4.in1
net a-knob-active or2.9.out not.2.in and2.15.in1
net a-knob-inactive not.2.out and2.14.in1
net a-select and2.16.in0 and2.15.out
net a-set flipflop.3.set and2.16.out
net a-step parport.0.pin-09-out stepgen.3.step
net all-amps-enabled logic.0.and parport.0.pin-17-out
net angular_motion or2.11.out mux2.0.sel
net any-buttons-active mux4.0.sel0 or2.12.out
net axis-disabled-value constant.9.out mux2.1.in0 mux2.2.in0 mux2.3.in0 mux2.4.in0
net az-buttons-active or2.1.out or2.12.in1 or2.13.in0
net az-reset flipflop.2.reset and2.14.out flipflop.3.reset
net button-crawl scale.4.out mux4.0.in3
net button-fast scale.2.out mux4.0.in1 scale.4.in
net estop-a and2.0.in0 input.0.btn-top2
net estop-b and2.0.in1 input.0.btn-base
net estop-out parport.0.pin-01-out iocontrol.0.emc-enable-in iocontrol.0.user-enable-out
net homeswitches parport.0.pin-10-in-not axis.0.home-sw-in axis.1.home-sw-in axis.2.home-sw-in axis.3.home-sw-in
net jog-crawl toggle.0.out mux4.0.sel1
net jog-speed halui.jog-speed mux4.0.out
net knob-crawl mux4.0.in2 scale.3.out
net knob-fast mux4.0.in0 scale.1.out scale.3.in
net manual-mode halui.mode.manual input.0.btn-base3
net n_9 axis.0.motor-pos-cmd stepgen.0.position-cmd
net n_11 axis.0.motor-pos-fb stepgen.0.position-fb
net n_13 and2.0.out halui.estop.activate
net n_14 or2.3.in0 input.0.btn-base5
net n_15 or2.3.in1 input.0.btn-base6
net n_16 toggle.0.in or2.3.out
net n_17 conv-float-s32.0.out input.0.abs-x-flat input.0.abs-y-flat input.0.abs-z-flat input.0.abs-rz-flat
net n_18 constant.1.out conv-float-s32.0.in
net n_19 constant.4.out scale.0.gain
net n_20 constant.5.out scale.1.gain
net n_21 constant.6.out scale.2.gain
net n_22 constant.7.out scale.3.gain
net n_23 scale.4.gain constant.8.out
net n_24 constant.0.out halui.jog-deadband
net n_25 constant.2.out mux2.0.in0
net n_26 mux2.0.in1 constant.3.out
net n_34 axis.1.motor-pos-cmd stepgen.1.position-cmd
net n_36 axis.1.motor-pos-fb stepgen.1.position-fb
net n_42 or2.7.in0 input.0.abs-x-is-pos
net n_43 or2.7.in1 input.0.abs-x-is-neg
net n_44 or2.8.in0 input.0.abs-y-is-pos
net n_45 or2.8.in1 input.0.abs-y-is-neg
net n_46 or2.9.in0 input.0.abs-z-is-pos
net n_47 or2.9.in1 input.0.abs-z-is-neg
net n_48 or2.10.in0 input.0.abs-rz-is-pos
net n_49 or2.10.in1 input.0.abs-rz-is-neg
net n_51 constant.10.out scale.5.gain scale.6.gain
net n_54 constant.11.out timedelay.0.on-delay
net n_55 constant.12.out timedelay.0.off-delay
net n_56 timedelay.0.out and2.1.in1 and2.2.in1 and2.4.in1 and2.3.in1 and2.5.in1 and2.6.in1 and2.8.in1 and2.7.in1
net n_57 and2.1.out halui.jog.0.minus
net n_58 and2.2.out halui.jog.0.plus
net n_59 and2.3.out halui.jog.1.minus
net n_60 halui.jog.1.plus and2.4.out
net n_61 and2.5.out halui.jog.2.minus
net n_62 and2.6.out halui.jog.2.plus
net n_63 and2.7.out halui.jog.3.minus
net n_64 and2.8.out halui.jog.3.plus
net n_67 axis.2.motor-pos-cmd stepgen.2.position-cmd
net n_69 axis.2.motor-pos-fb stepgen.2.position-fb
net n_77 axis.3.motor-pos-cmd stepgen.3.position-cmd
net n_79 axis.3.motor-pos-fb stepgen.3.position-fb
net probe-in parport.0.pin-15-in-not motion.probe-input
net program-resume halui.program.resume input.0.btn-base4
net reset-estop input.0.btn-base2 halui.estop.reset
net tool-change iocontrol.0.tool-change hal_manualtoolchange.change
net tool-changed hal_manualtoolchange.changed iocontrol.0.tool-changed
net tool-number iocontrol.0.tool-prep-number hal_manualtoolchange.number
net tool-prepare-loopback iocontrol.0.tool-prepare iocontrol.0.tool-prepared
net vel-per-minute scale.0.out scale.1.in scale.2.in
net vel-per-second mux2.0.out scale.0.in
net x-amp-enable logic.0.in-00 axis.0.amp-enable-out stepgen.0.enable
net x-analog mux2.1.out halui.jog.0.analog
net x-buttons-active or2.5.in0 or2.4.out
net x-direction parport.0.pin-02-out stepgen.0.dir
net x-disable not.4.out and2.12.in1
net x-enable not.4.in flipflop.0.out mux2.1.sel
net x-hat-minus or2.4.in1 input.0.abs-hat0x-is-neg and2.1.in0
net x-hat-plus or2.4.in0 input.0.abs-hat0x-is-pos and2.2.in0
net x-jog input.0.abs-x-position mux2.1.in1
net x-knob-active or2.7.out not.0.in and2.9.in0
net x-knob-inactive not.0.out and2.10.in0 and2.11.in0
net x-set and2.9.out flipflop.0.set
net x-step parport.0.pin-03-out stepgen.0.step
net xy-buttons-active or2.5.out or2.12.in0 or2.13.in1
net xy-reset flipflop.0.reset and2.10.out flipflop.1.reset
net xyza-buttons-active or2.13.out timedelay.0.in
net y-amp-enable logic.0.in-01 axis.1.amp-enable-out stepgen.1.enable
net y-analog halui.jog.1.analog mux2.2.out
net y-buttons-active or2.6.out or2.5.in1
net y-direction parport.0.pin-04-out stepgen.1.dir
net y-disable not.5.out and2.9.in1
net y-enable flipflop.1.out not.5.in mux2.2.sel
net y-hat-minus or2.6.in1 input.0.abs-hat0y-is-neg and2.4.in0
net y-hat-plus or2.6.in0 input.0.abs-hat0y-is-pos and2.3.in0
net y-jog input.0.abs-y-position scale.5.in
net y-jog-reversed mux2.2.in1 scale.5.out
net y-knob-active not.1.in or2.8.out and2.11.in1
net y-knob-inactive not.1.out and2.10.in1
net y-select and2.12.in0 and2.11.out
net y-set flipflop.1.set and2.12.out
net y-step parport.0.pin-05-out stepgen.1.step
net z-amp-enable logic.0.in-02 axis.2.amp-enable-out stepgen.2.enable
net z-analog mux2.3.out halui.jog.2.analog
net z-button-minus or2.2.in0 input.0.btn-thumb and2.5.in0
net z-button-plus or2.2.in1 input.0.btn-top and2.6.in0
net z-buttons-active or2.2.out or2.1.in1
net z-direction parport.0.pin-06-out stepgen.2.dir
net z-disable not.6.out and2.16.in1
net z-enable not.6.in flipflop.2.out mux2.3.sel
net z-jog input.0.abs-rz-position scale.6.in
net z-jog-reversed scale.6.out mux2.3.in1
net z-knob-active not.3.in or2.10.out and2.13.in0
net z-knob-inactive not.3.out and2.15.in0 and2.14.in0
net z-set and2.13.out flipflop.2.set
net z-step parport.0.pin-07-out stepgen.2.step
view raw Sherline.hal hosted with ❤ by GitHub
# Ed Nisley - KE4ZNU
# Just do not run stepconf ever again...
[EMC]
MACHINE = Sherline-XYZA
DEBUG = 0
RS274NGC_STARTUP_CODE = G21 G40 G49 G54 G80 G90 G92.1 G94 G97 G98
[DISPLAY]
DISPLAY = axis
EDITOR = gedit
GEOMETRY = AXYZ
POSITION_OFFSET = RELATIVE
POSITION_FEEDBACK = ACTUAL
MAX_FEED_OVERRIDE = 3.0
INTRO_GRAPHIC = /home/ed/linuxcnc/configs/Sherline-XYZA/Sherline.gif
INTRO_TIME = 3
PROGRAM_PREFIX = /mnt/bulkdata/
#PROGRAM_PREFIX = /home/ed/linuxcnc/nc_files/
#INCREMENTS = .1in .05in .01in .005in .001in .0005in .0001in
INCREMENTS = 10 mm, 1 mm, 0.1 mm, 90 deg, 45 deg, 10 deg
[FILTER]
PROGRAM_EXTENSION = .py Python Script
py = python
[TASK]
TASK = milltask
CYCLE_TIME = 0.010
[RS274NGC]
PARAMETER_FILE = emc.var
[EMCMOT]
EMCMOT = motmod
SHMEM_KEY = 111
COMM_TIMEOUT = 1.0
COMM_WAIT = 0.010
BASE_PERIOD = 50000
SERVO_PERIOD = 1000000
[PARPORT]
ADDRESS = 0x378
RESET_TIME = 10000
STEPLEN = 25000
STEPSPACE = 25000
DIRSETUP = 50000
DIRHOLD = 50000
[HAL]
HALUI = halui
HALFILE = Sherline.hal
HALFILE = custom.hal
POSTGUI_HALFILE = custom_postgui.hal
[TRAJ]
AXES = 4
COORDINATES = X Y Z A
MAX_ANGULAR_VELOCITY = 45.00
DEFAULT_ANGULAR_VELOCITY = 36.0
LINEAR_UNITS = inch
ANGULAR_UNITS = degree
CYCLE_TIME = 0.010
DEFAULT_VELOCITY = 0.400
MAX_LINEAR_VELOCITY = 0.400
POSITION_FILE = lastposition.txt
NO_FORCE_HOMING = 1
[EMCIO]
EMCIO = io
CYCLE_TIME = 0.100
TOOL_TABLE = Sherline.tbl
TOOL_CHANGE_AT_G30 = 1
[AXIS_0]
TYPE = LINEAR
MAX_VELOCITY = 0.400
MAX_ACCELERATION = 5.0
STEPGEN_MAXACCEL = 10.0
SCALE = 16000.0
FERROR = 0.05
MIN_FERROR = 0.01
MIN_LIMIT = -1.0
MAX_LIMIT = 9.5
BACKLASH = 0.003
HOME_IS_SHARED = 1
HOME_SEQUENCE = 1
HOME_SEARCH_VEL = 0.3
HOME_LATCH_VEL = 0.03
HOME_FINAL_VEL = 0.4
HOME_OFFSET = 9.1
HOME = 5.25
[AXIS_1]
TYPE = LINEAR
MAX_VELOCITY = 0.400
MAX_ACCELERATION = 5.0
STEPGEN_MAXACCEL = 10.0
SCALE = 16000.0
FERROR = 0.05
MIN_FERROR = 0.01
MIN_LIMIT = 0.00
MAX_LIMIT = 5.10
BACKLASH = 0.003
HOME_IS_SHARED = 1
HOME_SEQUENCE = 2
HOME_SEARCH_VEL = 0.3
HOME_LATCH_VEL = 0.03
HOME_FINAL_VEL = 0.4
HOME_OFFSET = 5.1
HOME = 4.5
[AXIS_2]
TYPE = LINEAR
MAX_VELOCITY = 0.333
MAX_ACCELERATION = 3.0
STEPGEN_MAXACCEL = 6.0
SCALE = 16000.0
FERROR = 0.05
MIN_FERROR = 0.01
MIN_LIMIT = 0.0
MAX_LIMIT = 6.680
BACKLASH = 0.005
HOME_IS_SHARED = 1
HOME_SEQUENCE = 0
HOME_SEARCH_VEL = 0.150
HOME_LATCH_VEL = 0.015
HOME_FINAL_VEL = 0.33
HOME_OFFSET = 6.680
HOME = 6.500
[AXIS_3]
TYPE = ANGULAR
###WRAPPED_ROTARY = 1
MAX_VELOCITY = 40.0
MAX_ACCELERATION = 250.0
STEPGEN_MAXACCEL = 275.0
SCALE = 160.0
FERROR = 1
MIN_FERROR = .25
MIN_LIMIT = -999999999.9
MAX_LIMIT = 999999999.9
HOME_SEARCH_VEL = 0
HOME_LATCH_VEL = 0
HOME = 0.0
view raw Sherline.ini hosted with ❤ by GitHub