diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index de9f68cdf3..7fc95b9979 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -292,6 +292,19 @@ const unsigned int dropsegments=5; //everything with less than this number of st // #define FWRETRACT //ONLY PARTIALLY TESTED #define MIN_RETRACT 0.1 //minimum extruded mm to accept a automatic gcode retraction attempt + +//adds support for experimental filament exchange support M600; requires display +#ifdef ULTIPANEL + //#define FILAMENTCHANGEENABLE + #ifdef FILAMENTCHANGEENABLE + #define FILAMENTCHANGE_XPOS 3 + #define FILAMENTCHANGE_YPOS 3 + #define FILAMENTCHANGE_ZADD 10 + #define FILAMENTCHANGE_FIRSTRETRACT -2 + #define FILAMENTCHANGE_FINALRETRACT -100 + #endif +#endif + //=========================================================================== //============================= Define Defines ============================ //=========================================================================== diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index b212aa5b4f..473d205e9e 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -126,6 +126,7 @@ // M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. // M503 - print the current settings (from memory not from eeprom) // M540 - Use S[0|1] to enable or disable the stop SD card print on endstop hit (requires ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) +// M600 - Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal] // M907 - Set digital trimpot motor current using axis codes. // M908 - Control digital trimpot directly. // M350 - Set microstepping mode. @@ -1506,6 +1507,130 @@ void process_commands() } break; #endif + #ifdef FILAMENTCHANGEENABLE + case 600: //Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal] + { + float target[4]; + float lastpos[4]; + target[X_AXIS]=current_position[X_AXIS]; + target[Y_AXIS]=current_position[Y_AXIS]; + target[Z_AXIS]=current_position[Z_AXIS]; + target[E_AXIS]=current_position[E_AXIS]; + lastpos[X_AXIS]=current_position[X_AXIS]; + lastpos[Y_AXIS]=current_position[Y_AXIS]; + lastpos[Z_AXIS]=current_position[Z_AXIS]; + lastpos[E_AXIS]=current_position[E_AXIS]; + //retract by E + if(code_seen('E')) + { + target[E_AXIS]+= code_value(); + } + else + { + #ifdef FILAMENTCHANGE_FIRSTRETRACT + target[E_AXIS]+= FILAMENTCHANGE_FIRSTRETRACT ; + #endif + } + plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); + + //lift Z + if(code_seen('Z')) + { + target[Z_AXIS]+= code_value(); + } + else + { + #ifdef FILAMENTCHANGE_ZADD + target[Z_AXIS]+= FILAMENTCHANGE_ZADD ; + #endif + } + plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); + + //move xy + if(code_seen('X')) + { + target[X_AXIS]+= code_value(); + } + else + { + #ifdef FILAMENTCHANGE_XPOS + target[X_AXIS]= FILAMENTCHANGE_XPOS ; + #endif + } + if(code_seen('Y')) + { + target[Y_AXIS]= code_value(); + } + else + { + #ifdef FILAMENTCHANGE_YPOS + target[Y_AXIS]= FILAMENTCHANGE_YPOS ; + #endif + } + + plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); + + if(code_seen('L')) + { + target[E_AXIS]+= code_value(); + } + else + { + #ifdef FILAMENTCHANGE_FINALRETRACT + target[E_AXIS]+= FILAMENTCHANGE_FINALRETRACT ; + #endif + } + + plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); + + //finish moves + st_synchronize(); + //disable extruder steppers so filament can be removed + disable_e0(); + disable_e1(); + disable_e2(); + delay(100); + LCD_ALERTMESSAGEPGM(MSG_FILAMENTCHANGE); + uint8_t cnt=0; + while(!LCD_CLICKED){ + cnt++; + manage_heater(); + manage_inactivity(); + lcd_update(); + + #if BEEPER > -1 + if(cnt==0) + { + SET_OUTPUT(BEEPER); + + WRITE(BEEPER,HIGH); + delay(3); + WRITE(BEEPER,LOW); + delay(3); + } + #endif + } + + //return to normal + if(code_seen('L')) + { + target[E_AXIS]+= -code_value(); + } + else + { + #ifdef FILAMENTCHANGE_FINALRETRACT + target[E_AXIS]+=(-1)*FILAMENTCHANGE_FINALRETRACT ; + #endif + } + current_position[E_AXIS]=target[E_AXIS]; //the long retract of L is compensated by manual filament feeding + plan_set_e_position(current_position[E_AXIS]); + plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //should do nothing + plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //move xy back + plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //move z back + plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], lastpos[E_AXIS], feedrate/60, active_extruder); //final untretract + } + break; + #endif //FILAMENTCHANGEENABLE case 907: // M907 Set digital trimpot motor current using axis codes. { #if DIGIPOTSS_PIN > -1 diff --git a/Marlin/language.h b/Marlin/language.h index 56dbe21c87..781268aa4e 100644 --- a/Marlin/language.h +++ b/Marlin/language.h @@ -113,6 +113,7 @@ #define MSG_CONTROL_RETRACT_RECOVER "UnRet +mm" #define MSG_CONTROL_RETRACT_RECOVERF "UnRet F" #define MSG_AUTORETRACT "AutoRetr." + #define MSG_FILAMENTCHANGE "Change filament" // Serial Console Messages @@ -267,6 +268,7 @@ #define MSG_CONTROL_RETRACT_RECOVER "Cof. wycof. +mm" #define MSG_CONTROL_RETRACT_RECOVERF "Cof. wycof. F" #define MSG_AUTORETRACT "Auto. wycofanie" + #define MSG_FILAMENTCHANGE "Change filament" // Serial Console Messages @@ -426,6 +428,7 @@ #define MSG_CONTROL_RETRACT_RECOVER " UnRet +mm:" #define MSG_CONTROL_RETRACT_RECOVERF " UnRet F:" #define MSG_AUTORETRACT " Retract. Auto.:" +#define MSG_FILAMENTCHANGE "Change filament" // Serial Console Messages @@ -583,6 +586,7 @@ #define MSG_CONTROL_RETRACT_RECOVER "UnRet +mm" #define MSG_CONTROL_RETRACT_RECOVERF "UnRet F" #define MSG_AUTORETRACT "AutoRetr." + #define MSG_FILAMENTCHANGE "Filament wechseln" // Serial Console Messages @@ -741,7 +745,7 @@ #define MSG_CONTROL_RETRACT_RECOVER " DesRet +mm:" #define MSG_CONTROL_RETRACT_RECOVERF " DesRet F:" #define MSG_AUTORETRACT " AutoRetr.:" - +#define MSG_FILAMENTCHANGE "Change filament" // Serial Console Messages #define MSG_Enqueing "En cola \"" @@ -891,6 +895,7 @@ #define MSG_CONTROL_RETRACT_RECOVER " Возврат +mm:" #define MSG_CONTROL_RETRACT_RECOVERF " Возврат F:" #define MSG_AUTORETRACT " АвтоОткат:" +#define MSG_FILAMENTCHANGE "Change filament" // Serial Console Messages @@ -1049,6 +1054,7 @@ #define MSG_CONTROL_RETRACT_RECOVERF " UnRet F:" #define MSG_AUTORETRACT " AutoRilascio.:" #define MSG_SERIAL_ERROR_MENU_STRUCTURE "Qualcosa non va in MenuStructure." + #define MSG_FILAMENTCHANGE "Change filament" // Serial Console Messages @@ -1210,6 +1216,7 @@ #define MSG_CONTROL_RETRACT_RECOVERF " DesRet F:" #define MSG_AUTORETRACT " AutoRetr.:" #define MSG_SERIAL_ERROR_MENU_STRUCTURE "Algo esta errado na estrutura do Menu." + #define MSG_FILAMENTCHANGE "Change filament" // Serial Console Messages @@ -1366,6 +1373,7 @@ #define MSG_CONTROL_RETRACT_RECOVER "UnRet +mm" #define MSG_CONTROL_RETRACT_RECOVERF "UnRet F" #define MSG_AUTORETRACT "AutoVeto." + #define MSG_FILAMENTCHANGE "Change filament" // Serial Console Messages diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index 5758ac1268..eb2660b89c 100644 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -252,6 +252,9 @@ static void lcd_tune_menu() #endif MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255); MENU_ITEM_EDIT(int3, MSG_FLOW, &extrudemultiply, 10, 999); +#ifdef FILAMENTCHANGEENABLE + MENU_ITEM(gcode, MSG_FILAMENTCHANGE, PSTR("M600")); +#endif END_MENU(); }