G34 Mechanical Gantry Calibration (like Prusa M915) (#18972)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
This commit is contained in:
parent
f21b91f1a7
commit
e7838c5f79
|
@ -3376,6 +3376,25 @@
|
||||||
//#define JOYSTICK_DEBUG
|
//#define JOYSTICK_DEBUG
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mechanical Gantry Calibration
|
||||||
|
* Modern replacement for the Prusa TMC_Z_CALIBRATION.
|
||||||
|
* Adds capability to work with any adjustable current drivers.
|
||||||
|
* Implemented as G34 because M915 is deprecated.
|
||||||
|
*/
|
||||||
|
//#define MECHANICAL_GANTRY_CALIBRATION
|
||||||
|
#if ENABLED(MECHANICAL_GANTRY_CALIBRATION)
|
||||||
|
#define GANTRY_CALIBRATION_CURRENT 600 // Default calibration current in ma
|
||||||
|
#define GANTRY_CALIBRATION_EXTRA_HEIGHT 15 // Extra distance in mm past Z_###_POS to move
|
||||||
|
#define GANTRY_CALIBRATION_FEEDRATE 500 // Feedrate for correction move
|
||||||
|
//#define GANTRY_CALIBRATION_TO_MIN // Enable to calibrate Z in the MIN direction
|
||||||
|
|
||||||
|
//#define GANTRY_CALIBRATION_SAFE_POSITION { X_CENTER, Y_CENTER } // Safe position for nozzle
|
||||||
|
//#define GANTRY_CALIBRATION_XY_PARK_FEEDRATE 3000 // XY Park Feedrate - MMM
|
||||||
|
//#define GANTRY_CALIBRATION_COMMANDS_PRE ""
|
||||||
|
#define GANTRY_CALIBRATION_COMMANDS_POST "G28" // G28 highly recommended to ensure an accurate position
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MAX7219 Debug Matrix
|
* MAX7219 Debug Matrix
|
||||||
*
|
*
|
||||||
|
|
153
Marlin/src/gcode/calibrate/G34.cpp
Normal file
153
Marlin/src/gcode/calibrate/G34.cpp
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
|
#if ENABLED(MECHANICAL_GANTRY_CALIBRATION)
|
||||||
|
|
||||||
|
#include "../gcode.h"
|
||||||
|
#include "../../module/motion.h"
|
||||||
|
#include "../../module/stepper.h"
|
||||||
|
#include "../../module/endstops.h"
|
||||||
|
|
||||||
|
#if HAS_LEVELING
|
||||||
|
#include "../../feature/bedlevel/bedlevel.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE)
|
||||||
|
#include "../../core/debug_out.h"
|
||||||
|
|
||||||
|
void GcodeSuite::G34() {
|
||||||
|
|
||||||
|
if (homing_needed()) return;
|
||||||
|
|
||||||
|
TEMPORARY_SOFT_ENDSTOP_STATE(false);
|
||||||
|
TEMPORARY_BED_LEVELING_STATE(false);
|
||||||
|
TemporaryGlobalEndstopsState unlock_z(false);
|
||||||
|
|
||||||
|
#ifdef GANTRY_CALIBRATION_COMMANDS_PRE
|
||||||
|
gcode.process_subcommands_now_P(PSTR(GANTRY_CALIBRATION_COMMANDS_PRE));
|
||||||
|
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Sub Commands Processed");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef GANTRY_CALIBRATION_SAFE_POSITION
|
||||||
|
// Move XY to safe position
|
||||||
|
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Parking XY");
|
||||||
|
const xy_pos_t safe_pos = GANTRY_CALIBRATION_SAFE_POSITION;
|
||||||
|
do_blocking_move_to(safe_pos, MMM_TO_MMS(GANTRY_CALIBRATION_XY_PARK_FEEDRATE));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const float move_distance = parser.intval('Z', GANTRY_CALIBRATION_EXTRA_HEIGHT),
|
||||||
|
zbase = ENABLED(GANTRY_CALIBRATION_TO_MIN) ? Z_MIN_POS : Z_MAX_POS,
|
||||||
|
zpounce = zbase - move_distance, zgrind = zbase + move_distance;
|
||||||
|
|
||||||
|
// Move Z to pounce position
|
||||||
|
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Setting Z Pounce");
|
||||||
|
do_blocking_move_to_z(zpounce, MMM_TO_MMS(HOMING_FEEDRATE_Z));
|
||||||
|
|
||||||
|
// Store current motor settings, then apply reduced value
|
||||||
|
|
||||||
|
#define _REDUCE_CURRENT ANY(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_PWM, HAS_MOTOR_CURRENT_DAC, HAS_MOTOR_CURRENT_I2C, HAS_TRINAMIC_CONFIG)
|
||||||
|
#if _REDUCE_CURRENT
|
||||||
|
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Reducing Current");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAS_MOTOR_CURRENT_SPI
|
||||||
|
const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT);
|
||||||
|
const uint32_t previous_current = stepper.motor_current_setting[Z_AXIS];
|
||||||
|
stepper.set_digipot_current(Z_AXIS, target_current);
|
||||||
|
#elif HAS_MOTOR_CURRENT_PWM
|
||||||
|
const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT);
|
||||||
|
const uint32_t previous_current = stepper.motor_current_setting[Z_AXIS];
|
||||||
|
stepper.set_digipot_current(1, target_current);
|
||||||
|
#elif HAS_MOTOR_CURRENT_DAC
|
||||||
|
const float target_current = parser.floatval('S', GANTRY_CALIBRATION_CURRENT);
|
||||||
|
const float previous_current = dac_amps(Z_AXIS, target_current);
|
||||||
|
stepper_dac.set_current_value(Z_AXIS, target_current);
|
||||||
|
#elif ENABLED(HAS_MOTOR_CURRENT_I2C)
|
||||||
|
const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT);
|
||||||
|
previous_current = dac_amps(Z_AXIS);
|
||||||
|
digipot_i2c.set_current(Z_AXIS, target_current)
|
||||||
|
#elif HAS_TRINAMIC_CONFIG
|
||||||
|
const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT);
|
||||||
|
static uint16_t previous_current_arr[NUM_Z_STEPPER_DRIVERS];
|
||||||
|
#if AXIS_IS_TMC(Z)
|
||||||
|
previous_current_arr[0] = stepperZ.getMilliamps();
|
||||||
|
stepperZ.rms_current(target_current);
|
||||||
|
#endif
|
||||||
|
#if AXIS_IS_TMC(Z2)
|
||||||
|
previous_current_arr[1] = stepperZ2.getMilliamps();
|
||||||
|
stepperZ2.rms_current(target_current);
|
||||||
|
#endif
|
||||||
|
#if AXIS_IS_TMC(Z3)
|
||||||
|
previous_current_arr[2] = stepperZ3.getMilliamps();
|
||||||
|
stepperZ3.rms_current(target_current);
|
||||||
|
#endif
|
||||||
|
#if AXIS_IS_TMC(Z4)
|
||||||
|
previous_current_arr[3] = stepperZ4.getMilliamps();
|
||||||
|
stepperZ4.rms_current(target_current);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Do Final Z move to adjust
|
||||||
|
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Final Z Move");
|
||||||
|
do_blocking_move_to_z(zgrind, MMM_TO_MMS(GANTRY_CALIBRATION_FEEDRATE));
|
||||||
|
|
||||||
|
// Back off end plate, back to normal motion range
|
||||||
|
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Z Backoff");
|
||||||
|
do_blocking_move_to_z(zpounce, MMM_TO_MMS(GANTRY_CALIBRATION_FEEDRATE));
|
||||||
|
|
||||||
|
#if _REDUCE_CURRENT
|
||||||
|
// Reset current to original values
|
||||||
|
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Restore Current");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAS_MOTOR_CURRENT_SPI
|
||||||
|
stepper.set_digipot_current(Z_AXIS, previous_current);
|
||||||
|
#elif HAS_MOTOR_CURRENT_PWM
|
||||||
|
stepper.set_digipot_current(1, previous_current);
|
||||||
|
#elif HAS_MOTOR_CURRENT_DAC
|
||||||
|
stepper_dac.set_current_value(Z_AXIS, previous_current);
|
||||||
|
#elif ENABLED(HAS_MOTOR_CURRENT_I2C)
|
||||||
|
digipot_i2c.set_current(Z_AXIS, previous_current)
|
||||||
|
#elif HAS_TRINAMIC_CONFIG
|
||||||
|
#if AXIS_IS_TMC(Z)
|
||||||
|
stepperZ.rms_current(previous_current_arr[0]);
|
||||||
|
#endif
|
||||||
|
#if AXIS_IS_TMC(Z2)
|
||||||
|
stepperZ2.rms_current(previous_current_arr[1]);
|
||||||
|
#endif
|
||||||
|
#if AXIS_IS_TMC(Z3)
|
||||||
|
stepperZ3.rms_current(previous_current_arr[2]);
|
||||||
|
#endif
|
||||||
|
#if AXIS_IS_TMC(Z4)
|
||||||
|
stepperZ4.rms_current(previous_current_arr[3]);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef GANTRY_CALIBRATION_COMMANDS_POST
|
||||||
|
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Running Post Commands");
|
||||||
|
gcode.process_subcommands_now_P(PSTR(GANTRY_CALIBRATION_COMMANDS_POST));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // MECHANICAL_GANTRY_CALIBRATION
|
|
@ -20,26 +20,27 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if ENABLED(Z_STEPPER_AUTO_ALIGN)
|
#if ENABLED(Z_STEPPER_AUTO_ALIGN)
|
||||||
|
|
||||||
#include "../../feature/z_stepper_align.h"
|
#include "../../feature/z_stepper_align.h"
|
||||||
|
|
||||||
#include "../gcode.h"
|
#include "../gcode.h"
|
||||||
#include "../../module/planner.h"
|
|
||||||
#include "../../module/stepper.h"
|
|
||||||
#include "../../module/motion.h"
|
#include "../../module/motion.h"
|
||||||
|
#include "../../module/stepper.h"
|
||||||
|
#include "../../module/planner.h"
|
||||||
#include "../../module/probe.h"
|
#include "../../module/probe.h"
|
||||||
|
#include "../../lcd/ultralcd.h" // for LCD_MESSAGEPGM
|
||||||
#if HAS_MULTI_HOTEND
|
|
||||||
#include "../../module/tool_change.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAS_LEVELING
|
#if HAS_LEVELING
|
||||||
#include "../../feature/bedlevel/bedlevel.h"
|
#include "../../feature/bedlevel/bedlevel.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAS_MULTI_HOTEND
|
||||||
|
#include "../../module/tool_change.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
||||||
#include "../../libs/least_squares_fit.h"
|
#include "../../libs/least_squares_fit.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -117,7 +118,7 @@ void GcodeSuite::G34() {
|
||||||
// In BLTOUCH HS mode, the probe travels in a deployed state.
|
// In BLTOUCH HS mode, the probe travels in a deployed state.
|
||||||
// Users of G34 might have a badly misaligned bed, so raise Z by the
|
// Users of G34 might have a badly misaligned bed, so raise Z by the
|
||||||
// length of the deployed pin (BLTOUCH stroke < 7mm)
|
// length of the deployed pin (BLTOUCH stroke < 7mm)
|
||||||
#define Z_BASIC_CLEARANCE Z_CLEARANCE_BETWEEN_PROBES + 7.0f * BOTH(BLTOUCH, BLTOUCH_HS_MODE)
|
#define Z_BASIC_CLEARANCE (Z_CLEARANCE_BETWEEN_PROBES + 7.0f * BOTH(BLTOUCH, BLTOUCH_HS_MODE))
|
||||||
|
|
||||||
// Compute a worst-case clearance height to probe from. After the first
|
// Compute a worst-case clearance height to probe from. After the first
|
||||||
// iteration this will be re-calculated based on the actual bed position
|
// iteration this will be re-calculated based on the actual bed position
|
||||||
|
@ -154,21 +155,29 @@ void GcodeSuite::G34() {
|
||||||
z_maxdiff = 0.0f,
|
z_maxdiff = 0.0f,
|
||||||
amplification = z_auto_align_amplification;
|
amplification = z_auto_align_amplification;
|
||||||
|
|
||||||
// These are needed after the for-loop
|
|
||||||
uint8_t iteration;
|
|
||||||
bool err_break = false;
|
|
||||||
float z_measured_min;
|
|
||||||
|
|
||||||
#if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
#if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
||||||
bool adjustment_reverse = false;
|
bool adjustment_reverse = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 'iteration' is declared above and is also used after the for-loop.
|
#if HAS_DISPLAY
|
||||||
// *not* the same as LOOP_L_N(iteration, z_auto_align_iterations)
|
PGM_P const msg_iteration = GET_TEXT(MSG_ITERATION);
|
||||||
for (iteration = 0; iteration < z_auto_align_iterations; ++iteration) {
|
const uint8_t iter_str_len = strlen_P(msg_iteration);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Final z and iteration values will be used after breaking the loop
|
||||||
|
float z_measured_min;
|
||||||
|
uint8_t iteration = 0;
|
||||||
|
bool err_break = false; // To break out of nested loops
|
||||||
|
while (iteration < z_auto_align_iterations) {
|
||||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> probing all positions.");
|
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> probing all positions.");
|
||||||
|
|
||||||
SERIAL_ECHOLNPAIR("\nITERATION: ", int(iteration + 1));
|
const int iter = iteration + 1;
|
||||||
|
SERIAL_ECHOLNPAIR("\nG34 Iteration: ", iter);
|
||||||
|
#if HAS_DISPLAY
|
||||||
|
char str[iter_str_len + 2 + 1];
|
||||||
|
sprintf_P(str, msg_iteration, iter);
|
||||||
|
ui.set_status(str);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Initialize minimum value
|
// Initialize minimum value
|
||||||
z_measured_min = 100000.0f;
|
z_measured_min = 100000.0f;
|
||||||
|
@ -190,7 +199,8 @@ void GcodeSuite::G34() {
|
||||||
// current_position.z has been manually altered in the "dirty trick" above.
|
// current_position.z has been manually altered in the "dirty trick" above.
|
||||||
const float z_probed_height = probe.probe_at_point(z_stepper_align.xy[iprobe], raise_after, 0, true, false);
|
const float z_probed_height = probe.probe_at_point(z_stepper_align.xy[iprobe], raise_after, 0, true, false);
|
||||||
if (isnan(z_probed_height)) {
|
if (isnan(z_probed_height)) {
|
||||||
SERIAL_ECHOLNPGM("Probing failed.");
|
SERIAL_ECHOLNPGM("Probing failed");
|
||||||
|
LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED);
|
||||||
err_break = true;
|
err_break = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -249,8 +259,39 @@ void GcodeSuite::G34() {
|
||||||
, " Z3-Z1=", ABS(z_measured[2] - z_measured[0])
|
, " Z3-Z1=", ABS(z_measured[2] - z_measured[0])
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
|
#if HAS_DISPLAY
|
||||||
|
char fstr1[10];
|
||||||
|
#if NUM_Z_STEPPER_DRIVERS == 2
|
||||||
|
char msg[6 + (6 + 5) * 1 + 1];
|
||||||
|
#else
|
||||||
|
char msg[6 + (6 + 5) * 3 + 1], fstr2[10], fstr3[10];
|
||||||
|
#endif
|
||||||
|
sprintf_P(msg,
|
||||||
|
PSTR("Diffs Z1-Z2=%s"
|
||||||
|
#if NUM_Z_STEPPER_DRIVERS == 3
|
||||||
|
" Z2-Z3=%s"
|
||||||
|
" Z3-Z1=%s"
|
||||||
|
#endif
|
||||||
|
), dtostrf(ABS(z_measured[0] - z_measured[1]), 1, 3, fstr1)
|
||||||
|
#if NUM_Z_STEPPER_DRIVERS == 3
|
||||||
|
, dtostrf(ABS(z_measured[1] - z_measured[2]), 1, 3, fstr2)
|
||||||
|
, dtostrf(ABS(z_measured[2] - z_measured[0]), 1, 3, fstr3)
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
ui.set_status(msg);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
auto decreasing_accuracy = [](const float &v1, const float &v2){
|
||||||
|
if (v1 < v2 * 0.7f) {
|
||||||
|
SERIAL_ECHOLNPGM("Decreasing Accuracy Detected.");
|
||||||
|
LCD_MESSAGEPGM(MSG_DECREASING_ACCURACY);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
|
||||||
|
|
||||||
// Check if the applied corrections go in the correct direction.
|
// Check if the applied corrections go in the correct direction.
|
||||||
// Calculate the sum of the absolute deviations from the mean of the probe measurements.
|
// Calculate the sum of the absolute deviations from the mean of the probe measurements.
|
||||||
// Compare to the last iteration to ensure it's getting better.
|
// Compare to the last iteration to ensure it's getting better.
|
||||||
|
@ -266,11 +307,8 @@ void GcodeSuite::G34() {
|
||||||
z_align_level_indicator += ABS(z_measured[zstepper] - z_measured_mean);
|
z_align_level_indicator += ABS(z_measured[zstepper] - z_measured_mean);
|
||||||
|
|
||||||
// If it's getting worse, stop and throw an error
|
// If it's getting worse, stop and throw an error
|
||||||
if (last_z_align_level_indicator < z_align_level_indicator * 0.7f) {
|
err_break = decreasing_accuracy(last_z_align_level_indicator, z_align_level_indicator);
|
||||||
SERIAL_ECHOLNPGM("Decreasing accuracy detected.");
|
if (err_break) break;
|
||||||
err_break = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
last_z_align_level_indicator = z_align_level_indicator;
|
last_z_align_level_indicator = z_align_level_indicator;
|
||||||
#endif
|
#endif
|
||||||
|
@ -290,8 +328,7 @@ void GcodeSuite::G34() {
|
||||||
if (z_align_abs) amplification = (iteration == 1) ? _MIN(last_z_align_move[zstepper] / z_align_abs, 2.0f) : z_auto_align_amplification;
|
if (z_align_abs) amplification = (iteration == 1) ? _MIN(last_z_align_move[zstepper] / z_align_abs, 2.0f) : z_auto_align_amplification;
|
||||||
|
|
||||||
// Check for less accuracy compared to last move
|
// Check for less accuracy compared to last move
|
||||||
if (last_z_align_move[zstepper] < z_align_abs * 0.7f) {
|
if (decreasing_accuracy(last_z_align_move[zstepper], z_align_abs)) {
|
||||||
SERIAL_ECHOLNPGM("Decreasing accuracy detected.");
|
|
||||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " last_z_align_move = ", last_z_align_move[zstepper]);
|
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " last_z_align_move = ", last_z_align_move[zstepper]);
|
||||||
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " z_align_abs = ", z_align_abs);
|
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " z_align_abs = ", z_align_abs);
|
||||||
adjustment_reverse = !adjustment_reverse;
|
adjustment_reverse = !adjustment_reverse;
|
||||||
|
@ -329,9 +366,14 @@ void GcodeSuite::G34() {
|
||||||
|
|
||||||
if (err_break) break;
|
if (err_break) break;
|
||||||
|
|
||||||
if (success_break) { SERIAL_ECHOLNPGM("Target accuracy achieved."); break; }
|
if (success_break) {
|
||||||
|
SERIAL_ECHOLNPGM("Target accuracy achieved.");
|
||||||
|
LCD_MESSAGEPGM(MSG_ACCURACY_ACHIEVED);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
} // for (iteration)
|
iteration++;
|
||||||
|
} // while (iteration < z_auto_align_iterations)
|
||||||
|
|
||||||
if (err_break)
|
if (err_break)
|
||||||
SERIAL_ECHOLNPGM("G34 aborted.");
|
SERIAL_ECHOLNPGM("G34 aborted.");
|
||||||
|
|
|
@ -327,7 +327,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
|
||||||
case 33: G33(); break; // G33: Delta Auto-Calibration
|
case 33: G33(); break; // G33: Delta Auto-Calibration
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(Z_STEPPER_AUTO_ALIGN)
|
#if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION)
|
||||||
case 34: G34(); break; // G34: Z Stepper automatic alignment using probe
|
case 34: G34(); break; // G34: Z Stepper automatic alignment using probe
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -465,11 +465,12 @@ private:
|
||||||
|
|
||||||
TERN_(DELTA_AUTO_CALIBRATION, static void G33());
|
TERN_(DELTA_AUTO_CALIBRATION, static void G33());
|
||||||
|
|
||||||
#if ENABLED(Z_STEPPER_AUTO_ALIGN)
|
#if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION)
|
||||||
static void G34();
|
static void G34();
|
||||||
static void M422();
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
TERN_(Z_STEPPER_AUTO_ALIGN, static void M422());
|
||||||
|
|
||||||
TERN_(ASSISTED_TRAMMING, static void G35());
|
TERN_(ASSISTED_TRAMMING, static void G35());
|
||||||
|
|
||||||
TERN_(G38_PROBE_TARGET, static void G38(const int8_t subcode));
|
TERN_(G38_PROBE_TARGET, static void G38(const int8_t subcode));
|
||||||
|
|
|
@ -422,7 +422,7 @@
|
||||||
#elif defined(CHAMBER_HEATER_PIN)
|
#elif defined(CHAMBER_HEATER_PIN)
|
||||||
#error "CHAMBER_HEATER_PIN is now HEATER_CHAMBER_PIN. Please update your configuration and/or pins."
|
#error "CHAMBER_HEATER_PIN is now HEATER_CHAMBER_PIN. Please update your configuration and/or pins."
|
||||||
#elif defined(TMC_Z_CALIBRATION)
|
#elif defined(TMC_Z_CALIBRATION)
|
||||||
#error "TMC_Z_CALIBRATION has been deprecated in favor of Z_STEPPER_AUTO_ALIGN. Please update your configuration."
|
#error "TMC_Z_CALIBRATION has been deprecated in favor of MECHANICAL_GANTRY_CALIBRATION. Please update your configuration."
|
||||||
#elif defined(Z_MIN_PROBE_ENDSTOP)
|
#elif defined(Z_MIN_PROBE_ENDSTOP)
|
||||||
#error "Z_MIN_PROBE_ENDSTOP is no longer required. Please remove it from Configuration.h."
|
#error "Z_MIN_PROBE_ENDSTOP is no longer required. Please remove it from Configuration.h."
|
||||||
#elif defined(DUAL_NOZZLE_DUPLICATION_MODE)
|
#elif defined(DUAL_NOZZLE_DUPLICATION_MODE)
|
||||||
|
@ -2788,6 +2788,21 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if ENABLED(MECHANICAL_GANTRY_CALIBRATION)
|
||||||
|
#if NONE(HAS_MOTOR_CURRENT_DAC, HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC, HAS_TRINAMIC_CONFIG, HAS_MOTOR_CURRENT_PWM)
|
||||||
|
#error "It is highly recommended to have adjustable current drivers to prevent damage. Disable this line to continue anyway."
|
||||||
|
#elif !defined(GANTRY_CALIBRATION_CURRENT)
|
||||||
|
#error "MECHANICAL_GANTRY_CALIBRATION Requires GANTRY_CALIBRATION_CURRENT to be set."
|
||||||
|
#elif !defined(GANTRY_CALIBRATION_EXTRA_HEIGHT)
|
||||||
|
#error "MECHANICAL_GANTRY_CALIBRATION Requires GANTRY_CALIBRATION_EXTRA_HEIGHT to be set."
|
||||||
|
#elif !defined(GANTRY_CALIBRATION_FEEDRATE)
|
||||||
|
#error "MECHANICAL_GANTRY_CALIBRATION Requires GANTRY_CALIBRATION_FEEDRATE to be set."
|
||||||
|
#endif
|
||||||
|
#if defined(GANTRY_CALIBRATION_SAFE_POSITION) && !defined(GANTRY_CALIBRATION_XY_PARK_FEEDRATE)
|
||||||
|
#error "GANTRY_CALIBRATION_SAFE_POSITION Requires GANTRY_CALIBRATION_XY_PARK_FEEDRATE to be set."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLED(PRINTCOUNTER) && DISABLED(EEPROM_SETTINGS)
|
#if ENABLED(PRINTCOUNTER) && DISABLED(EEPROM_SETTINGS)
|
||||||
#error "PRINTCOUNTER requires EEPROM_SETTINGS. Please update your Configuration."
|
#error "PRINTCOUNTER requires EEPROM_SETTINGS. Please update your Configuration."
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -67,6 +67,9 @@ namespace Language_en {
|
||||||
PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home Z");
|
PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home Z");
|
||||||
PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Align");
|
PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Align");
|
||||||
PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Assisted Tramming");
|
PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Assisted Tramming");
|
||||||
|
PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 Iteration: %i");
|
||||||
|
PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Accuracy Decreasing!");
|
||||||
|
PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Accuracy Achieved");
|
||||||
PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Homing XYZ");
|
PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Homing XYZ");
|
||||||
PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Click to Begin");
|
PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Click to Begin");
|
||||||
PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Next Point");
|
PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Next Point");
|
||||||
|
|
|
@ -358,7 +358,7 @@ void menu_motion() {
|
||||||
//
|
//
|
||||||
// Auto Z-Align
|
// Auto Z-Align
|
||||||
//
|
//
|
||||||
#if ENABLED(Z_STEPPER_AUTO_ALIGN)
|
#if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION)
|
||||||
GCODES_ITEM(MSG_AUTO_Z_ALIGN, PSTR("G34"));
|
GCODES_ITEM(MSG_AUTO_Z_ALIGN, PSTR("G34"));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ opt_set MOTHERBOARD BOARD_COHESION3D_REMIX
|
||||||
opt_set X_DRIVER_TYPE TMC2130
|
opt_set X_DRIVER_TYPE TMC2130
|
||||||
opt_set Y_DRIVER_TYPE TMC2130
|
opt_set Y_DRIVER_TYPE TMC2130
|
||||||
opt_set Z_DRIVER_TYPE TMC2130
|
opt_set Z_DRIVER_TYPE TMC2130
|
||||||
opt_enable AUTO_BED_LEVELING_BILINEAR EEPROM_SETTINGS EEPROM_CHITCHAT \
|
opt_enable AUTO_BED_LEVELING_BILINEAR EEPROM_SETTINGS EEPROM_CHITCHAT MECHANICAL_GANTRY_CALIBRATION \
|
||||||
TMC_USE_SW_SPI MONITOR_DRIVER_STATUS STEALTHCHOP_XY STEALTHCHOP_Z HYBRID_THRESHOLD \
|
TMC_USE_SW_SPI MONITOR_DRIVER_STATUS STEALTHCHOP_XY STEALTHCHOP_Z HYBRID_THRESHOLD \
|
||||||
SENSORLESS_PROBING Z_SAFE_HOMING X_STALL_SENSITIVITY Y_STALL_SENSITIVITY Z_STALL_SENSITIVITY TMC_DEBUG \
|
SENSORLESS_PROBING Z_SAFE_HOMING X_STALL_SENSITIVITY Y_STALL_SENSITIVITY Z_STALL_SENSITIVITY TMC_DEBUG \
|
||||||
EXPERIMENTAL_I2CBUS
|
EXPERIMENTAL_I2CBUS
|
||||||
|
|
|
@ -110,6 +110,7 @@ default_src_filter = +<src/*> -<src/config> -<src/HAL> +<src/HAL/shared>
|
||||||
-<src/gcode/bedlevel/G42.cpp>
|
-<src/gcode/bedlevel/G42.cpp>
|
||||||
-<src/gcode/bedlevel/M420.cpp>
|
-<src/gcode/bedlevel/M420.cpp>
|
||||||
-<src/gcode/calibrate/G33.cpp>
|
-<src/gcode/calibrate/G33.cpp>
|
||||||
|
-<src/gcode/calibrate/G34.cpp>
|
||||||
-<src/gcode/calibrate/G34_M422.cpp>
|
-<src/gcode/calibrate/G34_M422.cpp>
|
||||||
-<src/gcode/calibrate/G76_M192_M871.cpp>
|
-<src/gcode/calibrate/G76_M192_M871.cpp>
|
||||||
-<src/gcode/calibrate/G425.cpp>
|
-<src/gcode/calibrate/G425.cpp>
|
||||||
|
@ -309,6 +310,7 @@ MK2_MULTIPLEXER = src_filter=+<src/feature/snmm.cpp>
|
||||||
EXT_SOLENOID|MANUAL_SOLENOID_CONTROL = src_filter=+<src/feature/solenoid.cpp> +<src/gcode/control/M380_M381.cpp>
|
EXT_SOLENOID|MANUAL_SOLENOID_CONTROL = src_filter=+<src/feature/solenoid.cpp> +<src/gcode/control/M380_M381.cpp>
|
||||||
HAS_CUTTER = src_filter=+<src/feature/spindle_laser.cpp> +<src/gcode/control/M3-M5.cpp>
|
HAS_CUTTER = src_filter=+<src/feature/spindle_laser.cpp> +<src/gcode/control/M3-M5.cpp>
|
||||||
EXPERIMENTAL_I2CBUS = src_filter=+<src/feature/twibus.cpp> +<src/gcode/feature/i2c>
|
EXPERIMENTAL_I2CBUS = src_filter=+<src/feature/twibus.cpp> +<src/gcode/feature/i2c>
|
||||||
|
MECHANICAL_GANTRY_CAL.+ = src_filter=+<src/gcode/calibrate/G34.cpp>
|
||||||
Z_STEPPER_AUTO_ALIGN = src_filter=+<src/feature/z_stepper_align.cpp> +<src/gcode/calibrate/G34_M422.cpp>
|
Z_STEPPER_AUTO_ALIGN = src_filter=+<src/feature/z_stepper_align.cpp> +<src/gcode/calibrate/G34_M422.cpp>
|
||||||
G26_MESH_VALIDATION = src_filter=+<src/gcode/bedlevel/G26.cpp>
|
G26_MESH_VALIDATION = src_filter=+<src/gcode/bedlevel/G26.cpp>
|
||||||
ASSISTED_TRAMMING = src_filter=+<src/gcode/bedlevel/G35.cpp>
|
ASSISTED_TRAMMING = src_filter=+<src/gcode/bedlevel/G35.cpp>
|
||||||
|
|
Loading…
Reference in a new issue