Get Free Shipping & Prusaments with the Prusa XL Summer Deal!

Salad Fork Bambulab Nozzle Brush and Bucket

Remake of Dr. Mursey's nozzle scrubber using a Bambulab nozzle brush to fit my 160mm Salad Fork with a Custom Bed.
8
42
0
235
updated September 11, 2024

Description

PDF

This Nozzle Brush and Bucket were inspired by Dr. Mursey's version, but since there were no CAD files or anything I created everything from scratch, but took some measurements from his version.
Notable differences are that it's 3mm higher, not sure if my bed is thicker, but it was a little low for my liking. Its also alot shorter since i have a 160mm Salad fork, although i have a larger custom bed, but the Ears on my bed interfered with his version. The Mounting is different and i used M3x8 BHCS for that, but SHCS should work aswell. I added some guides for the extrusion aswell.
On the back of the brush holder aswell as the part of the bucket that touches the brush holder, i made a little chamfer to let debris slide down into the bucket more easily so it does not accumulate on the side of the holder or bucket.

Here is my two macro's that i use for scrubbing in a zigzaq motion:

[gcode_macro _MOVE_TO_PURGE_BUCKET]
variable_purge_position_x: 138.0                       ; x position for purge position
variable_purge_position_y: 192.0                       ; y position for purge position
variable_purge_position_z: 1.0                         ; z position for purge position

gcode:
    G1 X{purge_position_x} Y{purge_position_y} F10000  ; move nozzle above purge bucket
    G1 Z{purge_position_z} F10000                      ; move down to bucket height


[gcode_macro CLEAN_NOZZLE]
variable_invert_brush_direction: False            # False = brushing from right to Left, True = brushing from left to right

variable_brush_position_x_left:   88.0            ; x position to the left side of the Brush
variable_brush_position_x_right: 128.0             ; x position to the right side of the Brush
variable_brush_position_y_front: 186.0             ; y position to the front of the Brush
variable_brush_position_y_back:  191.5             ; y position to the back of the Brush
variable_rest_position_z:         10               ; z position for resting
variable_brushing_height:        10.0               ; 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!

# These parameters define your scrubbing, travel speeds, safe z clearance and how many times you want to wipe. Update as necessary.
variable_clearance_z:           10         ; When traveling, but not cleaning, the clearance along the z-axis between nozzle and brush.
variable_wipe_qty:              10         ; Number of complete (A complete wipe: left, right, left) wipes.
variable_zigzaq_qty:            5           ; Number of Zigzaq movements

variable_prep_spd_xy:        5000         ; Travel (not cleaning) speed along x and y-axis in mm/min.
variable_prep_spd_z:         1500         ; Travel (not cleaning) speed along z axis in mm/min.
variable_wipe_spd_xy:        10000        ; Nozzle wipe speed in mm/min.

gcode:
    {% set zigzaq_amount_x_per_movement = (brush_position_x_right - brush_position_x_left) / zigzaq_qty %}
    
    # 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

      {% if invert_brush_direction %}
          ## Position for wipe. Either left or right of brush based of variable_invert_brush_direction.
          G1 Z{rest_position_z + clearance_z} F{prep_spd_z}
          G1 X{brush_position_x_left} Y{brush_position_y_back} F{prep_spd_xy}

          ## Move nozzle down into brush.
          G1 Z{brushing_height} F{prep_spd_z}
   
          ## Perform wipe. Wipe direction based off variable_invert_brush_direction.
          {% for wipes in range(1, (wipe_qty + 1)) %}

            {% for zigzaq in range(1, (zigzaq_qty + 1)) %}

              G1 X{brush_position_x_left + ((zigzaq_amount_x_per_movement * zigzaq) - (zigzaq_amount_x_per_movement / 2))} Y{brush_position_y_front} F{wipe_spd_xy}
              G1 X{brush_position_x_left + (zigzaq_amount_x_per_movement * zigzaq)} Y{brush_position_y_back} F{wipe_spd_xy}
            
            {% endfor %}

            {% for zigzaq in range(1, (zigzaq_qty + 1)) %}

              G1 X{brush_position_x_right - ((zigzaq_amount_x_per_movement * zigzaq) - (zigzaq_amount_x_per_movement / 2))} Y{brush_position_y_front} F{wipe_spd_xy}
              G1 X{brush_position_x_right - (zigzaq_amount_x_per_movement * zigzaq)} Y{brush_position_y_back} F{wipe_spd_xy}
            
            {% endfor %}

          {% endfor %}
      {% else %}
          ## Position for wipe. Either left or right of brush based of variable_invert_brush_direction.
          G1 Z{rest_position_z + clearance_z} F{prep_spd_z}
          G1 X{brush_position_x_right} Y{brush_position_y_back} F{prep_spd_xy}

          ## Move nozzle down into brush.
          G1 Z{brushing_height} F{prep_spd_z}
   
          ## Perform wipe. Wipe direction based off variable_invert_brush_direction.
          {% for wipes in range(1, (wipe_qty + 1)) %}

            {% for zigzaq in range(1, (zigzaq_qty + 1)) %}

              G1 X{brush_position_x_right - ((zigzaq_amount_x_per_movement * zigzaq) - (zigzaq_amount_x_per_movement / 2))} Y{brush_position_y_front} F{wipe_spd_xy}
              G1 X{brush_position_x_right - (zigzaq_amount_x_per_movement * zigzaq)} Y{brush_position_y_back} F{wipe_spd_xy}
            
            {% endfor %}

            {% for zigzaq in range(1, (zigzaq_qty + 1)) %}

              G1 X{brush_position_x_left + ((zigzaq_amount_x_per_movement * zigzaq) - (zigzaq_amount_x_per_movement / 2))} Y{brush_position_y_front} F{wipe_spd_xy}
              G1 X{brush_position_x_left + (zigzaq_amount_x_per_movement * zigzaq)} Y{brush_position_y_back} F{wipe_spd_xy}
            
            {% endfor %}

          {% endfor %}
      {% endif %}

      ## Move to rest position.
      {% if invert_brush_direction %}
          #M117 Cleaned!
          G1 Z{rest_position_z + clearance_z} F{prep_spd_z}
          G1 X{brush_position_x_left} Y{brush_position_y_back} F{prep_spd_xy}
      {% else %}
          #M117 Cleaned!
          G1 Z{rest_position_z + clearance_z} F{prep_spd_z}
          G1 X{brush_position_x_right} Y{brush_position_y_back} F{prep_spd_xy}
      {% endif %}

      ## Restore the gcode state to how it was before the macro.
      RESTORE_GCODE_STATE NAME=clean_nozzle

    {% 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 %}

Tags



Model origin

The author marked this model as their own original creation.

License