Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce the reprobe and rewipe features #3553

Closed
wants to merge 11 commits into from
Closed
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions Marlin/Configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,22 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// You probably don't need more than 3 (squared=9).
#define AUTO_BED_LEVELING_GRID_POINTS 2

//#define REPROBE // Re-attempts probing

#ifdef REPROBE
#define Z_RETRY_PT 15 // Z height to move the hotend after failed probe
#define NUM_ATTEMPTS 3 // Number of attempts to make before giving up
//#define PROBE_FAIL_PANIC // Completely give up printing if the final attempt fails (use G26 to get out of failed state)
//#define REWIPE // Re-attempts wiping
#ifdef REWIPE
#define NUM_REWIPES 6 // Number of (back-and-forth) re-wipe attemps to make, e.g. 6 would produce 12 strokes
// Re-wipe line from REWIPE_FIRST_PT to REWIPE_SECOND_PT
#define REWIPE_FIRST_PT {45, 173}
#define REWIPE_SECOND_PT {115, 173}
#define Z_REWIPE_PT (Z_MIN_POS + 1) // Depth to re-wipe at
#endif
#endif

#else // !AUTO_BED_LEVELING_GRID

// Arbitrary points to probe.
Expand Down Expand Up @@ -609,6 +625,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 MIN_PROBE_PT (Z_MIN_POS-2) //How far the extruder should move down to probe
Copy link
Member

@thinkyhead thinkyhead Apr 20, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's a minor thing, but I just know the missing space here is going to drive me crazy.

#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.
Expand Down
161 changes: 159 additions & 2 deletions Marlin/Marlin_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@
* G4 - Dwell S<seconds> or P<milliseconds>
* G10 - retract filament according to settings of M207
* G11 - retract recover filament according to settings of M208
* G26 - Allow G-codes to enter the buffer again after a PROBE_FAIL_PANIC occurs during a G29
* G28 - Home one or more axes
* G29 - Detailed Z probe, probes the bed at 3 or more points. Will fail if you haven't homed yet.
* G30 - Single Z probe, probes bed at current XY location.
Expand Down Expand Up @@ -344,6 +345,10 @@ static uint8_t target_extruder;
int xy_travel_speed = XY_TRAVEL_SPEED;
float zprobe_zoffset = Z_PROBE_OFFSET_FROM_EXTRUDER;
bool bed_leveling_in_progress = false;
#if ENABLED(REPROBE)
uint8_t reprobe_attempts = 0;
bool probe_fail = false;
#endif
#endif

#if ENABLED(Z_DUAL_ENDSTOPS) && DISABLED(DELTA)
Expand Down Expand Up @@ -921,6 +926,17 @@ void gcode_line_error(const char* err, bool doFlush = true) {
serial_count = 0;
}

void clear_buffer() {
for (uint8_t i=0; i < BUFSIZE; i++)
for (uint8_t j=0; j < MAX_CMD_SIZE; j++)
command_queue[i][j] = NULL;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be…

for (uint8_t i=0; i < BUFSIZE; i++) command_queue[i][0] = '\0';

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@thinkyhead why just the first element of each row? Why not each element in the 2D array?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the first character in a string is nul, the string is considered empty. So there's no need to clear the entire string.

MYSERIAL.flush();
serial_count = 0;
commands_in_queue = 1;
cmd_queue_index_r = BUFSIZE-1;
cmd_queue_index_w = 0;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These three lines can be replaced with…

cmd_queue_index_r = cmd_queue_index_w = commands_in_queue = 0;

}

inline void get_serial_commands() {
static char serial_line_buffer[MAX_CMD_SIZE];
static boolean serial_comment_mode = false;
Expand Down Expand Up @@ -1019,6 +1035,22 @@ inline void get_serial_commands() {

// If command was e-stop process now
if (strcmp(command, "M112") == 0) kill(PSTR(MSG_KILLED));
#if ENABLED(PROBE_FAIL_PANIC)
if (strcmp(command, "G26") == 0) {
LCD_MESSAGEPGM(WELCOME_MSG);
probe_fail = false;
}
else if(probe_fail && (strchr(command, 'G') != NULL || strchr(command, 'M') != NULL) && strstr(command, "M105") == NULL) {
for(uint8_t j=0; j < MAX_CMD_SIZE; j++)
command_queue[cmd_queue_index_r][j] = 0;
if(commands_in_queue) {
commands_in_queue = 1;
cmd_queue_index_r = (cmd_queue_index_r + 1) % BUFSIZE;
}
serial_count = 0;
return;
}
#endif
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jbrazio @thinkyhead please take a look at this snippet. In case the probing fails all attempts G26 is used to give control back to the host, all other commands are ignored so that the print doesn't process. This is managed in the parser and is intended to handle hosts that aren't aware of this feature.

We prefer to reserve G26 if possible.

Granted if the intent is to be able to do manual cleaning of the nozzle and continue then the host needs to prevent all G-Code from being sent other than G26, Marlin cannot hold each command it receives in its buffer until it sees a G26, not enough memory; and it shouldn't throw away all other commands if they're not G26 as done here. This only done to handle "unaware" hosts.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jbrazio @thinkyhead would it possible for us to reserve G26?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hum you may I've checked and G26 is not defined anywhere. But I assume when we need user intervention we would call stop() right ? To get out of stop() you may use M999 S1.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jbrazio currently we don't call stop(). The buffer can still get filled when IsStopped() == true. To prevent any host from sending commands into the buffer after probing has failed we throw away all commands other than G26. That's why we handle G26 in the parser. M999 S1 could be used for this purpose as well but since we allocated G26 before this PR and are afraid of having future conflicts with it.

Copy link
Member

@thinkyhead thinkyhead May 20, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@scalez We've had some discussions recently about the handling of commands ahead of the normal command buffer. I don't know how conclusive they were. But understand that if a host fills up the buffer after issuing G29 (most likely while printing a GCode file) then the G26 command may not be seen until the G29 command exits and the machine resumes accepting commands.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@thinkyhead Currently we're flushing the command buffer when we enter the PROBE_FAIL_PANIC state. So even if the buffer is filled it is cleared and there is plenty of room for G26 to enter the buffer.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see! So, I'm also wondering why we need a new command or a "special" kind of panic, since we have M999 (and recently added M999 S1 to preserve the rx_buffer). Also, if, as you say, the buffer is flushed then there should be no need to do special handling of G26 outside of the normal command buffer. (We want to minimize calls to strcmp in the gcode parser.)


#if defined(NO_TIMEOUTS) && NO_TIMEOUTS > 0
last_command_time = ms;
Expand Down Expand Up @@ -1535,6 +1567,42 @@ static void setup_for_endstop_move() {

#endif // !AUTO_BED_LEVELING_GRID

static void do_blocking_move_to(float x, float y, float z);
inline void do_blocking_move_to_xy(float x, float y);
inline void do_blocking_move_to_x(float x);
inline void do_blocking_move_to_z(float z);

#if ENABLED(REPROBE)
void probing_failed() {
if (reprobe_attempts < NUM_ATTEMPTS-1) {
#if DISABLED(REWIPE)
SERIAL_ERRORLNPGM(MSG_REPROBE);
LCD_MESSAGEPGM(MSG_REPROBE);
#endif
do_blocking_move_to_z(Z_RETRY_PT);
#if ENABLED(REWIPE)
SERIAL_ERRORLNPGM(MSG_REWIPE);
LCD_MESSAGEPGM(MSG_REWIPE);
float rewipe_first_pt[2] = REWIPE_FIRST_PT;
float rewipe_second_pt[2] = REWIPE_SECOND_PT;
do_blocking_move_to_xy(rewipe_first_pt[X_AXIS], rewipe_first_pt[Y_AXIS]);
do_blocking_move_to_z(Z_REWIPE_PT);
for (uint8_t i=0; i < NUM_REWIPES; i++) {
do_blocking_move_to_xy(rewipe_second_pt[X_AXIS], rewipe_second_pt[Y_AXIS]);
do_blocking_move_to_xy(rewipe_first_pt[X_AXIS], rewipe_first_pt[Y_AXIS]);
}
#endif
do_blocking_move_to_z(Z_RETRY_PT);
do_blocking_move_to_xy(LEFT_PROBE_BED_POSITION, FRONT_PROBE_BED_POSITION);
reprobe_attempts++;
}
else {
do_blocking_move_to_z(Z_RETRY_PT);
reprobe_attempts++;
}
}
#endif

static void run_z_probe() {

/**
Expand Down Expand Up @@ -1579,7 +1647,7 @@ static void setup_for_endstop_move() {
feedrate = homing_feedrate[Z_AXIS];

// Move down until the Z probe (or endstop?) is triggered
float zPosition = -(Z_MAX_LENGTH + 10);
float zPosition = MIN_PROBE_PT;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should not be altered. The length given is meant to be excessive, so that even if the Z probe is very far away from the bed it will still reach it. We can't use a "point" here because the Z coordinate is not really "known" when probing.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@thinkyhead this movement is still relative to the origin. Therefore, -(Z_MAX_LENGTH + 10) would be a huge negative number that is essentially guaranteed to be outside of the range of the Z axis (Z_MIN_POS to Z_MAX_POS).

MIN_PROBE_PT is set in Configuration.h and could easily be set to any value, including -(Z_MAX_LENGTH + 10) if desired for any reason.

Why exactly do you think the position is lost during probing? set_bed_level_equation_lsq(plane_equation_coefficients) is not called until after probing is completed. Maybe the position isn't well-known if you are using the same mechanism for probing as you are for homing, in which case you can still simply change the value of MIN_PROBE_PT in Configuration.h.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why exactly do you think the position is lost during probing?

I don't mean to say it's lost, just not accurate or especially meaningful. During probing, the Z position is just a working number for moving up and down, and not necessarily guaranteed to be an accurate reflection of the Z-distance to the bed. At least, that is how I have tended to think of it. But maybe that has changed…?

Copy link
Contributor Author

@scalez scalez May 11, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@thinkyhead I think I see what you mean, when one point successfully probes the current position may not be accurate after the pin is toggled. From our tests this works fine.

In fact, we've even published a commit in our repo that sets the position of an axis when an endstop (not the reference one used for homing) is hit to (float)endstops_trigsteps[_AXIS(AXIS)]/axis_steps_per_unit[_AXIS(AXIS)]. That way, when an endstop is hit the position is kept to the current position on that axis. Take a look at alephobjects@ec71eda to see what I'm talking about.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @scalez I will look at that soon.

line_to_z(zPosition);
stepper.synchronize();

Expand All @@ -1589,6 +1657,12 @@ static void setup_for_endstop_move() {
current_position[X_AXIS], current_position[Y_AXIS], zPosition,
current_position[E_AXIS]
);
#ifdef REPROBE
if (zPosition == MIN_PROBE_PT && !digitalRead(Z_MIN_PIN)^Z_MIN_ENDSTOP_INVERTING) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see you're trying to keep the Z probe from going more than 2mm below the bed, but as pointed out above, that's not how this works. We don't know where Z is on the first probe, and during probing we don't know if the probe failed because the probe is broken or because it never reached the bed.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@thinkyhead we do know where the probe is before/on the first probe because we know the machine has already found its origin. Unless I'm mistaken, please elaborate.

probing_failed();
return;
}
#endif

// move up the retract distance
zPosition += home_bump_mm(Z_AXIS);
Expand All @@ -1599,7 +1673,7 @@ static void setup_for_endstop_move() {
// move back down slowly to find bed
set_homing_bump_feedrate(Z_AXIS);

zPosition -= home_bump_mm(Z_AXIS) * 2;
zPosition = MIN_PROBE_PT;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, on re-bump this might work. But we don't really know that zPosition is accurate. If you only wanted to keep the probe from going more than 2mm below the bed, you could use…

zPosition -= home_bump_mm(Z_AXIS) + 2;

line_to_z(zPosition);
stepper.synchronize();
endstops.hit_on_purpose(); // clear endstop hit flags
Expand Down Expand Up @@ -1938,6 +2012,10 @@ static void setup_for_endstop_move() {

run_z_probe();
float measured_z = current_position[Z_AXIS];
#ifdef REPROBE
if (measured_z == Z_RETRY_PT)
return MIN_PROBE_PT;
#endif

#if DISABLED(Z_PROBE_SLED) && DISABLED(Z_PROBE_ALLEN_KEY)
if (probe_action & ProbeStow) {
Expand Down Expand Up @@ -2527,6 +2605,16 @@ inline void gcode_G4() {

#endif //FWRETRACT

/**
* G26: Allow G-codes to enter the buffer again after a PROBE_FAIL_PANIC occurs during a G29
*/
#if ENABLED(PROBE_FAIL_PANIC)
inline void gcode_G26() {
LCD_MESSAGEPGM(WELCOME_MSG);
probe_fail = false;
}
#endif

/**
* G28: Home all axes according to settings
*
Expand Down Expand Up @@ -3282,6 +3370,11 @@ inline void gcode_G28() {
double yProbe = front_probe_bed_position + yGridSpacing * yCount;
int xStart, xStop, xInc;

#if ENABLED(REPROBE)
if (reprobe_attempts == NUM_ATTEMPTS && probePointCounter == -1)
break;
#endif

if (zig) {
xStart = 0;
xStop = auto_bed_leveling_grid_points;
Expand Down Expand Up @@ -3337,6 +3430,21 @@ inline void gcode_G28() {

measured_z = probe_pt(xProbe, yProbe, z_before, act, verbose_level);

#if ENABLED(REPROBE)
if (measured_z == MIN_PROBE_PT) {
if (reprobe_attempts < NUM_ATTEMPTS) {
probePointCounter = 0;
zig = true;
yCount = -1;
break;
}
else {
probePointCounter = -1;
break;
}
}
#endif

#if DISABLED(DELTA)
mean += measured_z;

Expand All @@ -3356,6 +3464,45 @@ inline void gcode_G28() {
} //xProbe
} //yProbe

#if ENABLED(PROBE_FAIL_PANIC)
if (reprobe_attempts == NUM_ATTEMPTS && probePointCounter == -1) {
if (!IS_SD_PRINTING)
probe_fail = true;
disable_all_heaters();
#if ENABLED(THERMAL_RUNAWAY_PROTECTION_PERIOD)
for (int i=0; i<EXTRUDERS; i++) target_temp_reached[i] = false;
#endif
#if ENABLED(SDSUPPORT)
card.closefile();
card.sdprinting = false;
#endif
clear_buffer();
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@thinkyhead command buffer is flushed here.

reprobe_attempts = 0;
do_blocking_move_to_z(Z_RETRY_PT);
#if ENABLED(REWIPE)
// If rewiped, move E back to 0 after a failed probe
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], 0.0, feedrate/60, active_extruder);
sync_plan_position()
acceleration = DEFAULT_ACCELERATION;
#endif
#if ENABLED(ULTIPANEL)
buzz(750, 1750);
#endif
SERIAL_ERROR_START;
SERIAL_ERRORLNPGM(MSG_LEVEL_FAIL);
LCD_MESSAGEPGM(MSG_LEVEL_FAIL);
return;
}
#else
#if ENABLED(REPROBE)
SERIAL_ERROR_START;
SERIAL_ERRORLNPGM(MSG_LEVEL_QUIT);
LCD_MESSAGEPGM(MSG_LEVEL_QUIT);
reprobe_attempts = 0;
return;
#endif
#endif

#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS("> probing complete", current_position);
#endif
Expand Down Expand Up @@ -3639,6 +3786,10 @@ inline void gcode_G28() {
#endif
stow_z_probe(false); // Retract Z Servo endstop if available. Z_PROBE_SLED is missed here.

#if ENABLED(REPROBE)
reprobe_attempts = 0;
#endif

report_current_position();
}

Expand Down Expand Up @@ -6501,6 +6652,12 @@ void process_next_command() {

#endif //FWRETRACT

#if ENABLED(PROBE_FAIL_PANIC)
case 26: // G26: Allow G-codes to enter the buffer again after a PROBE_FAIL_PANIC occurs during a G29
gcode_G26();
break;
#endif

case 28: // G28: Home all axes, one at a time
gcode_G28();
break;
Expand Down
17 changes: 17 additions & 0 deletions Marlin/example_configurations/Felix/Configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -555,6 +555,22 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// You probably don't need more than 3 (squared=9).
#define AUTO_BED_LEVELING_GRID_POINTS 2

//#define REPROBE // Re-attempts probing

#ifdef REPROBE
#define Z_RETRY_PT 15 // Z height to move the hotend after failed probe
#define NUM_ATTEMPTS 3 // Number of attempts to make before giving up
//#define PROBE_FAIL_PANIC // Completely give up printing if the final attempt fails (use G26 to get out of failed state)
//#define REWIPE // Re-attempts wiping
#ifdef REWIPE
#define NUM_REWIPES 6 // Number of (back-and-forth) re-wipe attemps to make, e.g. 6 would produce 12 strokes
// Re-wipe line from REWIPE_FIRST_PT to REWIPE_SECOND_PT
#define REWIPE_FIRST_PT {45, 173}
#define REWIPE_SECOND_PT {115, 173}
#define Z_REWIPE_PT (Z_MIN_POS + 1) // Depth to re-wipe at
#endif
#endif

#else // !AUTO_BED_LEVELING_GRID

// Arbitrary points to probe.
Expand Down Expand Up @@ -591,6 +607,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 MIN_PROBE_PT (Z_MIN_POS-2) //How far the extruder should move down to probe
#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.
Expand Down
17 changes: 17 additions & 0 deletions Marlin/example_configurations/Felix/Configuration_DUAL.h
Original file line number Diff line number Diff line change
Expand Up @@ -553,6 +553,22 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// You probably don't need more than 3 (squared=9).
#define AUTO_BED_LEVELING_GRID_POINTS 2

//#define REPROBE // Re-attempts probing

#ifdef REPROBE
#define Z_RETRY_PT 15 // Z height to move the hotend after failed probe
#define NUM_ATTEMPTS 3 // Number of attempts to make before giving up
//#define PROBE_FAIL_PANIC // Completely give up printing if the final attempt fails (use G26 to get out of failed state)
//#define REWIPE // Re-attempts wiping
#ifdef REWIPE
#define NUM_REWIPES 6 // Number of (back-and-forth) re-wipe attemps to make, e.g. 6 would produce 12 strokes
// Re-wipe line from REWIPE_FIRST_PT to REWIPE_SECOND_PT
#define REWIPE_FIRST_PT {45, 173}
#define REWIPE_SECOND_PT {115, 173}
#define Z_REWIPE_PT (Z_MIN_POS + 1) // Depth to re-wipe at
#endif
#endif

#else // !AUTO_BED_LEVELING_GRID

// Arbitrary points to probe.
Expand Down Expand Up @@ -589,6 +605,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 MIN_PROBE_PT (Z_MIN_POS-2) //How far the extruder should move down to probe
#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.
Expand Down
17 changes: 17 additions & 0 deletions Marlin/example_configurations/Hephestos/Configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,22 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo
// You probably don't need more than 3 (squared=9).
#define AUTO_BED_LEVELING_GRID_POINTS 2

//#define REPROBE // Re-attempts probing

#ifdef REPROBE
#define Z_RETRY_PT 15 // Z height to move the hotend after failed probe
#define NUM_ATTEMPTS 3 // Number of attempts to make before giving up
//#define PROBE_FAIL_PANIC // Completely give up printing if the final attempt fails (use G26 to get out of failed state)
//#define REWIPE // Re-attempts wiping
#ifdef REWIPE
#define NUM_REWIPES 6 // Number of (back-and-forth) re-wipe attemps to make, e.g. 6 would produce 12 strokes
// Re-wipe line from REWIPE_FIRST_PT to REWIPE_SECOND_PT
#define REWIPE_FIRST_PT {45, 173}
#define REWIPE_SECOND_PT {115, 173}
#define Z_REWIPE_PT (Z_MIN_POS + 1) // Depth to re-wipe at
#endif
#endif

#else // !AUTO_BED_LEVELING_GRID

// Arbitrary points to probe.
Expand Down Expand Up @@ -601,6 +617,7 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo

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

#define MIN_PROBE_PT (Z_MIN_POS-2) //How far the extruder should move down to probe
#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.
Expand Down
Loading