Retractable Nozzle Cleaning Brush for Voron 2.4 350
Obliczymy ostateczną cenę na podstawie wybranego pliku. Sprawdzisz ją i zaakceptujesz przed płatnością.
Zapisane na tym urządzeniu.
A retractable brush that rises above the bed to clean the nozzle
- Ocena
- 0 / 5
- Polubienia
- 8
- Pobrania
- 27
- Wydruki
- 0
- Wyświetlenia
- 372
- Oceny
- 0
Aktualizacja u źródła:
Informacje o modelu
- Źródło
- Printables
- Kategoria
- Voron Parts & Upgrades
- Licencja
- Creative Commons — Attribution — Noncommercial
Voron Nozzle Brush – Servo Driven Mechanism
This project is a simple mechanical nozzle cleaning system for Voron printers.
It uses a small tray with a brass brush that is moved in and out of the print area using a lever mechanism powered by a micro servo.
Features
Compact brush holder mounted on standard Voron extrusion
Lever mechanism keeps the brush level during movement
Servo-powered deployment and retraction
Power switching for the servo to prevent jitter and overheating
Fully compatible with Klipper macros
Hardware Setup
Servo: 9g micro servo (tested with Goteck GS-D9025MG)
Power: +5V via step-down converter
Control board: BTT Octopus (pins must be adjusted for your setup)
Wiring:
+5V → from PSU via step-down
GND → switched via MOSFET (fan output)
Signal → any free GPIO pin
This allows the servo to be powered only when needed.
Printing Settings
Material: ASA (recommended for enclosed printers)
Layer height: 0.2 mm
Infill: 40%
Perimeters: 4
Nozzle: 0.4 mm
Supports: only where necessary
Increase infill for mechanical parts (arms, servo mount).
Assembly Notes
Install all heat-set inserts before assembly
Set servo position before mounting arms
Make sure the brush stays level during motion
Check all clearances (bed / nozzle collision)
Trim carbon rods or pins so they don’t protrude
Klipper Macros
Below is a working example of the brush control and cleaning macro:
# --- BRUSH MACROS ---[gcode_macro _BRUSH_STATE]
variable_deployed: 0
variable_saved_temp: 0
gcode:
[gcode_macro _ENSURE_BRUSH_RETRACTED]
gcode:
{% if printer["gcode_macro _BRUSH_STATE"].deployed == 1 %}
BRUSH_OUT
{% endif %}
[servo nozzle_brush]
pin: PA15
maximum_servo_angle: 180
minimum_pulse_width: 0.0005
maximum_pulse_width: 0.0025
[output_pin servo_power]
pin: PD15
pwm: False
value: 0
shutdown_value: 0
[gcode_macro BRUSH_OUT]
description: Move brush to the safe retracted position
gcode:
SET_PIN PIN=servo_power VALUE=1
G4 P300
SET_SERVO SERVO=nozzle_brush ANGLE=45
G4 P600
SET_SERVO SERVO=nozzle_brush WIDTH=0
G4 P200
SET_GCODE_VARIABLE MACRO=_BRUSH_STATE VARIABLE=deployed VALUE=1
[gcode_macro BRUSH_IN]
description: Move brush to the active wipe position
gcode:
SET_PIN PIN=servo_power VALUE=1
G4 P300
SET_SERVO SERVO=nozzle_brush ANGLE=132
G4 P600
SET_SERVO SERVO=nozzle_brush WIDTH=0
G4 P200
SET_PIN PIN=servo_power VALUE=0
SET_GCODE_VARIABLE MACRO=_BRUSH_STATE VARIABLE=deployed VALUE=0
[gcode_macro CLEAN_NOZZLE]
description: Clean the nozzle using the brush
variable_brush_y: 340
variable_brush_z: 21.705
variable_brush_x_min: 32
variable_brush_x_max: 72
variable_safe_z: 30
variable_wipes: 6
gcode:
{% if "xyz" not in printer.toolhead.homed_axes %}
G28
{% endif %}
SAVE_GCODE_STATE NAME=CLEAN_STATE
G90
G1 Z{safe_z} F3000
BRUSH_OUT
G4 P200
G1 X{brush_x_min} Y{brush_y} F20000
G1 Z{brush_z} F1200
{% for i in range(wipes) %}
G1 X{brush_x_max} F12000
G1 X{brush_x_min} F12000
{% endfor %}
G1 Z{safe_z} F3000
BRUSH_IN
RESTORE_GCODE_STATE NAME=CLEAN_STATE</code></pre><hr><p>⚠ Important</p><ul><li><p> Pins (<code>PA15</code>, <code>PD15</code>) are specific to my setup → adjust for your board </p></li><li><p> Servo angles (<code>45 / 132</code>) must be calibrated </p></li><li><p> Brush coordinates must be adjusted to your printer </p></li><li><p> Macro naming and logic are kept exactly as in my setup </p></li><li><p> Movement direction may differ depending on servo orientation </p></li></ul><p>Always test movements manually before first use</p><p> Use at your own risk</p><p> Demo</p><p>See the mechanism in action here:<br><a target="_blank" rel="noopener noreferrer nofollow" class="editor-link" href="https://www.youtube.com/@romankocurek5817/shorts">https://www.youtube.com/@romankocurek5817/shorts</a></p>