1 / 9
QIDI X-Max 3 (Post Extruder) Filament cutter (Updated) — zdjęcie 1
1 / 9

QIDI X-Max 3 (Post Extruder) Filament cutter (Updated)

Zamów wydruk tego modelu

Obliczymy ostateczną cenę na podstawie wybranego pliku. Sprawdzisz ją i zaakceptujesz przed płatnością.

Zapisane na tym urządzeniu.

QIDI X-Max 3 extruder with ECAS fitting and runout sensor and extruder disengage slot.

Ocena
5 / 5
Polubienia
56
Pobrania
218
Wydruki
3
Wyświetlenia
1679
Oceny
2

Aktualizacja u źródła:

Informacje o modelu

Źródło
Printables
Licencja
Creative Commons — Attribution

Updated: (11/4/2025)

This Extruder Assembly has been working well for me so I'm going to call it good enough. Feel free to remix as you need!

https://vimeo.com/manage/videos/1077693101/502d7b66e4

---------------------------------

This will need a new homing procedure not to crash the head on the cutter arm. See bottom for changes.

Note: The homing procedures are for FreeDi which replaces QIDI's Klipper. Please update QIDI's Klipper as needed to prevent crashes.  

------------------------------

Goal

The goal of this project is to add an integrated filament cutter that minimizes waste while keeping the rest of the printer as stock as possible.

This design is a modified version of the original extruder body. It includes a filament cutter "blade port" positioned directly above the hotend and has been simplified for easier printing. 

Side note: QIDI originally had a design for this but not on the release model I have. 

In addition to the filament cutter, this modification incorporates a filament runout sensor placed above the extruder. The runout sensor utilizes a 5 mm bearing (original this was a 4.5mm BB) and an Omron D2F style limit switch: https://www.digikey.com/en/products/detail/omron-electronics-inc-emc-div/D2F/83270

Required: 

Printed Parts

  • Extruder Cover (Front (no supports needed), Left Panel, Right Panel) 
  • Lever Arm
  • Lever Arm Spacer
  • Blade Holder (print a few) 
    • Notes 
      • I printed in ABS with 40% infill and 4 walls.
      • The Left and Right Panels as well as the lever arm need support everything else should be fine.
      • I was having issues with the tabs snapping no matter how I printed them so I broke it up into multiple parts them printed for strength. As a plus this makes it easier to transfer the extruder fan. 

Filament Sensor

  • 1x 5mm Bearing
  • 1x Omron D2F style limit switch
  • 2x Self-tapping M2x8mm screws
  • Optional but helpful: long M2 screws to adjust the limit switch

Extruder

  • ECAS04
  • 4x M3 heat set inserts of any length for the extruder body
  • 2x M3x4 heat set inserts for the hotend mount holes
  • 2x M3 heat set inserts of any length for the cover if you print this in multiple pieces. 

Cutter

  • 18mm Snap-off Blade with 8mm segments - I bought mine at Harbor Freight.
  • 1x M3X20 screw
  • 4 mm OD, 0.5mm Wire Size, 15 mm compression spring - It is important that these are stiff, I got mine from my Box Turtle Kit 
  • Superglue

Instructions (in work):

Extruder 

  • Insert the ECAS fitting (this should be hard to insert, I pressed it in using a vise)
  • Filament Sensor 
    • Insert the 5mm bearing ensuring that it moves freely. 
    • Insert the limit switch in the correct orientation
    • Insert the optional M2 screws to apply pressure light pressure to the switch.
    • To adjust the placement of the switch take a piece of filament and insert it in the extruder listening for a click as you insert it.
      • If you don't hear a click tighten the M2 screws and try again.
      • It is critical that you ensure that the switch is triggered by the filament before setting its placement permanently.
    • Use the Self-tapping M2 screws set the switch location. 
  • Transfer the extruder hardware from the stock extruder. Be careful not to lose the tension spring or the gear bearings. The print is designed without tolerances for the bearings or gear pins, so some hardware mainly the dowel pins, may be difficult to insert.
    • I pressed in the bearing and reamed the dowel hole with a 3mm bit.
      • This will still be tight fit but easer to remove if needed. 
  • Insert 4 M3 heat-set inserts into the extruder body flush. 
  • For the hotend, ensure the inserts are 4mm or less.
  • Reassemble the extruders gears and reattach the back plate
  • Check that the gears turn freely
  •  
  • Notes 
    • Don't attach the hotend yet; you will want it off to verify blade length and smooth movement. 
    • Ensure that no plastic is displaced that will cause the blade to bind.
    • The have been increased to 4.2 mm but might still be slightly undersized 
      • Ensure the tenson spring is not binding on the plastic was displaced by the insert. 

Blade Holder

-----Use Caution when handling and snaping the blades!

  • The holder is designed for a 8mm wide section from a snap-off box cutter blade
    • The blade needs to be snapped to a length of of approximately ~18mm (measures from the cutting edge) or slightly less.
    • Insert the blade into the holder such that the lever assembly is around 25.7mm (This is what worked for me through guess and check)
    • Glue the blade into the holder.
    • Now is a good time to check that the blade is free moving in the extruder blade slot and that it extends past the filament hole by at least 1mm. 
    • Note
      • I used a vise and pliers to snap this to make clean(er) breaks but even then it wasn't consistent. 
      • The goal is to have a blade length that is long enough to cut the filament but isn't so long that it binds when retracted by the spring. 
      • It is hard to snap this exactly and this might take a few tries.
      • This section will probably require trial and error.
        • The lever arm length and hole depth were fiddly to get just right and may require adjusting to get the correct blade length. 

Lever Arm

  • Screw the assembled holder into the lever with two short M2 screws, 
    • Don't over tighten these since they should be free moving. 
  • Insert the M3x20 mm screw into the lever arm (these should be relatively free moving on the screw. 
  • Insert the screw into the printed spacer.
  • Screw the lever are onto the preexisting hole with a threaded insert next to the hotend

___________________________________________

!!!!!Please backup all of your configuration files before making changes!!!!!

I had to change the homing location from front left to rear center. This requires updating both the printer configuration and the homing macro. 

Needed for new homing procedure:

FreeDi printer.cfg
#####################################################################
# Drives
#####################################################################
[stepper_x]
position_min: -8   #Update for new homing procedure
position_endstop: 328  #Update for new homing procedure
position_max: 328  #Update for new homing procedure

[stepper_y] position_min: -15 #Update for new homing procedure position_endstop: 331 #Update for new homing procedure position_max: 331 #Update for new homing procedure

FreeDi macros.cfg
#####################################################################

Homing modification

##################################################################### [gcode_macro G28] rename_existing: G28.1 gcode: {% set reduced_current_x = 0.6 %} {% set reduced_current_y = 0.7 %} {% set home_all = ('X' in rawparams.upper() and 'Y' in rawparams.upper() and 'Z' in rawparams.upper()) or ('X' not in rawparams.upper() and 'Y' not in rawparams.upper() and 'Z' not in rawparams.upper()) %} {% set home_current_x = printer.configfile.settings['tmc2209 stepper_x'].run_current * reduced_current_x %} {% set home_current_y = printer.configfile.settings['tmc2209 stepper_y'].run_current * reduced_current_y %}

{% set init_XY_move = -30 %}
#{% set y_init_move = 5 %}
{% set z_clearance = 2 %}


{% set home_all_final_position_x = printer.toolhead.axis_maximum.x / 2 %}
{% set home_all_final_position_y = printer.toolhead.axis_maximum.y / 2 %}
{% set home_all_final_position_z = 20 %}


# If homing should at least move X or Y axis
{% if home_all or 'X' in rawparams.upper() or 'Y' in rawparams.upper() %}    
    # Check if Z is homed
    {% if 'z' in printer.toolhead.homed_axes %}
        {% set Z_axis_was_homed = true %}                                                                       ; Set Z_axis_was_homed to true if Z is already homed
        G91                                                                                                     ; Use relative positioning
        G1 Z2 F600                                                                                              ; Move bed down
        G90                                                                                                     ; Use absolute positioning
    {% else %}
        {% set Z_axis_was_homed = false %}                                                                      ; Set Z_axis_was_homed to false if Z is not homed
        FORCE_MOVE STEPPER=stepper_z DISTANCE={z_clearance} VELOCITY=10                                         ; Move bed down
    {% endif %}
{% endif %}


{% if home_all or 'X' in rawparams.upper() or 'Y' in rawparams.upper() %}
    G91                                                                                                         ; Use relative positioning
    FORCE_MOVE STEPPER=stepper_x DISTANCE={init_XY_move} VELOCITY=40                                            ; Move X a little before homing
    SET_KINEMATIC_POSITION X={printer.toolhead.position.x + (init_XY_move/2)}                                   ; Compensate the FORCE_MOVE position
    SET_KINEMATIC_POSITION Y={printer.toolhead.position.y + (init_XY_move/2)}                                   ; Compensate the FORCE_MOVE position
    G90                                                                                                         ; Use absolute positioning
{% endif %}

Home X

{% if home_all or 'X' in rawparams.upper() %}        
    SET_TMC_CURRENT STEPPER=stepper_x CURRENT={home_current_x}                                                  ; Lower motor current
    SET_TMC_CURRENT STEPPER=stepper_y CURRENT={home_current_x}                                                  ; Lower motor current
    G28.1 X                                                                                                     ; Home X
    SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.settings['tmc2209 stepper_x'].run_current}    ; Set motor current to the previous value
    SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.settings['tmc2209 stepper_y'].run_current}    ; Set motor current to the previous value
    #G1 X10 F1200
    G1 X{home_all_final_position_x} F1200; Move X-axis slightly
{% endif %}

# Home Y
{% if home_all or 'Y' in rawparams.upper() %}
    SET_TMC_CURRENT STEPPER=stepper_x CURRENT={home_current_y}                                                  ; Lower motor current
    SET_TMC_CURRENT STEPPER=stepper_y CURRENT={home_current_y}                                                  ; Lower motor current
    G28.1 Y                                                                                                     ; Home Y
    SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.settings['tmc2209 stepper_x'].run_current}    ; Set motor current to the previous value
    SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.settings['tmc2209 stepper_y'].run_current}    ; Set motor current to the previous value
    #G1 Y10 F1200                                                                                                ; Move Y-axis slightly
    G1 Y{home_all_final_position_y} F1200
{% endif %}




# Raise the bed again if only X or only Y axes were homed
{% if not (home_all or 'Z' in rawparams.upper()) %}
    {% if Z_axis_was_homed %}
        G91                                                                                                     ; Use relative positioning
        G1 Z-2 F600                                                                                             ; Raise the bed back again
        G90                                                                                                     ; Use absolute positioning
    {% else %}
        FORCE_MOVE STEPPER=stepper_z DISTANCE=-{z_clearance} VELOCITY=10                                        ; Raise the bed back again
    {% endif %}
{% endif %}


# Home Z
{% if home_all or 'Z' in rawparams.upper() %}
    G28.1 Z                                                                                                     ; Home Z
    G90                                                                                                         ; Set absolute positioning
    G1 Z{home_all_final_position_z}                                                                             ; Move bed down
{% endif %}


# Move to the final position if all axes were homed
{% if home_all %}
    G90                                                                                                         ; Set absolute positioning
    G1 X{home_all_final_position_x} Y{home_all_final_position_y} Z{home_all_final_position_z} F7800             ; Move to center
{% endif %}</code></pre><p>&nbsp;</p><p><strong>BoxTurtle MMU Hotend Values:</strong></p><pre><code class="language-plaintext">/AFC/AFC_Hardware.cfg

pin_tool_start: !PC3 #This will depend on where you plug in your runout sensor. #pin_tool_end: None #No post extruder sensor so not used. tool_stn: 100 tool_stn_unload: 30 tool_sensor_after_extruder: 0 tool_sensor_after_extruder: 0 tool_unload_speed: 10 tool_load_speed: 25

 

Tagi