From 1d06b10962ced3c29e11cea2c6e6c7872588ad4b Mon Sep 17 00:00:00 2001 From: Bernhard Date: Sun, 27 Jan 2013 13:21:34 +0100 Subject: [PATCH] Added a feature to have filament change by gcode or display trigger. [default off for now] syntax: M600 X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal] if enabled, after a M600, the printer will retract by E, lift by Z, move to XY, retract even more filament. Oh, and it will display "remove filament" and beep like crazy. You are then supposed to insert a new filament (other color, e.g.) and click the display to continue. After having the nozzle cleaned manually, aided by the disabled e-steppers. After clicking, the printer will then go back the whole shebang, and continue printing with a fancy new color. --- Marlin/Configuration_adv.h | 13 ++++ Marlin/Marlin_main.cpp | 125 +++++++++++++++++++++++++++++++++++++ Marlin/language.h | 10 ++- Marlin/ultralcd.cpp | 3 + 4 files changed, 150 insertions(+), 1 deletion(-) 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(); }