Voron 2.4 Silicone Nozzle Scrubber w/ Sheet Stops (Beacon / Carto Compatible)

Low profile nozzle scrubber with sheet stops designed for the Voron 2.4 using Bambu’s A1 silicone nozzle wiper.
286
1542
16
6640
updated January 16, 2026

Description

PDF

What started out as a remix has now been completely overhauled in CAD to require a bit less Y-overtravel and be a bit more robust.  If you are here to reprint a specific part, or using parts from other remixes, it may not fit together properly.  Highly recommend just reprinting everything if you have an older version of this print as previous versions of buckets and brackets will not fit together well.  The most common 8mm and 10mm thick aluminum beds are supported.  Use the provided .step files to adjust them to your specific setup if your bed thickness differs.

The cleaning macro was also rewritten to be more versatile and customizable with safeties built in.  I have rewritten the macro so that it will use the exact coordinates of the top left corner of the bristle as a baseline reference to operate on.  You must put your nozzle directly above the top left corner of the bristle and input those coordinates in my macro.  You should have at least 6-7mm of Y overtravel to use the macro and also have [gcode_arcs] set up in your printer.cfg for it to work.  More detailed instructions at the bottom. 

Provided .3mf files are designed with a 1.5mm thick magnetic sheet, official Bambu A1 Wiper, and .75mm thick build plate in mind.  A1 Wiper clones are approx .2mm taller than the official A1 wiper so expect the bristles to be .2mm taller if you are using a clone.

Beacon and Cartographer probes are normally 2.6mm - 3mm above the nozzle.  Ideal silicone brush protrusion therefore should be less than that, and I’ve designed the parts to be approx 1.5 - 2mm above the build sheet. YMMV, adjust using the provided .step files.



Three bucket sizes are now available: One for 300mm beds, one for 350mm beds, and one designed to take up the entire middle section for center installations.


Print Settings:
Print using voron printed parts settings in ABS/ASA.  Turn off shrinkage compensation if you have it on, parts were designed with ABS/ASA shrinkage in mind.  If you leave it on, you will need to use glue for the magnets.  Flip/mirror the parts in the slicer to install on the other side of the printer.

BOM:
6x3 Magnets x 4 for the scrubber and bucket attachment
M3x8mm x 4 for brackets
M3 SHCS x 2 for build sheet stops
Bambu A1 Wiper:
- Official: https://us.store.bambulab.com/products/heatbed-nozzle-wiper-a1 (8mm x 37mm x 3.85mm)
- Clone: https://www.aliexpress.us/item/3256807319701447.html (8mm x 37mm x 4mm)

 

Klipper Macro updated for 12/22/2025
Behavior: The new macro, by default, will park the nozzle 10mm to the right (or left) of the brush depending on where you placed the bucket.  Once up to temp, the nozzle will move into the edge of the first bristle and flick multiple times to make sure the filament that may still be hanging on drops into the bucket before scrubbing multiple times.

Changes: The macro will now base its movements based on a reference point you set.  The reference point will be the top left corner of the nozzle brush as pictured below.  The coordinates pictured are specifically for my 300mm 2.4 printer.  Your values may be different so move your nozzle above the red dot and take note of your exact coordinates, and then replace the values in both macros, NOZZLE_PARK_BUCKET and NOZZLE_CLEAN.  Using this baseline, the macro will know how to behave and avoid any previous issues such as the nozzle scraping the bed with the previous version.  Adjust the values of brush_ref_x and brush_ref_y in both macros.

Note: There may be certain custom endstop mounts that reduce the typical 10mm extra Y overtravel on the Voron 2.4 -- check that you have enough Y overtravel to use this macro.


Macro Placement: In your PRINT_START macro, use CLEAN_NOZZLE_PARK before the nozzle starts heating up so that it is positioned over the bucket when the filament is oozing out.  Trigger CLEAN_NOZZLE directly after.

Tips: Most of the variables I've set are good defaults for my scrubber mod.  Feel free to tweak settings if you know what you are doing.  I've set the speeds to reasonable defaults for a stock Voron 2.4 / Trident.  For those that have upgraded Vorons, you can adjust the speeds much higher for more aggressive movements and cleaning.  For most users, should just need to adjust brush_ref_x and brush_ref_y in both macros.

Note: Add these 2 lines to your printer.cfg as it will be required to use my macros.

[gcode_arcs]
resolution: 0.1


Macros:

[gcode_macro NOZZLE_PARK_BUCKET]
# Instructions: https://www.printables.com/model/796563-voron-24-silicone-nozzle-scrubber-w-sheet-stops-be
description: "Parks the nozzle over the bucket."

gcode:
    # ---------- Define variables ----------
    {% set brush_ref_x = 237.0 %}       # X coordinate of top-left brush corner
    {% set brush_ref_y = 304.5 %}       # Y coordinate of top-left brush corner
    {% set brush_width = 35.0 %}        # Width of brush (X dimension)
    {% set brush_depth = 7.0 %}         # Depth of brush (Y dimension)
    {% set bucket_side = "right" %}     # "right" or "left" relative to brush
    {% set bucket_offset = 10.0 %}      # Distance from brush to bucket
    {% set park_z = 5.0 %}              # Z height to park nozzle
    {% set travel_speed = 9000 %}       # XY travel speed (mm/min)
    {% set z_speed = 1500 %}            # Z-axis speed (mm/min)
    {% set do_qgl = False %}            # You should QGL in print_start.  Set to true if you plan on using this outside of print_start for safety. 

    # ---------- Safety checks. ----------
    {% if not printer.toolhead.homed_axes %}
        G28
    {% endif %}

    # Set do_qgl to false if using in print_start, otherwise you'll have multiple QGLs adding unnecessary delays to your print time.
    {% if do_qgl %}
        QUAD_GANTRY_LEVEL
        G28 Z ; good practice to home z again after QGL
    {% endif %}

    G90  ; Absolute positioning

    # ---------- Compute bucket coordinates ----------
    {% set cy = brush_ref_y - (brush_depth / 2.0) %}
    {% if bucket_side|lower == "right" %}
        {% set bucket_x = brush_ref_x + brush_width + bucket_offset %}
    {% else %}
        {% set bucket_x = brush_ref_x - bucket_offset %}
    {% endif %}

    # ---------- Move nozzle above bucket ----------
    G1 Z{park_z} F{z_speed}
    G1 X{bucket_x} Y{cy} F{travel_speed}


[gcode_macro NOZZLE_CLEAN]
# Instructions: https://www.printables.com/model/796563-voron-24-silicone-nozzle-scrubber-w-sheet-stops-be
description: "Cleans the nozzle by flicking the filament off the nozzle before scrubbing."

gcode:
    # ---------- Define variables ----------
    {% set brush_ref_x = 237.0 %}       # X coordinate of top-left brush corner
    {% set brush_ref_y = 304.5 %}       # Y coordinate of top-left brush corner
    {% set brush_width = 35.0 %}        # Width of brush
    {% set brush_depth = 7.0 %}         # Depth of brush

    {% set bucket_side = "right" %}     # "right" or "left" relative to brush
    {% set bucket_offset = 10.0 %}      # Distance from brush to bucket

    {% set clean_z = 1.5 %}             # Z height to dip nozzle into brush. Adjust this so that the nozzle is sufficiently inside the brushes without causing the brush to shift.
    {% set exit_z_lift = 3.0 %}         # Z lift after cleaning

    {% set flick_count = 5 %}           # Number of flicks into bucket
    {% set flick_speed = 9000 %}        # Speed of flick movement (mm/min)
    {% set flick_depth = 3.0 %}         # Distance nozzle moves into brush
    {% set flick_dwell_ms = 20 %}       # Dwell time at deepest point (ms)
    {% set flick_return_mult = 1.5 %}   # Return speed multiplier to bucket
    {% set flick_z_dip = 0.5 %}         # Z dip into brush

    {% set scrub_passes = 5 %}          # Number of linear passes along brush
    {% set circles_per_pass = 2 %}      # Number of circular motions per pass
    {% set circle_radius = 2.0 %}       # Radius of each circular scrub
    {% set scrub_speed = 3000 %}        # Speed for circular scrub
    {% set alternate_direction = True %} # Alternate CW/CCW circles

    {% set travel_speed = 9000 %}       # XY travel speed (mm/min)
    {% set z_speed = 1500 %}            # Z-axis speed (mm/min)
    {% set do_qgl = False %}            # You should QGL in print_start.  Set to true if you plan on using this outside of print_start for safety. 


    # ---------- Safety checks. ----------
    {% if not printer.toolhead.homed_axes %}
        G28
    {% endif %}

    # Set do_qgl to false if using in print_start, otherwise you'll have multiple QGLs adding unnecessary delays to your print time.
    {% if do_qgl %}
        QUAD_GANTRY_LEVEL
        G28 Z ; good practice to home z again after QGL
    {% endif %}

    G90  ; Absolute positioning

    # ---------- Precompute useful values ----------
    {% set cx = brush_ref_x + (brush_width / 2.0) %}
    {% set cy = brush_ref_y - (brush_depth / 2.0) %}
    {% set usable_width = brush_width - (circle_radius * 2) %}

    {% if bucket_side|lower == "right" %}
        {% set bucket_x = brush_ref_x + brush_width + bucket_offset %}
        {% set flick_x = brush_ref_x + brush_width - flick_depth %}
    {% else %}
        {% set bucket_x = brush_ref_x - bucket_offset %}
        {% set flick_x = brush_ref_x + flick_depth %}
    {% endif %}

    {% if scrub_passes > 1 %}
        {% set step = usable_width / (scrub_passes - 1) %}
        {% set start_x = cx - (usable_width / 2) %}
    {% else %}
        {% set step = 0 %}
        {% set start_x = cx %}
    {% endif %}

    {% set dwell = flick_dwell_ms|int %}
    {% set return_speed = flick_speed * flick_return_mult %}

    # ---------- Move to park above bucket ----------
    G1 Z{clean_z} F{z_speed}
    G1 X{bucket_x} Y{cy} F{travel_speed}

    # ---------- Flick / Edge Wipe ----------
    {% for i in range(flick_count) %}
        G1 Z{clean_z - flick_z_dip} F{z_speed}   ; Dip into brush
        G1 X{flick_x} F{flick_speed}             ; Move into brush
        G4 P{dwell}                              ; Micro dwell
        G1 X{bucket_x} F{return_speed}           ; Snap back to bucket
        G1 Z{clean_z} F{z_speed}                 ; Restore Z
    {% endfor %}

    # ---------- Circular Scrub ----------
    {% for i in range(scrub_passes) %}
        {% set x_pos = start_x + (i * step) %}
        G1 X{x_pos} Y{cy} F{travel_speed}       ; Move to scrub position

        {% for j in range(circles_per_pass) %}
            {% if alternate_direction and ((i + j) % 2 == 1) %}
                G3 X{x_pos} Y{cy} I{circle_radius} J0 F{scrub_speed}  ; CCW circle
            {% else %}
                G2 X{x_pos} Y{cy} I{circle_radius} J0 F{scrub_speed}  ; CW circle
            {% endif %}
        {% endfor %}
    {% endfor %}

    # ---------- Exit / Lift ----------
    G1 Z{clean_z + exit_z_lift} F{travel_speed}

I have done a lot of testing but I may have missed some edge cases.  Let me know if anything doesn't work as intended so that I can adjust.  Enjoy!

Tags



Model origin

The author remixed this model.

Differences of the remix compared to the original

Modified the design to use Bambu's A1 silicone nozzle brush and use M3 SHCS bolts as sheet stops.  Added multiple bucket sizes that will not hit beacon/cartographer scanners.  Brush protrusion will not collide with beacon/cartographer scanners.  Much more versatile and safe cleaning macro.  Optimizations of the design to require less Y overtravel.

License