Skip to content

Commit

Permalink
Merge pull request #3946 from thinkyhead/rc_g28_servo_raise_before_stow
Browse files Browse the repository at this point in the history
Raise the servo probe before stow outside ABL context
  • Loading branch information
thinkyhead committed Jun 3, 2016
2 parents 0d793fb + db0fd02 commit 8529122
Show file tree
Hide file tree
Showing 22 changed files with 201 additions and 111 deletions.
2 changes: 1 addition & 1 deletion Marlin/Conditionals.h
Original file line number Diff line number Diff line change
Expand Up @@ -732,7 +732,7 @@
#define Z_ENDSTOP_SERVO_NR -1
#endif
#if X_ENDSTOP_SERVO_NR >= 0 || Y_ENDSTOP_SERVO_NR >= 0 || HAS_Z_ENDSTOP_SERVO
#define HAS_SERVO_ENDSTOPS true
#define HAS_SERVO_ENDSTOPS
#define SERVO_ENDSTOP_IDS { X_ENDSTOP_SERVO_NR, Y_ENDSTOP_SERVO_NR, Z_ENDSTOP_SERVO_NR }
#endif
#endif
Expand Down
10 changes: 7 additions & 3 deletions Marlin/Configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// If you're using the Z MIN endstop connector for your Z probe, this has no effect.
//#define DISABLE_Z_MIN_PROBE_ENDSTOP

// Probe Raise options provide clearance for the probe to deploy and stow.
// For G28 these apply when the probe deploys and stows.
// For G29 these apply before and after the full procedure.
#define Z_RAISE_BEFORE_PROBING 15 // Raise before probe deploy (e.g., the first probe).
#define Z_RAISE_AFTER_PROBING 15 // Raise before probe stow (e.g., the last probe).

// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
// :{0:'Low',1:'High'}
#define X_ENABLE_ON 0
Expand Down Expand Up @@ -585,7 +591,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
#define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20

#endif // AUTO_BED_LEVELING_GRID
#endif // !AUTO_BED_LEVELING_GRID

// Z Probe to nozzle (X,Y) offset, relative to (0, 0).
// X and Y offsets must be integers.
Expand All @@ -610,9 +616,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l

#define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min.

#define Z_RAISE_BEFORE_PROBING 15 // How much the Z axis will be raised before traveling to the first probing point.
#define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points.
#define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point.

//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine.
// Useful to retract a deployable Z probe.
Expand Down
118 changes: 66 additions & 52 deletions Marlin/Marlin_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,7 @@ static uint8_t target_extruder;
};
#endif

#if HAS_SERVO_ENDSTOPS
#if ENABLED(HAS_SERVO_ENDSTOPS)
const int servo_endstop_id[] = SERVO_ENDSTOP_IDS;
const int servo_endstop_angle[][2] = SERVO_ENDSTOP_ANGLES;
#endif
Expand Down Expand Up @@ -724,7 +724,7 @@ void servo_init() {
servo[3].detach();
#endif

#if HAS_SERVO_ENDSTOPS
#if ENABLED(HAS_SERVO_ENDSTOPS)

endstops.enable_z_probe(false);

Expand Down Expand Up @@ -1701,7 +1701,12 @@ static void setup_for_endstop_move() {
}

inline void raise_z_after_probing() {
do_blocking_move_to_z(current_position[Z_AXIS] + Z_RAISE_AFTER_PROBING);
#if Z_RAISE_AFTER_PROBING > 0
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("raise_z_after_probing()");
#endif
do_blocking_move_to_z(current_position[Z_AXIS] + Z_RAISE_AFTER_PROBING);
#endif
}

static void clean_up_after_endstop_move() {
Expand All @@ -1724,7 +1729,7 @@ static void setup_for_endstop_move() {

if (endstops.z_probe_enabled) return;

#if HAS_SERVO_ENDSTOPS
#if ENABLED(HAS_SERVO_ENDSTOPS)

// Engage Z Servo endstop if enabled
if (servo_endstop_id[Z_AXIS] >= 0) servo[servo_endstop_id[Z_AXIS]].move(servo_endstop_angle[Z_AXIS][0]);
Expand Down Expand Up @@ -1811,7 +1816,7 @@ static void setup_for_endstop_move() {
}

static void stow_z_probe(bool doRaise = true) {
#if !(HAS_SERVO_ENDSTOPS && (Z_RAISE_AFTER_PROBING > 0))
#if !(ENABLED(HAS_SERVO_ENDSTOPS) && (Z_RAISE_AFTER_PROBING > 0))
UNUSED(doRaise);
#endif
#if ENABLED(DEBUG_LEVELING_FEATURE)
Expand All @@ -1820,21 +1825,13 @@ static void setup_for_endstop_move() {

if (!endstops.z_probe_enabled) return;

#if HAS_SERVO_ENDSTOPS
#if ENABLED(HAS_SERVO_ENDSTOPS)

// Retract Z Servo endstop if enabled
if (servo_endstop_id[Z_AXIS] >= 0) {

#if Z_RAISE_AFTER_PROBING > 0
if (doRaise) {
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) {
SERIAL_ECHOPAIR("Raise Z (after) by ", Z_RAISE_AFTER_PROBING);
SERIAL_EOL;
SERIAL_ECHO("> SERVO_ENDSTOPS > raise_z_after_probing()");
SERIAL_EOL;
}
#endif
raise_z_after_probing(); // this also updates current_position
stepper.synchronize();
}
Expand Down Expand Up @@ -2062,7 +2059,7 @@ static void setup_for_endstop_move() {

#endif // DELTA

#if HAS_SERVO_ENDSTOPS && DISABLED(Z_PROBE_SLED)
#if ENABLED(HAS_SERVO_ENDSTOPS) && DISABLED(Z_PROBE_SLED)

void raise_z_for_servo() {
float zpos = current_position[Z_AXIS], z_dest = Z_RAISE_BEFORE_PROBING;
Expand Down Expand Up @@ -2122,9 +2119,7 @@ static void setup_for_endstop_move() {

float oldXpos = current_position[X_AXIS]; // save x position
if (dock) {
#if Z_RAISE_AFTER_PROBING > 0
raise_z_after_probing(); // raise Z
#endif
raise_z_after_probing(); // raise Z
// Dock sled a bit closer to ensure proper capturing
do_blocking_move_to_x(X_MAX_POS + SLED_DOCKING_OFFSET + offset - 1);
digitalWrite(SLED_PIN, LOW); // turn off magnet
Expand Down Expand Up @@ -2173,33 +2168,36 @@ static void homeaxis(AxisEnum axis) {
sync_plan_position();

#if ENABLED(Z_PROBE_SLED)
#define _Z_SERVO_TEST (axis != Z_AXIS) // deploy Z, servo.move XY
#define _Z_PROBE_SUBTEST false // Z will never be invoked
#define _Z_SERVO_TEST (axis != Z_AXIS) // already deployed Z
#define _Z_SERVO_SUBTEST false // Z will never be invoked
#define _Z_DEPLOY (dock_sled(false))
#define _Z_STOW (dock_sled(true))
#elif SERVO_LEVELING || ENABLED(FIX_MOUNTED_PROBE)
#define _Z_SERVO_TEST (axis != Z_AXIS) // servo.move XY
#define _Z_PROBE_SUBTEST false // Z will never be invoked
#define _Z_SERVO_TEST (axis != Z_AXIS) // already deployed Z
#define _Z_SERVO_SUBTEST false // Z will never be invoked
#define _Z_DEPLOY (deploy_z_probe())
#define _Z_STOW (stow_z_probe())
#elif HAS_SERVO_ENDSTOPS
#define _Z_SERVO_TEST true // servo.move X, Y, Z
#define _Z_PROBE_SUBTEST (axis == Z_AXIS) // Z is a probe
#elif ENABLED(HAS_SERVO_ENDSTOPS)
#define _Z_SERVO_TEST true // Z not deployed yet
#define _Z_SERVO_SUBTEST (axis == Z_AXIS) // Z is a probe
#endif

if (axis == Z_AXIS) {
// If there's a Z probe that needs deployment...
#if ENABLED(Z_PROBE_SLED) || SERVO_LEVELING || ENABLED(FIX_MOUNTED_PROBE)
// ...and homing Z towards the bed? Deploy it.
if (axis_home_dir < 0) _Z_DEPLOY;
#endif
}
// If there's a Z probe that needs deployment...
#if ENABLED(Z_PROBE_SLED) || SERVO_LEVELING || ENABLED(FIX_MOUNTED_PROBE)
// ...and homing Z towards the bed? Deploy it.
if (axis == Z_AXIS && axis_home_dir < 0) {
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> SERVO_LEVELING > " STRINGIFY(_Z_DEPLOY));
#endif
_Z_DEPLOY;
}
#endif

#if HAS_SERVO_ENDSTOPS
// Engage an X or Y Servo endstop if enabled
#if ENABLED(HAS_SERVO_ENDSTOPS)
// Engage an X, Y (or Z) Servo endstop if enabled
if (_Z_SERVO_TEST && servo_endstop_id[axis] >= 0) {
servo[servo_endstop_id[axis]].move(servo_endstop_angle[axis][0]);
if (_Z_PROBE_SUBTEST) endstops.z_probe_enabled = true;
if (_Z_SERVO_SUBTEST) endstops.z_probe_enabled = true;
}
#endif

Expand Down Expand Up @@ -2316,7 +2314,7 @@ static void homeaxis(AxisEnum axis) {
axis_known_position[axis] = true;
axis_homed[axis] = true;

// Put away the Z probe
// Put away the Z probe with a function
#if ENABLED(Z_PROBE_SLED) || SERVO_LEVELING || ENABLED(FIX_MOUNTED_PROBE)
if (axis == Z_AXIS && axis_home_dir < 0) {
#if ENABLED(DEBUG_LEVELING_FEATURE)
Expand All @@ -2326,16 +2324,32 @@ static void homeaxis(AxisEnum axis) {
}
#endif

// Retract Servo endstop if enabled
#if HAS_SERVO_ENDSTOPS
// Retract X, Y (or Z) Servo endstop if enabled
#if ENABLED(HAS_SERVO_ENDSTOPS)
if (_Z_SERVO_TEST && servo_endstop_id[axis] >= 0) {

This comment has been minimized.

Copy link
@MagoKimbra

MagoKimbra Jun 4, 2016

Contributor

There is something not quite right.
If I have the servo and the active abl, Z_SERVO_TEST = (axis! = Z_AXIS), so here goes only if axis is not Z_AXIS and then do not the Z_RAISE_AFTER_PROBING...

This comment has been minimized.

Copy link
@thinkyhead

thinkyhead Jun 4, 2016

Author Member

This confused me too, at first…

If SERVO_LEVELING is enabled, the code immediately above will have called stow_z_probe() (for Z_AXIS only). So we don't need to do anything in this block for the Z axis. However, for X or Y servos (if they exist) then we do want to stow them here.

If only HAS_SERVO_ENDSTOPS is enabled (there's no Z probe servo, or AUTO_BED_LEVELING_FEATURE is disabled, but there are X and/or Y servos), the block above will not exist. So this block will be invoked for all servos. (This block would also be invoked for a Z servo when bed leveling is disabled, but a Z servo exists. The stow_z_probe() function doesn't exist in that case.)

// Raise the servo probe before stow outside ABL context.
// This is a workaround to allow use of a Servo Probe without
// ABL until more global probe handling is implemented.
#if Z_RAISE_AFTER_PROBING > 0
if (axis == Z_AXIS) {
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) SERIAL_ECHOPAIR("Raise Z (after) by ", Z_RAISE_AFTER_PROBING);
#endif
current_position[Z_AXIS] = Z_RAISE_AFTER_PROBING;
feedrate = homing_feedrate[Z_AXIS];
line_to_current_position();
stepper.synchronize();
}
#endif

#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> SERVO_ENDSTOPS > Stow with servo.move()");
#endif
servo[servo_endstop_id[axis]].move(servo_endstop_angle[axis][1]);
if (_Z_PROBE_SUBTEST) endstops.enable_z_probe(false);
if (_Z_SERVO_SUBTEST) endstops.enable_z_probe(false);
}
#endif

#endif // HAS_SERVO_ENDSTOPS

}

Expand Down Expand Up @@ -3564,7 +3578,7 @@ inline void gcode_G28() {
// Allen Key Probe for Delta
#if ENABLED(Z_PROBE_ALLEN_KEY) || SERVO_LEVELING
stow_z_probe();
#elif Z_RAISE_AFTER_PROBING > 0
#else
raise_z_after_probing(); // for non Allen Key probes, such as simple mechanical probe
#endif
#else // !DELTA
Expand Down Expand Up @@ -3624,7 +3638,7 @@ inline void gcode_G28() {
#endif

current_position[Z_AXIS] = -zprobe_zoffset + (z_tmp - real_z)
#if HAS_SERVO_ENDSTOPS || ENABLED(Z_PROBE_ALLEN_KEY) || ENABLED(Z_PROBE_SLED)
#if ENABLED(HAS_SERVO_ENDSTOPS) || ENABLED(Z_PROBE_ALLEN_KEY) || ENABLED(Z_PROBE_SLED)
+ Z_RAISE_AFTER_PROBING
#endif
;
Expand All @@ -3639,9 +3653,9 @@ inline void gcode_G28() {
// Sled assembly for Cartesian bots
#if ENABLED(Z_PROBE_SLED)
dock_sled(true); // dock the sled
#elif Z_RAISE_AFTER_PROBING > 0
#else
// Raise Z axis for non-delta and non servo based probes
#if !defined(HAS_SERVO_ENDSTOPS) && DISABLED(Z_PROBE_ALLEN_KEY) && DISABLED(Z_PROBE_SLED)
#if DISABLED(HAS_SERVO_ENDSTOPS) && DISABLED(Z_PROBE_ALLEN_KEY) && DISABLED(Z_PROBE_SLED)
raise_z_after_probing();
#endif
#endif
Expand Down Expand Up @@ -3685,7 +3699,7 @@ inline void gcode_G28() {
* G30: Do a single Z probe at the current XY
*/
inline void gcode_G30() {
#if HAS_SERVO_ENDSTOPS
#if ENABLED(HAS_SERVO_ENDSTOPS)
raise_z_for_servo();
#endif
deploy_z_probe(); // Engage Z Servo endstop if available. Z_PROBE_SLED is missed here.
Expand All @@ -3707,7 +3721,7 @@ inline void gcode_G28() {

clean_up_after_endstop_move(); // Too early. must be done after the stowing.

#if HAS_SERVO_ENDSTOPS
#if ENABLED(HAS_SERVO_ENDSTOPS)
raise_z_for_servo();
#endif
stow_z_probe(false); // Retract Z Servo endstop if available. Z_PROBE_SLED is missed here.
Expand Down Expand Up @@ -5816,13 +5830,13 @@ inline void gcode_M303() {
*/
inline void gcode_M400() { stepper.synchronize(); }

#if ENABLED(AUTO_BED_LEVELING_FEATURE) && DISABLED(Z_PROBE_SLED) && (HAS_SERVO_ENDSTOPS || ENABLED(Z_PROBE_ALLEN_KEY))
#if ENABLED(AUTO_BED_LEVELING_FEATURE) && DISABLED(Z_PROBE_SLED) && (ENABLED(HAS_SERVO_ENDSTOPS) || ENABLED(Z_PROBE_ALLEN_KEY))

/**
* M401: Engage Z Servo endstop if available
*/
inline void gcode_M401() {
#if HAS_SERVO_ENDSTOPS
#if ENABLED(HAS_SERVO_ENDSTOPS)
raise_z_for_servo();
#endif
deploy_z_probe();
Expand All @@ -5832,13 +5846,13 @@ inline void gcode_M400() { stepper.synchronize(); }
* M402: Retract Z Servo endstop if enabled
*/
inline void gcode_M402() {
#if HAS_SERVO_ENDSTOPS
#if ENABLED(HAS_SERVO_ENDSTOPS)
raise_z_for_servo();
#endif
stow_z_probe(false);
}

#endif // AUTO_BED_LEVELING_FEATURE && (HAS_SERVO_ENDSTOPS || Z_PROBE_ALLEN_KEY) && !Z_PROBE_SLED
#endif // AUTO_BED_LEVELING_FEATURE && (ENABLED(HAS_SERVO_ENDSTOPS) || Z_PROBE_ALLEN_KEY) && !Z_PROBE_SLED

#if ENABLED(FILAMENT_WIDTH_SENSOR)

Expand Down Expand Up @@ -7054,14 +7068,14 @@ void process_next_command() {
gcode_M400();
break;

#if ENABLED(AUTO_BED_LEVELING_FEATURE) && (HAS_SERVO_ENDSTOPS || ENABLED(Z_PROBE_ALLEN_KEY)) && DISABLED(Z_PROBE_SLED)
#if ENABLED(AUTO_BED_LEVELING_FEATURE) && (ENABLED(HAS_SERVO_ENDSTOPS) || ENABLED(Z_PROBE_ALLEN_KEY)) && DISABLED(Z_PROBE_SLED)
case 401:
gcode_M401();
break;
case 402:
gcode_M402();
break;
#endif // AUTO_BED_LEVELING_FEATURE && (HAS_SERVO_ENDSTOPS || Z_PROBE_ALLEN_KEY) && !Z_PROBE_SLED
#endif // AUTO_BED_LEVELING_FEATURE && (ENABLED(HAS_SERVO_ENDSTOPS) || Z_PROBE_ALLEN_KEY) && !Z_PROBE_SLED

#if ENABLED(FILAMENT_WIDTH_SENSOR)
case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or display nominal filament width
Expand Down
2 changes: 1 addition & 1 deletion Marlin/SanityCheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@
/**
* Servo deactivation depends on servo endstops
*/
#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) && !HAS_SERVO_ENDSTOPS
#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) && DISABLED(HAS_SERVO_ENDSTOPS)
#error "At least one of the ?_ENDSTOP_SERVO_NR is required for DEACTIVATE_SERVOS_AFTER_MOVE."
#endif

Expand Down
10 changes: 7 additions & 3 deletions Marlin/example_configurations/Felix/Configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// If you're using the Z MIN endstop connector for your Z probe, this has no effect.
//#define DISABLE_Z_MIN_PROBE_ENDSTOP

// Probe Raise options provide clearance for the probe to deploy and stow.
// For G28 these apply when the probe deploys and stows.
// For G29 these apply before and after the full procedure.
#define Z_RAISE_BEFORE_PROBING 15 // Raise before probe deploy (e.g., the first probe).
#define Z_RAISE_AFTER_PROBING 15 // Raise before probe stow (e.g., the last probe).

// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
// :{0:'Low',1:'High'}
#define X_ENABLE_ON 0
Expand Down Expand Up @@ -567,7 +573,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
#define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20

#endif // AUTO_BED_LEVELING_GRID
#endif // !AUTO_BED_LEVELING_GRID

// Z Probe to nozzle (X,Y) offset, relative to (0, 0).
// X and Y offsets must be integers.
Expand All @@ -592,9 +598,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l

#define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min.

#define Z_RAISE_BEFORE_PROBING 15 // How much the Z axis will be raised before traveling to the first probing point.
#define Z_RAISE_BETWEEN_PROBINGS 5 // How much the Z axis will be raised when traveling from between next probing points.
#define Z_RAISE_AFTER_PROBING 15 // How much the Z axis will be raised after the last probing point.

//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" // These commands will be executed in the end of G29 routine.
// Useful to retract a deployable Z probe.
Expand Down
Loading

0 comments on commit 8529122

Please sign in to comment.