Merge pull request #6809 from thinkyhead/bf_G33_evolves

G33 updates
This commit is contained in:
Scott Lahteine 2017-05-20 20:12:36 -05:00 committed by GitHub
commit 0e1f0efc4b
10 changed files with 179 additions and 204 deletions

View file

@ -3019,12 +3019,12 @@ static void homeaxis(const AxisEnum axis) {
// so here it re-homes each tower in turn. // so here it re-homes each tower in turn.
// Delta homing treats the axes as normal linear axes. // Delta homing treats the axes as normal linear axes.
// retrace by the amount specified in endstop_adj // retrace by the amount specified in endstop_adj + additional 0.1mm in order to have minimum steps
if (endstop_adj[axis] * Z_HOME_DIR < 0) { if (endstop_adj[axis] * Z_HOME_DIR <= 0) {
#if ENABLED(DEBUG_LEVELING_FEATURE) #if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("endstop_adj:"); if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("endstop_adj:");
#endif #endif
do_homing_move(axis, endstop_adj[axis]); do_homing_move(axis, endstop_adj[axis] - 0.1);
} }
#else #else
@ -5098,20 +5098,18 @@ void home_all_axes() { gcode_G28(true); }
* *
* Parameters: * Parameters:
* *
* P Number of probe points: * Pn Number of probe points:
* *
* P1 Probe center and set height only. * P1 Probe center and set height only.
* P2 Probe center and towers. Set height, endstops, and delta radius. * P2 Probe center and towers. Set height, endstops, and delta radius.
* P3 Probe all positions: center, towers and opposite towers. Set all. * P3 Probe all positions: center, towers and opposite towers. Set all.
* P4-P7 Probe all positions at different locations and average them. * P4-P7 Probe all positions at different locations and average them.
* *
* A Abort delta height calibration after 1 probe (only P1) * T Don't calibrate tower angle corrections
* *
* O Use opposite tower points instead of tower points (only P2) * Cn.nn Calibration precision; when omitted calibrates to maximum precision
* *
* T Don't calibrate tower angle corrections (P3-P7) * Vn Verbose level:
*
* V Verbose level:
* *
* V0 Dry-run mode. Report settings and probe results. No calibration. * V0 Dry-run mode. Report settings and probe results. No calibration.
* V1 Report settings * V1 Report settings
@ -5131,30 +5129,61 @@ void home_all_axes() { gcode_G28(true); }
return; return;
} }
const bool do_height_only = probe_points == 1, const float calibration_precision = code_seen('C') ? code_value_float() : 0.0;
do_center_and_towers = probe_points == 2, if (calibration_precision < 0) {
do_all_positions = probe_points == 3, SERIAL_PROTOCOLLNPGM("?(C)alibration precision is implausible (>0).");
do_circle_x2 = probe_points == 5, return;
do_circle_x3 = probe_points == 6, }
do_circle_x4 = probe_points == 7,
probe_center_plus_3 = probe_points >= 3,
point_averaging = probe_points >= 4,
probe_center_plus_6 = probe_points >= 5;
const char negating_parameter = do_height_only ? 'A' : do_center_and_towers ? 'O' : 'T'; const bool towers_set = !code_seen('T'),
int8_t probe_mode = code_seen(negating_parameter) && code_value_bool() ? -probe_points : probe_points;
_1p_calibration = probe_points == 1,
_4p_calibration = probe_points == 2,
_4p_towers_points = _4p_calibration && towers_set,
_4p_opposite_points = _4p_calibration && !towers_set,
_7p_calibration = probe_points >= 3,
_7p_half_circle = probe_points == 3,
_7p_double_circle = probe_points == 5,
_7p_triple_circle = probe_points == 6,
_7p_quadruple_circle = probe_points == 7,
_7p_multi_circle = _7p_double_circle || _7p_triple_circle || _7p_quadruple_circle,
_7p_intermed_points = _7p_calibration && !_7p_half_circle;
if (!_1p_calibration) { // test if the outer radius is reachable
for (uint8_t axis = 1; axis < 13; ++axis) {
float circles = (_7p_quadruple_circle ? 1.5 :
_7p_triple_circle ? 1.0 :
_7p_double_circle ? 0.5 : 0);
if (!position_is_reachable_by_probe_xy(cos(RADIANS(180 + 30 * axis)) *
delta_calibration_radius * (1 + circles * 0.1),
sin(RADIANS(180 + 30 * axis)) *
delta_calibration_radius * (1 + circles * 0.1))) {
SERIAL_PROTOCOLLNPGM("?(M665 B)ed radius is implausible.");
return;
}
}
}
SERIAL_PROTOCOLLNPGM("G33 Auto Calibrate"); SERIAL_PROTOCOLLNPGM("G33 Auto Calibrate");
stepper.synchronize();
#if HAS_LEVELING #if HAS_LEVELING
set_bed_leveling_enabled(false); reset_bed_level(); // After calibration bed-level data is no longer valid
#endif #endif
#if HOTENDS > 1
const uint8_t old_tool_index = active_extruder;
tool_change(0, 0, true);
#endif
setup_for_endstop_or_probe_move();
home_all_axes(); endstops.enable(true);
home_delta();
endstops.not_homing();
const static char save_message[] PROGMEM = "Save with M500 and/or copy to Configuration.h"; const static char save_message[] PROGMEM = "Save with M500 and/or copy to Configuration.h";
float test_precision, float test_precision,
zero_std_dev = (verbose_level ? 999.0 : 0.0), // 0.0 in dry-run mode : forced end zero_std_dev = (verbose_level ? 999.0 : 0.0), // 0.0 in dry-run mode : forced end
zero_std_dev_old = zero_std_dev,
e_old[XYZ] = { e_old[XYZ] = {
endstop_adj[A_AXIS], endstop_adj[A_AXIS],
endstop_adj[B_AXIS], endstop_adj[B_AXIS],
@ -5173,7 +5202,7 @@ void home_all_axes() { gcode_G28(true); }
LCD_MESSAGEPGM("Checking... AC"); // TODO: Make translatable string LCD_MESSAGEPGM("Checking... AC"); // TODO: Make translatable string
SERIAL_PROTOCOLPAIR(".Height:", DELTA_HEIGHT + home_offset[Z_AXIS]); SERIAL_PROTOCOLPAIR(".Height:", DELTA_HEIGHT + home_offset[Z_AXIS]);
if (!do_height_only) { if (!_1p_calibration) {
SERIAL_PROTOCOLPGM(" Ex:"); SERIAL_PROTOCOLPGM(" Ex:");
if (endstop_adj[A_AXIS] >= 0) SERIAL_CHAR('+'); if (endstop_adj[A_AXIS] >= 0) SERIAL_CHAR('+');
SERIAL_PROTOCOL_F(endstop_adj[A_AXIS], 2); SERIAL_PROTOCOL_F(endstop_adj[A_AXIS], 2);
@ -5186,7 +5215,7 @@ void home_all_axes() { gcode_G28(true); }
SERIAL_PROTOCOLPAIR(" Radius:", delta_radius); SERIAL_PROTOCOLPAIR(" Radius:", delta_radius);
} }
SERIAL_EOL; SERIAL_EOL;
if (probe_mode > 2) { // negative disables tower angles if (_7p_calibration && towers_set) {
SERIAL_PROTOCOLPGM(".Tower angle : Tx:"); SERIAL_PROTOCOLPGM(".Tower angle : Tx:");
if (delta_tower_angle_trim[A_AXIS] >= 0) SERIAL_CHAR('+'); if (delta_tower_angle_trim[A_AXIS] >= 0) SERIAL_CHAR('+');
SERIAL_PROTOCOL_F(delta_tower_angle_trim[A_AXIS], 2); SERIAL_PROTOCOL_F(delta_tower_angle_trim[A_AXIS], 2);
@ -5202,80 +5231,76 @@ void home_all_axes() { gcode_G28(true); }
#endif #endif
int8_t iterations = 0; int8_t iterations = 0;
home_offset[Z_AXIS] -= probe_pt(0.0, 0.0 , true, 1); // 1st probe to set height
do_probe_raise(Z_CLEARANCE_BETWEEN_PROBES);
do { do {
float z_at_pt[13] = { 0 }, float z_at_pt[13] = { 0.0 }, S1 = 0.0, S2 = 0.0;
S1 = 0.0,
S2 = 0.0;
int16_t N = 0; int16_t N = 0;
test_precision = zero_std_dev; test_precision = zero_std_dev_old != 999.0 ? (zero_std_dev + zero_std_dev_old) / 2 : zero_std_dev;
iterations++; iterations++;
// Probe the points // Probe the points
if (!do_all_positions && !do_circle_x3) { // probe the center if (!_7p_half_circle && !_7p_triple_circle) { // probe the center
setup_for_endstop_or_probe_move(); z_at_pt[0] += probe_pt(0.0, 0.0 , true, 1);
z_at_pt[0] += probe_pt(0.0, 0.0 , true, 1); // TODO: Needs error handling
clean_up_after_endstop_or_probe_move();
} }
if (probe_center_plus_3) { // probe extra center points if (_7p_calibration) { // probe extra center points
for (int8_t axis = probe_center_plus_6 ? 11 : 9; axis > 0; axis -= probe_center_plus_6 ? 2 : 4) { for (int8_t axis = _7p_multi_circle ? 11 : 9; axis > 0; axis -= _7p_multi_circle ? 2 : 4) {
setup_for_endstop_or_probe_move(); const float a = RADIANS(180 + 30 * axis), r = delta_calibration_radius * 0.1;
z_at_pt[0] += probe_pt( // TODO: Needs error handling z_at_pt[0] += probe_pt(cos(a) * r, sin(a) * r, true, 1); // TODO: Needs error handling
cos(RADIANS(180 + 30 * axis)) * (0.1 * delta_calibration_radius),
sin(RADIANS(180 + 30 * axis)) * (0.1 * delta_calibration_radius), true, 1);
clean_up_after_endstop_or_probe_move();
} }
z_at_pt[0] /= float(do_circle_x2 ? 7 : probe_points); z_at_pt[0] /= float(_7p_double_circle ? 7 : probe_points);
} }
if (!do_height_only) { // probe the radius if (!_1p_calibration) { // probe the radius
bool zig_zag = true; bool zig_zag = true;
for (uint8_t axis = (probe_mode == -2 ? 3 : 1); axis < 13; const uint8_t start = _4p_opposite_points ? 3 : 1,
axis += (do_center_and_towers ? 4 : do_all_positions ? 2 : 1)) { step = _4p_calibration ? 4 : _7p_half_circle ? 2 : 1;
float offset_circles = (do_circle_x4 ? (zig_zag ? 1.5 : 1.0) : for (uint8_t axis = start; axis < 13; axis += step) {
do_circle_x3 ? (zig_zag ? 1.0 : 0.5) : const float offset_circles = _7p_quadruple_circle ? (zig_zag ? 1.5 : 1.0) :
do_circle_x2 ? (zig_zag ? 0.5 : 0.0) : 0); _7p_triple_circle ? (zig_zag ? 1.0 : 0.5) :
_7p_double_circle ? (zig_zag ? 0.5 : 0.0) : 0;
for (float circles = -offset_circles ; circles <= offset_circles; circles++) { for (float circles = -offset_circles ; circles <= offset_circles; circles++) {
setup_for_endstop_or_probe_move(); const float a = RADIANS(180 + 30 * axis),
z_at_pt[axis] += probe_pt( // TODO: Needs error handling r = delta_calibration_radius * (1 + circles * (zig_zag ? 0.1 : -0.1));
cos(RADIANS(180 + 30 * axis)) * delta_calibration_radius * z_at_pt[axis] += probe_pt(cos(a) * r, sin(a) * r, true, 1); // TODO: Needs error handling
(1 + circles * 0.1 * (zig_zag ? 1 : -1)),
sin(RADIANS(180 + 30 * axis)) * delta_calibration_radius *
(1 + circles * 0.1 * (zig_zag ? 1 : -1)), true, 1);
clean_up_after_endstop_or_probe_move();
} }
zig_zag = !zig_zag; zig_zag = !zig_zag;
z_at_pt[axis] /= (2 * offset_circles + 1); z_at_pt[axis] /= (2 * offset_circles + 1);
} }
} }
if (point_averaging) // average intermediates to tower and opposites if (_7p_intermed_points) // average intermediates to tower and opposites
for (uint8_t axis = 1; axis <= 11; axis += 2) for (uint8_t axis = 1; axis <= 11; axis += 2)
z_at_pt[axis] = (z_at_pt[axis] + (z_at_pt[axis + 1] + z_at_pt[(axis + 10) % 12 + 1]) / 2.0) / 2.0; z_at_pt[axis] = (z_at_pt[axis] + (z_at_pt[axis + 1] + z_at_pt[(axis + 10) % 12 + 1]) / 2.0) / 2.0;
S1 += z_at_pt[0]; S1 += z_at_pt[0];
S2 += sq(z_at_pt[0]); S2 += sq(z_at_pt[0]);
N++; N++;
if (!do_height_only) // std dev from zero plane if (!_1p_calibration) // std dev from zero plane
for (uint8_t axis = (probe_mode == -2 ? 3 : 1); axis < 13; axis += (do_center_and_towers ? 4 : 2)) { for (uint8_t axis = (_4p_opposite_points ? 3 : 1); axis < 13; axis += (_4p_calibration ? 4 : 2)) {
S1 += z_at_pt[axis]; S1 += z_at_pt[axis];
S2 += sq(z_at_pt[axis]); S2 += sq(z_at_pt[axis]);
N++; N++;
} }
zero_std_dev_old = zero_std_dev;
zero_std_dev = round(sqrt(S2 / N) * 1000.0) / 1000.0 + 0.00001; zero_std_dev = round(sqrt(S2 / N) * 1000.0) / 1000.0 + 0.00001;
if (iterations == 1) home_offset[Z_AXIS] = zh_old; // reset height after 1st probe change
// Solve matrices // Solve matrices
if (zero_std_dev < test_precision) { if (zero_std_dev < test_precision && zero_std_dev > calibration_precision) {
COPY(e_old, endstop_adj); COPY(e_old, endstop_adj);
dr_old = delta_radius; dr_old = delta_radius;
zh_old = home_offset[Z_AXIS]; zh_old = home_offset[Z_AXIS];
alpha_old = delta_tower_angle_trim[A_AXIS]; alpha_old = delta_tower_angle_trim[A_AXIS];
beta_old = delta_tower_angle_trim[B_AXIS]; beta_old = delta_tower_angle_trim[B_AXIS];
float e_delta[XYZ] = { 0.0 }, r_delta = 0.0, float e_delta[XYZ] = { 0.0 }, r_delta = 0.0, t_alpha = 0.0, t_beta = 0.0;
t_alpha = 0.0, t_beta = 0.0;
const float r_diff = delta_radius - delta_calibration_radius, const float r_diff = delta_radius - delta_calibration_radius,
h_factor = 1.00 + r_diff * 0.001, //1.02 for r_diff = 20mm h_factor = 1.00 + r_diff * 0.001, //1.02 for r_diff = 20mm
r_factor = -(1.75 + 0.005 * r_diff + 0.001 * sq(r_diff)), //2.25 for r_diff = 20mm r_factor = -(1.75 + 0.005 * r_diff + 0.001 * sq(r_diff)), //2.25 for r_diff = 20mm
@ -5293,25 +5318,25 @@ void home_all_axes() { gcode_G28(true); }
#define Z0444(I) ZP(a_factor * 4.0 / 9.0, I) #define Z0444(I) ZP(a_factor * 4.0 / 9.0, I)
#define Z0888(I) ZP(a_factor * 8.0 / 9.0, I) #define Z0888(I) ZP(a_factor * 8.0 / 9.0, I)
switch (probe_mode) { switch (probe_points) {
case -1:
test_precision = 0.00;
case 1: case 1:
test_precision = 0.00;
LOOP_XYZ(i) e_delta[i] = Z1000(0); LOOP_XYZ(i) e_delta[i] = Z1000(0);
break; break;
case 2: case 2:
e_delta[X_AXIS] = Z1050(0) + Z0700(1) - Z0350(5) - Z0350(9); if (towers_set) {
e_delta[Y_AXIS] = Z1050(0) - Z0350(1) + Z0700(5) - Z0350(9); e_delta[X_AXIS] = Z1050(0) + Z0700(1) - Z0350(5) - Z0350(9);
e_delta[Z_AXIS] = Z1050(0) - Z0350(1) - Z0350(5) + Z0700(9); e_delta[Y_AXIS] = Z1050(0) - Z0350(1) + Z0700(5) - Z0350(9);
r_delta = Z2250(0) - Z0750(1) - Z0750(5) - Z0750(9); e_delta[Z_AXIS] = Z1050(0) - Z0350(1) - Z0350(5) + Z0700(9);
break; r_delta = Z2250(0) - Z0750(1) - Z0750(5) - Z0750(9);
}
case -2: else {
e_delta[X_AXIS] = Z1050(0) - Z0700(7) + Z0350(11) + Z0350(3); e_delta[X_AXIS] = Z1050(0) - Z0700(7) + Z0350(11) + Z0350(3);
e_delta[Y_AXIS] = Z1050(0) + Z0350(7) - Z0700(11) + Z0350(3); e_delta[Y_AXIS] = Z1050(0) + Z0350(7) - Z0700(11) + Z0350(3);
e_delta[Z_AXIS] = Z1050(0) + Z0350(7) + Z0350(11) - Z0700(3); e_delta[Z_AXIS] = Z1050(0) + Z0350(7) + Z0350(11) - Z0700(3);
r_delta = Z2250(0) - Z0750(7) - Z0750(11) - Z0750(3); r_delta = Z2250(0) - Z0750(7) - Z0750(11) - Z0750(3);
}
break; break;
default: default:
@ -5320,9 +5345,9 @@ void home_all_axes() { gcode_G28(true); }
e_delta[Z_AXIS] = Z1050(0) - Z0175(1) - Z0175(5) + Z0350(9) + Z0175(7) + Z0175(11) - Z0350(3); e_delta[Z_AXIS] = Z1050(0) - Z0175(1) - Z0175(5) + Z0350(9) + Z0175(7) + Z0175(11) - Z0350(3);
r_delta = Z2250(0) - Z0375(1) - Z0375(5) - Z0375(9) - Z0375(7) - Z0375(11) - Z0375(3); r_delta = Z2250(0) - Z0375(1) - Z0375(5) - Z0375(9) - Z0375(7) - Z0375(11) - Z0375(3);
if (probe_mode > 0) { // negative disables tower angles if (towers_set) {
t_alpha = + Z0444(1) - Z0888(5) + Z0444(9) + Z0444(7) - Z0888(11) + Z0444(3); t_alpha = Z0444(1) - Z0888(5) + Z0444(9) + Z0444(7) - Z0888(11) + Z0444(3);
t_beta = - Z0888(1) + Z0444(5) + Z0444(9) - Z0888(7) + Z0444(11) + Z0444(3); t_beta = Z0888(1) - Z0444(5) - Z0444(9) + Z0888(7) - Z0444(11) - Z0444(3);
} }
break; break;
} }
@ -5330,7 +5355,7 @@ void home_all_axes() { gcode_G28(true); }
LOOP_XYZ(axis) endstop_adj[axis] += e_delta[axis]; LOOP_XYZ(axis) endstop_adj[axis] += e_delta[axis];
delta_radius += r_delta; delta_radius += r_delta;
delta_tower_angle_trim[A_AXIS] += t_alpha; delta_tower_angle_trim[A_AXIS] += t_alpha;
delta_tower_angle_trim[B_AXIS] -= t_beta; delta_tower_angle_trim[B_AXIS] += t_beta;
// adjust delta_height and endstops by the max amount // adjust delta_height and endstops by the max amount
const float z_temp = MAX3(endstop_adj[A_AXIS], endstop_adj[B_AXIS], endstop_adj[C_AXIS]); const float z_temp = MAX3(endstop_adj[A_AXIS], endstop_adj[B_AXIS], endstop_adj[C_AXIS]);
@ -5339,7 +5364,7 @@ void home_all_axes() { gcode_G28(true); }
recalc_delta_settings(delta_radius, delta_diagonal_rod); recalc_delta_settings(delta_radius, delta_diagonal_rod);
} }
else { // step one back else if(zero_std_dev >= test_precision) { // step one back
COPY(endstop_adj, e_old); COPY(endstop_adj, e_old);
delta_radius = dr_old; delta_radius = dr_old;
home_offset[Z_AXIS] = zh_old; home_offset[Z_AXIS] = zh_old;
@ -5355,7 +5380,7 @@ void home_all_axes() { gcode_G28(true); }
SERIAL_PROTOCOLPGM(". c:"); SERIAL_PROTOCOLPGM(". c:");
if (z_at_pt[0] > 0) SERIAL_CHAR('+'); if (z_at_pt[0] > 0) SERIAL_CHAR('+');
SERIAL_PROTOCOL_F(z_at_pt[0], 2); SERIAL_PROTOCOL_F(z_at_pt[0], 2);
if (probe_mode == 2 || probe_center_plus_3) { if (_4p_towers_points || _7p_calibration) {
SERIAL_PROTOCOLPGM(" x:"); SERIAL_PROTOCOLPGM(" x:");
if (z_at_pt[1] >= 0) SERIAL_CHAR('+'); if (z_at_pt[1] >= 0) SERIAL_CHAR('+');
SERIAL_PROTOCOL_F(z_at_pt[1], 2); SERIAL_PROTOCOL_F(z_at_pt[1], 2);
@ -5366,9 +5391,9 @@ void home_all_axes() { gcode_G28(true); }
if (z_at_pt[9] >= 0) SERIAL_CHAR('+'); if (z_at_pt[9] >= 0) SERIAL_CHAR('+');
SERIAL_PROTOCOL_F(z_at_pt[9], 2); SERIAL_PROTOCOL_F(z_at_pt[9], 2);
} }
if (probe_mode != -2) SERIAL_EOL; if (!_4p_opposite_points) SERIAL_EOL;
if (probe_mode == -2 || probe_center_plus_3) { if ((_4p_opposite_points) || _7p_calibration) {
if (probe_center_plus_3) { if (_7p_calibration) {
SERIAL_CHAR('.'); SERIAL_CHAR('.');
SERIAL_PROTOCOL_SP(13); SERIAL_PROTOCOL_SP(13);
} }
@ -5385,10 +5410,15 @@ void home_all_axes() { gcode_G28(true); }
} }
} }
if (test_precision != 0.0) { // !forced end if (test_precision != 0.0) { // !forced end
if (zero_std_dev >= test_precision) { // end iterations if (zero_std_dev >= test_precision || zero_std_dev <= calibration_precision) { // end iterations
SERIAL_PROTOCOLPGM("Calibration OK"); SERIAL_PROTOCOLPGM("Calibration OK");
SERIAL_PROTOCOL_SP(36); SERIAL_PROTOCOL_SP(36);
SERIAL_PROTOCOLPGM("rolling back."); if (zero_std_dev >= test_precision)
SERIAL_PROTOCOLPGM("rolling back.");
else {
SERIAL_PROTOCOLPGM("std dev:");
SERIAL_PROTOCOL_F(zero_std_dev, 3);
}
SERIAL_EOL; SERIAL_EOL;
LCD_MESSAGEPGM("Calibration OK"); // TODO: Make translatable string LCD_MESSAGEPGM("Calibration OK"); // TODO: Make translatable string
} }
@ -5404,7 +5434,7 @@ void home_all_axes() { gcode_G28(true); }
lcd_setstatus(mess); lcd_setstatus(mess);
} }
SERIAL_PROTOCOLPAIR(".Height:", DELTA_HEIGHT + home_offset[Z_AXIS]); SERIAL_PROTOCOLPAIR(".Height:", DELTA_HEIGHT + home_offset[Z_AXIS]);
if (!do_height_only) { if (!_1p_calibration) {
SERIAL_PROTOCOLPGM(" Ex:"); SERIAL_PROTOCOLPGM(" Ex:");
if (endstop_adj[A_AXIS] >= 0) SERIAL_CHAR('+'); if (endstop_adj[A_AXIS] >= 0) SERIAL_CHAR('+');
SERIAL_PROTOCOL_F(endstop_adj[A_AXIS], 2); SERIAL_PROTOCOL_F(endstop_adj[A_AXIS], 2);
@ -5417,7 +5447,7 @@ void home_all_axes() { gcode_G28(true); }
SERIAL_PROTOCOLPAIR(" Radius:", delta_radius); SERIAL_PROTOCOLPAIR(" Radius:", delta_radius);
} }
SERIAL_EOL; SERIAL_EOL;
if (probe_mode > 2) { // negative disables tower angles if (_7p_calibration && towers_set) {
SERIAL_PROTOCOLPGM(".Tower angle : Tx:"); SERIAL_PROTOCOLPGM(".Tower angle : Tx:");
if (delta_tower_angle_trim[A_AXIS] >= 0) SERIAL_CHAR('+'); if (delta_tower_angle_trim[A_AXIS] >= 0) SERIAL_CHAR('+');
SERIAL_PROTOCOL_F(delta_tower_angle_trim[A_AXIS], 2); SERIAL_PROTOCOL_F(delta_tower_angle_trim[A_AXIS], 2);
@ -5427,7 +5457,7 @@ void home_all_axes() { gcode_G28(true); }
SERIAL_PROTOCOLPGM(" Tz:+0.00"); SERIAL_PROTOCOLPGM(" Tz:+0.00");
SERIAL_EOL; SERIAL_EOL;
} }
if (zero_std_dev >= test_precision) if (zero_std_dev >= test_precision || zero_std_dev <= calibration_precision)
serialprintPGM(save_message); serialprintPGM(save_message);
SERIAL_EOL; SERIAL_EOL;
} }
@ -5449,12 +5479,20 @@ void home_all_axes() { gcode_G28(true); }
} }
} }
stepper.synchronize(); endstops.enable(true);
home_delta();
endstops.not_homing();
home_all_axes(); }
while (zero_std_dev < test_precision && zero_std_dev > calibration_precision && iterations < 31);
} while (zero_std_dev < test_precision && iterations < 31);
#if ENABLED(DELTA_HOME_TO_SAFE_ZONE)
do_blocking_move_to_z(delta_clip_start_height);
#endif
clean_up_after_endstop_or_probe_move();
#if HOTENDS > 1
tool_change(old_tool_index, 0, true);
#endif
#if ENABLED(Z_PROBE_SLED) #if ENABLED(Z_PROBE_SLED)
RETRACT_PROBE(); RETRACT_PROBE();
#endif #endif

View file

@ -447,10 +447,10 @@
#define DELTA_DIAGONAL_ROD 218.0 // mm #define DELTA_DIAGONAL_ROD 218.0 // mm
// Horizontal distance bridged by diagonal push rods when effector is centered. // Horizontal distance bridged by diagonal push rods when effector is centered.
#define DELTA_RADIUS 100.00 //mm // get this value from auto calibrate #define DELTA_RADIUS 100.00 //mm Get this value from auto calibrate
// height from z=0 to home position // height from z=0 to home position
#define DELTA_HEIGHT 295.00 // get this value from auto calibrate - use G33 P1 A at 1st time calibration #define DELTA_HEIGHT 295.00 // get this value from auto calibrate - use G33 P1 at 1st time calibration
// Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers).
#define DELTA_PRINTABLE_RADIUS 85.0 #define DELTA_PRINTABLE_RADIUS 85.0
@ -460,8 +460,8 @@
// See http://minow.blogspot.com/index.html#4918805519571907051 // See http://minow.blogspot.com/index.html#4918805519571907051
#define DELTA_CALIBRATION_MENU #define DELTA_CALIBRATION_MENU
// set the radius for the calibration probe points - max 0.8 * DELTA_PRINTABLE_RADIUS if DELTA_AUTO_CALIBRATION enabled // set the radius for the calibration probe points - max DELTA_PRINTABLE_RADIUS*0.869 if DELTA_AUTO_CALIBRATION enabled
#define DELTA_CALIBRATION_RADIUS (DELTA_PRINTABLE_RADIUS - 17) // mm #define DELTA_CALIBRATION_RADIUS ((DELTA_PRINTABLE_RADIUS) * 0.869) // mm
// G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results) // G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results)
#define DELTA_AUTO_CALIBRATION #define DELTA_AUTO_CALIBRATION

View file

@ -454,10 +454,10 @@
#define DELTA_CARRIAGE_OFFSET 22.0 // mm #define DELTA_CARRIAGE_OFFSET 22.0 // mm
// Horizontal distance bridged by diagonal push rods when effector is centered. // Horizontal distance bridged by diagonal push rods when effector is centered.
#define DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET - DELTA_EFFECTOR_OFFSET - DELTA_CARRIAGE_OFFSET) //mm // get this value from auto calibrate #define DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET - DELTA_EFFECTOR_OFFSET - DELTA_CARRIAGE_OFFSET) //mm Get this value from auto calibrate
// height from z=0.00 to home position // height from z=0.00 to home position
#define DELTA_HEIGHT 280 // get this value from auto calibrate - use G33 C-1 at 1st time calibration #define DELTA_HEIGHT 280 // get this value from auto calibrate - use G33 P1 at 1st time calibration
// Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers).
#define DELTA_PRINTABLE_RADIUS 85.0 #define DELTA_PRINTABLE_RADIUS 85.0
@ -467,8 +467,8 @@
// See http://minow.blogspot.com/index.html#4918805519571907051 // See http://minow.blogspot.com/index.html#4918805519571907051
//#define DELTA_CALIBRATION_MENU //#define DELTA_CALIBRATION_MENU
// set the radius for the calibration probe points - max 0.8 * DELTA_PRINTABLE_RADIUS if DELTA_AUTO_CALIBRATION enabled // set the radius for the calibration probe points - max DELTA_PRINTABLE_RADIUS*0.869 if DELTA_AUTO_CALIBRATION enabled
#define DELTA_CALIBRATION_RADIUS (DELTA_PRINTABLE_RADIUS - 17) // mm #define DELTA_CALIBRATION_RADIUS ((DELTA_PRINTABLE_RADIUS) * 0.869) // mm
// G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results) // G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results)
//#define DELTA_AUTO_CALIBRATION //#define DELTA_AUTO_CALIBRATION

View file

@ -444,10 +444,10 @@
#define DELTA_CARRIAGE_OFFSET 18.0 // mm #define DELTA_CARRIAGE_OFFSET 18.0 // mm
// Horizontal distance bridged by diagonal push rods when effector is centered. // Horizontal distance bridged by diagonal push rods when effector is centered.
#define DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET - DELTA_EFFECTOR_OFFSET - DELTA_CARRIAGE_OFFSET) //mm // get this value from auto calibrate // height from z=0.00 to home position #define DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET - DELTA_EFFECTOR_OFFSET - DELTA_CARRIAGE_OFFSET) //mm Get this value from auto calibrate
// height from z=0.00 to home position // height from z=0.00 to home position
#define DELTA_HEIGHT 250 // get this value from auto calibrate - use G33 C-1 at 1st time calibration #define DELTA_HEIGHT 250 // get this value from auto calibrate - use G33 P1 at 1st time calibration
// Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers).
#define DELTA_PRINTABLE_RADIUS 140.0 #define DELTA_PRINTABLE_RADIUS 140.0
@ -456,8 +456,8 @@
// See http://minow.blogspot.com/index.html#4918805519571907051 // See http://minow.blogspot.com/index.html#4918805519571907051
//#define DELTA_CALIBRATION_MENU //#define DELTA_CALIBRATION_MENU
// set the radius for the calibration probe points - max 0.8 * DELTA_PRINTABLE_RADIUS if DELTA_AUTO_CALIBRATION enabled // set the radius for the calibration probe points - max DELTA_PRINTABLE_RADIUS*0.869 if DELTA_AUTO_CALIBRATION enabled
#define DELTA_CALIBRATION_RADIUS (DELTA_PRINTABLE_RADIUS - 28) // mm #define DELTA_CALIBRATION_RADIUS ((DELTA_PRINTABLE_RADIUS) * 0.869) // mm
// G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results) // G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results)
//#define DELTA_AUTO_CALIBRATION //#define DELTA_AUTO_CALIBRATION

View file

@ -444,10 +444,10 @@
#define DELTA_CARRIAGE_OFFSET 19.5 // mm #define DELTA_CARRIAGE_OFFSET 19.5 // mm
// Horizontal distance bridged by diagonal push rods when effector is centered. // Horizontal distance bridged by diagonal push rods when effector is centered.
#define DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET - DELTA_EFFECTOR_OFFSET - DELTA_CARRIAGE_OFFSET) //mm // get this value from auto calibrate #define DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET - DELTA_EFFECTOR_OFFSET - DELTA_CARRIAGE_OFFSET) //mm Get this value from auto calibrate
// height from z=0.00 to home position // height from z=0.00 to home position
#define DELTA_HEIGHT 250 // get this value from auto calibrate - use G33 C-1 at 1st time calibration #define DELTA_HEIGHT 250 // get this value from auto calibrate - use G33 P1 at 1st time calibration
// Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers).
#define DELTA_PRINTABLE_RADIUS 90.0 #define DELTA_PRINTABLE_RADIUS 90.0
@ -456,8 +456,8 @@
// See http://minow.blogspot.com/index.html#4918805519571907051 // See http://minow.blogspot.com/index.html#4918805519571907051
//#define DELTA_CALIBRATION_MENU //#define DELTA_CALIBRATION_MENU
// set the radius for the calibration probe points - max 0.8 * DELTA_PRINTABLE_RADIUS if DELTA_AUTO_CALIBRATION enabled // set the radius for the calibration probe points - max DELTA_PRINTABLE_RADIUS*0.869 if DELTA_AUTO_CALIBRATION enabled
#define DELTA_CALIBRATION_RADIUS (DELTA_PRINTABLE_RADIUS - 18) // mm #define DELTA_CALIBRATION_RADIUS ((DELTA_PRINTABLE_RADIUS) * 0.869) // mm
// G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results) // G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results)
//#define DELTA_AUTO_CALIBRATION //#define DELTA_AUTO_CALIBRATION

View file

@ -431,10 +431,10 @@
#define DELTA_CARRIAGE_OFFSET 30.0 // mm #define DELTA_CARRIAGE_OFFSET 30.0 // mm
// Horizontal distance bridged by diagonal push rods when effector is centered. // Horizontal distance bridged by diagonal push rods when effector is centered.
#define DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET - DELTA_EFFECTOR_OFFSET - DELTA_CARRIAGE_OFFSET) //mm // get this value from auto calibrate #define DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET - DELTA_EFFECTOR_OFFSET - DELTA_CARRIAGE_OFFSET) //mm Get this value from auto calibrate
// height from z=0.00 to home position // height from z=0.00 to home position
#define DELTA_HEIGHT 277 // get this value from auto calibrate - use G33 C-1 at 1st time calibration #define DELTA_HEIGHT 277 // get this value from auto calibrate - use G33 P1 at 1st time calibration
// Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers).
#define DELTA_PRINTABLE_RADIUS 127.0 #define DELTA_PRINTABLE_RADIUS 127.0
@ -443,8 +443,8 @@
// See http://minow.blogspot.com/index.html#4918805519571907051 // See http://minow.blogspot.com/index.html#4918805519571907051
//#define DELTA_CALIBRATION_MENU //#define DELTA_CALIBRATION_MENU
// set the radius for the calibration probe points - max 0.8 * DELTA_PRINTABLE_RADIUS if DELTA_AUTO_CALIBRATION enabled // set the radius for the calibration probe points - max DELTA_PRINTABLE_RADIUS*0.869 if DELTA_AUTO_CALIBRATION enabled
#define DELTA_CALIBRATION_RADIUS (DELTA_PRINTABLE_RADIUS - 25.4) // mm #define DELTA_CALIBRATION_RADIUS ((DELTA_PRINTABLE_RADIUS) * 0.869) // mm
// G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results) // G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results)
//#define DELTA_AUTO_CALIBRATION //#define DELTA_AUTO_CALIBRATION

View file

@ -449,10 +449,10 @@
#define DELTA_CARRIAGE_OFFSET 22.0 // mm #define DELTA_CARRIAGE_OFFSET 22.0 // mm
// Horizontal distance bridged by diagonal push rods when effector is centered. // Horizontal distance bridged by diagonal push rods when effector is centered.
#define DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET - DELTA_EFFECTOR_OFFSET - DELTA_CARRIAGE_OFFSET) //mm // get this value from auto calibrate #define DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET - DELTA_EFFECTOR_OFFSET - DELTA_CARRIAGE_OFFSET) //mm Get this value from auto calibrate
// height from z=0.00 to home position // height from z=0.00 to home position
#define DELTA_HEIGHT 380 // get this value from auto calibrate - use G33 C-1 at 1st time calibration #define DELTA_HEIGHT 380 // get this value from auto calibrate - use G33 P1 at 1st time calibration
// Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers).
#define DELTA_PRINTABLE_RADIUS 140.0 #define DELTA_PRINTABLE_RADIUS 140.0
@ -461,8 +461,8 @@
// See http://minow.blogspot.com/index.html#4918805519571907051 // See http://minow.blogspot.com/index.html#4918805519571907051
//#define DELTA_CALIBRATION_MENU //#define DELTA_CALIBRATION_MENU
// set the radius for the calibration probe points - max 0.8 * DELTA_PRINTABLE_RADIUS if DELTA_AUTO_CALIBRATION enabled // set the radius for the calibration probe points - max DELTA_PRINTABLE_RADIUS*0.869 if DELTA_AUTO_CALIBRATION enabled
#define DELTA_CALIBRATION_RADIUS (DELTA_PRINTABLE_RADIUS - 28) // mm #define DELTA_CALIBRATION_RADIUS ((DELTA_PRINTABLE_RADIUS) * 0.869) // mm
// G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results) // G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results)
//#define DELTA_AUTO_CALIBRATION //#define DELTA_AUTO_CALIBRATION

View file

@ -160,8 +160,10 @@ class Planner {
min_travel_feedrate_mm_s; min_travel_feedrate_mm_s;
#if HAS_ABL #if HAS_ABL
static bool abl_enabled; // Flag that bed leveling is enabled static bool abl_enabled; // Flag that bed leveling is enabled
static matrix_3x3 bed_level_matrix; // Transform to compensate for bed level #if ABL_PLANAR
static matrix_3x3 bed_level_matrix; // Transform to compensate for bed level
#endif
#endif #endif
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)

View file

@ -2151,6 +2151,10 @@ void kill_screen(const char* lcd_msg) {
} }
void _lcd_delta_calibrate_home() { void _lcd_delta_calibrate_home() {
#if HAS_LEVELING
reset_bed_level(); // After calibration bed-level data is no longer valid
#endif
enqueue_and_echo_commands_P(PSTR("G28")); enqueue_and_echo_commands_P(PSTR("G28"));
lcd_goto_screen(_lcd_calibrate_homing); lcd_goto_screen(_lcd_calibrate_homing);
} }
@ -2158,6 +2162,10 @@ void kill_screen(const char* lcd_msg) {
// Move directly to the tower position with uninterpolated moves // Move directly to the tower position with uninterpolated moves
// If we used interpolated moves it would cause this to become re-entrant // If we used interpolated moves it would cause this to become re-entrant
void _goto_tower_pos(const float &a) { void _goto_tower_pos(const float &a) {
#if HAS_LEVELING
reset_bed_level(); // After calibration bed-level data is no longer valid
#endif
current_position[Z_AXIS] = max(Z_HOMING_HEIGHT, Z_CLEARANCE_BETWEEN_PROBES) + (DELTA_PRINTABLE_RADIUS) / 5; current_position[Z_AXIS] = max(Z_HOMING_HEIGHT, Z_CLEARANCE_BETWEEN_PROBES) + (DELTA_PRINTABLE_RADIUS) / 5;
line_to_current(Z_AXIS); line_to_current(Z_AXIS);

View file

@ -6,7 +6,7 @@
<img align="top" width=175 src="buildroot/share/pixmaps/logo/marlin-250.png" /> <img align="top" width=175 src="buildroot/share/pixmaps/logo/marlin-250.png" />
Additional documentation can be found at the [Marlin Home Page](http://marlinfw.org/). Additional documentation can be found at the [Marlin Home Page](http://marlinfw.org/).
Please test this firmware and inform us if it misbehaves in any way, volunteers are standing by! Please test this firmware and let us know if it misbehaves in any way. Volunteers are standing by!
## Bugfix Branch ## Bugfix Branch
@ -14,91 +14,18 @@ __Not for production use. Use with caution!__
This branch is used to accumulate patches to the latest 1.1.x release version. Periodically this branch will form the basis for the next minor 1.1.x release. This branch is used to accumulate patches to the latest 1.1.x release version. Periodically this branch will form the basis for the next minor 1.1.x release.
Download earlier versions of Marlin on the [Releases page](https://github.com/MarlinFirmware/Marlin/releases). (The latest tagged release of Marlin is version 1.1.0.) Download earlier versions of Marlin on the [Releases page](https://github.com/MarlinFirmware/Marlin/releases). (The latest tagged release of Marlin is version 1.1.1.)
## Recent Changes ## Recent Changes
- 1.1.0 - 4 May 2017 - Further integration of Unified Bed Leveling
- See the [1.1.0 Release Notes](https://github.com/MarlinFirmware/Marlin/releases/tag/1.1.0) for a full list of changes. - Initial UBL LCD Menu
- New optimized G-code parser singleton
- RC8 - 6 Dec 2016 - Initial M3/M4/M5 Spindle and Laser support
- Major performance improvement for Graphical LCDs - Added M421 Q to offset a mesh point
- Simplified probe configuration - Refinements to G26 and G33
- Enable Auto Bed Leveling by type - Added M80 S to query the power state
- Reduce serial communication errors - "Cancel Print" now shuts off heaters
- Make Bilinear (Mesh) Grid Leveling available for non-delta - Added `EXTRAPOLATE_BEYOND_GRID` option for mesh-based leveling
- Support for Trinamic TMC2130 SilentStepStick SPI-based drivers
- Add `M211` to Enable/Disable Software Endstops
- Add `M355` to turn the case light on/off and set brightness
- Improved I2C class with full master/slave support
- Add `G38.2` `G38.3` command option for CNC style probing
- Add `MINIMUM_STEPPER_PULSE` option to adjust step pulse duration
- Add `R` parameter support for `G2`/`G3`
- Add `M43` optional command (`PINS_DEBUGGING`)
- Remove SCARA axis scaling
- Improved sanity checking of configuration
- Improved support for PlatformIO and command-line build
- Usable `DELTA_CALIBRATION_MENU`
- Support for Printrbot Rev.F
- New and updated languages
- RC7 - 26 Jul 2016
- Add Print Job Timer and Print Counter (`PRINTCOUNTER`)
- New `M600` Filament Change (`FILAMENT_CHANGE_FEATURE`)
- New `G12` Nozzle Clean (`NOZZLE_CLEAN_FEATURE`)
- New `G27` Nozzle Park (`NOZZLE_PARK_FEATURE`)
- Add support for `COREYZ`
- Add a new Advance Extrusion algorithm (`LIN_ADVANCE`)
- Add support for inches, Fahrenheit, Kelvin units (`INCH_MODE_SUPPORT`, `TEMPERATURE_UNITS_SUPPORT`)
- Better handling of `G92` shifting of the coordinate space
- Add Greek and Croatian languages
- Improve the Manual (Mesh) Bed Leveling user interface
- Add support for more boards, controllers, and probes:
- Vellemann K8400 (`BOARD_K8400`)
- RigidBot V2 (`BOARD_RIGIDBOARD_V2`)
- Cartesio UI (`BOARD_CNCONTROLS_12`)
- BLTouch probe sensor (`BLTOUCH`)
- Viki 2 with RAMPS and MKS boards
- Improve support for `DELTA` and other kinematics
- Improve thermal management, add `WATCH_BED_TEMP_PERIOD`
- Better handling of toolchange, multiple tools
- Add support for two X steppers `X_DUAL_STEPPER_DRIVERS`
- Add support for `SINGLENOZZLE`, `MIXING_EXTRUDER`, `SWITCHING_NOZZLE`, and `SWITCHING_EXTRUDER`
- Simplified probe configuration, allow usage without bed leveling
- And much more… See the [1.1.0-RC7 Change Log](https://github.com/MarlinFirmware/Marlin/releases/tag/1.1.0-RC7) for the complete list of changes.
- RC6 - 24 Apr 2016
- Marlin now requires Arduino version 1.6.0 or later
- Completed support for CoreXY / CoreXZ
- See the [1.1.0-RC6 Change Log](https://github.com/MarlinFirmware/Marlin/releases/tag/1.1.0-RC6) for all the changes.
- RC5 - 01 Apr 2016
- Warn if compiling with older versions (<1.50) of Arduino
- Fix various LCD menu issues
- Add formal support for MKSv1.3 and Sainsmart (RAMPS variants)
- Fix bugs in M104, M109, and M190
- Fix broken M404 command
- Fix issues with M23 and "Start SD Print"
- More output for M111
- Rename FILAMENT_SENSOR to FILAMENT_WIDTH_SENSOR
- Fix SD card bugs
- and a lot more
- See the [1.1.0-RC5 Change Log](https://github.com/MarlinFirmware/Marlin/releases/tag/1.1.0-RC5) for more!
- RC4 - 24 Mar 2016
- Many lingering bugs and nagging issues addressed
- Improvements to LCD menus, CoreXY/CoreXZ, Delta, Bed Leveling, and more…
- RC3 - 01 Dec 2015
- A number of language sensitive strings have been revised
- Formatting of the LCD display has been improved to handle negative coordinates better
- Various compiler-related issues have been corrected
- RC2 - 29 Sep 2015
- File styling reverted
- LCD update frequency reduced
- RC1 - 19 Sep 2015
- Published for testing
## Submitting Patches ## Submitting Patches
@ -142,7 +69,7 @@ More features have been added by:
- [[@Tannoo](https://github.com/Tannoo)] - [[@Tannoo](https://github.com/Tannoo)]
- [[@teemuatlut](https://github.com/teemuatlut)] - [[@teemuatlut](https://github.com/teemuatlut)]
- [[@bgort](https://github.com/bgort)] - [[@bgort](https://github.com/bgort)]
- [[@LVD-AC](https://github.com/LVD-AC)] - Luc Van Daele[[@LVD-AC](https://github.com/LVD-AC)] - Dutch, French, English
- [[@paulusjacobus](https://github.com/paulusjacobus)] - [[@paulusjacobus](https://github.com/paulusjacobus)]
- ...and many others - ...and many others