Master branch gantry Mesa 7i96
- ikkuh
-
Topic Author
- Offline
- Elite Member
-
- Posts: 272
- Thank you received: 46
Thanks @rodw for your great example at forum.linuxcnc.org/47-hal-examples/34072...ranch-gantry-example
You helped me a lot when I was using the cheap Chines Bob and a gantry. Now I am using a Mesa 7i96 and I can not get it to work again. I want a functioning gantry for my Y axes, I had it working with the parallel Bob's.
I finally got the limit and home switches working, I had to invert them and it took me a long time to figure out that I can not use the
-not
_not
But I can not get the gantry to work with both Y motors working as they should. I can see in the hallmonitor that three signals are generated, I seem to miss the fourth signal for the second Y motor.
Can you please take a look and tell me what I am doing wrong? Would be really appreciated

(my git repo: git.cnckloon.nl/CNCZone/Mesa_2019 )
7i96.hal
# #######################################
#
# HAL file for HostMot2 with 3 steppers
#
# Derived from Ted Hyde's original hm2-servo config
#
# Based up work and discussion with Seb & Peter & Jeff
# GNU license references - insert here. www.linuxcnc.org
#
#
# ########################################
# Firmware files are in /lib/firmware/hm2/7i43/
# Must symlink the hostmot2 firmware directory of sanbox to
# /lib/firmware before running EMC2...
# sudo ln -s $HOME/emc2-sandbox/src/hal/drivers/mesa-hostmot2/firmware /lib/firmware/hm2
#
# See also:
# <http://www.linuxcnc.org/docs/devel/html/man/man9/hostmot2.9.html#config%20modparam>
# and http://wiki.linuxcnc.org/cgi-bin/emcinfo.pl?HostMot2
#
# #####################################################################
# ###################################
# Core EMC/HAL Loads
# ###################################
# kinematics
loadrt [KINS]KINEMATICS
# motion controller, get name and thread periods from ini file
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS
# hostmot2 driver
loadrt hostmot2
# load low-level driver
loadrt [HOSTMOT2](DRIVER) config=[HOSTMOT2](CONFIG)
# load estop latch component
loadrt estop_latch
####https://forum.linuxcnc.org/49-basic-configuration/33867-how-to-connect-home-switches-for-dual-motor-on-3-axis-machine-2-8-pre-master#104933
loadrt stepgen step_type=0,0,0,0
# ################################################
# THREADS
# ################################################
addf hm2_[HOSTMOT2](BOARD).0.read servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
# revel in the free time here from not having to run PID
addf hm2_[HOSTMOT2](BOARD).0.write servo-thread
addf estop-latch.0 servo-thread
# --- MAX-X ---
#net max-x <= hm2_7i96.0.gpio.010.in
# --- ESTOP ---
net estop-ext <= hm2_7i96.0.gpio.010.in
net estop-out <= iocontrol.0.user-enable-out
net home-x <= hm2_7i96.0.gpio.000.in_not
net home-yR <= hm2_7i96.0.gpio.001.in_not
net home-yL <= hm2_7i96.0.gpio.002.in_not
net home-z <= hm2_7i96.0.gpio.003.in_not
#probe
#net probe-in => motion.probe-input
#net probe-in <= hm2_7i96.0.gpio.009.in
# --- GMoccapy tool probe
net probe motion.probe-input <= hm2_7i96.0.gpio.009.in
# ######################################################
# Axis-of-motion Specific Configs (not the GUI)
# ######################################################
# ################
# X [0] Axis
# ################
# axis enable chain
newsig emcmot.00.enable bit
sets emcmot.00.enable FALSE
net emcmot.00.enable <= joint.0.amp-enable-out
net emcmot.00.enable => hm2_[HOSTMOT2](BOARD).0.stepgen.00.enable
# position command and feedback
net emcmot.00.pos-cmd <= joint.0.motor-pos-cmd
net emcmot.00.pos-cmd => hm2_[HOSTMOT2](BOARD).0.stepgen.00.position-cmd
net motor.00.pos-fb <= hm2_[HOSTMOT2](BOARD).0.stepgen.00.position-fb
net motor.00.pos-fb => joint.0.motor-pos-fb
# timing parameters
setp hm2_[HOSTMOT2](BOARD).0.stepgen.00.dirsetup [JOINT_0]DIRSETUP
setp hm2_[HOSTMOT2](BOARD).0.stepgen.00.dirhold [JOINT_0]DIRHOLD
setp hm2_[HOSTMOT2](BOARD).0.stepgen.00.steplen [JOINT_0]STEPLEN
setp hm2_[HOSTMOT2](BOARD).0.stepgen.00.stepspace [JOINT_0]STEPSPACE
setp hm2_[HOSTMOT2](BOARD).0.stepgen.00.position-scale [JOINT_0]SCALE
setp hm2_[HOSTMOT2](BOARD).0.stepgen.00.maxvel [JOINT_0]STEPGEN_MAX_VEL
setp hm2_[HOSTMOT2](BOARD).0.stepgen.00.maxaccel [JOINT_0]STEPGEN_MAX_ACC
setp hm2_[HOSTMOT2](BOARD).0.stepgen.00.step_type 0
# ################
# Yr [1] Axis
# ################
# axis enable chain
newsig emcmot.01.enable bit
sets emcmot.01.enable FALSE
net emcmot.01.enable <= joint.1.amp-enable-out
net emcmot.01.enable => hm2_[HOSTMOT2](BOARD).0.stepgen.01.enable
# position command and feedback
net emcmot.01.pos-cmd <= joint.1.motor-pos-cmd
net emcmot.01.pos-cmd => hm2_[HOSTMOT2](BOARD).0.stepgen.01.position-cmd
net motor.01.pos-fb <= hm2_[HOSTMOT2](BOARD).0.stepgen.01.position-fb
net motor.01.pos-fb => joint.1.motor-pos-fb
# timing parameters
setp hm2_[HOSTMOT2](BOARD).0.stepgen.01.dirsetup [JOINT_1]DIRSETUP
setp hm2_[HOSTMOT2](BOARD).0.stepgen.01.dirhold [JOINT_1]DIRHOLD
setp hm2_[HOSTMOT2](BOARD).0.stepgen.01.steplen [JOINT_1]STEPLEN
setp hm2_[HOSTMOT2](BOARD).0.stepgen.01.stepspace [JOINT_1]STEPSPACE
setp hm2_[HOSTMOT2](BOARD).0.stepgen.01.position-scale [JOINT_1]SCALE
setp hm2_[HOSTMOT2](BOARD).0.stepgen.01.maxvel [JOINT_1]STEPGEN_MAX_VEL
setp hm2_[HOSTMOT2](BOARD).0.stepgen.01.maxaccel [JOINT_1]STEPGEN_MAX_ACC
setp hm2_[HOSTMOT2](BOARD).0.stepgen.01.step_type 0
# ################
# Yl [2] Axis
# ################
# axis enable chain
newsig emcmot.02.enable bit
sets emcmot.02.enable FALSE
net emcmot.02.enable <= joint.2.amp-enable-out
net emcmot.02.enable => hm2_[HOSTMOT2](BOARD).0.stepgen.02.enable
# position command and feedback
net emcmot.02.pos-cmd <= joint.2.motor-pos-cmd
net emcmot.02.pos-cmd => hm2_[HOSTMOT2](BOARD).0.stepgen.02.position-cmd
net motor.02.pos-fb <= hm2_[HOSTMOT2](BOARD).0.stepgen.02.position-fb
net motor.02.pos-fb => joint.2.motor-pos-fb
# timing parameters
setp hm2_[HOSTMOT2](BOARD).0.stepgen.02.dirsetup [JOINT_1]DIRSETUP
setp hm2_[HOSTMOT2](BOARD).0.stepgen.02.dirhold [JOINT_1]DIRHOLD
setp hm2_[HOSTMOT2](BOARD).0.stepgen.02.steplen [JOINT_1]STEPLEN
setp hm2_[HOSTMOT2](BOARD).0.stepgen.02.stepspace [JOINT_1]STEPSPACE
setp hm2_[HOSTMOT2](BOARD).0.stepgen.02.position-scale [JOINT_1]SCALE
setp hm2_[HOSTMOT2](BOARD).0.stepgen.02.maxvel [JOINT_1]STEPGEN_MAX_VEL
setp hm2_[HOSTMOT2](BOARD).0.stepgen.02.maxaccel [JOINT_1]STEPGEN_MAX_ACC
setp hm2_[HOSTMOT2](BOARD).0.stepgen.02.step_type 0
# ################
# Z [2] Axis
# ################
# axis enable chain
newsig emcmot.03.enable bit
sets emcmot.03.enable FALSE
net emcmot.03.enable <= joint.3.amp-enable-out
net emcmot.03.enable => hm2_[HOSTMOT2](BOARD).0.stepgen.03.enable
# position command and feedback
net emcmot.03.pos-cmd <= joint.3.motor-pos-cmd
net emcmot.03.pos-cmd => hm2_[HOSTMOT2](BOARD).0.stepgen.03.position-cmd
net motor.03.pos-fb <= hm2_[HOSTMOT2](BOARD).0.stepgen.03.position-fb
net motor.03.pos-fb => joint.3.motor-pos-fb
# timing parameters
setp hm2_[HOSTMOT2](BOARD).0.stepgen.03.dirsetup [JOINT_3]DIRSETUP
setp hm2_[HOSTMOT2](BOARD).0.stepgen.03.dirhold [JOINT_3]DIRHOLD
setp hm2_[HOSTMOT2](BOARD).0.stepgen.03.steplen [JOINT_3]STEPLEN
setp hm2_[HOSTMOT2](BOARD).0.stepgen.03.stepspace [JOINT_3]STEPSPACE
setp hm2_[HOSTMOT2](BOARD).0.stepgen.03.position-scale [JOINT_3]SCALE
setp hm2_[HOSTMOT2](BOARD).0.stepgen.03.maxvel [JOINT_3]STEPGEN_MAX_VEL
setp hm2_[HOSTMOT2](BOARD).0.stepgen.03.maxaccel [JOINT_3]STEPGEN_MAX_ACC
setp hm2_[HOSTMOT2](BOARD).0.stepgen.03.step_type 0
#
# The Mesa AnyIO output pins can be in open-drain mode (drive low, float
# high) or push/pull mode (drive low, drive high).
#
# When a logical output is 1 in open-drain mode, the FPGA lets the pin
# float and it gets pulled high to +5V via a 10K resistor.
#
# When a logical output is 1 in push/pull mode, the FPGA pushes the pin
# high but only to +3.3V. This is problematic on some kinds of inputs.
#
#setp hm2_[HOSTMOT2](BOARD).0.gpio.048.is_opendrain 1
#setp hm2_[HOSTMOT2](BOARD).0.gpio.049.is_opendrain 1
#setp hm2_[HOSTMOT2](BOARD).0.gpio.054.is_opendrain 1
#setp hm2_[HOSTMOT2](BOARD).0.gpio.055.is_opendrain 1
#setp hm2_[HOSTMOT2](BOARD).0.gpio.060.is_opendrain 1
#setp hm2_[HOSTMOT2](BOARD).0.gpio.061.is_opendrain 1
# ##################################################
# Standard I/O Block - EStop, Etc
# ##################################################
# A basic estop loop that only includes the hostmot watchdog.
net user-enable iocontrol.0.user-request-enable => estop-latch.0.reset
net enable-latch estop-latch.0.ok-out => iocontrol.0.emc-enable-in
net watchdog hm2_[HOSTMOT2](BOARD).0.watchdog.has_bit => estop-latch.0.fault-in
# create signals for tool loading loopback
net tool-prep-loop iocontrol.0.tool-prepare => iocontrol.0.tool-prepared
net tool-change-loop iocontrol.0.tool-change => iocontrol.0.tool-changed
7i96.ini
[EMC]
# The version string for this INI file.
VERSION = 1.1
# Name of machine, for use with display, etc.
MACHINE = 7i96 Ton CNC
# Debug level, 0 means no messages. See src/emc/nml_int/emcglb.h for others
#DEBUG = 0x00000003
#DEBUG = 0x00000007
DEBUG = 0
[DISPLAY]
# Name of display program, e.g., tklinuxcnc
#DISPLAY = tklinuxcnc
DISPLAY = gmoccapy
# Cycle time, in seconds, that display will sleep between polls
CYCLE_TIME = 0.0500
# Path to help file
HELP_FILE = tklinuxcnc.txt
# Initial display setting for position, RELATIVE or MACHINE
POSITION_OFFSET = RELATIVE
# Initial display setting for position, COMMANDED or ACTUAL
POSITION_FEEDBACK = ACTUAL
# Highest value that will be allowed for feed override, 1.0 = 100%
MAX_FEED_OVERRIDE = 1.5
# Prefix to be used
PROGRAM_PREFIX = /home/ton/linuxcnc/nc_files
# Introductory graphic
INTRO_GRAPHIC = linuxcnc.gif
INTRO_TIME = 5
[FILTER]
PROGRAM_EXTENSION = .png,.gif,.jpg Grayscale Depth Image
PROGRAM_EXTENSION = .py Python Script
png = image-to-gcode
gif = image-to-gcode
jpg = image-to-gcode
py = python
[RS274NGC]
# File containing interpreter variables
PARAMETER_FILE = 7i96.var
[EMCMOT]
EMCMOT = motmod
# Timeout for comm to emcmot, in seconds
COMM_TIMEOUT = 1.0
# Servo task period, in nanoseconds
SERVO_PERIOD = 1000000
[TASK]
# Name of task controller program, e.g., milltask
TASK = milltask
# Cycle time, in seconds, that task controller will sleep between polls
CYCLE_TIME = 0.010
[HAL]
# The run script first uses halcmd to execute any HALFILE
# files, and then to execute any individual HALCMD commands.
# list of hal config files to run through halcmd
# files are executed in the order in which they appear
HALFILE = 7i96.hal
# list of halcmd commands to execute
# commands are executed in the order in which they appear
#HALCMD = save neta
[HALUI]
#No Content
[TRAJ]
COORDINATES = X Y Z
#HOME = 0 0 0
LINEAR_UNITS = mm
ANGULAR_UNITS = degree
[EMCIO]
# Name of IO controller program, e.g., io
EMCIO = io
# cycle time, in seconds
CYCLE_TIME = 0.100
# tool table file
TOOL_TABLE = tool.tbl
[KINS]
JOINTS = 4
KINEMATICS = trivkins coordinates=XYYZ
[AXIS_X]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 10
MAX_ACCELERATION = 20
[JOINT_0]
# X
# Step timing is 40 us steplen + 40 us stepspace
# That gives 80 us step period = 12.5 KHz step freq
#
# Bah, even software stepping can handle that, hm2 doesnt buy you much with
# such slow steppers.
#
# Scale is 200 steps/rev * 5 revs/inch = 1000 steps/inch
#
# This gives a maxvel of 12.5/1 = 12.5 ips
#
TYPE = LINEAR
MAX_VELOCITY = 10
MAX_ACCELERATION = 20
# Set Stepgen max 20% higher than the axis
STEPGEN_MAX_VEL = 12
STEPGEN_MAX_ACC = 24
BACKLASH = 0.000
# scale is 200 steps/rev * 5 revs/inch
SCALE = 1000
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.050
MIN_FERROR = 0.005
#HOME = 0.000
#HOME_OFFSET = 0.10
#HOME_SEARCH_VEL = 0.10
#HOME_LATCH_VEL = -0.01
#HOME_USE_INDEX = YES
#HOME_IGNORE_LIMITS = YES
HOME_SEQUENCE = 1
# these are in nanoseconds
DIRSETUP = 200
DIRHOLD = 200
STEPLEN = 40000
STEPSPACE = 40000
[AXIS_Y]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 10
MAX_ACCELERATION = 20
[JOINT_1]
## Y
TYPE = LINEAR
MAX_VELOCITY = 10
MAX_ACCELERATION = 20
# Set Stepgen max 20% higher than the axis
STEPGEN_MAX_VEL = 12
STEPGEN_MAX_ACC = 24
BACKLASH = 0.000
SCALE = 1000
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.050
MIN_FERROR = 0.005
#HOME = 0.000
#HOME_OFFSET = 0.10
#HOME_SEARCH_VEL = 0.10
#HOME_LATCH_VEL = -0.01
#HOME_USE_INDEX = YES
#HOME_IGNORE_LIMITS = YES
HOME_SEQUENCE = 1
# these are in nanoseconds
DIRSETUP = 200
DIRHOLD = 200
STEPLEN = 40000
STEPSPACE = 40000
[JOINT_2]
## Y
TYPE = LINEAR
MAX_VELOCITY = 10
MAX_ACCELERATION = 20
# Set Stepgen max 20% higher than the axis
STEPGEN_MAX_VEL = 12
STEPGEN_MAX_ACC = 24
BACKLASH = 0.000
SCALE = 1000
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.050
MIN_FERROR = 0.005
#HOME = 0.000
#HOME_OFFSET = 0.10
#HOME_SEARCH_VEL = 0.10
#HOME_LATCH_VEL = -0.01
#HOME_USE_INDEX = YES
#HOME_IGNORE_LIMITS = YES
HOME_SEQUENCE = 1
# these are in nanoseconds
DIRSETUP = 200
DIRHOLD = 200
STEPLEN = 40000
STEPSPACE = 40000
[AXIS_Z]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 10
MAX_ACCELERATION = 20
[JOINT_3]
## Z
TYPE = LINEAR
MAX_VELOCITY = 10
MAX_ACCELERATION = 20
# Set Stepgen max 20% higher than the axis
STEPGEN_MAX_VEL = 12
STEPGEN_MAX_ACC = 24
BACKLASH = 0.000
SCALE = 1000
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
FERROR = 0.050
MIN_FERROR = 0.005
#HOME = 0.000
#HOME_OFFSET = 0.10
#HOME_SEARCH_VEL = 0.10
#HOME_LATCH_VEL = -0.01
#HOME_USE_INDEX = YES
#HOME_IGNORE_LIMITS = YES
HOME_SEQUENCE = 0
# these are in nanoseconds
DIRSETUP = 200
DIRHOLD = 200
STEPLEN = 40000
STEPSPACE = 40000
[HOSTMOT2]
DRIVER=hm2_eth board_ip="10.10.10.10" debug=0
BOARD=7i96
CONFIG="num_encoders=1 num_stepgens=5"
Please Log in or Create an account to join the conversation.
- PCW
-
- Away
- Moderator
-
- Posts: 18559
- Thank you received: 5099
These numbers might make sense for a small inch machine bit not for mm (scaling of 1000 =1u resolution seems high also)
I would set the step timings to something reasonable also
say
DIRSETUP = 20000
DIRHOLD = 20000
STEPLEN = 5000
STEPSPACE = 5000
Please Log in or Create an account to join the conversation.
- rodw
-
- Offline
- Platinum Member
-
- Posts: 11230
- Thank you received: 3755
Then make sure the HOME_SEQUENCE = -1 for both sides of the gantry in the INI file
Please Log in or Create an account to join the conversation.
- andypugh
-
- Offline
- Moderator
-
- Posts: 23320
- Thank you received: 4946
You need to manually add another joint to your INI file and configure it in Hal.
Are you sure? He seems to have 3 axes and 4 joints, as expected.
Please Log in or Create an account to join the conversation.
- ikkuh
-
Topic Author
- Offline
- Elite Member
-
- Posts: 272
- Thank you received: 46
You need to manually add another joint to your INI file and configure it in Hal.
Are you sure? He seems to have 3 axes and 4 joints, as expected.
I was wondering too. Changed a lot an hour ago, but still not working. If I use Hallshow just three motion counter change, the fourth one stays at 0.
Please Log in or Create an account to join the conversation.
- PCW
-
- Away
- Moderator
-
- Posts: 18559
- Thank you received: 5099
joint.1.motor-pos-cmd (y1 command) _after_ homing?
Please Log in or Create an account to join the conversation.
- tommylight
-
- Offline
- Moderator
-
- Posts: 20202
- Thank you received: 6876
Copy and paste should do it.This is generally just a cut and paste exercise .......
Please Log in or Create an account to join the conversation.
- tommylight
-
- Offline
- Moderator
-
- Posts: 20202
- Thank you received: 6876
Please Log in or Create an account to join the conversation.
- ikkuh
-
Topic Author
- Offline
- Elite Member
-
- Posts: 272
- Thank you received: 46
In your ini file you need to have "home" position and home search velocity set ( it is omitted ) and both Y axis must have "-1" set for sequence.
They are there in my latest version of the config files.Does not work though.
Having loads of following errors:
task: main loop took 0.132463 seconds
IDLE
1 2
task: main loop took 0.101422 seconds
IDLE
MANUAL Mode
RUN
IDLE
joint 3 following error
emc/task/taskintf.cc 942: Error on joint 3, command number 169
task: main loop took 0.160427 seconds
IDLE
Joint_3 is home_sequence 0
hal file: git.cnckloon.nl/CNCZone/mesa_2019/src/br...master/mesa_2019.hal
ini file: git.cnckloon.nl/CNCZone/mesa_2019/src/br...master/mesa_2019.ini
Getting frustrated now

Please Log in or Create an account to join the conversation.
- PCW
-
- Away
- Moderator
-
- Posts: 18559
- Thank you received: 5099
This will fail instantly:
MAX_VELOCITY = 40.0
...
STEPGEN_MAX_VEL = 12
(stepgen max acceleration and velocity limits should be set to about 125% of the joint and axis acceleration and velocity limits)
DIRSETUP = 35000
DIRHOLD = 35000
STEPLEN = 1
STEPSPACE = 0
and a 1 ns step will not drive any real hardware
I suggest (again) 5000,5000 for steplen/stepspace
Please Log in or Create an account to join the conversation.