commit
ad7a7bb01c
|
|
@ -21,7 +21,7 @@
|
||||||
#include "Configuration.h"
|
#include "Configuration.h"
|
||||||
#include "pins.h"
|
#include "pins.h"
|
||||||
#include "Timer.h"
|
#include "Timer.h"
|
||||||
extern int mbl_z_probe_nr;
|
extern uint8_t mbl_z_probe_nr;
|
||||||
|
|
||||||
#ifndef AT90USB
|
#ifndef AT90USB
|
||||||
#define HardwareSerial_h // trick to disable the standard HWserial
|
#define HardwareSerial_h // trick to disable the standard HWserial
|
||||||
|
|
|
||||||
|
|
@ -167,7 +167,7 @@ CardReader card;
|
||||||
unsigned long PingTime = _millis();
|
unsigned long PingTime = _millis();
|
||||||
unsigned long NcTime;
|
unsigned long NcTime;
|
||||||
|
|
||||||
int mbl_z_probe_nr = 3; //numer of Z measurements for each point in mesh bed leveling calibration
|
uint8_t mbl_z_probe_nr = 3; //numer of Z measurements for each point in mesh bed leveling calibration
|
||||||
|
|
||||||
//used for PINDA temp calibration and pause print
|
//used for PINDA temp calibration and pause print
|
||||||
#define DEFAULT_RETRACTION 1
|
#define DEFAULT_RETRACTION 1
|
||||||
|
|
@ -4438,7 +4438,10 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
|
||||||
bool clamped = world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]);
|
bool clamped = world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]);
|
||||||
clamped ? SERIAL_PROTOCOLPGM("First calibration point clamped.\n") : SERIAL_PROTOCOLPGM("No clamping for first calibration point.\n");
|
clamped ? SERIAL_PROTOCOLPGM("First calibration point clamped.\n") : SERIAL_PROTOCOLPGM("No clamping for first calibration point.\n");
|
||||||
}
|
}
|
||||||
#endif //SUPPORT_VERBOSITY
|
#else //SUPPORT_VERBOSITY
|
||||||
|
world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]);
|
||||||
|
#endif //SUPPORT_VERBOSITY
|
||||||
|
|
||||||
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[X_AXIS] / 30, active_extruder);
|
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[X_AXIS] / 30, active_extruder);
|
||||||
// Wait until the move is finished.
|
// Wait until the move is finished.
|
||||||
st_synchronize();
|
st_synchronize();
|
||||||
|
|
@ -4490,6 +4493,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
|
||||||
// Move Z up to MESH_HOME_Z_SEARCH.
|
// Move Z up to MESH_HOME_Z_SEARCH.
|
||||||
if((ix == 0) && (iy == 0)) current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
|
if((ix == 0) && (iy == 0)) current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
|
||||||
else current_position[Z_AXIS] += 2.f / nMeasPoints; //use relative movement from Z coordinate where PINDa triggered on previous point. This makes calibration faster.
|
else current_position[Z_AXIS] += 2.f / nMeasPoints; //use relative movement from Z coordinate where PINDa triggered on previous point. This makes calibration faster.
|
||||||
|
float init_z_bckp = current_position[Z_AXIS];
|
||||||
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], Z_LIFT_FEEDRATE, active_extruder);
|
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], Z_LIFT_FEEDRATE, active_extruder);
|
||||||
st_synchronize();
|
st_synchronize();
|
||||||
|
|
||||||
|
|
@ -4499,15 +4503,18 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
|
||||||
|
|
||||||
//printf_P(PSTR("[%f;%f]\n"), current_position[X_AXIS], current_position[Y_AXIS]);
|
//printf_P(PSTR("[%f;%f]\n"), current_position[X_AXIS], current_position[Y_AXIS]);
|
||||||
|
|
||||||
world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]);
|
|
||||||
#ifdef SUPPORT_VERBOSITY
|
#ifdef SUPPORT_VERBOSITY
|
||||||
if (verbosity_level >= 1) {
|
if (verbosity_level >= 1) {
|
||||||
|
clamped = world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]);
|
||||||
SERIAL_PROTOCOL(mesh_point);
|
SERIAL_PROTOCOL(mesh_point);
|
||||||
clamped ? SERIAL_PROTOCOLPGM(": xy clamped.\n") : SERIAL_PROTOCOLPGM(": no xy clamping\n");
|
clamped ? SERIAL_PROTOCOLPGM(": xy clamped.\n") : SERIAL_PROTOCOLPGM(": no xy clamping\n");
|
||||||
}
|
}
|
||||||
|
#else //SUPPORT_VERBOSITY
|
||||||
|
world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]);
|
||||||
#endif // SUPPORT_VERBOSITY
|
#endif // SUPPORT_VERBOSITY
|
||||||
|
|
||||||
|
//printf_P(PSTR("after clamping: [%f;%f]\n"), current_position[X_AXIS], current_position[Y_AXIS]);
|
||||||
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], XY_AXIS_FEEDRATE, active_extruder);
|
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], XY_AXIS_FEEDRATE, active_extruder);
|
||||||
st_synchronize();
|
st_synchronize();
|
||||||
|
|
||||||
|
|
@ -4517,8 +4524,8 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
|
||||||
printf_P(_T(MSG_BED_LEVELING_FAILED_POINT_LOW));
|
printf_P(_T(MSG_BED_LEVELING_FAILED_POINT_LOW));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (MESH_HOME_Z_SEARCH - current_position[Z_AXIS] < 0.1f) { //broken cable or initial Z coordinate too low. Go to MESH_HOME_Z_SEARCH and repeat last step (z-probe) again to distinguish between these two cases.
|
if (init_z_bckp - current_position[Z_AXIS] < 0.1f) { //broken cable or initial Z coordinate too low. Go to MESH_HOME_Z_SEARCH and repeat last step (z-probe) again to distinguish between these two cases.
|
||||||
|
//printf_P(PSTR("Another attempt! Current Z position: %f\n"), current_position[Z_AXIS]);
|
||||||
current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
|
current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
|
||||||
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], Z_LIFT_FEEDRATE, active_extruder);
|
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], Z_LIFT_FEEDRATE, active_extruder);
|
||||||
st_synchronize();
|
st_synchronize();
|
||||||
|
|
@ -4528,12 +4535,12 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (MESH_HOME_Z_SEARCH - current_position[Z_AXIS] < 0.1f) {
|
if (MESH_HOME_Z_SEARCH - current_position[Z_AXIS] < 0.1f) {
|
||||||
printf_P(PSTR("Bed leveling failed. Sensor disconnected or cable broken. Waiting for reset.\n"));
|
printf_P(PSTR("Bed leveling failed. Sensor disconnected or cable broken.\n"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (has_z && fabs(z0 - current_position[Z_AXIS]) > Z_CALIBRATION_THRESHOLD) { //if we have data from z calibration, max. allowed difference is 1mm for each point
|
if (has_z && fabs(z0 - current_position[Z_AXIS]) > Z_CALIBRATION_THRESHOLD) { //if we have data from z calibration, max. allowed difference is 1mm for each point
|
||||||
printf_P(PSTR("Bed leveling failed. Sensor triggered too high. Waiting for reset.\n"));
|
printf_P(PSTR("Bed leveling failed. Sensor triggered too high.\n"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifdef SUPPORT_VERBOSITY
|
#ifdef SUPPORT_VERBOSITY
|
||||||
|
|
|
||||||
|
|
@ -678,11 +678,13 @@ void reset_bed_offset_and_skew()
|
||||||
|
|
||||||
bool is_bed_z_jitter_data_valid()
|
bool is_bed_z_jitter_data_valid()
|
||||||
// offsets of the Z heiths of the calibration points from the first point are saved as 16bit signed int, scaled to tenths of microns
|
// offsets of the Z heiths of the calibration points from the first point are saved as 16bit signed int, scaled to tenths of microns
|
||||||
{
|
// if at least one 16bit integer has different value then -1 (0x0FFFF), data are considered valid and function returns true, otherwise it returns false
|
||||||
for (int8_t i = 0; i < 8; ++ i)
|
{
|
||||||
if (eeprom_read_word((uint16_t*)(EEPROM_BED_CALIBRATION_Z_JITTER+i*2)) == 0x0FFFF)
|
bool data_valid = false;
|
||||||
return false;
|
for (int8_t i = 0; i < 8; ++i) {
|
||||||
return true;
|
if (eeprom_read_word((uint16_t*)(EEPROM_BED_CALIBRATION_Z_JITTER + i * 2)) != 0x0FFFF) data_valid = true;
|
||||||
|
}
|
||||||
|
return data_valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void world2machine_update(const float vec_x[2], const float vec_y[2], const float cntr[2])
|
static void world2machine_update(const float vec_x[2], const float vec_y[2], const float cntr[2])
|
||||||
|
|
@ -943,10 +945,11 @@ inline bool find_bed_induction_sensor_point_z(float minimum_z, uint8_t n_iter, i
|
||||||
#endif //SUPPORT_VERBOSITY
|
#endif //SUPPORT_VERBOSITY
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
bool high_deviation_occured = false;
|
||||||
#ifdef TMC2130
|
#ifdef TMC2130
|
||||||
FORCE_HIGH_POWER_START;
|
FORCE_HIGH_POWER_START;
|
||||||
#endif
|
#endif
|
||||||
|
//printf_P(PSTR("Min. Z: %f\n"), minimum_z);
|
||||||
#ifdef SUPPORT_VERBOSITY
|
#ifdef SUPPORT_VERBOSITY
|
||||||
if(verbosity_level >= 10) SERIAL_ECHOLNPGM("find bed induction sensor point z");
|
if(verbosity_level >= 10) SERIAL_ECHOLNPGM("find bed induction sensor point z");
|
||||||
#endif // SUPPORT_VERBOSITY
|
#endif // SUPPORT_VERBOSITY
|
||||||
|
|
@ -961,18 +964,26 @@ inline bool find_bed_induction_sensor_point_z(float minimum_z, uint8_t n_iter, i
|
||||||
// we have to let the planner know where we are right now as it is not where we said to go.
|
// we have to let the planner know where we are right now as it is not where we said to go.
|
||||||
update_current_position_z();
|
update_current_position_z();
|
||||||
if (! endstop_z_hit_on_purpose())
|
if (! endstop_z_hit_on_purpose())
|
||||||
goto error;
|
{
|
||||||
|
//printf_P(PSTR("endstop not hit 1, current_pos[Z]: %f \n"), current_position[Z_AXIS]);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
#ifdef TMC2130
|
#ifdef TMC2130
|
||||||
if (READ(Z_TMC2130_DIAG) != 0) goto error; //crash Z detected
|
if (READ(Z_TMC2130_DIAG) != 0)
|
||||||
|
{
|
||||||
|
//printf_P(PSTR("crash detected 1, current_pos[Z]: %f \n"), current_position[Z_AXIS]);
|
||||||
|
goto error; //crash Z detected
|
||||||
|
}
|
||||||
#endif //TMC2130
|
#endif //TMC2130
|
||||||
for (uint8_t i = 0; i < n_iter; ++ i)
|
for (uint8_t i = 0; i < n_iter; ++ i)
|
||||||
{
|
{
|
||||||
|
|
||||||
current_position[Z_AXIS] += 0.2;
|
current_position[Z_AXIS] += high_deviation_occured ? 0.5 : 0.2;
|
||||||
float z_bckp = current_position[Z_AXIS];
|
float z_bckp = current_position[Z_AXIS];
|
||||||
go_to_current(homing_feedrate[Z_AXIS]/60);
|
go_to_current(homing_feedrate[Z_AXIS]/60);
|
||||||
// Move back down slowly to find bed.
|
// Move back down slowly to find bed.
|
||||||
current_position[Z_AXIS] = minimum_z;
|
current_position[Z_AXIS] = minimum_z;
|
||||||
|
//printf_P(PSTR("init Z = %f, min_z = %f, i = %d\n"), z_bckp, minimum_z, i);
|
||||||
go_to_current(homing_feedrate[Z_AXIS]/(4*60));
|
go_to_current(homing_feedrate[Z_AXIS]/(4*60));
|
||||||
// we have to let the planner know where we are right now as it is not where we said to go.
|
// we have to let the planner know where we are right now as it is not where we said to go.
|
||||||
update_current_position_z();
|
update_current_position_z();
|
||||||
|
|
@ -989,10 +1000,16 @@ inline bool find_bed_induction_sensor_point_z(float minimum_z, uint8_t n_iter, i
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (! endstop_z_hit_on_purpose())
|
if (!endstop_z_hit_on_purpose())
|
||||||
goto error;
|
{
|
||||||
|
//printf_P(PSTR("i = %d, endstop not hit 2, current_pos[Z]: %f \n"), i, current_position[Z_AXIS]);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
#ifdef TMC2130
|
#ifdef TMC2130
|
||||||
if (READ(Z_TMC2130_DIAG) != 0) goto error; //crash Z detected
|
if (READ(Z_TMC2130_DIAG) != 0) {
|
||||||
|
//printf_P(PSTR("crash detected 2, current_pos[Z]: %f \n"), current_position[Z_AXIS]);
|
||||||
|
goto error; //crash Z detected
|
||||||
|
}
|
||||||
#endif //TMC2130
|
#endif //TMC2130
|
||||||
// SERIAL_ECHOPGM("Bed find_bed_induction_sensor_point_z low, height: ");
|
// SERIAL_ECHOPGM("Bed find_bed_induction_sensor_point_z low, height: ");
|
||||||
// MYSERIAL.print(current_position[Z_AXIS], 5);
|
// MYSERIAL.print(current_position[Z_AXIS], 5);
|
||||||
|
|
@ -1000,7 +1017,21 @@ inline bool find_bed_induction_sensor_point_z(float minimum_z, uint8_t n_iter, i
|
||||||
float dz = i?abs(current_position[Z_AXIS] - (z / i)):0;
|
float dz = i?abs(current_position[Z_AXIS] - (z / i)):0;
|
||||||
z += current_position[Z_AXIS];
|
z += current_position[Z_AXIS];
|
||||||
//printf_P(PSTR("Z[%d] = %d, dz=%d\n"), i, (int)(current_position[Z_AXIS] * 1000), (int)(dz * 1000));
|
//printf_P(PSTR("Z[%d] = %d, dz=%d\n"), i, (int)(current_position[Z_AXIS] * 1000), (int)(dz * 1000));
|
||||||
if (dz > 0.05) goto error;//deviation > 50um
|
//printf_P(PSTR("Z- measurement deviation from avg value %f um\n"), dz);
|
||||||
|
if (dz > 0.05) { //deviation > 50um
|
||||||
|
if (high_deviation_occured == false) { //first occurence may be caused in some cases by mechanic resonance probably especially if printer is placed on unstable surface
|
||||||
|
//printf_P(PSTR("high dev. first occurence\n"));
|
||||||
|
delay_keep_alive(500); //damping
|
||||||
|
//start measurement from the begining, but this time with higher movements in Z axis which should help to reduce mechanical resonance
|
||||||
|
high_deviation_occured = true;
|
||||||
|
i = -1;
|
||||||
|
z = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//printf_P(PSTR("PINDA triggered at %f\n"), current_position[Z_AXIS]);
|
||||||
}
|
}
|
||||||
current_position[Z_AXIS] = z;
|
current_position[Z_AXIS] = z;
|
||||||
if (n_iter > 1)
|
if (n_iter > 1)
|
||||||
|
|
|
||||||
|
|
@ -5319,7 +5319,7 @@ do\
|
||||||
{\
|
{\
|
||||||
if (mmu_enabled)\
|
if (mmu_enabled)\
|
||||||
{\
|
{\
|
||||||
if (SilentModeMenu_MMU == 0) MENU_ITEM_FUNCTION_P(_i("MMU Mode [Fast]"), lcd_silent_mode_mmu_set); \
|
if (SilentModeMenu_MMU == 0) MENU_ITEM_FUNCTION_P(_i("MMU Mode [Normal]"), lcd_silent_mode_mmu_set); \
|
||||||
else MENU_ITEM_FUNCTION_P(_i("MMU Mode[Stealth]"), lcd_silent_mode_mmu_set); \
|
else MENU_ITEM_FUNCTION_P(_i("MMU Mode[Stealth]"), lcd_silent_mode_mmu_set); \
|
||||||
}\
|
}\
|
||||||
}\
|
}\
|
||||||
|
|
@ -6688,6 +6688,17 @@ static void mbl_mesh_set() {
|
||||||
eeprom_update_byte((uint8_t*)EEPROM_MBL_POINTS_NR, mesh_nr);
|
eeprom_update_byte((uint8_t*)EEPROM_MBL_POINTS_NR, mesh_nr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mbl_probe_nr_set() {
|
||||||
|
mbl_z_probe_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR);
|
||||||
|
switch (mbl_z_probe_nr) {
|
||||||
|
case 1: mbl_z_probe_nr = 3; break;
|
||||||
|
case 3: mbl_z_probe_nr = 5; break;
|
||||||
|
case 5: mbl_z_probe_nr = 1; break;
|
||||||
|
default: mbl_z_probe_nr = 3; break;
|
||||||
|
}
|
||||||
|
eeprom_update_byte((uint8_t*)EEPROM_MBL_PROBE_NR, mbl_z_probe_nr);
|
||||||
|
}
|
||||||
|
|
||||||
static void lcd_mesh_bed_leveling_settings()
|
static void lcd_mesh_bed_leveling_settings()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
@ -6695,25 +6706,20 @@ static void lcd_mesh_bed_leveling_settings()
|
||||||
uint8_t points_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_POINTS_NR);
|
uint8_t points_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_POINTS_NR);
|
||||||
|
|
||||||
MENU_BEGIN();
|
MENU_BEGIN();
|
||||||
// leaving menu - this condition must be immediately before MENU_ITEM_BACK_P
|
|
||||||
if (((menu_item == menu_line) && menu_clicked && (lcd_encoder == menu_item)) || menu_leaving)
|
|
||||||
{
|
|
||||||
eeprom_update_byte((uint8_t*)EEPROM_MBL_PROBE_NR, (uint8_t)mbl_z_probe_nr);
|
|
||||||
}
|
|
||||||
MENU_ITEM_BACK_P(_T(MSG_SETTINGS));
|
MENU_ITEM_BACK_P(_T(MSG_SETTINGS));
|
||||||
if(points_nr == 3) MENU_ITEM_FUNCTION_P(_i("Mesh [3x3]"), mbl_mesh_set);
|
if(points_nr == 3) MENU_ITEM_FUNCTION_P(_i("Mesh [3x3]"), mbl_mesh_set); ////MSG_MESH_3x3 c=18 r=0
|
||||||
else MENU_ITEM_FUNCTION_P(_i("Mesh [7x7]"), mbl_mesh_set);
|
else MENU_ITEM_FUNCTION_P(_i("Mesh [7x7]"), mbl_mesh_set); ////MSG_MESH_7x7 c=18 r=0
|
||||||
MENU_ITEM_EDIT_int3_P(_i("Z-probe nr."), &mbl_z_probe_nr, 1, 5);
|
switch (mbl_z_probe_nr) {
|
||||||
if (points_nr == 7) {
|
case 1: MENU_ITEM_FUNCTION_P(_i("Z-probe nr. [1]"), mbl_probe_nr_set); break; ////MSG_Z_PROBE_NR_1 c=18 r=0
|
||||||
if (magnet_elimination) MENU_ITEM_FUNCTION_P(_i("Magnets comp. [On]"), mbl_magnets_elimination_set);
|
case 5: MENU_ITEM_FUNCTION_P(_i("Z-probe nr. [5]"), mbl_probe_nr_set); break; ////MSG_Z_PROBE_NR_1 c=18 r=0
|
||||||
else MENU_ITEM_FUNCTION_P(_i("Magnets comp.[Off]"), mbl_magnets_elimination_set);
|
default: MENU_ITEM_FUNCTION_P(_i("Z-probe nr. [3]"), mbl_probe_nr_set); break; ////MSG_Z_PROBE_NR_1 c=18 r=0
|
||||||
}
|
}
|
||||||
else menu_item_text_P(_i("Magnets comp.[N/A]"));
|
if (points_nr == 7) {
|
||||||
|
if (magnet_elimination) MENU_ITEM_FUNCTION_P(_i("Magnets comp. [On]"), mbl_magnets_elimination_set); ////MSG_MAGNETS_COMP_ON c=18 r=0
|
||||||
|
else MENU_ITEM_FUNCTION_P(_i("Magnets comp.[Off]"), mbl_magnets_elimination_set); ////MSG_MAGNETS_COMP_OFF c=18 r=0
|
||||||
|
}
|
||||||
|
else menu_item_text_P(_i("Magnets comp.[N/A]")); ////MSG_MAGNETS_COMP_NA c=18 r=0
|
||||||
MENU_END();
|
MENU_END();
|
||||||
/*if(menu_leaving)
|
|
||||||
{
|
|
||||||
eeprom_update_byte((uint8_t*)EEPROM_MBL_POINTS_NR, mbl_z_probe_nr);
|
|
||||||
}*/
|
|
||||||
//SETTINGS_MBL_MODE;
|
//SETTINGS_MBL_MODE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue