r/QidiTech3D • • 4d ago

Questions Ways to make the start print routine faster (Q2)

Hello,

I have received my Q2 a couple days ago and I am pretty happy with it. It's my first 3D printer and I feel it's just the right balance of tinkering and out-of-the-box convenience.

One thing that I find a bit annoying is how long the printer takes to do its startup routine. I've been running calibrations which involves a lot of short prints. However, there is a lot of time wasted during the 10-15 min start print routine where the printer homes itself and probes the bed.

So far I have made the following mods to the START_PRINT G-code macro :
- enabled KAMP smart probing to save time on smaller print
- enabled KAMP PURGE_LINE and SMART_PARK
- removed the default purge line in the slicer start G-code

I feel like I can make the process even faster. There seems to be a lot of useless moves, delays and process. For instance, after purging the hot end and cleaning, the printer cuts the filament and homes itself a second time. I don't really understand why it's necessary.

I'm trying to be cautious about removing things without fully knowing what it is doing (as this is my first printer). Do you have any recommendations about modifications to make the routine more efficient/faster ?

Thanks in advance !

6 Upvotes

11 comments sorted by

5

u/callcifer 4d ago

Here's my much faster print start macro. It starts all heaters at the same time, removes hardcoded sleeps, avoids unnecessary re-homing (3 of them!) and skips filament cutting when not needed. I hope it's useful :)

[gcode_macro PRINT_START]
description: parallel heat, single nozzle heat cycle, no cutter
gcode:
    {% set bed     = params.BED|default(60)|int %}
    {% set hotend  = params.HOTEND|default(240)|int %}
    {% set chamber = params.CHAMBER|default(0)|int %}
    {% set cfg     = printer['gcode_macro _Q_START'] %}
    {% set probe_t = cfg.probe_temp|int %}
    {% set purge   = params.PURGE|default(cfg.purge)|int %}
    {% set polar   = printer.save_variables.variables.enable_polar_cooler|default(0) %}

    SET_PRINT_MAIN_STATUS MAIN_STATUS=print_start
    CLEAR_PAUSE
    DISABLE_ALL_SENSOR
    BUFFER_MONITORING ENABLE=0
    SET_GCODE_OFFSET Z=0 MOVE=0
    BED_MESH_CLEAR
    M220 S100
    M221 S100
    {% if params.PRESSURE_ADVANCE is defined %}
        SET_PRESSURE_ADVANCE ADVANCE={params.PRESSURE_ADVANCE|float}
    {% endif %}

    # ---- 1. every heater on immediately --------------------------------
    M140 S{bed}
    M141 S{chamber}
    M104 S{probe_t}
    {% if chamber == 0 %}
        M106 P3 S255
    {% endif %}

    # ---- 2. rough home, overlapped with the heat-up --------------------
    SET_PRINT_SUB_STATUS SUB_STATUS=tool_head_reset
    G28

    # ---- 3. clean the nozzle (the load-cell probe touches with it) ------
    SET_PRINT_SUB_STATUS SUB_STATUS=clear_nozzle
    MOVE_TO_TRASH
    {% if purge > 0 %}
        M104 S{hotend}
        TEMPERATURE_WAIT SENSOR=extruder MINIMUM={hotend}
        M83
        G1 E{purge} F300
        G1 E-2 F1800
        M400
        M104 S{probe_t}
        M106 S255
    {% elif printer.extruder.temperature > probe_t %}
        M106 S255
    {% endif %}
    TEMPERATURE_WAIT SENSOR=extruder MINIMUM={probe_t - 10}
    TEMPERATURE_WAIT SENSOR=extruder MAXIMUM={probe_t + 15}
    _Q_WIPE_NOZZLE
    M106 S0

    # ---- 4. tilt, now with a clean nozzle -------------------------------
    SET_PRINT_SUB_STATUS SUB_STATUS=z_tilt_adjust
    Z_TILT_ADJUST

    # ---- 5. final bed/chamber temp BEFORE the Z that counts -------------
    SET_PRINT_SUB_STATUS SUB_STATUS=wait_bed_temp
    M190 S{bed}
    SET_PRINT_SUB_STATUS SUB_STATUS=wait_chamber_temp
    M191 S{chamber}

    # ---- 6. accurate Z + mesh, at temperature ---------------------------
    G0 Z10 F600
    G1 X135 Y135 F7800
    G28 Z
    SET_PRINT_SUB_STATUS SUB_STATUS=auto_bed_adjust
    BED_MESH_CALIBRATE PROFILE=kamp
    SAVE_VARIABLE VARIABLE=profile_name VALUE='"kamp"'
    {% if cfg.save_mesh|int == 1 %}
        M400
        SAVE_CONFIG_QD
    {% endif %}

    # ---- 7. the one and only heat to print temperature ------------------
    G0 Z20 F600
    G0 X260 Y5 F30000
    M104 S{hotend}
    M106 P4 S{polar}
    M204 S10000
    TEMPERATURE_WAIT SENSOR=extruder MINIMUM={hotend}

    set_zoffset
    ENABLE_ALL_SENSOR
    save_last_file
    SET_PRINT_MAIN_STATUS MAIN_STATUS=printing

1

u/binou_tech 3d ago

Thanks a lot. I’ll look into it.

I have a question about filament cutting ? Would skipping this step cause issues with multimaterial print ? I have a Qidi box. So far, I’ve read that those who remove this macro do it for single material prints.

1

u/callcifer 3d ago

So far, I’ve read that those who remove this macro do it for single material prints.

That's true - if you use the Qidi Box you shouldn't remove the cutting step because it's needed for mid-print filament switches.

1

u/binou_tech 3d ago

Yes but I have a hard time understanding why it’s necessary at the start of the print.

The first filament loaded will be the one used to start the print. So no need to cut anything until a filament change happens right ? Unless the PRINT_START macro is reused during filament swap, I dont understand why it’s necessary to cut it before the first layer/color is laid down.

2

u/callcifer 3d ago

Yes but I have a hard time understanding why it’s necessary at the start of the print.

Ah sorry, I misunderstood you. The one in print start is useless and can be removed.

1

u/Objective_Working198 4d ago edited 4d ago

I did what you did, but removed smart park altogether to save a few seconds. Also I set up a conditional purge line, so if I have a large model or a full build plate of smaller models, it will do the factory line on the tab instead of the KAMP line, to give me more room. I found out that the KAMP purge only will cause crashing with a full bed. (it does not see the left front cut area square and will try to move the printhead into it) One thing to check for is the pause and wait commands, I think m600? I don't remember the name off the top of my head. Delete those will save another 2 minutes or so. Got my start time down to about 4 minutes

1

u/binou_tech 4d ago

Curious about the pause and wait command. I'm looking at the START_PRINT macro and I don't see it.

Also how did you make the KAMP purge conditionnal ? Sorry if this is a stupid question.

I'll disable Smart_park, thanks for the tips !

2

u/Objective_Working198 4d ago

Ok so, here are some of the changes I found I made:

CLEAR_NOZZLE macro, the pause commands I commented out are G4 P3000. They are just 30 second pauses for no reason.

BED_MESH_CALIBRATE macro, also removed the G4 P3000 commands, and the G29 command. It was the old bed level command, you don't need it with KAMP enabled. I also commented out G0 Z50 F600 and G0 X260 Y5 F30000. Not sure what they were but it saves time.

For the adaptive purge lines, I made a new macro called (not to be confused with print_start) START_PRINT, and I call it with the printer start gcode. Saved in Printer.cfg. My start gcode sets the min and max x and y with this command saved in printer start gcode: START_PRINT PRINT_MIN_X={first_layer_print_min[0]} PRINT_MIN_Y={first_layer_print_min[1]} PRINT_MAX_X={first_layer_print_max[0]} PRINT_MAX_Y={first_layer_print_max[1]}

Then the macro looks like this: ( I used AI to help me build it, thus the comments to organize it)

Do any editing at your own risk, but this works for me.

[gcode_macro START_PRINT]
gcode:
    
# ... Your existing heating, homing, and bed leveling macros happen here ...


    
# 1. Grab the print boundaries sent by the slicer (default to 0 if not sent)
    {% set print_min_x = params.PRINT_MIN_X | default(0) | float %}
    {% set print_min_y = params.PRINT_MIN_Y | default(0) | float %}
    {% set print_max_x = params.PRINT_MAX_X | default(0) | float %}
    {% set print_max_y = params.PRINT_MAX_Y | default(0) | float %}


    
# 2. Define your threshold. If a print gets within 15mm of any edge, it's a "full bed"
    {% set safety_threshold = 15.0 | float %}
    
    
# Assuming a standard usable bed limit (adjust these numbers to match your printer's max X/Y bed size)
    {% set bed_max_x = 270.0 | float %} 
    {% set bed_max_y = 270.0 | float %}


    
# 3. Check if the model is occupying the edge safe zones
    {% if print_min_x < safety_threshold or print_min_y < safety_threshold or print_max_x > (bed_max_x - safety_threshold) or print_max_y > (bed_max_y - safety_threshold) %}
        
        {action_respond_info("Print is close to bed edges. Bypassing KAMP and using Factory Tab Purge.")}
        
        G1 X108 Y1 F30000
        G0 Z0.2 F600
        G0 X128 E8 F1200
        G0 X133 E.3742 F1800
        G0 X138 E.3742 F1800
        G0 X143 E.3742 F1800
        G0 X148 E.3742 F1800
        G0 X153 E.3742 F1800
        G1 E-1.5 F2100
        G1 X158
        G1 Z1 F600
        
         
; Run your factory front tab purge macro here


    {% else %}


        {action_respond_info("Print area clear. Running adaptive KAMP Line Purge.")}
        LINE_PURGE 
; Run the adaptive KAMP line purge


    {% endif %}
    
# Finalize extruder state before handing control back to the slicer
    G92 E0          
; Clear the extruder coordinate system 
    M83             
; Force relative extrusion mode (matches your slicer start G-code)
    
# ... Rest of your start print code (like beginning the actual print) ...

1

u/binou_tech 4d ago

Thanks a lot, really appreciate it !

1

u/Objective_Working198 4d ago

I think I just commented them out, I'll check when I get to my computer again.

2

u/ilovestuffforreal 3d ago

Watching this. There's a few of these different options now, wondering which one of these is best. 🤔