diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index f279ef0328..697753bc3a 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -362,6 +362,15 @@ const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o #define Y_MAX_LENGTH (Y_MAX_POS - Y_MIN_POS) #define Z_MAX_LENGTH (Z_MAX_POS - Z_MIN_POS) +//=========================================================================== +//============================= Filament Runout Sensor ====================== +//=========================================================================== +//#define FILAMENT_RUNOUT_SENSOR // Uncomment for defining a filament runout sensor such as a mechanical or opto endstop to check the existence of filament + // In RAMPS uses servo pin 2. Can be changed in pins file. For other boards pin definition should be made. + // It is assumed that when logic high = filament available + // when logic low = filament ran out +//const bool FIL_RUNOUT_INVERTING = true; // Should be uncommented and true or false should assigned +//#define ENDSTOPPULLUP_FIL_RUNOUT // Uncomment to use internal pullup for filament runout pins if the sensor is defined. //=========================================================================== //============================= Bed Auto Leveling =========================== diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index a8611f197a..750f82c638 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -199,6 +199,10 @@ void prepare_move(); void kill(); void Stop(); +#ifdef FILAMENT_RUNOUT_SENSOR +void filrunout(); +#endif + bool IsStopped(); bool enquecommand(const char *cmd); //put a single ASCII command at the end of the current buffer or return false when it is full diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 6236836ebb..986b8207df 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -370,6 +370,10 @@ bool cancel_heatup = false; int meas_delay_cm = MEASUREMENT_DELAY_CM; //distance delay setting #endif +#ifdef FILAMENT_RUNOUT_SENSOR + static bool filrunoutEnqued = false; +#endif + const char errormagic[] PROGMEM = "Error:"; const char echomagic[] PROGMEM = "echo:"; @@ -529,6 +533,16 @@ void setup_killpin() #endif } +void setup_filrunoutpin() +{ +#if defined(FILRUNOUT_PIN) && FILRUNOUT_PIN > -1 + pinMode(FILRUNOUT_PIN,INPUT); + #if defined(ENDSTOPPULLUP_FIL_RUNOUT) + WRITE(FILLRUNOUT_PIN,HIGH); + #endif +#endif +} + // Set home pin void setup_homepin(void) { @@ -605,6 +619,7 @@ void servo_init() void setup() { setup_killpin(); + setup_filrunoutpin(); setup_powerhold(); MYSERIAL.begin(BAUDRATE); SERIAL_PROTOCOLLNPGM("start"); @@ -4136,6 +4151,11 @@ inline void gcode_M503() { plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], target[E_AXIS], fr60, active_extruder); //move z back plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], lastpos[E_AXIS], fr60, active_extruder); //final untretract #endif + + #ifdef FILAMENT_RUNOUT_SENSOR + filrunoutEnqued = false; + #endif + } #endif // FILAMENTCHANGEENABLE @@ -5275,6 +5295,12 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument s const int KILL_DELAY = 10000; #endif +#if defined(FILRUNOUT_PIN) && FILRUNOUT_PIN > -1 + if(card.sdprinting) { + if(!(READ(FILRUNOUT_PIN))^FIL_RUNOUT_INVERTING) + filrunout(); } +#endif + #if defined(HOME_PIN) && HOME_PIN > -1 static int homeDebounceCount = 0; // poor man's debouncing count const int HOME_DEBOUNCE_DELAY = 10000; @@ -5423,6 +5449,16 @@ void kill() while(1) { /* Intentionally left empty */ } // Wait for reset } +#ifdef FILAMENT_RUNOUT_SENSOR + void filrunout() + { + if filrunoutEnqued == false { + filrunoutEnqued = true; + enquecommand("M600"); + } + } +#endif + void Stop() { disable_heater(); diff --git a/Marlin/pins_RAMPS_13.h b/Marlin/pins_RAMPS_13.h index d85b778656..71287f6832 100644 --- a/Marlin/pins_RAMPS_13.h +++ b/Marlin/pins_RAMPS_13.h @@ -61,6 +61,11 @@ #define FILWIDTH_PIN 5 #endif +#if defined(FILAMENT_RUNOUT_SENSOR) + // define digital pin 4 for the filament runout sensor. Use the RAMPS 1.4 digital input 4 on the servos connector + #define FILRUNOUT_PIN 4 +#endif + #if MB(RAMPS_13_EFB) || MB(RAMPS_13_EFF) #define FAN_PIN 9 // (Sprinter config) #if MB(RAMPS_13_EFF)