FILAMENT_RUNOUT_DISTANCE_MM or similar at reprap?
-
Is it there any way to get somehow the marlin feature like
FILAMENT_RUNOUT_DISTANCE_MM
that runs "x"mm of filament when filament sensor detects NO filament..
Thanks
-
When the filament sensor triggers, RRF runs filament-error(n).g if present, where (n) is the sensor number.
If that's not present it tries to run filament-error.g
If that's not present, it runs pause.gSo to achieve what you want I'd try this.
NOTE - THIS IS UNTESTEDCreate a global variable in config.g
global filamentDistance= 0 ;
Create a filament-error.g file in the /sys directory and have it set the variable to whatever the current filament distance is.
;0:/sys/filament-error.g ; run whenever the sensor detects no filament var runoutDistance = 100 ; this is just so you can change easily var thisExtruderValue = move.extruders[tools[state.currentTool].filamentExtruder].position set global.filamentDistance = var.thisExtruderValue + var.runoutDistance
Then create a daemon.g file and check the cure value against the the limit you set
;0:/sys/daemon.g ; run every 10 seconds by default ; This should only trigger if a print is in progress and the runout value has been set by a runout. if (move.extruders[tools[state.currentTool].filamentExtruder].position > global.filamentDistance) && (global.filamentDistance !=0) && (state.status = "processing") M25 ; to run at intervals less than 10 seconds, use a loop instead of above ;while true ; if (move.extruders[tools[state.currentTool].filamentExtruder].position > global.filamentDistance) && (global.filamentDistance !=0) && (state.status = "processing") ; M25 ; G4 S5 ; run every 5 secs
You would also need to ensure that your resume.g file resets your counter to zero
;resume.g set global.filamentDistance = 0 ;
-
Hmmm
I tried the method I suggested, but it doesn't work.Although the macro gets called and the global is set, RRF pauses immediately after filament-error.g is called.
That is probably deliberate and kind of logical, but renders this method unworkable. -
-
-
-
@dc42 @T3P3Tony
The M25 should not be called until the current extruder position exceeds the global variable position set.I.e when the filament sensor is tripped, the M25 should not be called until another 200mm of filament has been extruded.
This allows for the filament between the sensor and the extruder to be used up. On my case that's about 600mm
At that point a pause is called.I'll check again but I'm pretty sure the the code in daemon.g evaluated to false when pause was called.
EDIT:
I'm wondering if it's because I have a filament monitor defined using M591, rather than just an external trigger using M581? -
@dc42 said in FILAMENT_RUNOUT_DISTANCE_MM or similar at reprap?:
@t3p3tony the daemon.g file suggested by OwenD contains an explicit M25 command. That's probably why pause.g is being run.
I just ran a quick test.
The M25 in daemon.g isn't being called.
In config.g I have
; Filament monitor M591 P1 C"e0stop" S1 D0 ; filament monitor for extruder 0 connected to E0 endstop
In filament-error0.g (and filament-error.g) I have
;0:/sys/filament-error#.g ; run when filament error for extruder # is found. ; if this file not found runs filament-error.g ; if neither found runs pause.g G4 P10 ; delay 10ms to debounce if sensors.filamentMonitors[0].status="ok" echo "switch bounce detected" M99 ; break out if sensor value is zero again (bouncing) var runoutDistance = 300 ; this is just so you can change easily var thisExtruderValue = move.extruders[tools[state.currentTool].filamentExtruder].position set global.filamentDistance = var.thisExtruderValue + var.runoutDistance echo "filament-error0.g run - print will be paused after " ^ var.runoutDistance ^ "mm"
In daemon.g I have
if (move.extruders[tools[state.currentTool].filamentExtruder].position > global.filamentDistance) && (global.filamentDistance !=0) && (state.status = "processing") echo "paused called from daemon" M25 ; pause print if filament has run out G4 S2 ; add a delay for these checks
The console output seems to show the print is paused before filament-error.g is run
In any case, it's paused before the daemon can do it.
Here is the extruder position vs the position it should have paused.
(pause caused a retract)
-
I should also point out that the print paused in the position where the filament sensor tripped
It did not move away as I have in pause.gM83 ; relative extruder moves G91 ; relative movement G10 ; retract filament G1 Z+5 F600 ; lift Z by 5mm G90 ; absolute positioning G1 X{move.axes[0].min} Y{move.axes[1].max} F6000 ; move bed forward and clear nozzle away ;M144 ; put bed on standby T100 ; Put nozzle in standby
-
@dc42 yes. It´s a direct extruder, but with reversed bowden of 400mm, and at the beginning of the reversed bowden it´s the filament sensor, so It would be nice to extrude at leat 90% of that lenght in order not to waste that filament
-
@owend Looking at how caribou3d duet handles the sensor
https://github.com/Caribou3d/CaribouDuet2Wifi-ConfigurationMacrosmay be, on trigger we could deactivate sensor, continue printing for var runoutDistance, and then trigger pause, reactivate, load an resume
??
-
-
I have recreated this - and moved it to firmware wishlist section as the behaviour will need to be changed to allow the filament out logic to run without a pause.
-
@t3p3tony
Thanks Tony -
@t3p3tony thanks
-
@t3p3tony does this feature have an ETA?
-
@apak no ETA yet.
-
-
-
-
@t3p3tony Tell me if I'm correct:
A workaround should be possible by setting a global variable in filament-error.g if you want to cancel the pause. pause.g checks for the variable, and does an M24 if the variable was set, instead of its usual commands.
Do you think this would work? Or would it skip pause.g if filament-error.g ran, giving you no opportunity to cancel the pause? I'm uncertain whether pause.g gets run or not if filament-error.g exists. I know it's not supposed to.
-
@donstauffer if filament-error.g runs then pause.g does not run AFAIK. The issue is that there is always a pause as part of the process no matter which macro is called.
-
@t3p3tony Confirmed. pause.g doesn't run.