Printing without Prime/Purge tower - Custom g-Code macro and tooling, with some data

Hi All

I recently got my Snapmaker U1 and started to play around with it. My primary use case is printing Terrain for D&D. Remove the priming and base coloring of the model and leave it to the colored 3d print.

Seeing how the Prusa/Bondtec IDNX can print without a Primetower, I though well hey, the U1 is a toolchanger and it has some cleaning tooling available - why not try to replicate what the IDNX does and pruge/prime with the cleaning tools available.

The Results

TL;DR: It works. I essentially created some custom g-code macro that implements the cleaning routine, then configure OrcaSlicer to use it on a filament change.

Here are some pictures

Model Weight:

Model with with prime tower:

And now, my “custom” method of using the cleaning utensils to prime and purge the toolheads:

The Caveat

It certainly is quite the reduction in waste! So overall, I’m happy with it. Of course though, there is a caveat: It is somewhat messy:

You can see that on the toolhead facing surface, you’ll need to do quite the cleanup.

The macro

It’s a modification of the already existing PREEXTRUDE macro by Snapmaker that does the cleaning. Essentially adding a dwell param to improve speed and ensure retract_length is a float.

[gcode_macro CUSTOM_PREEXTRUDE_FILAMENT]
description: Towerless U1 pre-extrude and wipe
gcode:
    {% set temp = params.TEMP | default(220) | int %}
    {% set speed = params.SPEED | default(360) | float %}
    {% set length = params.LENGTH | default(20) | float %}
    {% set retract_length = params.RETRACT_LENGTH | default(0.5) | float | abs %}
    {% set dwell = params.DWELL | default(1500) | int %}

    SAVE_GCODE_STATE NAME=u1_preextrude
    SET_ACTION_CODE ACTION=PRINT_PREEXTRUDING

    MOVE_TO_DISCARD_FILAMENT_POSITION
    M204 S10000
    M109 S{temp}
    M83

    INNER_APPLY_FLOW_K EXTRUDER={printer.toolhead.extruder} APPLY=1
    G1 E{length} F{speed}
    INNER_APPLY_FLOW_K EXTRUDER={printer.toolhead.extruder} APPLY=0

    G1 E-{retract_length}
    M400

    M106 S255
    G4 P{dwell}
    M400

    INNER_CUTOFF_BASE_DISCARD
    INNER_ROUGHLY_CLEAN_NOZZLE_BASE_DISCARD ACTION=4
    INNER_DISCARD_FILAMENT_BASE_DISCARD

    MOVE_TO_XY_IDLE_POSITION_EXTRUDER
    M107

    RESTORE_GCODE_STATE NAME=u1_preextrude
    SET_ACTION_CODE ACTION=IDLE

On the OrcaSlicer side, I modified the Change Filament G-Code setting in the device settings.

I replace this code:

if previous_extruder != next_extruder and initial_extruder != next_extruder then
"SM_PRINT_PREEXTRUDE_FILAMENT INDEX=" + next_extruder + "
";
endif

With the following snipped:

if previous_extruder != next_extruder then
    if layer_num == 0 then
        "CUSTOM_PREEXTRUDE_FILAMENT TEMP=" + first_layer_temperature[next_extruder] + " LENGTH=15 RETRACT_LENGTH=0 DWELL=1500
";
    else
        "CUSTOM_PREEXTRUDE_FILAMENT TEMP=" + temperature[next_extruder] + " LENGTH=15 RETRACT_LENGTH=0 DWELL=1500
";
    endif

    e_retracted[next_extruder] = 0;
    e_restart_extra[next_extruder] = 0;
endif

Essentialy, call the function when the extruder isn’t the one we just had, ensure temperature is correct for layer 0 and add some math for retraction, purge, etc.

Snapmaker retracts for 10mm at the end of a tool use. Then, on a tool change this function will extrude 15mm, 10 to compensate and 5 to prime and then lastly it’ll clean.

The conclusion so far

The result shows that it could work, it certainly requires some tuning. It also shows that the INDX purge/wipe tooling is made for this method and the U1 isn’t. The U1 is more a generalized cleanup/maintenance kit I suppose (The silicone scrubber thing).

I think with tuning and maybe a cleaning tooling modification (I.e. a V shaped silicone cleaner to “cut” the bugger off) it could actually work really well. But overall, I guess it’ll require tuning shrugs.

3 Likes