Tips for Proactive Filament Change when running out?

  • Occasionally, I've had great success with using the filament change feature on my Original Prusa i3 MK1. It has an option on the control panel to interrupt a running print and perform a filament change. I use it to change spools when one is running out.

    I've been looking through the doc on M24 / M25 and the pause.g / resume.g file examples.

    In order to accomplish the same functionality with the Duet, is it simply a matter of:

    Configure pause.g to move to edge of the bed

    When wanting / needing to change the filament, go to the G-Code console while the print is running:

    1. send M25
    2. run unload commands
    3. run load commands
    4. purge extuder to bring in new filament
    5. send M24

    Anybody have tips or tricks on things to do / avoid with this approach?


  • administrators

    You could set up a macro file to do it, leaving pause.g and resume.g alone:

    • Send M25
    • Delay a short time if necessary (G4) to give the pause macro time to start (I'm not sure this is needed)
    • Send M400 to wait until all movement is finished (to let pause.g finish)
    • Run unload commands
    • Use M291 to prompt the user to swap the filament and wait for acknowledgement
    • Run load commands
    • Purge extruder, send M24 to resume

    HTH David

  • @webdad:

    Occasionally, I've had great success with using the filament change feature on my Original Prusa i3 MK1. It has an option on the control panel to interrupt a running print and perform a filament change. I use it to change spools when one is running out.

    When a reel is down to a couple if metres or so, I just cut what's left of the old roll while it's printing and push the new filament in until the extruder grabs it. Simple 🙂

  • Interesting. I'll have to try both approaches. I'm really enjoying the macro capability and being able to create custom command sets.

    I've got a Bowden set up, and it seems like the cut and push method should work. Deckingman - if you inadvertently cause a gap between the old and the new filament, does that have any adverse effect on the print?

    Thanks all.

  • @webdad:

    …................... Deckingman - if you inadvertently cause a gap between the old and the new filament, does that have any adverse effect on the print?

    Thanks all.

    Yes it would. What would happen is that there would be a pause in the filament being extruded from the nozzle as the extruder pushes the new filament in to fill the gap. This technique may or may not work, depending on what extruder you have. I use E3D titans which have a short piece of PTFE tube to guide the filament into the extruder, and find that it works as long as I keep pressing on the new filament so that it is contact with the top of the old filament that is being used up. I generally run the lowest spring tension that I can get away with too.

    I actually use this technique quite a lot. The reason is that I have Diamond hot ends and it's essential to have filaments loaded into all the inputs at all times. It's generally best to keep these filaments moving too. So when printing a single colour with say the 3 colour Diamond, I use about 90% of one input and 5% of the other two. To save buying and loading 3 complete reels of the same filament, I simply pull off two lengths of a couple of metres or so and load these into two inputs and the main reel into the third input with a mixing ratio of 90:05:05. Sometimes, my estimate is a bit out and if it looks like I'll run out of the short lengths, I just cut the main reel a reasonable distance above the extruder and pull off a couple more lengths without pausing the print. Then I cut one of the filaments close to the extruder and feed one new filament in. Once that has been "grabbed" by the extruder, I then repeat for the other two. It's best if you can pick a point in the print where there are no retracts but if not, just keep pressing the filament until you are sure that retraction isn't going to push the end out of the extruder. Don't press too hard - just enough to keep the new filament in contact with the old but so much as to buckle the filament. Oh, and I guess this wouldn't work with a flexible filament but for PLA and PETG it works fine for me.

  • Thanks! Excellent point about the retracts. I've got a Titan extruder with an E3D v6 Full, and had assumed I'd keep pressure until it was picked up by the extruder. The only complication is that I have a DBot with a 750+ mm bowden tube and it is highly unlikely I'd have prints that could go that long without a retraction.

    Interesting thought though.

    Thanks for the detail.

  • Yes, true enough. With a long Bowden tube you may have a period where retraction is less effective. It may not matter too much as you'll still be relieving the pressure on the filament - just not actually pulling it back out of the hot end. Try it and see I guess.

  • Got some time this weekend to try and bang out a macro to change filament. Thought I would also try some other things in the firmware, like calling other macros, etc.

    Haven't had a great deal of success, so wanted to post what I have and see if anyone can see the error of my ways. The issue is that in the 3 step process driven by Change Filament, whenever I executed it during a print, it appears to pause the print and move off to the side and lower the bed (pause.g is executed) but then it proceeds to fall through everything else - cf-unload as well as all of steps 1 and 2, and just display Step 3's prompt for Ok or cancel. At that point, OK results in no action, and a message that no file was open for printing, or something similar.

    Basic flow is:
    Change Filament is the driver and does the following:

    • Pause the print

    • Call macro cf-unload to purge some filament, then do a fast retract to pull filament back to titan extruder

    • (Step 1) Prompt user to insert filament just to start of the bowden tube

    • Call macro cf-load to advance filament through bowden tube to just above hotend

    • (Step 2) Prompt user to manually push filament into the hotend

    • Call macro cf-prime to purge filament to clear color

    • (Step 3) Final prompt for user to accept and continue or cancel

    • Resume print on "OK"

    All the below are stored in the macros directory

    Change Filament

    M25  ; Pause print
    G4 P2000  ; Dwell 200 milliseconds
    M400   ; Wait for current moves to finish
    M98 P/macros/cf-unload
    M291 P"Insert new filament to just above titan extruder and press OK" R"Step 1: Load New Filament" S3
    M98 P"/macros/cf-load"
    M291 P"Manually advance filament into hotend" R"Step 2: prime Filament" S3
    M98 P"/macros/cf-prime"
    M291 P"Click OK to continue to Cancel to abort print" R"Step 3: Final Check" S3
    M24 ; Resume print


    ; Load filament
    G1 E750 F3600
    M84 P3 E0:1		; turn extruder motors off so the user can feed by hand


    ; Purge and then Unload filament
    G1 X2 Y2 ; Move to front corner
    G1 E20 F500 ; Extrude 20mm to warm the heatbreak filament
    G1 E-10 F500
    G1 E-800 F3600


    ; Prime filament
    G1 E40 F300

    Any tips or observations would be greatly appreciated. the three macros I'm calling are actually macros I use day to day for loading / unloading filament and they work fine when I run them from the console. I thought I would use them as they are for this change filament exercise, so that's why I decided to call them. The idea being if I further modify them, change filament would get the mods as well. I actually have them named something else, but thought the clear names (that have spaces) might have been causing issues so that's why some of the calls use quoted strings and some don't.


  • I've never tried calling macros - only ever run them "stand alone" fashion so I may not be much help. One thing that kind of jumped out at me was that the macro names above don't have a ".g" suffice. Not sure if this is significant but it might be. No doubt David will be along shortly to put you right…..

  • administrators

    Try adding a M400 command before each M291 command or at the end of each macro. Maybe I should make that part of what M291 does.

  • I'll give that a shot, but there is an intermediate M400 already after cf-load and before the Step 2 M291. Would it be better to put it in the macro files?

  • Is there a way for the Duet3d to detect when the extruder filament runs out or break to automatically start the pause script and wait for someone to fix the issue and resume the print?


  • administrators

    Yes, see M591 in the GCode wiki. The firmware currently supports simple switch-type filament sensors and the prototype Duet3D rotating magnet filament monitors. I also have a build that supports the prototype Duet3D laser filament monitors.

Log in to reply