This is a remix of the great design by FunFunBoy here with two key changes
I needed a reliable nozzle cleaning solution to allow for more accurate auto z offset and also to remove any residual material from the nozzle without having to manually clean it at the start of every print.
However, I found that the brash bristle brush tends to leave copper residue on the hardened steel nozzle I was using, which especially if printing a white filament, tended to transfer to the first layer. Also I did not feel particularly great with scrubbing the nozzle with metal.
Having explored a number of silicone brush holders, they relied on kitchen silicone brushes which are not stiff enough and also are not rated for this use.
So I decided to mod this holder to use the Bambu lab A1 purpose made silicone nozzle wiper. It's dirt cheap, it is much stiffer than the kitchen brushes and it's easy to fit and set up.
In addition I wanted to use this purge bucket with my Voron 2.4 350 - however it was slightly too short, so it was not sitting square to the bed.
So I extended the mounting position of the brush slightly to allow for more versatility in choosing your bucket of choice, which is great if you have a large bed like the 350.
The Bambu lab nozzle wiper is fixed using the integrated double sided tape as above
Installed on the printer
Here you can see the increased distance from the left side of the purge bucket to allow for more bed clearance on the right hand side while also being extra large capacity for more purge shoots.
The below is my custom Clean Nozzle gcode - I scrub the nozzle left, right, diagonally and also at varying heights to give it a more thorough clean
[gcode_macro CLEAN_NOZZLE]
variable_start_x: 315 # starting position - offset a bit to the right from the brush
variable_start_y: 345 # starting Y position - offset a bit to the front of the brush
variable_start_z: 4 #starting Z height. This should barely touch the surface of the brush
variable_x_min: 269 #left side of the brush
variable_x_max: 304 #right side of the brush
variable_y_min: 356 #front side of the brush - make sure the nozzle is over the last line of bristles
variable_y_max: 358 #rear side of the brush - make sure the nozzle is over the first line of bristles
variable_z1: 3.2 # second z height of the nozzle over the brush - this should be with the nozzle slightly sunk in
variable_z2: 2.4 # third z height of the nozzle over the brush - this should be with the nozzle fully sunk into the brush, but not touching the bottom of it.
variable_wipe_qty: 2 #how many times to run the cleaning sequence
variable_wipe_spd: 200 #cleaning speed
variable_raise_distance: 30 # z height after cleaning is done
gcode:
{% if "xyz" not in printer.toolhead.homed_axes %}
G28
{% endif %}
G90 ; absolute positioning
### Move nozzle to start position
G1 X{start_x} Y{start_y} F9000
G1 X{x_max} Y{y_min} F9000
G1 Z{start_z} F1500
### Wipe nozzle
{% for wipes in range(1, (wipe_qty + 1)) %} #wipe left and right
G1 Y{y_min} F{wipe_spd * 60}
G1 X{x_min} F{wipe_spd * 60}
G1 X{start_x} F{wipe_spd * 60}
G1 Y{y_max} F{wipe_spd * 60}
G1 X{x_min} F{wipe_spd * 60}
G1 X{start_x} F{wipe_spd * 60}
G1 Z{z1} F1500
G1 Y{y_min} F{wipe_spd * 60}
G1 X{x_min} F{wipe_spd * 60}
G1 X{start_x} F{wipe_spd * 60}
G1 Y{y_max} F{wipe_spd * 60}
G1 X{x_min} F{wipe_spd * 60}
G1 X{start_x} F{wipe_spd * 60}
G1 Z{z2} F1500
G1 Y{y_min} F{wipe_spd * 60}
G1 X{x_min} F{wipe_spd * 60}
G1 X{start_x} F{wipe_spd * 60}
G1 Y{y_max} F{wipe_spd * 60}
G1 X{x_min} F{wipe_spd * 60}
G1 X{start_x} F{wipe_spd * 60}
G1 Z{start_z} F1500
{% endfor %}
{% for wipes in range(1, (wipe_qty + 1)) %} #wipe diagonally
G1 Z{start_z} F1500
G1 X{x_min} Y{y_min} F{wipe_spd * 60}
G1 X{x_max} Y{y_max} F{wipe_spd * 60}
G1 X{x_min} Y{y_min} F{wipe_spd * 60}
G1 X{x_max} Y{y_max} F{wipe_spd * 60}
G1 Z{z1} F1500
G1 X{x_min} Y{y_min} F{wipe_spd * 60}
G1 X{x_max} Y{y_max} F{wipe_spd * 60}
G1 X{x_min} Y{y_min} F{wipe_spd * 60}
G1 X{x_max} Y{y_max} F{wipe_spd * 60}
G1 Z{z1} F1500
G1 X{x_min} Y{y_max} F{wipe_spd * 60}
G1 X{x_max} Y{y_min} F{wipe_spd * 60}
G1 X{x_min} Y{y_max} F{wipe_spd * 60}
G1 X{x_max} Y{y_min} F{wipe_spd * 60}
G1 Z{z2} F1500
G1 X{x_min} Y{y_min} F{wipe_spd * 60}
G1 X{x_max} Y{y_max} F{wipe_spd * 60}
G1 X{x_min} Y{y_min} F{wipe_spd * 60}
G1 X{x_max} Y{y_max} F{wipe_spd * 60}
G1 X{x_min} Y{y_max} F{wipe_spd * 60}
G1 X{x_max} Y{y_min} F{wipe_spd * 60}
G1 X{x_min} Y{y_max} F{wipe_spd * 60}
G1 X{x_max} Y{y_min} F{wipe_spd * 60}
G1 X{start_x} Y{y_min} F{wipe_spd * 60}
G1 Z{start_z} F1500
{% endfor %}
G1 X{start_x} Y{start_y} F9000 #go back to starting position
## Raise nozzle
G1 Z{raise_distance}