Filament Runout Sensor Feature
With this change a mechanical or optical switch may be used to check the availability of the filament and when the filament runs out an M600 (filament change) command is issued. This is only done while printing with an SD card. This feature was requested several times (issue #679), but the requests were not accepted since it was believed that this situation should be handled at host side. However during an SD print the control is totally on firmware and I think that during an SD print it should be handled by the firmware. The original code was posted at reprap forum (http://forums.reprap.org/read.php?1,297350) by Lazymonk. I have only corrected some bugs of the code and improved it by adding definitions to the configuration.h in order to make it more standardized.
This commit is contained in:
@@ -366,6 +366,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:";
|
||||
|
||||
@@ -525,6 +529,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)
|
||||
{
|
||||
@@ -601,6 +615,7 @@ void servo_init()
|
||||
void setup()
|
||||
{
|
||||
setup_killpin();
|
||||
setup_filrunoutpin();
|
||||
setup_powerhold();
|
||||
MYSERIAL.begin(BAUDRATE);
|
||||
SERIAL_PROTOCOLLNPGM("start");
|
||||
@@ -4091,6 +4106,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
|
||||
@@ -5230,6 +5250,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;
|
||||
@@ -5378,6 +5404,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();
|
||||
|
Reference in New Issue
Block a user