1 / 3
Ender 3 S1/Pro Nozzle Wiper (Silicone Brush) — image 1
1 / 3

Ender 3 S1/Pro Nozzle Wiper (Silicone Brush)

Order a print of this model

We calculate the final price from your selected file. You review and accept it before payment.

Saved on this device.

Snap-fit mount for silicone nozzle brush to be attached to heater bed cable. No loss of print volume.

Rating
5 / 5
Likes
51
Downloads
201
Makes
3
Views
1,380
Reviews
3

Updated at source:

Model information

License
Creative Commons — Attribution — Noncommercial — Share Alike

I wanted a way to have a lower maintenance swap between prints and also keep my nozzle clean, but could not find a nozzle wiper that didn't either take up room I wanted to use for a purge bin on the X gantry or attach under the bed leveling screws where I already had locking screws printed. 

I found this model by Olaznog_sp that looked like a good foundation but it was for a wire brush instead, so I started breaking it up to try and accommodate an adhesive silicone wiper, easily snap on to the heater bed cable and not move around too much, and not lose any print volume. 

The finished model should snap right over the heater bed cable on a S1 and, I believe, the S1 Pro and S1 Plus as well. It may also fit others, though I don't have other printers to compare. The recess should perfectly fit a full silicone nozzle wiper (approx 37mm x 8mm). 

Printed in PLA and seems to be holding up just fine. Prints without supports in the orientation as downloaded.

(With the help of Gemini, ) I also put together a gcode macro that should be easily tweakable to your exact coordinate positioning and preferred nozzle wiping amounts/speeds: 

[gcode_macro BED_NOZZLE_WIPE]
# Default parameters for the nozzle wipe macro.
# These can be overridden when calling the macro (e.g., NOZZLE_WIPE WIGGLES=5)
variable_x_start: 1.5       # Starting X coordinate of the wiper area
variable_y_start: 229.5     # Starting Y coordinate of the wiper area
variable_x_end: 37.5        # Ending X coordinate of the wiper area
variable_y_end: 234.5       # Ending Y coordinate of the wiper area
variable_z_min: 10.7      # Minimum Z-height for wiping
variable_z_max: 11      # Maximum Z-height for wiping
variable_wiggles: 4       # Number of full back-and-forth passes through the wiper (across X-axis)
variable_y_zigzags_per_x_pass: 4 # Number of Y-axis zig-zags during one full X-axis traversal (e.g., 2 means Y_START->Y_END->Y_START)
variable_wipe_speed: 80   # Speed (mm/s) for wiping movements (default 50 mm/s)
variable_z_travel_speed: 50 # Speed (mm/s) for Z-axis travel movements (default 50 mm/s)
description: Nozzle wiping macro with zig-zag motion.
gcode:
   # Assign parameters, using defaults if not provided by the user
   {% set X_START = params.X_START|default(x_start) %}
   {% set Y_START = params.Y_START|default(y_start) %}
   {% set X_END = params.X_END|default(x_end) %}
   {% set Y_END = params.Y_END|default(y_end) %}
   {% set Z_MIN = params.Z_MIN|default(z_min) %}
   {% set Z_MAX = params.Z_MAX|default(z_max) %}
   {% set WIGGLES = params.WIGGLES|default(wiggles)|int %}
   {% set Y_ZIGZAGS_PER_X_PASS = params.Y_ZIGZAGS_PER_X_PASS|default(y_zigzags_per_x_pass)|int %}
   {% set WIPE_SPEED_MM_S = params.WIPE_SPEED|default(wipe_speed)|int %}
   {% set Z_TRAVEL_SPEED_MM_S = params.Z_TRAVEL_SPEED|default(z_travel_speed)|int %}
   # Convert speeds from mm/s to mm/min for G-code commands
   {% set WIPE_SPEED_MM_MIN = WIPE_SPEED_MM_S * 60 %}
   {% set Z_TRAVEL_SPEED_MM_MIN = Z_TRAVEL_SPEED_MM_S * 60 %}
   # Ensure Y_ZIGZAGS_PER_X_PASS is at least 1
   {% if Y_ZIGZAGS_PER_X_PASS < 1 %}
       {% set Y_ZIGZAGS_PER_X_PASS = 1 %}
   {% endif %}
   # Calculate the number of total segments for X movement.
   # Each full Y-zigzag (e.g., Y_START -> Y_END -> Y_START) involves two diagonal movements.
   # So, for N zigzags, we need 2N segments to complete the full X traversal.
   {% set total_x_segments = Y_ZIGZAGS_PER_X_PASS * 2 %}
   {% set X_SEGMENT_LENGTH = (X_END - X_START) / total_x_segments %}

1. Check if printer is homed. If not, perform G28.

{% if not 'x' in printer.toolhead.homed_axes or not 'y' in printer.toolhead.homed_axes or not 'z' in printer.toolhead.homed_axes %} M117 Homing printer... G28 ; Home all axes if not already homed {% endif %}

2. Save the current G-code state (position, speed, etc.)

This allows the printer to return to its exact previous state after the wipe.

SAVE_GCODE_STATE NAME=nozzle_wipe_state

3. Ensure absolute positioning (G90) for precise coordinate movements

G90

4. Move Z up to a safe height above the wiping area before horizontal travel.

This prevents the nozzle from dragging across the bed or obstacles.

G0 Z{Z_MAX + 1.0} F{Z_TRAVEL_SPEED_MM_MIN} ; Move Z up quickly

5. Perform the wiping motion: Wiggle back and forth through the wiper with multiple zig-zags.

The outer loop iterates 'WIGGLES' times for full back-and-forth passes across the X-axis.

M117 Wiping at bed wiper. {% for i in range(WIGGLES) %} # Determine current X direction (forward or backward pass) {% set is_forward_pass = i % 2 == 0 %} # Set initial X and Y for this pass. # We always start at Y_START for the first segment of any X-pass to ensure consistent zig-zag pattern. {% set current_x = X_START if is_forward_pass else X_END %} {% set current_y = Y_START %} # Move to the starting point of the current pass (at safe Z) G0 X{current_x} Y{current_y} F{WIPE_SPEED_MM_MIN * 1.25} # Move down to the minimum Z-height for wiping G0 Z{Z_MIN} F{Z_TRAVEL_SPEED_MM_MIN} # Perform Y-zigzags while traversing X # The inner loop iterates through the calculated number of X segments. {% for j in range(total_x_segments) %} # Calculate target X for this segment. # For forward passes, X increases; for backward, X decreases. {% set target_x_raw = X_START + (j + 1) * X_SEGMENT_LENGTH %} {% set target_x = target_x_raw if is_forward_pass else X_END - (target_x_raw - X_START) %} # Determine target Y for this segment. It alternates between Y_END and Y_START. # This creates the zig-zag motion along the Y-axis. {% set target_y = Y_END if j % 2 == 0 else Y_START %} # Adjust target_x for potential floating point inaccuracies at the very end of the pass. {% if is_forward_pass and j == total_x_segments - 1 %} {% set target_x = X_END %} {% elif not is_forward_pass and j == total_x_segments - 1 %} {% set target_x = X_START %} {% endif %} # Move diagonally to the next zig-zag point G1 X{target_x} Y{target_y} F{WIPE_SPEED_MM_MIN} {% endfor %} # After completing the X-pass, move up to Z-max for the return journey G0 Z{Z_MAX} F{Z_TRAVEL_SPEED_MM_MIN} {% endfor %}

6. Move Z back to a safe height after the wiping sequence is complete.

G0 Z{Z_MAX + 1.0} F{Z_TRAVEL_SPEED_MM_MIN}

7. Restore the printer's G-code state to what it was before the macro was called.

MOVE=1 ensures the printer physically moves back to the saved position.

RESTORE_GCODE_STATE NAME=nozzle_wipe_state MOVE=1 MOVE_SPEED={WIPE_SPEED_MM_S}

8. Display a message on the printer's display indicating completion.

M117 Nozzle wiped!

Tags