Fixed "Shift out of range" bug in xyz calibration, status on demand added, temp reading disable in farm mode

This commit is contained in:
PavelSindler 2017-02-22 18:00:41 +01:00
parent 590cc8f3e8
commit 241e32e691
6 changed files with 368 additions and 36 deletions

View File

@ -5,7 +5,7 @@
#include "Configuration_prusa.h"
// Firmware version
#define FW_version "3.0.10"
#define FW_version "3.0.10.1"
#define FW_PRUSA3D_MAGIC "PRUSA3DFW"
#define FW_PRUSA3D_MAGIC_LEN 10

View File

@ -292,6 +292,7 @@ extern unsigned long kicktime;
extern unsigned long total_filament_used;
void save_statistics(unsigned long _total_filament_used, unsigned long _total_print_time);
extern unsigned int heating_status;
extern unsigned int status_number;
extern unsigned int heating_status_counter;
extern bool custom_message;
extern unsigned int custom_message_type;

View File

@ -267,6 +267,7 @@ unsigned char lang_selected = 0;
bool prusa_sd_card_upload = false;
unsigned int status_number = 0;
unsigned long total_filament_used;
unsigned int heating_status;
@ -1958,7 +1959,10 @@ void process_commands()
int8_t SilentMode;
#endif
if(code_seen("PRUSA")){
if (code_seen("fn")) {
if (code_seen("PRN")) {
MYSERIAL.println(status_number);
}else if (code_seen("fn")) {
if (farm_mode) {
MYSERIAL.println(farm_no);
}
@ -1966,7 +1970,7 @@ void process_commands()
MYSERIAL.println("Not in farm mode.");
}
}else if (code_seen("fv")) {
}else if (code_seen("fv")) {
// get file version
#ifdef SDSUPPORT
card.openFile(strchr_pointer + 3,true);
@ -2017,7 +2021,7 @@ void process_commands()
}else if(code_seen("Y")) { //filaments adjustment at the beginning of print (for SNMM)
#ifdef SNMM
int extr;
SilentMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT); //is silent mode or loud mode set
SilentMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT); //is e or loud mode set
lcd_implementation_clear();
lcd_display_message_fullscreen_P(MSG_FIL_ADJUSTING);
current_position[Z_AXIS] = 100;
@ -3917,22 +3921,24 @@ Sigma_Exit:
#endif //TEMP_RESIDENCY_TIME
if( (millis() - codenum) > 1000UL )
{ //Print Temp Reading and remaining time every 1 second while heating up/cooling down
SERIAL_PROTOCOLPGM("T:");
SERIAL_PROTOCOL_F(degHotend(tmp_extruder),1);
SERIAL_PROTOCOLPGM(" E:");
SERIAL_PROTOCOL((int)tmp_extruder);
#ifdef TEMP_RESIDENCY_TIME
SERIAL_PROTOCOLPGM(" W:");
if(residencyStart > -1)
{
codenum = ((TEMP_RESIDENCY_TIME * 1000UL) - (millis() - residencyStart)) / 1000UL;
SERIAL_PROTOCOLLN( codenum );
}
else
{
SERIAL_PROTOCOLLN( "?" );
}
if (!farm_mode) {
SERIAL_PROTOCOLPGM("T:");
SERIAL_PROTOCOL_F(degHotend(tmp_extruder), 1);
SERIAL_PROTOCOLPGM(" E:");
SERIAL_PROTOCOL((int)tmp_extruder);
#ifdef TEMP_RESIDENCY_TIME
SERIAL_PROTOCOLPGM(" W:");
if (residencyStart > -1)
{
codenum = ((TEMP_RESIDENCY_TIME * 1000UL) - (millis() - residencyStart)) / 1000UL;
SERIAL_PROTOCOLLN(codenum);
}
else
{
SERIAL_PROTOCOLLN("?");
}
}
#else
SERIAL_PROTOCOLLN("");
#endif
@ -3984,15 +3990,18 @@ Sigma_Exit:
{
if(( millis() - codenum) > 1000 ) //Print Temp Reading every 1 second while heating up.
{
float tt=degHotend(active_extruder);
SERIAL_PROTOCOLPGM("T:");
SERIAL_PROTOCOL(tt);
SERIAL_PROTOCOLPGM(" E:");
SERIAL_PROTOCOL((int)active_extruder);
SERIAL_PROTOCOLPGM(" B:");
SERIAL_PROTOCOL_F(degBed(),1);
SERIAL_PROTOCOLLN("");
codenum = millis();
if (!farm_mode) {
float tt = degHotend(active_extruder);
SERIAL_PROTOCOLPGM("T:");
SERIAL_PROTOCOL(tt);
SERIAL_PROTOCOLPGM(" E:");
SERIAL_PROTOCOL((int)active_extruder);
SERIAL_PROTOCOLPGM(" B:");
SERIAL_PROTOCOL_F(degBed(), 1);
SERIAL_PROTOCOLLN("");
}
codenum = millis();
}
manage_heater();
manage_inactivity();

View File

@ -412,18 +412,55 @@ BedSkewOffsetDetectionResultType calculate_machine_skew_and_offset_LS(
cntr[1] = 0.f;
float wx = 0.f;
float wy = 0.f;
for (int8_t i = 0; i < 9; ++ i) {
for (int8_t i = 0; i < npts; ++ i) {
float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1];
float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1];
float w = point_weight_x(i, y);
cntr[0] += w * (pgm_read_float(true_pts + i * 2) - x);
wx += w;
cntr[0] += w * (pgm_read_float(true_pts + i * 2) - x);
wx += w;
if (verbosity_level >= 20) {
MYSERIAL.print(i);
SERIAL_ECHOLNPGM("");
SERIAL_ECHOLNPGM("Weight_x:");
MYSERIAL.print(w);
SERIAL_ECHOLNPGM("");
SERIAL_ECHOLNPGM("cntr[0]:");
MYSERIAL.print(cntr[0]);
SERIAL_ECHOLNPGM("");
SERIAL_ECHOLNPGM("wx:");
MYSERIAL.print(wx);
}
w = point_weight_y(i, y);
cntr[1] += w * (pgm_read_float(true_pts + i * 2 + 1) - y);
wy += w;
}
cntr[1] += w * (pgm_read_float(true_pts + i * 2 + 1) - y);
wy += w;
if (verbosity_level >= 20) {
SERIAL_ECHOLNPGM("");
SERIAL_ECHOLNPGM("Weight_y:");
MYSERIAL.print(w);
SERIAL_ECHOLNPGM("");
SERIAL_ECHOLNPGM("cntr[1]:");
MYSERIAL.print(cntr[1]);
SERIAL_ECHOLNPGM("");
SERIAL_ECHOLNPGM("wy:");
MYSERIAL.print(wy);
SERIAL_ECHOLNPGM("");
SERIAL_ECHOLNPGM("");
}
}
cntr[0] /= wx;
cntr[1] /= wy;
if (verbosity_level >= 20) {
SERIAL_ECHOLNPGM("");
SERIAL_ECHOLNPGM("Final cntr values:");
SERIAL_ECHOLNPGM("cntr[0]:");
MYSERIAL.print(cntr[0]);
SERIAL_ECHOLNPGM("");
SERIAL_ECHOLNPGM("cntr[1]:");
MYSERIAL.print(cntr[1]);
SERIAL_ECHOLNPGM("");
}
}
#endif
@ -605,18 +642,24 @@ void world2machine_initialize()
// Length of the vec_x shall be close to unity.
float l = sqrt(vec_x[0] * vec_x[0] + vec_x[1] * vec_x[1]);
if (l < 0.9 || l > 1.1) {
SERIAL_ECHOLNPGM("X vector length:");
MYSERIAL.println(l);
SERIAL_ECHOLNPGM("Invalid bed correction matrix. Length of the X vector out of range.");
reset = true;
}
// Length of the vec_y shall be close to unity.
l = sqrt(vec_y[0] * vec_y[0] + vec_y[1] * vec_y[1]);
if (l < 0.9 || l > 1.1) {
SERIAL_ECHOLNPGM("Invalid bed correction matrix. Length of the X vector out of range.");
SERIAL_ECHOLNPGM("Y vector length:");
MYSERIAL.println(l);
SERIAL_ECHOLNPGM("Invalid bed correction matrix. Length of the Y vector out of range.");
reset = true;
}
// Correction of the zero point shall be reasonably small.
l = sqrt(cntr[0] * cntr[0] + cntr[1] * cntr[1]);
if (l > 15.f) {
SERIAL_ECHOLNPGM("Zero point correction:");
MYSERIAL.println(l);
SERIAL_ECHOLNPGM("Invalid bed correction matrix. Shift out of range.");
reset = true;
}
@ -1654,7 +1697,27 @@ BedSkewOffsetDetectionResultType find_bed_offset_and_skew(int8_t verbosity_level
eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y +0), vec_y[0]);
eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y +4), vec_y[1]);
#endif
if (verbosity_level >= 10) {
// Length of the vec_x
float l = sqrt(vec_x[0] * vec_x[0] + vec_x[1] * vec_x[1]);
SERIAL_ECHOLNPGM("X vector length:");
MYSERIAL.println(l);
// Length of the vec_y
l = sqrt(vec_y[0] * vec_y[0] + vec_y[1] * vec_y[1]);
SERIAL_ECHOLNPGM("Y vector length:");
MYSERIAL.println(l);
// Zero point correction
l = sqrt(cntr[0] * cntr[0] + cntr[1] * cntr[1]);
SERIAL_ECHOLNPGM("Zero point correction:");
MYSERIAL.println(l);
// vec_x and vec_y shall be nearly perpendicular.
l = vec_x[0] * vec_y[0] + vec_x[1] * vec_y[1];
SERIAL_ECHOLNPGM("Perpendicularity");
MYSERIAL.println(fabs(l));
SERIAL_ECHOLNPGM("Saving bed calibration vectors to EEPROM");
}
// Correct the current_position to match the transformed coordinate system after world2machine_rotation_and_skew and world2machine_shift were set.
world2machine_update_current();

View File

@ -1874,6 +1874,7 @@ void lcd_diag_show_end_stops()
void prusa_statistics(int _message) {
switch (_message)
{
@ -1883,6 +1884,7 @@ void prusa_statistics(int _message) {
{
SERIAL_ECHO("{");
prusa_stat_printerstatus(4);
status_number = 4;
prusa_stat_printinfo();
SERIAL_ECHOLN("}");
}
@ -1890,6 +1892,7 @@ void prusa_statistics(int _message) {
{
SERIAL_ECHO("{");
prusa_stat_printerstatus(1);
status_number = 1;
SERIAL_ECHOLN("}");
}
break;
@ -1898,6 +1901,7 @@ void prusa_statistics(int _message) {
farm_status = 2;
SERIAL_ECHO("{");
prusa_stat_printerstatus(2);
status_number = 2;
SERIAL_ECHOLN("}");
farm_timer = 1;
break;
@ -1906,6 +1910,7 @@ void prusa_statistics(int _message) {
farm_status = 3;
SERIAL_ECHO("{");
prusa_stat_printerstatus(3);
status_number = 3;
SERIAL_ECHOLN("}");
farm_timer = 1;
@ -1914,12 +1919,14 @@ void prusa_statistics(int _message) {
farm_status = 4;
SERIAL_ECHO("{");
prusa_stat_printerstatus(4);
status_number = 4;
SERIAL_ECHOLN("}");
}
else
{
SERIAL_ECHO("{");
prusa_stat_printerstatus(3);
status_number = 3;
SERIAL_ECHOLN("}");;
}
farm_timer = 1;
@ -1938,14 +1945,17 @@ void prusa_statistics(int _message) {
break;
case 6: // print done
SERIAL_ECHOLN("{[PRN:8]}");
status_number = 8;
farm_timer = 2;
break;
case 7: // print done - stopped
SERIAL_ECHOLN("{[PRN:9]}");
status_number = 9;
farm_timer = 2;
break;
case 8: // printer started
SERIAL_ECHO("{[PRN:0][PFN:");
status_number = 0;
SERIAL_ECHO(farm_no);
SERIAL_ECHOLN("]}");
farm_timer = 2;
@ -1963,6 +1973,7 @@ void prusa_statistics(int _message) {
break;
case 22: // waiting for filament change
SERIAL_ECHOLN("{[PRN:5]}");
status_number = 5;
break;
case 90: // Error - Thermal Runaway
@ -3166,6 +3177,7 @@ static void lcd_main_menu()
MENU_ITEM(submenu, MSG_UNLOAD_FILAMENT, fil_unload_menu);
MENU_ITEM(submenu, MSG_CHANGE_EXTR, change_extr_menu);
#endif
//MENU_ITEM(function, PSTR("belt test"), belt_test);
MENU_ITEM(submenu, MSG_SETTINGS, lcd_settings_menu);
if(!isPrintPaused) MENU_ITEM(submenu, MSG_MENU_CALIBRATION, lcd_calibration_menu);
}
@ -3551,6 +3563,251 @@ menu_edit_type(float, float52, ftostr52, 100)
menu_edit_type(unsigned long, long5, ftostr5, 0.01)
static void belt_test() {
/*lcd_update_enable(false);
float coordinate[2] = { 253, 215.5 };
float max = 10;
float step = 0.5; //mm
float change_belt = 2.5; //mm
float excellent = 1;
//set motor current higherdigipot_current(0, 850); //set motor current higher
//current_position[Z_AXIS] += 15;
//plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
for (int j = 0; j < 2; j++) {
lcd_implementation_clear();
j == 0 ? lcd_printPGM(PSTR("Testing X belt")) : lcd_printPGM(PSTR("Testing Y belt"));
for (int i = 0; i < max*(1 / step); i++) {
if (i == 0) {
current_position[j] += coordinate[j] + max;
j == 0 ? digipot_current(0, 130):digipot_current(0, 60);
}
else {
current_position[j] += ((float)i - 1.f)*step;
}
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
st_synchronize();
digipot_current(0, 500);
if (i == 0) current_position[j] -= coordinate[j];
else current_position[j] -= (float)i * step;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
st_synchronize();
if ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1) || (READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1)) {
//lcd_display_message_fullscreen_P(PSTR("Endstop hit"));
lcd.setCursor(0, 0);
if (i < (excellent / step)) lcd_printPGM(PSTR("Excelent condition ")); //1 mm
else if (i < (change_belt / step)) lcd_printPGM(PSTR("Belt ok ")); //2.5 mm
else lcd_printPGM(PSTR("Change the belt ")); //>2.5mm
delay_keep_alive(5000);
i = max*(1 / step);
}
else {
lcd.setCursor((change_belt / step), 1); lcd_printPGM(PSTR("|"));
lcd.setCursor((change_belt / step), 2); lcd_printPGM(PSTR("|"));
lcd.setCursor((change_belt / step), 3); lcd_printPGM(PSTR("|"));
lcd.setCursor(i, 2);
if (i == (change_belt / step)) lcd_printPGM(PSTR("+"));
else lcd_printPGM(PSTR("-"));
}
}
}
enquecommand_P(PSTR("G28 W"));
lcd_update_enable(true);
digipot_current(0, 800);
lcd_update(2);
return;*/
/*
13.f - BED_ZERO_REF_X, 6.4f - BED_ZERO_REF_Y,
115.f - BED_ZERO_REF_X, 6.4f - BED_ZERO_REF_Y,
216.f - BED_ZERO_REF_X, 6.4f - BED_ZERO_REF_Y,
216.f - BED_ZERO_REF_X, 104.4f - BED_ZERO_REF_Y,
115.f - BED_ZERO_REF_X, 104.4f - BED_ZERO_REF_Y,
13.f - BED_ZERO_REF_X, 104.4f - BED_ZERO_REF_Y,
13.f - BED_ZERO_REF_X, 202.4f - BED_ZERO_REF_Y,
115.f - BED_ZERO_REF_X, 202.4f - BED_ZERO_REF_Y,
216.f - BED_ZERO_REF_X, 202.4f - BED_ZERO_REF_Y
#define BED_ZERO_REF_X (- 22.f + X_PROBE_OFFSET_FROM_EXTRUDER)
#define BED_ZERO_REF_Y (- 0.6f + Y_PROBE_OFFSET_FROM_EXTRUDER)
#define X_PROBE_OFFSET_FROM_EXTRUDER 23 // Z probe to nozzle X offset: -left +right
#define Y_PROBE_OFFSET_FROM_EXTRUDER 9 // Z probe to nozzle Y offset: -front +behind
#define Z_PROBE_OFFSET_FROM_EXTRUDER -0.4
*/
/*
lcd_update_enable(false);
float coordinate[2] = { 210, 190 };
float max = 10;
float step = 0.5; //mm
float change_belt = 2.5; //mm
float excellent = 1;
float safety_a = 20;
//set motor current higherdigipot_current(0, 850); //set motor current higher
current_position[Z_AXIS] -= 0.4;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
st_synchronize();
for (int j = 0; j < 2; j++) {
lcd_implementation_clear();
j == 0 ? lcd_printPGM(PSTR("Testing X belt")) : lcd_printPGM(PSTR("Testing Y belt"));
for (int i = 0; i < max*(1 / step); i++) {
if (i == 0) {
current_position[j] += coordinate[j] - safety_a;
//j == 0 ? digipot_current(0, 130):digipot_current(0, 60);
}
else {
current_position[j] += ((float)i - 1.f)*step;
}
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
st_synchronize();
if (i == 0) {
for (int k = 0; k < (safety_a + max)*(1 / step); k++) {
current_position[j] += step ;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
st_synchronize();
if ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1)) {
k = 2000;
}
}
}
//digipot_current(0, 500);
if (i == 0) current_position[j] -= coordinate[j];
else current_position[j] -= (float)i * step;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
st_synchronize();
if ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1) || (READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1)) {
//lcd_display_message_fullscreen_P(PSTR("Endstop hit"));
lcd.setCursor(0, 0);
//if (i < (excellent / step)) lcd_printPGM(PSTR("Change it ")); //1 mm
if (i < (change_belt / step)) lcd_printPGM(PSTR("Change the belt ")); //2.5 mm
else lcd_printPGM(PSTR("Belt ok ")); //>2.5mm
delay_keep_alive(5000);
current_position[j] += 14;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
st_synchronize();
i = max*(1 / step);
}
else {
lcd.setCursor((change_belt / step), 1); lcd_printPGM(PSTR("|"));
lcd.setCursor((change_belt / step), 2); lcd_printPGM(PSTR("|"));
lcd.setCursor((change_belt / step), 3); lcd_printPGM(PSTR("|"));
lcd.setCursor(i, 2);
if (i == (change_belt / step)) lcd_printPGM(PSTR("+"));
else lcd_printPGM(PSTR("-"));
}
}
}
enquecommand_P(PSTR("G28 W"));
lcd_update_enable(true);
//digipot_current(0, 800);
lcd_update(2);
return;*/
/*
lcd_update_enable(false);
float coordinate[2] = { 210, 190 };
float max = 10;
float step = 0.5; //mm
float change_belt = 2.5; //mm
float excellent = 1;
float safety_a = 20;
//set motor current higherdigipot_current(0, 850); //set motor current higher
current_position[Z_AXIS] -= 0.4;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
st_synchronize();
for (int j = 0; j < 2; j++) {
lcd_implementation_clear();
j == 0 ? lcd_printPGM(PSTR("Testing X belt")) : lcd_printPGM(PSTR("Testing Y belt"));
current_position[j] += coordinate[j] - safety_a;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
st_synchronize();
for (int k = 0; k < (safety_a + max)*(1 / step); k++) {
current_position[j] += step;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
st_synchronize();
if ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1)) {
k = 2000;
}
}
}
current_position[j] -= coordinate[j];
else current_position[j] -= (float)i * step;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
st_synchronize();
if ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1) || (READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1)) {
//lcd_display_message_fullscreen_P(PSTR("Endstop hit"));
lcd.setCursor(0, 0);
//if (i < (excellent / step)) lcd_printPGM(PSTR("Change it ")); //1 mm
if (i < (change_belt / step)) lcd_printPGM(PSTR("Change the belt ")); //2.5 mm
else lcd_printPGM(PSTR("Belt ok ")); //>2.5mm
delay_keep_alive(5000);
current_position[j] += 14;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
st_synchronize();
i = max*(1 / step);
}
else {
lcd.setCursor((change_belt / step), 1); lcd_printPGM(PSTR("|"));
lcd.setCursor((change_belt / step), 2); lcd_printPGM(PSTR("|"));
lcd.setCursor((change_belt / step), 3); lcd_printPGM(PSTR("|"));
lcd.setCursor(i, 2);
if (i == (change_belt / step)) lcd_printPGM(PSTR("+"));
else lcd_printPGM(PSTR("-"));
}
}
}
enquecommand_P(PSTR("G28 W"));
lcd_update_enable(true);
//digipot_current(0, 800);
lcd_update(2);
return;
*/
}
static void lcd_selftest()
{
int _progress = 0;

View File

@ -31,6 +31,8 @@
void lcd_mylang();
bool lcd_detected(void);
static void belt_test();
static void lcd_selftest();
static bool lcd_selfcheck_endstops();
static bool lcd_selfcheck_axis(int _axis, int _travel);