|
|
|
@ -140,12 +140,6 @@ static void print_calibration_settings(const bool end_stops, const bool tower_an
|
|
|
|
|
if ((!end_stops && tower_angles) || (end_stops && !tower_angles)) { // XOR
|
|
|
|
|
SERIAL_ECHOPAIR(" Radius:", delta_radius);
|
|
|
|
|
}
|
|
|
|
|
#if HAS_BED_PROBE
|
|
|
|
|
if (!end_stops && !tower_angles) {
|
|
|
|
|
SERIAL_ECHO_SP(30);
|
|
|
|
|
print_signed_float(PSTR("Offset"), zprobe_zoffset);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
SERIAL_EOL();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -194,30 +188,19 @@ static float std_dev_points(float z_pt[NPP + 1], const bool _0p_cal, const bool
|
|
|
|
|
/**
|
|
|
|
|
* - Probe a point
|
|
|
|
|
*/
|
|
|
|
|
static float calibration_probe(const float &nx, const float &ny, const bool stow, const bool set_up) {
|
|
|
|
|
static float calibration_probe(const float &nx, const float &ny, const bool stow) {
|
|
|
|
|
#if HAS_BED_PROBE
|
|
|
|
|
return probe_pt(nx, ny, set_up ? PROBE_PT_BIG_RAISE : stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, false);
|
|
|
|
|
return probe_pt(nx, ny, stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, false);
|
|
|
|
|
#else
|
|
|
|
|
UNUSED(stow);
|
|
|
|
|
UNUSED(set_up);
|
|
|
|
|
return lcd_probe_pt(nx, ny);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if HAS_BED_PROBE && HAS_LCD_MENU
|
|
|
|
|
static float probe_z_shift(const float center) {
|
|
|
|
|
STOW_PROBE();
|
|
|
|
|
endstops.enable_z_probe(false);
|
|
|
|
|
float z_shift = lcd_probe_pt(0, 0) - center;
|
|
|
|
|
endstops.enable_z_probe(true);
|
|
|
|
|
return z_shift;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* - Probe a grid
|
|
|
|
|
*/
|
|
|
|
|
static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_points, const bool towers_set, const bool stow_after_each, const bool set_up) {
|
|
|
|
|
static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_points, const bool towers_set, const bool stow_after_each) {
|
|
|
|
|
const bool _0p_calibration = probe_points == 0,
|
|
|
|
|
_1p_calibration = probe_points == 1 || probe_points == -1,
|
|
|
|
|
_4p_calibration = probe_points == 2,
|
|
|
|
@ -240,7 +223,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi
|
|
|
|
|
if (!_0p_calibration) {
|
|
|
|
|
|
|
|
|
|
if (!_7p_no_intermediates && !_7p_4_intermediates && !_7p_11_intermediates) { // probe the center
|
|
|
|
|
z_pt[CEN] += calibration_probe(0, 0, stow_after_each, set_up);
|
|
|
|
|
z_pt[CEN] += calibration_probe(0, 0, stow_after_each);
|
|
|
|
|
if (isnan(z_pt[CEN])) return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -250,7 +233,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi
|
|
|
|
|
I_LOOP_CAL_PT(rad, start, steps) {
|
|
|
|
|
const float a = RADIANS(210 + (360 / NPP) * (rad - 1)),
|
|
|
|
|
r = delta_calibration_radius * 0.1;
|
|
|
|
|
z_pt[CEN] += calibration_probe(cos(a) * r, sin(a) * r, stow_after_each, set_up);
|
|
|
|
|
z_pt[CEN] += calibration_probe(cos(a) * r, sin(a) * r, stow_after_each);
|
|
|
|
|
if (isnan(z_pt[CEN])) return false;
|
|
|
|
|
}
|
|
|
|
|
z_pt[CEN] /= float(_7p_2_intermediates ? 7 : probe_points);
|
|
|
|
@ -274,7 +257,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi
|
|
|
|
|
const float a = RADIANS(210 + (360 / NPP) * (rad - 1)),
|
|
|
|
|
r = delta_calibration_radius * (1 - 0.1 * (zig_zag ? offset - circle : circle)),
|
|
|
|
|
interpol = FMOD(rad, 1);
|
|
|
|
|
const float z_temp = calibration_probe(cos(a) * r, sin(a) * r, stow_after_each, set_up);
|
|
|
|
|
const float z_temp = calibration_probe(cos(a) * r, sin(a) * r, stow_after_each);
|
|
|
|
|
if (isnan(z_temp)) return false;
|
|
|
|
|
// split probe point to neighbouring calibration points
|
|
|
|
|
z_pt[uint8_t(LROUND(rad - interpol + NPP - 1)) % NPP + 1] += z_temp * sq(cos(RADIANS(interpol * 90)));
|
|
|
|
@ -403,10 +386,7 @@ static float auto_tune_a() {
|
|
|
|
|
*
|
|
|
|
|
* Parameters:
|
|
|
|
|
*
|
|
|
|
|
* S Setup mode; disables probe protection
|
|
|
|
|
*
|
|
|
|
|
* Pn Number of probe points:
|
|
|
|
|
* P-1 Checks the z_offset with a center probe and paper test.
|
|
|
|
|
* P0 Normalizes calibration.
|
|
|
|
|
* P1 Calibrates height only with center probe.
|
|
|
|
|
* P2 Probe center and towers. Calibrate height, endstops and delta radius.
|
|
|
|
@ -429,22 +409,15 @@ static float auto_tune_a() {
|
|
|
|
|
*/
|
|
|
|
|
void GcodeSuite::G33() {
|
|
|
|
|
|
|
|
|
|
const bool set_up =
|
|
|
|
|
#if HAS_BED_PROBE
|
|
|
|
|
parser.seen('S');
|
|
|
|
|
#else
|
|
|
|
|
false;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
const int8_t probe_points = set_up ? 2 : parser.intval('P', DELTA_CALIBRATION_DEFAULT_POINTS);
|
|
|
|
|
if (!WITHIN(probe_points, -1, 10)) {
|
|
|
|
|
SERIAL_ECHOLNPGM("?(P)oints is implausible (-1 - 10).");
|
|
|
|
|
const int8_t probe_points = parser.intval('P', DELTA_CALIBRATION_DEFAULT_POINTS);
|
|
|
|
|
if (!WITHIN(probe_points, 0, 10)) {
|
|
|
|
|
SERIAL_ECHOLNPGM("?(P)oints is implausible (0-10).");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const bool towers_set = !parser.seen('T');
|
|
|
|
|
|
|
|
|
|
const float calibration_precision = set_up ? Z_CLEARANCE_BETWEEN_PROBES / 5.0 : parser.floatval('C', 0.0);
|
|
|
|
|
const float calibration_precision = parser.floatval('C', 0.0);
|
|
|
|
|
if (calibration_precision < 0) {
|
|
|
|
|
SERIAL_ECHOLNPGM("?(C)alibration precision is implausible (>=0).");
|
|
|
|
|
return;
|
|
|
|
@ -452,26 +425,18 @@ void GcodeSuite::G33() {
|
|
|
|
|
|
|
|
|
|
const int8_t force_iterations = parser.intval('F', 0);
|
|
|
|
|
if (!WITHIN(force_iterations, 0, 30)) {
|
|
|
|
|
SERIAL_ECHOLNPGM("?(F)orce iteration is implausible (0 - 30).");
|
|
|
|
|
SERIAL_ECHOLNPGM("?(F)orce iteration is implausible (0-30).");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const int8_t verbose_level = parser.byteval('V', 1);
|
|
|
|
|
if (!WITHIN(verbose_level, 0, 3)) {
|
|
|
|
|
SERIAL_ECHOLNPGM("?(V)erbose level is implausible (0 - 3).");
|
|
|
|
|
SERIAL_ECHOLNPGM("?(V)erbose level is implausible (0-3).");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const bool stow_after_each = parser.seen('E');
|
|
|
|
|
|
|
|
|
|
if (set_up) {
|
|
|
|
|
delta_height = 999.99;
|
|
|
|
|
delta_radius = DELTA_PRINTABLE_RADIUS;
|
|
|
|
|
ZERO(delta_endstop_adj);
|
|
|
|
|
ZERO(delta_tower_angle_trim);
|
|
|
|
|
recalc_delta_settings();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const bool _0p_calibration = probe_points == 0,
|
|
|
|
|
_1p_calibration = probe_points == 1 || probe_points == -1,
|
|
|
|
|
_4p_calibration = probe_points == 2,
|
|
|
|
@ -520,7 +485,6 @@ void GcodeSuite::G33() {
|
|
|
|
|
PGM_P checkingac = PSTR("Checking... AC");
|
|
|
|
|
serialprintPGM(checkingac);
|
|
|
|
|
if (verbose_level == 0) SERIAL_ECHOPGM(" (DRY-RUN)");
|
|
|
|
|
if (set_up) SERIAL_ECHOPGM(" (SET-UP)");
|
|
|
|
|
SERIAL_EOL();
|
|
|
|
|
ui.set_status_P(checkingac);
|
|
|
|
|
|
|
|
|
@ -539,7 +503,7 @@ void GcodeSuite::G33() {
|
|
|
|
|
|
|
|
|
|
// Probe the points
|
|
|
|
|
zero_std_dev_old = zero_std_dev;
|
|
|
|
|
if (!probe_calibration_points(z_at_pt, probe_points, towers_set, stow_after_each, set_up)) {
|
|
|
|
|
if (!probe_calibration_points(z_at_pt, probe_points, towers_set, stow_after_each)) {
|
|
|
|
|
SERIAL_ECHOLNPGM("Correct delta settings with M665 and M666");
|
|
|
|
|
return AC_CLEANUP();
|
|
|
|
|
}
|
|
|
|
@ -587,11 +551,6 @@ void GcodeSuite::G33() {
|
|
|
|
|
delta_calibration_radius = cr_old;
|
|
|
|
|
|
|
|
|
|
switch (probe_points) {
|
|
|
|
|
case -1:
|
|
|
|
|
#if HAS_BED_PROBE && HAS_LCD_MENU
|
|
|
|
|
zprobe_zoffset += probe_z_shift(z_at_pt[CEN]);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
case 0:
|
|
|
|
|
test_precision = 0.00; // forced end
|
|
|
|
|
break;
|
|
|
|
|