├── README.md ├── cad └── Voron 2.4 Nozzle Cleaner mod.f3d ├── clean_nozzle.cfg ├── images └── cleaner_render.png └── stl ├── nozzle_purge_bumper_holder.stl ├── nozzle_purge_sheet_endstop_holder.stl └── ptfe_tube_cutter.stl /README.md: -------------------------------------------------------------------------------- 1 | # nozzle-cleaner 2 | [![Stencil Fix Portable YouTube video](https://i.ytimg.com/vi/U1onfGroUJI/maxresdefault.jpg)](https://youtu.be/U1onfGroUJI "Stencil Fix Portable") 3 | 4 | ## Built 5 | ![asdf](images/cleaner_render.png) 6 | 7 | Print `nozzle_purge_bumper_holder.stl` and `nozzle_purge_sheet_endstop_holder.stl`. In addition, print `ptfe_tube_cutter.stl` for cutting the PTFE tube. And choose one of the buckets form the [original mod](https://github.com/VoronDesign/VoronUsers/tree/main/orphaned_mods/edwardyeeks/Decontaminator_Purge_Bucket_%26_Nozzle_Scrubber/STLs) (any of `purge_bucket_*mm_rev4.stl`). 8 | 9 | The [YouTube video](https://youtu.be/U1onfGroUJI) shows how to install the mod. 10 | 11 | ## BOM 12 | | Part | Amount | Comment | 13 | |---|---|---| 14 | | M3*16 socket head screw | 2 | For build plate to index against | 15 | | M3*8 socket head screw | 3 | Mounting mod to plate | 16 | | M2*20 socket head screw | 1 | To mount PTFE tube | 17 | | 12.1mm PTFE tube | 1 | | 18 | | 6x3mm round magnets | 2 | For the purge bucket to connect to screws | 19 | | M3*16 socket head screw | 1 | [optional] For PTFE cutter | 20 | | M3 nut | 1 | [optional] For PTFE cutter | 21 | 22 | ## Config 23 | The macro for cleaning the nozzle can be found in `clean_nozzle.cfg`. I use it in the print start macro as follows 24 | 25 | ``` 26 | [include clean_nozzle.cfg] 27 | 28 | # from https://github.com/jontek2/A-better-print_start-macro 29 | [gcode_macro PRINT_START] 30 | gcode: 31 | # This part fetches data from your slicer. Such as bed temp, extruder temp, chamber temp and size of your printer. 32 | {% set target_bed = params.BED|int %} 33 | {% set target_extruder = params.EXTRUDER|int %} 34 | {% set target_chamber = params.CHAMBER|default("40")|int %} 35 | {% set x_wait = printer.toolhead.axis_maximum.x|float / 2 %} 36 | {% set y_wait = printer.toolhead.axis_maximum.y|float / 2 %} 37 | 38 | # Homes the printer, sets absolute positioning and updates the Stealthburner leds. 39 | STATUS_HOMING # Sets SB-leds to homing-mode 40 | G28 # Full home (XYZ) 41 | G90 # Absolut position 42 | 43 | ## Uncomment for bed mesh (1 of 2) 44 | BED_MESH_CLEAR # Clears old saved bed mesh (if any) 45 | 46 | # Checks if the bed temp is higher than 90c - if so then trigger a heatsoak. 47 | {% if params.BED|int > 90 %} 48 | SET_DISPLAY_TEXT MSG="Bed: {target_bed}c" # Displays info 49 | STATUS_HEATING # Sets SB-leds to heating-mode 50 | M106 S255 # Turns on the PT-fan 51 | 52 | ## Uncomment if you have a Nevermore. 53 | SET_FAN_SPEED FAN=BedFans SPEED=1.0 # Turns on the nevermore 54 | 55 | G1 X{x_wait} Y{y_wait} Z15 F9000 # Goes to center of the bed 56 | M190 S{target_bed} # Sets the target temp for the bed and wait 57 | SET_DISPLAY_TEXT MSG="Heatsoak: {target_chamber}c" # Displays info 58 | TEMPERATURE_WAIT SENSOR="temperature_sensor chamber_temp" MINIMUM={target_chamber} # Waits for chamber to reach desired temp 59 | 60 | # If the bed temp is not over 90c, then it skips the heatsoak and just heats up to set temp with a 5min soak 61 | {% else %} 62 | SET_DISPLAY_TEXT MSG="Bed: {target_bed}c" # Displays info 63 | STATUS_HEATING # Sets SB-leds to heating-mode 64 | G1 X{x_wait} Y{y_wait} Z15 F9000 # Goes to center of the bed 65 | M190 S{target_bed} # Sets the target temp for the bed and wait 66 | # not convinced that is needed for PLA and the likes 67 | # SET_DISPLAY_TEXT MSG="Soak for 5min" # Displays info 68 | # G4 P300000 # Waits 5 min for the bedtemp to stabilize 69 | {% endif %} 70 | 71 | # Go to purge bucket, heat to target temp, purge, cool to 150, wipe nozzle 72 | clean_nozzle PURGE={target_extruder} CLEAN=150 73 | 74 | # Heating nozzle to 150 degrees. This helps with getting a correct Z-home 75 | SET_DISPLAY_TEXT MSG="Hotend: 150c" # Displays info 76 | M109 S150 # Heats the nozzle to 150c 77 | 78 | # Quad gantry level AKA QGL 79 | SET_DISPLAY_TEXT MSG="QGL" # Displays info 80 | STATUS_LEVELING # Sets SB-leds to leveling-mode 81 | quad_gantry_level # Levels the buildplate via QGL 82 | G28 Z # Homes Z again after QGL 83 | 84 | # Bed mesh (2 of 2) 85 | SET_DISPLAY_TEXT MSG="Bed mesh" # Displays info 86 | STATUS_MESHING # Sets SB-leds to bed mesh-mode 87 | bed_mesh_calibrate # Starts bed mesh 88 | 89 | # Go to purge bucket, heat to target temp, wipe nozzle 90 | clean_nozzle CLEAN={target_extruder} 91 | 92 | # Heats up the nozzle up to target via data from slicer 93 | SET_DISPLAY_TEXT MSG="Hotend: {target_extruder}c" # Displays info 94 | STATUS_HEATING # Sets SB-leds to heating-mode 95 | G1 X{x_wait} Y{y_wait} Z15 F9000 # Goes to center of the bed 96 | M107 # Turns off partcooling fan 97 | M109 S{target_extruder} # Heats the nozzle to printing temp 98 | 99 | # Gets ready to print by doing a purge line and updating the SB-leds 100 | SET_DISPLAY_TEXT MSG="Printer goes brr" # Displays info 101 | STATUS_PRINTING # Sets SB-leds to printing-mode 102 | G0 X{x_wait - 50} Y4 F10000 # Moves to starting point 103 | G0 Z0.4 # Raises Z to 0.4 104 | G91 # Incremental positioning 105 | G1 X100 E20 F1000 # Purge line 106 | G90 # Absolut position 107 | ``` 108 | 109 | The macro can also be called from the command line for testing like so: 110 | 111 | ``` 112 | clean_nozzle PURGE=215 CLEAN=150 # Go to purge bucket, heat to target temp, purge, cool to 150, wipe nozzle 113 | clean_nozzle PURGE=215 # Go to purge bucket, heat to target temp, purge, wipe nozzle 114 | clean_nozzle # Go to purge bucket, wipe nozzle 115 | ``` 116 | 117 | ## Acknowledgement 118 | This mod is based on the [Decontaminator Purge Bucket & Nozzle Scrubber](https://github.com/VoronDesign/VoronUsers/tree/main/orphaned_mods/edwardyeeks/Decontaminator_Purge_Bucket_%26_Nozzle_Scrubber) mod from @edwardyeeks. The macro is also heavily inspired by Edward's excellent work. Thanks a bunch ❤️ -------------------------------------------------------------------------------- /cad/Voron 2.4 Nozzle Cleaner mod.f3d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scheffield/nozzle-cleaner/22cd6a86ce85f3a63952d14af2c1294e272a8384/cad/Voron 2.4 Nozzle Cleaner mod.f3d -------------------------------------------------------------------------------- /clean_nozzle.cfg: -------------------------------------------------------------------------------- 1 | # Inspired by https://github.com/VoronDesign/VoronUsers/blob/master/orphaned_mods/printer_mods/edwardyeeks/Decontaminator_Purge_Bucket_%26_Nozzle_Scrubber/Macros/nozzle_scrub.cfg 2 | ####################################################################################################################################### 3 | 4 | # The goal of this macro is to provide a nozzle cleaning and purging routine that is easily copied/referenced into your printer.cfg. 5 | # Users can simply change parameters and enable/disable options in the first half. Descriptions are plentiful, making this macro 6 | # look huge but informative and are laid out in sequence to be read first describing the line below; PLEASE READ CAREFULLY. 7 | 8 | # This sample config assumes the following: The user has implemented the default decontaminator purge bucket & nozzle cleaner mod 9 | # for the VORON 1/2. It can be tweaked to customised purge bucket geometries. 10 | 11 | # Features in this macro: option of putting the bucket at the rear or front of the bed. Purge routine that can be enabled/disabled. 12 | # By default, bucket is located at rear left of bed and purge routine is enabled. The purge and scrubbing routine is randomized 13 | # in either left or right bucket to ensure as even as possible distribution of filament gunk. 14 | 15 | # Default parameters are set for safe speeds and movements. Where necessary, tweak the parameters for the nozzle scrub procedure 16 | # to fit your printer. 17 | 18 | ####################################################################################################################################### 19 | 20 | [gcode_macro clean_nozzle] 21 | # Name of the macro is clean_nozzle. 22 | 23 | # These parameters define your filament purging. The retract variable is used to retract right after purging to prevent unnecessary 24 | # oozing. Some filament are particularly oozy and may continue to ooze out of the nozzle for a second or two after retracting. The 25 | # ooze dwell variable makes allowance for this. Update as necessary. If you decided to not enable purge, you can ignore this section. 26 | variable_purge_len: 10 ; Amount of filament, in mm, to purge. 27 | variable_purge_spd: 200 ; Speed, in mm/min, of the purge. 28 | variable_purge_temp_min: 150 ; Minimum nozzle temperature to permit a purge. Otherwise, purge will not occur. 29 | variable_purge_ret: 2 ; Retract length, in mm, after purging to prevent slight oozing. Adjust as necessary. 30 | variable_ooze_offset_z: 40 ; After purging, how far up to move Z, in mm. 31 | variable_ooze_spd_z: 120 ; After purging, how fast to move up Z, in mm/min. 32 | 33 | # Adjust this so that your nozzle hits the tube. The nozzle should hit the upper 1/4th to 1/2nd part of the tube. 34 | variable_tube_top: 4.5 ; Z position in mm 35 | 36 | # These parameters define your cleaning, travel speeds, safe z clearance and how many times you want to wipe. Update as necessary. Wipe 37 | # direction is randomized based off whether the left or right bucket is randomly selected in the purge & scrubbing routine. 38 | variable_clearance_z: 5 ; When traveling, but not cleaning, the clearance along the z-axis between nozzle and tube. 39 | variable_wipe_qty: 2 ; Number of complete (A complete wipe: left, right, left OR right, left, right) wipes. 40 | variable_prep_spd_xy: 6000 ; Travel (not cleaning) speed along x and y-axis in mm/min. 41 | variable_prep_spd_z: 1500 ; Travel (not cleaning) speed along z axis in mm/min. 42 | variable_wipe_spd_xy: 5000 ; Nozzle wipe speed in mm/min. 43 | 44 | # Tube position 45 | variable_tube_x: 110 # X position of tube, Y is assumed to be 0 46 | 47 | # This value is defaulted from tube location in CAD (rear left). 48 | variable_wipe_travel: 20 # distance to travel when claening in mm 49 | 50 | # These parameters define the size of your purge bucket. Update as necessary. If you decided to not enable purge, you can ignore 51 | # this section. A visual reference is provided below. 52 | # 53 | # bucket_gap 54 | # ← ---- → 55 | # __________________________________________ 56 | # | | | | 57 | # | | | | 58 | # bucket_start (x) | |______| | 59 | # | | | | 60 | # | | | | 61 | # |_________________|. . . |_________________| 62 | # ← ------------- → ← ------------- → 63 | # bucket_left_width bucket_right_width 64 | # _______________________________________________________________________________________ 65 | # PRINTER FRONT 66 | # 67 | ## For V2.4 250mm build, uncomment below 68 | #variable_bucket_left_width: 42 69 | 70 | ## For V2.4 300mm build, uncomment below 71 | #variable_bucket_left_width: 67 72 | 73 | ## For V2.4 350mm build, uncomment below 74 | variable_bucket_left_width: 92 75 | 76 | # These values are defaulted from bucket geometry in CAD (rear left location). Change only if you're using a custom bucket. 77 | variable_bucket_right_width: 40 78 | variable_bucket_gap: 22 79 | 80 | # For V1.8, you may need to measure where your bucket start is and input into bucket_start. Otherwise, a value of 0 is for a default 81 | # installation of purge bucket at rear left. 82 | variable_bucket_start: 0 83 | 84 | ############################################################################################################################################### 85 | ############################################################################################################################################### 86 | 87 | ### From here on, unless you know what you're doing, it's recommended not to change anything 88 | 89 | ############################################################################################################################################### 90 | ############################################################################################################################################### 91 | 92 | # Placeholder. The variable will later be set to contain, at random, a number representing the left or right bucket. 93 | variable_bucket_pos: 1 94 | 95 | gcode: 96 | 97 | # Temperature in °C at which the filament is extruded/purged. Should be the print temperature. If no temperature or below 150 °C is 98 | # specified, no purging will happen. 99 | {% set purge_temp = params.PURGE|default("0")|int %} 100 | # Temperature in °C below which the nozzle is whiped over the tube. If not termperature is defined, the cleaning will happen without 101 | # waiting to reach any particular temperature. 102 | {% set clean_temp = params.CLEAN|default("0")|int %} 103 | 104 | # First, check if the axes are homed. 105 | {% if "xyz" in printer.toolhead.homed_axes %} 106 | 107 | # Save the gcode state in this macro instance. 108 | SAVE_GCODE_STATE NAME=clean_nozzle 109 | 110 | # Set to absolute positioning. 111 | G90 112 | 113 | SET_DISPLAY_TEXT MSG="Cleaning nozzle" ; Displays info 114 | 115 | # Grab max position of Y-axis from config to use in setting a fixed y position. 116 | {% set Ry = printer.configfile.config["stepper_y"]["position_max"]|float %} 117 | 118 | # Randomly select left or right bin for purge. 0 = left, 1 = right 119 | SET_GCODE_VARIABLE MACRO=clean_nozzle VARIABLE=bucket_pos VALUE={(range(2) | random)} 120 | 121 | # Raise Z for travel. 122 | G1 Z{tube_top + clearance_z} F{prep_spd_z} 123 | # Position for purge. Randomly selects middle of left or right bucket. It references from the middle of the left bucket. 124 | G1 Y{Ry} F{prep_spd_xy} 125 | G1 X{bucket_start + (bucket_left_width / (2 - bucket_pos)) + (bucket_pos * bucket_gap) + (bucket_pos * (bucket_right_width / 2))} 126 | 127 | # Purge filament if temp above 150 °C is specified 128 | {% if purge_temp > purge_temp_min %} 129 | # Lower as far as we can go 130 | G1 Z{tube_top} F{prep_spd_z} 131 | # Heats up the nozzle up to target via data from slicer 132 | SET_DISPLAY_TEXT MSG="Hotend: {purge_temp}c" ; Displays info 133 | STATUS_HEATING ; Sets SB-leds to heating-mode 134 | M107 ; Turns off partcooling fan 135 | M109 S{purge_temp} ; Heats the nozzle to printing temp 136 | 137 | ### Small retract after purging to minimize any persistent oozing at 5x purge_spd. G4 dwell is in milliseconds, 138 | ### hence * 1000 in formula. 139 | M83 ; relative mode 140 | G1 E{purge_len} F{purge_spd} 141 | G1 E-{purge_ret} F{purge_spd * 5} 142 | M106 S127 ; use part cooling to harden the material 143 | G92 E0 ; reset extruder 144 | {% endif %} 145 | 146 | # Wait till hotend is below given temperature if provided 147 | {% if clean_temp > 0 %} 148 | # Cooling nozzle to a given temperature. This helps with cleanly breaking off extruded filament 149 | SET_DISPLAY_TEXT MSG="Hotend: {clean_temp}c" ; Displays info 150 | M104 S{clean_temp} ; Heats the nozzle to 150c without waiting 151 | G1 Z{tube_top + ooze_offset_z} F{ooze_spd_z} ; Slowly moving up to ensure ooze is straight and can be broken off 152 | M109 S{clean_temp} ; Actually waiting for temperature to reach 153 | M107 ; stop part cooling fan 154 | {% endif %} 155 | 156 | # Position for wipe. Either left or right of tube based off bucket_pos to avoid unnecessary travel. 157 | G1 Z{tube_top + clearance_z} F{prep_spd_z} 158 | G1 X{tube_x + (wipe_travel / 2 * (bucket_pos * 2 - 1))} F{prep_spd_xy} 159 | G1 Y{Ry} 160 | 161 | # Move nozzle down to hit the tube. 162 | G1 Z{tube_top} F{prep_spd_z} 163 | 164 | # Perform wipe. Wipe direction based off bucket_pos for cool random scrubby routine. 165 | {% for wipes in range(1, (wipe_qty + 1)) %} 166 | G1 X{tube_x - (wipe_travel / 2 * (bucket_pos * 2 - 1))} F{wipe_spd_xy} 167 | G1 X{tube_x + (wipe_travel / 2 * (bucket_pos * 2 - 1))} F{wipe_spd_xy} 168 | {% endfor %} 169 | 170 | # Clear from area. 171 | SET_DISPLAY_TEXT MSG="Nozzle cleaned" 172 | G1 Z{tube_top + clearance_z} F{prep_spd_z} 173 | G1 X{bucket_start + (bucket_left_width / 4)} F{prep_spd_xy} #bugfix for right side mounted buckets 174 | 175 | # Restore the gcode state to how it was before the macro. 176 | RESTORE_GCODE_STATE NAME=clean_nozzle 177 | 178 | {% else %} 179 | 180 | # raise error will stop any macros that clean_nozzle is referenced in from proceeding for safety. 181 | { action_raise_error("Please home your axes!") } 182 | SET_DISPLAY_TEXT MSG="Please home first!" 183 | 184 | {% endif %} 185 | -------------------------------------------------------------------------------- /images/cleaner_render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scheffield/nozzle-cleaner/22cd6a86ce85f3a63952d14af2c1294e272a8384/images/cleaner_render.png -------------------------------------------------------------------------------- /stl/nozzle_purge_bumper_holder.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scheffield/nozzle-cleaner/22cd6a86ce85f3a63952d14af2c1294e272a8384/stl/nozzle_purge_bumper_holder.stl -------------------------------------------------------------------------------- /stl/nozzle_purge_sheet_endstop_holder.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scheffield/nozzle-cleaner/22cd6a86ce85f3a63952d14af2c1294e272a8384/stl/nozzle_purge_sheet_endstop_holder.stl -------------------------------------------------------------------------------- /stl/ptfe_tube_cutter.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scheffield/nozzle-cleaner/22cd6a86ce85f3a63952d14af2c1294e272a8384/stl/ptfe_tube_cutter.stl --------------------------------------------------------------------------------