[gcode_macro clean_nozzle] # If you are putting your purge bucket at the rear left of the bed as per default installation, enable True on your location_bucket_rear # variable. If you want to put your purge bucket elsewhere (perhaps the front), then set it to False. See diagrams and description # further below on how to set your XY position. variable_location_bucket_rear: False # If you want the purging routine in your bucket enabled, set to True (and vice versa). variable_enable_purge: True # These parameters define your filament purging. The retract variable is used to retract right after purging to prevent unnecessary # oozing. Some filament are particularly oozy and may continue to ooze out of the nozzle for a second or two after retracting. The # ooze dwell variable makes allowance for this. Update as necessary. If you decided to not enable purge, you can ignore this section. variable_purge_len: 25 ; Amount of filament, in mm, to purge. variable_purge_spd: 300 ; Speed, in mm/min, of the purge. variable_purge_temp_min: 220 ; Minimum nozzle temperature to permit a purge. Otherwise, purge will not occur. variable_purge_ret: 0 ; Retract length, in mm, after purging to prevent slight oozing. Adjust as necessary. variable_ooze_dwell: 1 ; Dwell/wait time, in seconds, after purging and retracting. # Adjust this so that your nozzle scrubs within the brush. Currently defaulted to be a lot higher for safety. Be careful not to go too low! variable_brush_top: 8 # These parameters define your scrubbing, travel speeds, safe z clearance and how many times you want to wipe. Update as necessary. Wipe # direction is randomized based off whether the left or right bucket is randomly selected in the purge & scrubbing routine. variable_clearance_z: 10 ; When traveling, but not cleaning, the clearance along the z-axis between nozzle and brush. variable_wipe_qty: 3 ; Number of complete (A complete wipe: left, right, left OR right, left, right) wipes. variable_prep_spd_xy: 48000 ; Travel (not cleaning) speed along x and y-axis in mm/s. variable_prep_spd_z: 1500 ; Travel (not cleaning) speed along z axis in mm/s. variable_wipe_spd_xy: 5100 ; Nozzle wipe speed in mm/s. # These parameters define the size of the brush. Update as necessary. A visual reference is provided below. Note that orientation of # parameters remain the same whether bucket is at rear or front. # # ← brush_width → # _________________ ↑ # | | ↑ If you chose location_bucket_rear = True, Y position is acquired # brush_start (x) | | brush_depth from your stepper_y position_max. Adjust your brush physically in # |_________________| ↓ Y so that the nozzle scrubs within the brush. # (y) ↓ # brush_front # __________________________________________________________ # PRINTER FRONT # # ## For V1.8, you may need to measure where your brush is on the x axis and input manually into any of the variable_brush_start uncommented. variable_brush_start: 72 # This value is defaulted from brush location in CAD (rear left). Change if your brush width is different. variable_brush_width: 30 ## These are only used if location_bucket_rear is False. You specify a custom location in y axis for your brush - see diagram above. ## variable_brush_front: 301 variable_brush_depth: 4 # These parameters define the size of your purge bucket. Update as necessary. If you decided to not enable purge, you can ignore # this section. A visual reference is provided below. Note that orientation of parameters remain the same whether bucket is at rear # or front. # # bucket_gap # ← ---- → # __________________________________________ # | | | | # | | | | # bucket_start (x) | |______| | # | | | | # | | | | # |_________________|. . . |_________________| # ← ------------- → ← ------------- → # bucket_left_width bucket_right_width # _______________________________________________________________________________________ # PRINTER FRONT # ## For V2.4 250mm build, uncomment below variable_bucket_left_width: 42 # These values are defaulted from bucket geometry in CAD (rear left location). Change only if you're using a custom bucket. variable_bucket_right_width: 40 variable_bucket_gap: 22 # 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 # installation of purge bucket at rear left. variable_bucket_start: 38 ############################################################################################################################################### ############################################################################################################################################### ### From here on, unless you know what you're doing, it's recommended not to change anything. Feel free to peruse the code and reach out to me ### (edwardyeeks#6042) on Discord if you spot any problems! ############################################################################################################################################### ############################################################################################################################################### # Placeholder. The variable will later be set to contain, at random, a number representing the left or right bucket. variable_bucket_pos: 1 gcode: # First, check if the axes are homed. {% if "xyz" in printer.toolhead.homed_axes %} ## Save the gcode state in this macro instance. SAVE_GCODE_STATE NAME=clean_nozzle ## Set to absolute positioning. G90 ## Grab max position of Y-axis from config to use in setting a fixed y position for location_bucket_rear = True. {% set Ry = printer.configfile.config["stepper_y"]["position_max"]|float %} ## Check if user enabled purge option or not. {% if enable_purge %} ### Randomly select left or right bin for purge. 0 = left, 1 = right SET_GCODE_VARIABLE MACRO=clean_nozzle VARIABLE=bucket_pos VALUE={(range(2) | random)} ### Raise Z for travel. G1 Z{brush_top + clearance_z} F{prep_spd_z} ### Position for purge. Randomly selects middle of left or right bucket. It references from the middle of the left bucket. G1 X{bucket_start + (bucket_left_width / (2 - bucket_pos)) + (bucket_pos * bucket_gap) + (bucket_pos * (bucket_right_width / 2))} F{prep_spd_xy} ### Check if user chose to use rear location. {% if location_bucket_rear %} G1 Y{Ry} F{prep_spd_xy} {% else %} G1 Y{brush_front + (brush_depth / 2)} F{prep_spd_xy} {% endif %} ### Perform purge if the temp is up to min temp. If not, it will skip and continue executing rest of macro. Small retract after ### purging to minimize any persistent oozing at 5x purge_spd. G4 dwell is in milliseconds, hence * 1000 in formula. {% if printer.extruder.temperature >= purge_temp_min %} M83 ; relative mode G1 E{purge_len} F{purge_spd} G92 E0 ; reset extruder before retract G1 E-{purge_ret} F{purge_spd * 5} G4 P{ooze_dwell * 1000} {% endif %} {% endif %} ## Position for wipe. Either left or right of brush based off bucket_pos to avoid unnecessary travel. G1 Z{brush_top + clearance_z} F{prep_spd_z} G1 X{brush_start + (brush_width * bucket_pos)} F{prep_spd_xy} ## Check if user chose to use rear location. {% if location_bucket_rear %} G1 Y{Ry} {% else %} G1 Y{brush_front + (brush_depth / 2)} {% endif %} ## Move nozzle down into brush. G1 Z{brush_top} F{prep_spd_z} ## Perform wipe. Wipe direction based off bucket_pos for cool random scrubby routine. {% for wipes in range(1, (wipe_qty + 1)) %} G1 X{brush_start + (brush_width * (1 - bucket_pos))} F{wipe_spd_xy} G1 X{brush_start + (brush_width * bucket_pos)} F{wipe_spd_xy} {% endfor %} ## Clear from area. M117 Cleaned! G1 Z{brush_top + clearance_z} F{prep_spd_z} ## Restore the gcode state to how it was before the macro. RESTORE_GCODE_STATE NAME=clean_nozzle MOVE=1 MOVE_SPEED=500 {% else %} ## raise error will stop any macros that clean_nozzle is referenced in from proceeding for safety. { action_raise_error("Please home your axes!") } M117 Please home first! {% endif %}