diff --git a/Firmware/first_lay_cal.cpp b/Firmware/first_lay_cal.cpp index 5e61f1f061..402ea8c461 100644 --- a/Firmware/first_lay_cal.cpp +++ b/Firmware/first_lay_cal.cpp @@ -11,6 +11,7 @@ #include "mmu2.h" #include #include +#include "temperature.h" //! @brief Count extrude length //! @@ -41,8 +42,18 @@ static void lay1cal_common_enqueue_loop(const char * const * cmd_sequence, const } } -static const char extrude_fmt[] PROGMEM = "G1 X%d Y%d E%-.5f"; -static const char zero_extrusion[] PROGMEM = "G92 E0"; +static const char extrude_fmt_X[] PROGMEM = "G1X%gE%g"; +static const char extrude_fmt_Y[] PROGMEM = "G1Y%gE%g"; +static const char zero_extrusion[] PROGMEM = "G92E0"; +#ifndef NEW_FIRST_LAYER_CAL +int8_t invert = 1; +const float short_length = 20; +#else +int8_t invert = -1; +const float short_length = 13; +#endif //NEW_FIRST_LAYER_CAL +const float square_width = 20; +const float long_length = 150; //! @brief Wait for preheat void lay1cal_wait_preheat() @@ -72,8 +83,8 @@ bool lay1cal_load_filament(uint8_t filament) if (MMU2::mmu2.Enabled()) { enquecommand_P(MSG_M83); - enquecommand_P(PSTR("G1 Y-3 F1000")); - enquecommand_P(PSTR("G1 Z0.4 F1000")); + enquecommand_P(PSTR("G1Y-3F1000")); + enquecommand_P(PSTR("G1Z0.4")); uint8_t currentTool = MMU2::mmu2.get_current_tool(); if(currentTool == filament ){ @@ -96,22 +107,19 @@ bool lay1cal_load_filament(uint8_t filament) //! @param extrusion_width the width of the extrusion layer void lay1cal_intro_line(bool extraPurgeNeeded, float layer_height, float extrusion_width) { - static const char cmd_intro_mmu_3[] PROGMEM = "G1 X55 E29 F1073"; - static const char cmd_intro_mmu_4[] PROGMEM = "G1 X5 E29 F1800"; - static const char cmd_intro_mmu_5[] PROGMEM = "G1 X55 E8 F2000"; - static const char cmd_intro_mmu_6[] PROGMEM = "G1 Z0.3 F1000"; - static const char cmd_intro_mmu_8[] PROGMEM = "G1 X240 E25 F2200"; - static const char cmd_intro_mmu_9[] PROGMEM = "G1 Y-2 F1000"; - static const char cmd_intro_mmu_10[] PROGMEM = "G1 X55 E25 F1400"; - static const char cmd_intro_mmu_11[] PROGMEM = "G1 Z0.2 F1000"; - static const char cmd_intro_mmu_12[] PROGMEM = "G1 X5 E4 F1000"; - - static const char * const intro_mmu_cmd[] PROGMEM = + static const char cmd_intro_mmu_3[] PROGMEM = "G1X55E29F1073"; + static const char cmd_intro_mmu_4[] PROGMEM = "G1X5E29F1800"; + static const char cmd_intro_mmu_5[] PROGMEM = "G1X55E8F2000"; + static const char cmd_intro_mmu_6[] PROGMEM = "G1Z0.3F1000"; + static const char cmd_intro_mmu_8[] PROGMEM = "G1X240E25F2200"; + static const char cmd_intro_mmu_9[] PROGMEM = "G1Y-2F1000"; + static const char cmd_intro_mmu_10[] PROGMEM = "G1X200E8F1400"; + static const char cmd_intro_mmu_11[] PROGMEM = "G1Z0.2F1000"; + static const char * const cmd_intro_mmu[] PROGMEM = { // first 2 items are only relevant if filament was not loaded - i.e. extraPurgeNeeded == true cmd_intro_mmu_3, cmd_intro_mmu_4, - cmd_intro_mmu_5, cmd_intro_mmu_6, zero_extrusion, @@ -119,42 +127,41 @@ void lay1cal_intro_line(bool extraPurgeNeeded, float layer_height, float extrusi cmd_intro_mmu_9, cmd_intro_mmu_10, cmd_intro_mmu_11, - cmd_intro_mmu_12, }; if (MMU2::mmu2.Enabled()) { - for (uint8_t i = (extraPurgeNeeded ? 0 : 2); i < (sizeof(intro_mmu_cmd)/sizeof(intro_mmu_cmd[0])); ++i) + for (uint8_t i = (extraPurgeNeeded ? 0 : 2); i < (sizeof(cmd_intro_mmu)/sizeof(cmd_intro_mmu[0])); ++i) { - enquecommand_P(static_cast(pgm_read_ptr(&intro_mmu_cmd[i]))); + enquecommand_P(static_cast(pgm_read_ptr(&cmd_intro_mmu[i]))); } } else { - static const char fmt1[] PROGMEM = "G1 X%d E%-.3f F1000"; - enquecommandf_P(fmt1, 60, count_e(layer_height, extrusion_width * 4.f, 60)); - enquecommandf_P(fmt1, 100, count_e(layer_height, extrusion_width * 8.f, 40)); + enquecommandf_P(extrude_fmt_X, (float)60, count_e(layer_height, extrusion_width * 4.f, 60)); + enquecommandf_P(extrude_fmt_X, (float)202.5, count_e(layer_height, extrusion_width * 8.f, 142.5)); } } //! @brief Setup for printing meander void lay1cal_before_meander() { - static const char cmd_pre_meander_2[] PROGMEM = "G90"; //use absolute coordinates - static const char cmd_pre_meander_4[] PROGMEM = "G1 E-1.5 F2100"; - static const char cmd_pre_meander_5[] PROGMEM = "G1 Z5 F7200"; - static const char cmd_pre_meander_6[] PROGMEM = "M204 S1000"; //set acceleration - static const char cmd_pre_meander_7[] PROGMEM = "G1 F4000"; +#ifndef NEW_FIRST_LAYER_CAL + static const char cmd_pre_meander_4[] PROGMEM = "G1E-1.5F2100"; + static const char cmd_pre_meander_5[] PROGMEM = "G1Z5F7200"; +#endif //NEW_FIRST_LAYER_CAL + static const char cmd_pre_meander_6[] PROGMEM = "M204S1000"; //set acceleration static const char * const cmd_pre_meander[] PROGMEM = { zero_extrusion, - cmd_pre_meander_2, + MSG_G90, MSG_M83, // use relative distances for extrusion +#ifndef NEW_FIRST_LAYER_CAL cmd_pre_meander_4, cmd_pre_meander_5, +#endif //NEW_FIRST_LAYER_CAL cmd_pre_meander_6, - cmd_pre_meander_7, }; lay1cal_common_enqueue_loop(cmd_pre_meander, (sizeof(cmd_pre_meander)/sizeof(cmd_pre_meander[0]))); @@ -163,42 +170,49 @@ void lay1cal_before_meander() //! @brief Print meander start void lay1cal_meander_start(float layer_height, float extrusion_width) { - enquecommand_P(PSTR("G1 X50 Y155")); - - static const char fmt1[] PROGMEM = "G1 Z%-.3f F7200"; +#ifndef NEW_FIRST_LAYER_CAL + enquecommand_P(PSTR("G1X50Y155")); +#endif //_NEW_FIRST_LAYER_CAL + static const char fmt1[] PROGMEM = "G1Z%gF7200"; enquecommandf_P(fmt1, layer_height); - - enquecommand_P(PSTR("G1 F1080")); - - enquecommandf_P(extrude_fmt, 75, 155, count_e(layer_height, extrusion_width * 4.f, 25)); - enquecommandf_P(extrude_fmt, 100, 155, count_e(layer_height, extrusion_width * 2.f, 25)); - enquecommandf_P(extrude_fmt, 200, 155, count_e(layer_height, extrusion_width, 100)); - enquecommandf_P(extrude_fmt, 200, 135, count_e(layer_height, extrusion_width, 20)); + enquecommand_P(PSTR("G1F1080")); +#ifdef NEW_FIRST_LAYER_CAL + enquecommandf_P(extrude_fmt_Y, short_length, count_e(layer_height, extrusion_width, short_length)); +#endif //_NEW_FIRST_LAYER_CAL + + enquecommand_P(PSTR("G91")); +#ifndef NEW_FIRST_LAYER_CAL + enquecommandf_P(extrude_fmt_X, (float)25*invert, count_e(layer_height, extrusion_width * 4.f, 25)); + enquecommandf_P(extrude_fmt_X, (float)25*invert, count_e(layer_height, extrusion_width * 2.f, 25)); + enquecommandf_P(extrude_fmt_X, (float)100*invert, count_e(layer_height, extrusion_width, 100)); + enquecommandf_P(extrude_fmt_Y, (float)-20*invert, count_e(layer_height, extrusion_width, 20)); +#else + enquecommandf_P(extrude_fmt_X, long_length*invert, count_e(layer_height, extrusion_width, long_length)); + enquecommandf_P(extrude_fmt_Y, -short_length*invert, count_e(layer_height, extrusion_width, short_length)); +#endif //_NEW_FIRST_LAYER_CAL } //! @brief Print meander //! @param cmd_buffer character buffer needed to format gcodes void lay1cal_meander(float layer_height, float extrusion_width) { - const float short_length = 20; - float long_length = 150; const float long_extrusion = count_e(layer_height, extrusion_width, long_length); const float short_extrusion = count_e(layer_height, extrusion_width, short_length); - uint8_t y_pos = 135; - uint8_t x_pos = 50; + float x_pos = long_length; + for(uint8_t i = 0; i <= 4; ++i) { - enquecommandf_P(extrude_fmt, x_pos, y_pos, long_extrusion); + enquecommandf_P(extrude_fmt_X, -x_pos*invert, long_extrusion); - y_pos -= short_length; + x_pos = -x_pos; - enquecommandf_P(extrude_fmt, x_pos, y_pos, short_extrusion); - - x_pos += long_length; - - long_length = -long_length; + enquecommandf_P(extrude_fmt_Y, -short_length*invert, short_extrusion); } +#ifdef NEW_FIRST_LAYER_CAL + enquecommandf_P(extrude_fmt_X, -(long_length/2-square_width/2), long_extrusion); //~Middle of bed X125 + enquecommandf_P(extrude_fmt_Y, short_length, short_extrusion); //~Middle of bed Y105 +#endif //NEW_FIRST_LAYER_CAL } @@ -210,41 +224,37 @@ void lay1cal_meander(float layer_height, float extrusion_width) //! @param i iteration void lay1cal_square(uint8_t step, float layer_height, float extrusion_width) { - const float long_length = 20; - const float short_length = spacing(layer_height, extrusion_width); - const float long_extrusion = count_e(layer_height, extrusion_width, long_length); - const float short_extrusion = count_e(layer_height, extrusion_width, short_length); - static const char fmt1[] PROGMEM = "G1 X%d Y%-.2f E%-.3f"; + const float Y_spacing = spacing(layer_height, extrusion_width); + const float long_extrusion = count_e(layer_height, extrusion_width, square_width); + const float short_extrusion = count_e(layer_height, extrusion_width, Y_spacing); for (uint8_t i = step; i < step+4; ++i) { - enquecommandf_P(fmt1, 70, (35 - i*short_length * 2), long_extrusion); - enquecommandf_P(fmt1, 70, (35 - (2 * i + 1)*short_length), short_extrusion); - enquecommandf_P(fmt1, 50, (35 - (2 * i + 1)*short_length), long_extrusion); - enquecommandf_P(fmt1, 50, (35 - (i + 1)*short_length * 2), short_extrusion); + enquecommandf_P(extrude_fmt_X, square_width*invert, long_extrusion); + enquecommandf_P(extrude_fmt_Y, -Y_spacing*invert, short_extrusion); + enquecommandf_P(extrude_fmt_X, -square_width*invert, long_extrusion); + enquecommandf_P(extrude_fmt_Y, -Y_spacing*invert, short_extrusion); } } void lay1cal_finish(bool mmu_enabled) { - static const char cmd_cal_finish_1[] PROGMEM = "G1 E-0.075 F2100"; //retract - static const char cmd_cal_finish_2[] PROGMEM = "M104 S0"; // turn off temperature - static const char cmd_cal_finish_3[] PROGMEM = "M140 S0"; // turn off heatbed - static const char cmd_cal_finish_4[] PROGMEM = "G1 Z10 F1300"; //lift Z - static const char cmd_cal_finish_5[] PROGMEM = "G1 X10 Y180 F4000"; //Go to parking position + static const char cmd_cal_finish_2[] PROGMEM = "G1E-0.075F2100"; //retract + static const char cmd_cal_finish_3[] PROGMEM = "G1Z10F1300"; //lift Z + static const char cmd_cal_finish_4[] PROGMEM = "G1X10Y180F4000"; //Go to parking position static const char * const cmd_cal_finish[] PROGMEM = { MSG_M107, // turn off printer fan - cmd_cal_finish_1, cmd_cal_finish_2, cmd_cal_finish_3, - cmd_cal_finish_4, - cmd_cal_finish_5 + cmd_cal_finish_4 }; + enquecommand_P(MSG_G90); lay1cal_common_enqueue_loop(cmd_cal_finish, (sizeof(cmd_cal_finish)/sizeof(cmd_cal_finish[0]))); if (mmu_enabled) enquecommand_P(MSG_M702); //unload from nozzle + disable_heater(); enquecommand_P(MSG_M84);// disable motors } diff --git a/Firmware/messages.cpp b/Firmware/messages.cpp index 75303059b8..7a0d6cec3d 100644 --- a/Firmware/messages.cpp +++ b/Firmware/messages.cpp @@ -428,6 +428,7 @@ const char MSG_FILAMENT_RUNOUT_DETECTED[] PROGMEM_N1 = "Filament runout detected // Common G-gcodes const char G1_E_F2700[] PROGMEM_N1 = "G1 E%-.3f F2700"; const char G28W[] PROGMEM_N1 = "G28 W"; +const char MSG_G90[] PROGMEM_N1 = "G90"; const char MSG_M23[] PROGMEM_N1 = "M23 %s"; const char MSG_M24[] PROGMEM_N1 = "M24"; const char MSG_M83[] PROGMEM_N1 = "M83"; diff --git a/Firmware/messages.h b/Firmware/messages.h index 4d1e6c99e7..ed1fd857aa 100644 --- a/Firmware/messages.h +++ b/Firmware/messages.h @@ -430,6 +430,7 @@ extern const char MSG_FILAMENT_RUNOUT_DETECTED[]; // Common G-gcodes extern const char G1_E_F2700[]; extern const char G28W[]; +extern const char MSG_G90[]; extern const char MSG_M23[]; extern const char MSG_M24[]; extern const char MSG_M83[]; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index df78267ee3..1dd7c5a722 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -860,13 +860,13 @@ void lcd_commands() lay1cal_square(0, layer_height, extrusion_width); break; case 5: - lay1cal_square(4, layer_height, extrusion_width); + lay1cal_square(1, layer_height, extrusion_width); break; case 4: - lay1cal_square(8, layer_height, extrusion_width); + lay1cal_square(2, layer_height, extrusion_width); break; case 3: - lay1cal_square(12, layer_height, extrusion_width); + lay1cal_square(3, layer_height, extrusion_width); break; case 2: lay1cal_finish(MMU2::mmu2.Enabled()); diff --git a/Firmware/variants/MK25-RAMBo10a.h b/Firmware/variants/MK25-RAMBo10a.h index 4e02bf14f0..77cced0bed 100644 --- a/Firmware/variants/MK25-RAMBo10a.h +++ b/Firmware/variants/MK25-RAMBo10a.h @@ -24,6 +24,7 @@ #define HEATBED_V2 #define STEEL_SHEET +//#define NEW_FIRST_LAYER_CAL //from front to back #define TACH0PULLUP // Uncomment the below for the E3D PT100 temperature sensor (with or without PT100 Amplifier) diff --git a/Firmware/variants/MK25-RAMBo13a.h b/Firmware/variants/MK25-RAMBo13a.h index 3b7a81408c..9f081885f5 100644 --- a/Firmware/variants/MK25-RAMBo13a.h +++ b/Firmware/variants/MK25-RAMBo13a.h @@ -24,6 +24,7 @@ #define HEATBED_V2 #define STEEL_SHEET +//#define NEW_FIRST_LAYER_CAL //from front to back #define TACH0PULLUP // Uncomment the below for the E3D PT100 temperature sensor (with or without PT100 Amplifier) diff --git a/Firmware/variants/MK25S-RAMBo10a.h b/Firmware/variants/MK25S-RAMBo10a.h index 906ba6859c..b047cb00d3 100644 --- a/Firmware/variants/MK25S-RAMBo10a.h +++ b/Firmware/variants/MK25S-RAMBo10a.h @@ -24,6 +24,7 @@ #define HEATBED_V2 #define STEEL_SHEET +//#define NEW_FIRST_LAYER_CAL //from front to back #define TACH0PULLUP // Uncomment the below for the E3D PT100 temperature sensor (with or without PT100 Amplifier) diff --git a/Firmware/variants/MK25S-RAMBo13a.h b/Firmware/variants/MK25S-RAMBo13a.h index bb3ad41af9..9ef7f3bd7b 100644 --- a/Firmware/variants/MK25S-RAMBo13a.h +++ b/Firmware/variants/MK25S-RAMBo13a.h @@ -24,6 +24,7 @@ #define HEATBED_V2 #define STEEL_SHEET +//#define NEW_FIRST_LAYER_CAL //from front to back #define TACH0PULLUP // Uncomment the below for the E3D PT100 temperature sensor (with or without PT100 Amplifier) diff --git a/Firmware/variants/MK3-E3DREVO.h b/Firmware/variants/MK3-E3DREVO.h index 9efb587ddc..9232f84627 100644 --- a/Firmware/variants/MK3-E3DREVO.h +++ b/Firmware/variants/MK3-E3DREVO.h @@ -23,6 +23,7 @@ // Electronics #define MOTHERBOARD BOARD_EINSY_1_0a #define STEEL_SHEET +//#define NEW_FIRST_LAYER_CAL //from front to back #define HAS_SECOND_SERIAL_PORT diff --git a/Firmware/variants/MK3-E3DREVO_HF_60W.h b/Firmware/variants/MK3-E3DREVO_HF_60W.h index 5ec1bdb8db..ace4553d55 100644 --- a/Firmware/variants/MK3-E3DREVO_HF_60W.h +++ b/Firmware/variants/MK3-E3DREVO_HF_60W.h @@ -23,6 +23,7 @@ // Electronics #define MOTHERBOARD BOARD_EINSY_1_0a #define STEEL_SHEET +//#define NEW_FIRST_LAYER_CAL //from front to back #define HAS_SECOND_SERIAL_PORT diff --git a/Firmware/variants/MK3.h b/Firmware/variants/MK3.h index b9ab1ed3c0..8b0651f257 100644 --- a/Firmware/variants/MK3.h +++ b/Firmware/variants/MK3.h @@ -23,6 +23,7 @@ // Electronics #define MOTHERBOARD BOARD_EINSY_1_0a #define STEEL_SHEET +//#define NEW_FIRST_LAYER_CAL //from front to back #define HAS_SECOND_SERIAL_PORT diff --git a/Firmware/variants/MK3S-E3DREVO.h b/Firmware/variants/MK3S-E3DREVO.h index d426d7d7de..70aef3d4d2 100644 --- a/Firmware/variants/MK3S-E3DREVO.h +++ b/Firmware/variants/MK3S-E3DREVO.h @@ -22,6 +22,7 @@ // Electronics #define MOTHERBOARD BOARD_EINSY_1_0a #define STEEL_SHEET +//#define NEW_FIRST_LAYER_CAL //from front to back #define HAS_SECOND_SERIAL_PORT // PSU diff --git a/Firmware/variants/MK3S-E3DREVO_HF_60W.h b/Firmware/variants/MK3S-E3DREVO_HF_60W.h index de86f6c027..cf576d82da 100644 --- a/Firmware/variants/MK3S-E3DREVO_HF_60W.h +++ b/Firmware/variants/MK3S-E3DREVO_HF_60W.h @@ -22,6 +22,7 @@ // Electronics #define MOTHERBOARD BOARD_EINSY_1_0a #define STEEL_SHEET +//#define NEW_FIRST_LAYER_CAL //from front to back #define HAS_SECOND_SERIAL_PORT // PSU diff --git a/Firmware/variants/MK3S.h b/Firmware/variants/MK3S.h index 32ca987b02..6d2027671f 100644 --- a/Firmware/variants/MK3S.h +++ b/Firmware/variants/MK3S.h @@ -22,6 +22,7 @@ // Electronics #define MOTHERBOARD BOARD_EINSY_1_0a #define STEEL_SHEET +//#define NEW_FIRST_LAYER_CAL //from front to back #define HAS_SECOND_SERIAL_PORT // PSU