Puzzling Homing Issues

I’m using a Smoothieboard Beta for a Morgan bot.

I’m using the latest firmware.bin for Smoothie, and I’ve set the arm_solution to morgan.

In Pronterface I’ve verified that when I jog Y+ by 1, M114 reports that Y is at 1.0. Same for X+.

I have switches for homing on on X min and Y min. M119 shows them as 0 when they’re not pressed, and 1 when they are.

When I run G28 X and Y positions increase, rather than decrease as expected. It never reaches the home switches as a result.

I’ve tried changing the homing direction to home_to_max and it still advances X and Y, never hitting the home switches.

I’ve tried switching X and Y motor directions, but that gets weird. While it’ll reach the homing switches, when it backs off its reported position for each axis is less than zero.

Am I fighting the Morgan arm solution?

I’ve been playing with this some more this morning and I’m still really puzzled.

Here’s what the bot looks like with the motors and homing switches labeled, as well as some indications of how the arms should move when given various commands.

If it’s not obvious in the photo, the beta_min switch is on the opposite side of the beta motor because of how the arms are driven. A simple way of thinking about it is that when beta moves it drives the “Y” arm which uses the beta_min switch. Same is true for the alpha motor and switch, except it drives the “X” arm.

I’ll also include the end stop settings from my config, but it’s worth mentioning that the I’ve set the config so that when I send G0 X1, the arm in the top part of the photo moves clockwise (assuming my original position was X0. If X is at 10, and I send G0 X5 the arm moves counter-clockwise. Same goes for Y positions.

My settings are:

soft_endstop.enable         true         # Enable soft endstops
soft_endstop.x_min          0            # Minimum X position
soft_endstop.x_max          17          # Maximum X position
soft_endstop.y_min          0            # Minimum Y position
soft_endstop.y_max          17          # Maximum Y position

endstops_enable                              true             # The endstop module is enabled by default and can be disabled here
alpha_min_endstop                            1.24^            # Pin to read min endstop, add a ! to invert if endstop is NO connected to ground
#alpha_max_endstop                           1.25^            # Pin to read max endstop, uncomment this and comment the above if using max endstops
alpha_homing_direction                       home_to_min      # Or set to home_to_max and set alpha_max and uncomment the alpha_max_endstop
alpha_min                                    0                # This gets loaded as the current position after homing when home_to_min is set
alpha_max                                    200              # This gets loaded as the current position after homing when home_to_max is set
beta_min_endstop                             1.26^            # Pin to read min endstop, add a ! to invert if endstop is NO connected to ground
#beta_max_endstop                            1.27^            # Pin to read max endstop, uncomment this and comment the above if using max endstops
beta_homing_direction                        home_to_min      # Or set to home_to_max and set alpha_max and uncomment the alpha_max_endstop
beta_min                                     0                # This gets loaded as the current position after homing when home_to_min is set
beta_max                                     200              # This gets loaded as the current position after homing when home_to_max is set
gamma_min_endstop                            1.28^!            # Pin to read min endstop, add a ! to invert if endstop is NO connected to ground
#gamma_max_endstop                           1.29^            # Pin to read max endstop, uncomment this and comment the above if using max endstops
gamma_homing_direction                       home_to_min      # Or set to home_to_max and set alpha_max and uncomment the alpha_max_endstop
gamma_min                                    0                # This gets loaded as the current position after homing when home_to_min is set
gamma_max                                    200              # This gets loaded as the current position after homing when home_to_max is set

alpha_max_travel                             17              # Max travel in mm for alpha/X axis when homing
beta_max_travel                              17              # Max travel in mm for beta/Y axis when homing
gamma_max_travel                             17              # Max travel in mm for gamma/Z axis when homing

# Optional enable limit switches, actions will stop if any enabled limit switch is triggered
alpha_limit_enable                          false            # Set to true to enable X min and max limit switches
beta_limit_enable                           false            # Set to true to enable Y min and max limit switches
gamma_limit_enable                          false            # Set to true to enable Z min and max limit switches

# Endstops home at their fast feedrate first, then once the endstop is found they home again at their slow feedrate for accuracy
alpha_fast_homing_rate_mm_s                  2               # Alpha/X fast homing feedrate in mm/second
alpha_slow_homing_rate_mm_s                  1               # Alpha/X slow homing feedrate in mm/second
beta_fast_homing_rate_mm_s                   2               # Beta/Y  fast homing feedrate in mm/second
beta_slow_homing_rate_mm_s                   1               # Beta/Y  slow homing feedrate in mm/second
gamma_fast_homing_rate_mm_s                  2                # Gamma/Z fast homing feedrate in mm/second
gamma_slow_homing_rate_mm_s                  1                # Gamma/Z slow homing feedrate in mm/second

alpha_homing_retract_mm                      1               # Distance to retract from the endstop after it is hit for alpha/X
beta_homing_retract_mm                       1                # Distance to retract from the endstop after it is hit for beta/Y
gamma_homing_retract_mm                      1                # Distance to retract from the endstop after it is hit for gamma/Z

When I send G28, the X arm rotates clockwise, and the Y arm rotates counter-clockwise.

These are the exact opposite of what I would expect.

If I don’t send G28, and instead send something like G0 X5, the X arm rotates clockwise as expected (since X is increasing). G0 Y5 does the right thing as well (rotating counter-clockwise), since Y is increasing.

It seems then that G28 is trying to increase X and Y from 0 when trying to find the alpha_min and beta_min switches.

It’s almost as if it’s using home_to_max instead home_to_min. Except if I switch the home_to_max for both switches, it doesn’t change the behavior at all.

The only thing I can think of is that using the morgan arm solution is changing the behavior in ways I don’t understand.

I will probably switch to using the default arm solution to see if that changes things, but in the meantime, does anyone have any ideas?

@Arthur_Wolf do you have any insight here?

A thought occurred to me just now - it’s quite likely that a Morgan SCARA moves in ways that don’t match what I’d expect. Just because my machine’s geometry is similar doesn’t mean it should work the same.

I’m going to comb through the MorganSCARASolution.cpp code and see if it helps me understand things a bit better.

1 Like