Introduction: 3D Printer Circular Nozzle Cleaner

Picture of 3D Printer Circular Nozzle Cleaner

Created this circular nozzle cleaner for my CoreXY printer. The cleaner uses 10 Brass Brushes for a rotary tool.

brushes purchased on amazon (pack of 20) PHYHOO Cleaning Brass Brushes Kit for Rotary Tools

Cleaner designed in Fusion 360. You can download the model at

Since this printer is coreXY with the Bed moving along the z-axis, the height of the Nozzle is stationairy in relation to the frame.

In order to account for changes in the nozzle (as it related to the actual extruder) the nozzle cleaner is adjustable via three screws accessible from the bottom. Screw and tension springs can be purchased at amazon:

screws: Uxcell M3 20mm socket head screw

springs: Swordfish 31070 200PC Extended and Compressed Spring assortment Case Kit

Step 1: Marlin Code Adjustments

The current printer this nozzle cleaner is added to is running Marlin 1.0.x which has experimental code around nozzle cleaning.

Cleaning can be initiated with the g12 code.

I choose for a circular cleaning pattern as I feel that will get all the nooks and crannies of a standard e3d nozzle.

in configuration.h you uncomment the #define NOZZLE_CLEAN_FEATURE line and set parameters.

NOZZLE_CLEAN_STROKES = 2 (nozzle will make 2 full circles inside the cleaner

NOZZLE_CLEAN_START_POINT= { 37, -54, (Z_MIN_POS + 1)} This happens to be the center coordinated of the circular row of brushes in my cleaner

NOZZLE_CLEAN_CIRCLE_RADIUS 8.2 (that is the radius of the circle of brushes in this design)

NOZZLE_CLEAN_CIRCLE_FN 20 set the number of steps in which a full circle is completed (each step represents a x/y coordinate on the circle).

As far as I can tell the original code for creation a circle in the nozzle.cpp code is not correct. It uses the M_2_PI c++ parameter when it should be using 2*M_PI.

old code:

float x, y; 
for (uint8_t s = 0; s < strokes; s++) { 
	for (uint8_t i = 0; i < NOZZLE_CLEAN_CIRCLE_FN; i++) { 
		x = middle.x + sin((M_2_PI / NOZZLE_CLEAN_CIRCLE_FN) * i) * radius; 
		y = middle.y + cos((M_2_PI / NOZZLE_CLEAN_CIRCLE_FN) * i) * radius;<br>	        
		do_blocking_move_to_xy(x, y); 

new code

float x, y;<br>for (uint8_t s = 0; s < strokes; s++) {
	for (uint8_t i = 0; i < NOZZLE_CLEAN_CIRCLE_FN; i++) {
		x = middle.x + sin((2* M_PI / NOZZLE_CLEAN_CIRCLE_FN) * i) * radius;
        	y = middle.y + cos((2* M_PI / NOZZLE_CLEAN_CIRCLE_FN) * i) * radius;
        	do_blocking_move_to_xy(x, y);

Step 2: Custom Gcode

Nozzles tend to ooze filament in the following cases:

At heat up time. As the hot-end temperature nears the desired temperature, existing filament inside the head tends to expand and extrude from the nozzle.

During Auto bed leveling the hotend continues to "leak" filament.

for the printer in question the hotend will heat will sitting at X=0, Y=-60 prior to auto leveling

while going into auto level the hot-end will pass over the nozzle cleaner (it so happens to be in the path). This pass-over will remove and strings of filaments that extruded while heating.

Subsequently it will perform auto bed leveling after which I call the g12 P2 command to execute nozzle cleaning.

This is the custom g-code that is inserted prior to printing

G28 XY (home for X and Y)

M109 T0 S220; pre heat so it can drop filament prior to moving to corner bed.

G28 //Home

G29 //Auto Level

G12 P2 S3 //Clean nozzle making 3 passes around the nozzle cleaner.

start print.......


About This Instructable




Bio: Avid 3D printer builder, currently completing my 3rd printer design
More by Core3D:Generic Linear Actuator With Built-in Tension Spring3D Printer Circular Nozzle Cleaner3D Printer Cantilever
Add instructable to: