grozby88 Posté(e) Mars 14 Posté(e) Mars 14 (modifié) Bonsoir à tous ! Je me suis lancé début février dans la transformation de ma ender3 en core XY E3NG. Ce projet est génial et très prometteur et je n'ai pas rencontré de difficultés particulières pour le montage physique de la machine, ce qui est déjà pas mal car c'est assez velu quand même !!! Mais bon voilà, çà fait maintenant plus de 10 jours que je galère à installer klipper sur la machine et je ne compte plus les heures à corriger les erreurs générées à chaque redémarrage. Ces erreurs sont pour la plupart bien documentées et en cherchant un peu on arrive à les régler au fur et à mesure... Sauf que maintenant j'ai une erreur MCU can't connect depuis 8 jours et rien n'y fait !!! j'ai reinstallé Klipper complet (via Klipain), le firmware de carte Octopus V1.1 plusieurs fois et nada !!! je deviens fou et je me décide enfin à demander l'analyse et l'expertise des experts Klipper de ce forum. J'ai bien l'ID qui s'affiche dans la console Putty et je l'ai bien recopiée dans le mcu.cfg (procédure spécifique à Klipain) Je vous joins les fichiers log et images liées à cette affaire et vous remercie pour vos commentaires et analyse de ces logs. Cordialement Citation ===== Config file ===== [printer] kinematics = corexy max_velocity = 400 max_accel = 8000 max_z_velocity = 30 max_z_accel = 500 square_corner_velocity = 5.0 [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = {% if printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} STATUS_LEDS COLOR="ERROR" {% endif %} {% if printer["gcode_macro _USER_VARIABLES"].probe_type_enabled == "dockable" or printer["gcode_macro _USER_VARIABLES"].probe_type_enabled == "dockable_virtual" %} _PROBE_ON_ERROR_ACTION {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} PARK {% endif %} [idle_timeout] timeout = 1800 gcode = RESPOND MSG="Idle timeout reached" TURN_OFF_HEATERS M84 {% if printer["gcode_macro _USER_VARIABLES"].light_enabled %} LIGHT_OFF {% endif %} {% if printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} STATUS_LEDS COLOR="OFF" {% endif %} [pause_resume] [display_status] [exclude_object] [respond] [force_move] enable_force_move = True [gcode_arcs] resolution = 0.1 [thermistor CMFB103F3950FANT] temperature1 = 0.0 resistance1 = 32116.0 temperature2 = 40.0 resistance2 = 5309.0 temperature3 = 80.0 resistance3 = 1228.0 [gcode_shell_command shaketune] command = ~/printer_data/config/scripts/K-ShakeTune/shaketune.sh timeout = 600.0 verbose = True [gcode_shell_command system_info] command = ~/printer_data/config/scripts/system_info.py timeout = 5.0 verbose = True [gcode_macro CANCEL_PRINT] rename_existing = BASE_CANCEL_PRINT description = Cancel the print, retract 10mm of filament and park gcode = {% set turn_off_heaters_in_end_print = printer["gcode_macro _USER_VARIABLES"].turn_off_heaters_in_end_print %} {% set safe_extruder_temp = printer["gcode_macro _USER_VARIABLES"].safe_extruder_temp|float %} {% set light_intensity_end_print = printer["gcode_macro _USER_VARIABLES"].light_intensity_end_print %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set mmu_unload_on_cancel_print = printer["gcode_macro _USER_VARIABLES"].mmu_unload_on_cancel_print %} {% set filter_enabled = printer["gcode_macro _USER_VARIABLES"].filter_enabled %} {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set filter_default_time = printer["gcode_macro _USER_VARIABLES"].filter_default_time_on_end_print|default(600)|int %} {% set hotend_fan_tach_enabled = printer["gcode_macro _USER_VARIABLES"].hotend_fan_tach_enabled %} {% set retract_length = printer["gcode_macro _USER_VARIABLES"].retract_length|default(20)|float %} PARK {% if klippain_mmu_enabled and mmu_unload_on_cancel_print %} {% if printer.mmu.enabled and printer.mmu.tool|int != -2 %} MMU_UNLOAD {% endif %} {% elif printer.extruder.can_extrude %} G92 E0 G1 E-{retract_length} F2100 {% endif %} {% if turn_off_heaters_in_end_print %} TURN_OFF_HEATERS {% else %} SET_HEATER_TEMPERATURE HEATER=extruder TARGET={safe_extruder_temp} {% endif %} {% if hotend_fan_tach_enabled %} UPDATE_DELAYED_GCODE ID=_BACKGROUND_HOTEND_TACHO_CHECK DURATION=0 {% endif %} M107 M400 CLEAR_PAUSE {% if bed_mesh_enabled %} BED_MESH_CLEAR {% endif %} SDCARD_RESET_FILE {% if filter_enabled %} {% if printer['fan_generic filter'].speed > 0 %} {% set FILTER_TIME = params.FILTER_TIME|default(filter_default_time)|int %} START_FILTER SPEED=1 UPDATE_DELAYED_GCODE ID=_STOP_FILTER_DELAYED DURATION={FILTER_TIME} {% endif %} {% endif %} {% if light_enabled %} LIGHT_ON S={light_intensity_end_print} {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="OFF" {% endif %} {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and printer.mmu.print_start_detection|int == 0 %} _MMU_PRINT_END STATE=cancelled {% endif %} {% endif %} {% if filament_sensor_enabled %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% endif %} BASE_CANCEL_PRINT [gcode_macro _OFF] description = Turn off the printer gcode = {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set display_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_minidisplay_enabled %} M84 TURN_OFF_HEATERS M107 {% if light_enabled %} LIGHT_OFF {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="SHUTDOWN" {% endif %} {% if display_leds_enabled %} _SET_ALLLEDS_BY_NAME LEDS="minidisplay" COLOR="shutdown" {% endif %} [gcode_macro SHUTDOWN] description = Turn off the printer and shutdown the host gcode = _OFF {action_respond_info('action:poweroff')} {action_call_remote_method("shutdown_machine")} [gcode_macro END_PRINT] description = Stop the print and filter the atmosphere for 10min before shuting down gcode = {% set disable_motors_in_end_print = printer["gcode_macro _USER_VARIABLES"].disable_motors_in_end_print %} {% set turn_off_heaters_in_end_print = printer["gcode_macro _USER_VARIABLES"].turn_off_heaters_in_end_print %} {% set safe_extruder_temp = printer["gcode_macro _USER_VARIABLES"].safe_extruder_temp|float %} {% set light_intensity_end_print = printer["gcode_macro _USER_VARIABLES"].light_intensity_end_print %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set mmu_unload = params.MMU_UNLOAD_AT_END|default(printer["gcode_macro _USER_VARIABLES"].mmu_unload_on_end_print)|default(0)|int %} {% set filter_enabled = printer["gcode_macro _USER_VARIABLES"].filter_enabled %} {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set filter_default_time = printer["gcode_macro _USER_VARIABLES"].filter_default_time_on_end_print|default(600)|int %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set hotend_fan_tach_enabled = printer["gcode_macro _USER_VARIABLES"].hotend_fan_tach_enabled %} {% set retract_length = printer["gcode_macro _USER_VARIABLES"].retract_length|default(20)|float %} PARK {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and mmu_unload %} MMU_UNLOAD {% endif %} {% elif printer.extruder.can_extrude %} G92 E0 G1 E-{retract_length} F2100 {% endif %} {% if turn_off_heaters_in_end_print %} TURN_OFF_HEATERS {% else %} SET_HEATER_TEMPERATURE HEATER=extruder TARGET={safe_extruder_temp} {% endif %} {% if hotend_fan_tach_enabled %} UPDATE_DELAYED_GCODE ID=_BACKGROUND_HOTEND_TACHO_CHECK DURATION=0 {% endif %} M107 M400 {% if bed_mesh_enabled %} BED_MESH_CLEAR {% endif %} {% if disable_motors_in_end_print %} M84 {% endif %} {% if filter_enabled %} {% if printer['fan_generic filter'].speed > 0 %} {% set FILTER_TIME = params.FILTER_TIME|default(filter_default_time)|int %} START_FILTER SPEED=1 UPDATE_DELAYED_GCODE ID=_STOP_FILTER_DELAYED DURATION={FILTER_TIME} {% endif %} {% endif %} {% if light_enabled %} LIGHT_ON S={light_intensity_end_print} {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="DONE_PRINTING" {% endif %} {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and printer.mmu.print_start_detection|int == 0 %} _MMU_PRINT_END {% endif %} {% endif %} {% if filament_sensor_enabled %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% endif %} [gcode_macro PARK] description = Park the toolhead at the back and retract some filament if the nozzle is hot gcode = {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set material = printer['gcode_macro START_PRINT'].material %} {% set Px, Py = printer["gcode_macro _USER_VARIABLES"].park_position_xy|map('float') %} {% set Px = params.X|default(Px)|float %} {% set Py = params.Y|default(Py)|float %} {% set park_lift_z = printer["gcode_macro _USER_VARIABLES"].park_lift_z %} {% set Z_HOP = params.Z_HOP|default(park_lift_z)|float %} {% set firmware_retraction_enabled = printer["gcode_macro _USER_VARIABLES"].firmware_retraction_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set max_z = printer.toolhead.axis_maximum.z - printer.gcode_move.homing_origin.z |float %} {% set act_z = printer.toolhead.position.z|float %} {% set z_safe = act_z + Z_HOP %} {% if z_safe > max_z %} {% set z_safe = max_z %} {% endif %} {% if printer.toolhead.homed_axes != "xyz" %} {action_raise_error("Cannot park the toolhead because axis are not homed!")} {% endif %} SAVE_GCODE_STATE NAME=PARK {% if printer.extruder.can_extrude %} {% if params.E is defined %} {% set E = params.E|float|abs %} {% if verbose %} RESPOND MSG="Retraction overrided with parameter, Extruder retraction = {E}" {% endif %} {% else %} {% if firmware_retraction_enabled %} {% if verbose %} RESPOND MSG="Firmware retraction enabled, Extruder retraction = {printer.firmware_retraction.retract_length}" {% endif %} G10 {% else %} {% if printer["gcode_macro _USER_VARIABLES"].material_parameters[material] is defined %} {% set E = printer["gcode_macro _USER_VARIABLES"].material_parameters[material].retract_length|default(1.7) %} {% else %} {% set E = 1.7 %} {% endif %} {% if verbose %} RESPOND MSG="Firmware retraction disabled, Extruder retraction = {E}" {% endif %} {% endif %} {% endif %} {% if E is defined and E > 0 %} G92 E0 G1 E-{E} F2100 {% endif %} {% endif %} G90 G1 Z{z_safe} F{Sz} G0 X{Px} Y{Py} F{St} RESTORE_GCODE_STATE NAME=PARK [gcode_macro PARK_FRONT] description = Park the toolhead on the front of the printer for maintenance gcode = {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% if printer.toolhead.homed_axes != "xyz" %} {action_raise_error("Cannot park the toolhead in maintenance position because axis are not homed!")} {% endif %} SAVE_GCODE_STATE NAME=PARK_FRONT G90 G0 Z{printer.toolhead.axis_maximum.z/3*2} F{Sz} G0 X{printer.toolhead.axis_maximum.x/2} Y{printer.toolhead.axis_minimum.y+10} F{St} RESTORE_GCODE_STATE NAME=PARK_FRONT [gcode_macro PAUSE] rename_existing = BASE_PAUSE description = Pause the print and park gcode = {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set light_intensity_start_print = printer["gcode_macro _USER_VARIABLES"].light_intensity_start_print %} {% set idle_timeout_on_pause = printer["gcode_macro _USER_VARIABLES"].idle_timeout_on_pause|default(0)|int %} {% if printer.pause_resume.is_paused %} RESPOND MSG="Print is already paused" {% else %} SAVE_GCODE_STATE NAME=PAUSE_state {% if light_enabled %} LIGHT_ON S={light_intensity_start_print} {% endif %} BASE_PAUSE PARK {% if idle_timeout_on_pause > 0 %} SET_IDLE_TIMEOUT TIMEOUT={idle_timeout_on_pause} {% endif %} {% endif %} [gcode_macro RESUME] rename_existing = BASE_RESUME description = Resume the print after an optional unretract gcode = {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed %} {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set light_intensity_printing = printer["gcode_macro _USER_VARIABLES"].light_intensity_printing %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set idle_timeout_on_pause = printer["gcode_macro _USER_VARIABLES"].idle_timeout_on_pause|default(0)|int %} {% if not printer.pause_resume.is_paused %} RESPOND MSG="Print is not paused. Resume ignored" {% else %} {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and printer.mmu.is_locked %} RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=0 {% else %} RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 MOVE_SPEED={St} {% endif %} {% else %} RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 MOVE_SPEED={St} {% endif %} {% if light_enabled %} LIGHT_ON S={light_intensity_printing} {% endif %} {% if idle_timeout_on_pause > 0%} SET_IDLE_TIMEOUT TIMEOUT={printer.configfile.settings.idle_timeout.timeout} {% endif %} BASE_RESUME {% endif %} [gcode_macro START_PRINT] description = Machine heatup procedure before starting a print variable_bed_temp = 0 variable_extruder_temp = 0 variable_z_adjust = 0 variable_soak = 0 variable_chamber_temp = 0 variable_chamber_maxtime = 0 variable_initial_tool = 0 variable_check_gates = 0 variable_tools_used = "" variable_sync_mmu_extruder = 0 variable_material = "XXX" variable_fl_size = "0_0_0_0" variable_bed_mesh_profile = "" variable_total_layer = 0 variable_adaptive_primeline = 1 gcode = {% set BED_TEMP = params.BED_TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_bed_temp)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set Z_ADJUST = params.Z_ADJUST|default(0)|float %} {% set SOAK = params.SOAK|default(printer["gcode_macro _USER_VARIABLES"].print_default_soak)|int %} {% set CHAMBER_TEMP = params.CHAMBER|default(printer["gcode_macro _USER_VARIABLES"].print_default_chamber_temp)|int %} {% set CHAMBER_MAXTIME = params.CHAMBER_MAXTIME|default(printer["gcode_macro _USER_VARIABLES"].print_default_chamber_max_heating_time)|int %} {% set INITIAL_TOOL = params.INITIAL_TOOL|default(0)|int %} {% set MATERIAL = params.MATERIAL|default(printer["gcode_macro _USER_VARIABLES"].print_default_material)|string %} {% set FL_SIZE = params.SIZE|default("0_0_0_0")|string %} {% set CHECK_GATES = params.CHECK_GATES|default(printer['gcode_macro _USER_VARIABLES'].mmu_check_gates_on_start_print)|default(0)|int %} {% set TOOLS_USED = params.TOOLS_USED|default("")|string %} {% set SYNC_MMU_EXTRUDER = params.SYNC_MMU_EXTRUDER|default(0)|int %} {% set BED_MESH_PROFILE = params.MESH|default("")|string %} {% set ADAPTIVE_PRIMELINE = params.ADAPTIVE_PRIMELINE|default(1)|int %} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=bed_temp VALUE={BED_TEMP} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_temp VALUE={EXTRUDER_TEMP} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=soak VALUE={SOAK} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=chamber_temp VALUE={CHAMBER_TEMP} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=chamber_maxtime VALUE={CHAMBER_MAXTIME} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=initial_tool VALUE={INITIAL_TOOL} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=check_gates VALUE={CHECK_GATES} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=tools_used VALUE='"{TOOLS_USED}"' SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=sync_mmu_extruder VALUE={SYNC_MMU_EXTRUDER} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=material VALUE='"{MATERIAL}"' SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=fl_size VALUE='"{FL_SIZE}"' SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=bed_mesh_profile VALUE='"{BED_MESH_PROFILE}"' SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=adaptive_primeline VALUE={ADAPTIVE_PRIMELINE} {% if params.TOTAL_LAYER %} SET_PRINT_STATS_INFO TOTAL_LAYER={params.TOTAL_LAYER|int} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=total_layer VALUE={params.TOTAL_LAYER|int} {% endif %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set light_intensity_start_print = printer["gcode_macro _USER_VARIABLES"].light_intensity_start_print %} {% set light_intensity_printing = printer["gcode_macro _USER_VARIABLES"].light_intensity_printing %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set force_homing_in_start_print = printer["gcode_macro _USER_VARIABLES"].force_homing_in_start_print %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set firmware_retraction_enabled = printer["gcode_macro _USER_VARIABLES"].firmware_retraction_enabled %} {% set filter_enabled = printer["gcode_macro _USER_VARIABLES"].filter_enabled %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set part_fan_tach_enabled = printer["gcode_macro _USER_VARIABLES"].part_fan_tach_enabled %} {% set hotend_fan_tach_enabled = printer["gcode_macro _USER_VARIABLES"].hotend_fan_tach_enabled %} {% if MATERIAL not in printer["gcode_macro _USER_VARIABLES"].material_parameters %} RESPOND MSG="Material '{MATERIAL}' is unknown!" { action_raise_error("Add this new material to your material_parameters variable!") } {% else %} RESPOND MSG="Material '{MATERIAL}' is used" {% set material = printer["gcode_macro _USER_VARIABLES"].material_parameters[MATERIAL] %} {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="BUSY" {% endif %} {% if light_enabled %} LIGHT_ON S={light_intensity_start_print} {% endif %} CLEAR_PAUSE {% if bed_mesh_enabled %} BED_MESH_CLEAR {% endif %} {% if filter_enabled %} UPDATE_DELAYED_GCODE ID=_STOP_FILTER_DELAYED DURATION=0 STOP_FILTER {% endif %} {% if part_fan_tach_enabled %} M106 S255 G4 P2000 _PART_FAN_CHECK M106 S0 {% endif %} {% if hotend_fan_tach_enabled %} UPDATE_DELAYED_GCODE ID=_BACKGROUND_HOTEND_TACHO_CHECK DURATION=1 {% endif %} SET_GCODE_OFFSET Z=0 M221 S100 M220 S100 G90 M83 {% if firmware_retraction_enabled %} SET_RETRACTION RETRACT_LENGTH={material.retract_length} RETRACT_SPEED={material.retract_speed} UNRETRACT_EXTRA_LENGTH={material.unretract_extra_length} UNRETRACT_SPEED={material.unretract_speed} {% endif %} SET_PRESSURE_ADVANCE ADVANCE={material.pressure_advance} {% if force_homing_in_start_print %} G28 {% else %} _CG28 {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_INIT {% endif %} {% set sp_actions = printer["gcode_macro _USER_VARIABLES"].startprint_actions %} {% for action in sp_actions %} {% if action == "bed_soak" %} _MODULE_HEATSOAK_BED {% elif action == "chamber_soak" %} _MODULE_HEATSOAK_CHAMBER {% elif action == "tilt_calib" %} _MODULE_TILTING {% elif action == "extruder_heating" %} _MODULE_EXTRUDER_HEATING {% elif action == "purge" %} _MODULE_PURGE {% elif action == "clean" %} _MODULE_CLEAN {% elif action == "z_offset" %} _MODULE_Z_CALIB {% elif action == "bedmesh" %} _MODULE_BED_MESH {% elif action == "primeline" %} _MODULE_PRIMELINE {% elif action == "extruder_preheating" %} _MODULE_EXTRUDER_PREHEATING {% elif action == "custom1" %} _MODULE_CUSTOM1 {rawparams} {% elif action == "custom2" %} _MODULE_CUSTOM2 {rawparams} {% elif action == "custom3" %} _MODULE_CUSTOM3 {rawparams} {% else %} { action_raise_error("Unknown module called in START_PRINT! Please verify your startprint_actions variable override!") } {% endif %} {% endfor %} SET_GCODE_OFFSET Z_ADJUST={Z_ADJUST} MOVE=1 SET_GCODE_OFFSET Z_ADJUST={material.additional_z_offset} MOVE=1 {% if filter_enabled %} START_FILTER SPEED={material.filter_speed / 100} {% endif %} {% if filament_sensor_enabled and not material.filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="PRINTING" {% endif %} {% if light_enabled %} LIGHT_ON S={light_intensity_printing} {% endif %} {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and printer.mmu.print_start_detection|int == 0 %} _MMU_PRINT_START {% endif %} {% endif %} {% if verbose %} RESPOND MSG="Start printing !" {% endif %} G92 E0.0 [gcode_macro _MODULE_PRIMELINE] gcode = {% set FL_SIZE = printer["gcode_macro START_PRINT"].fl_size %} {% set ADAPTIVE_PRIMELINE = printer["gcode_macro START_PRINT"].adaptive_primeline %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% if verbose %} RESPOND MSG="Executing a primeline..." {% endif %} PRIMELINE SIZE={FL_SIZE} ADAPTIVE_MODE={ADAPTIVE_PRIMELINE} [gcode_macro _MODULE_HEATSOAK_BED] gcode = {% set BED_TEMP = printer["gcode_macro START_PRINT"].bed_temp %} {% set SOAK = printer["gcode_macro START_PRINT"].soak %} {% set CHAMBER_TEMP = printer["gcode_macro START_PRINT"].chamber_temp %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set filter_enabled = printer["gcode_macro _USER_VARIABLES"].filter_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set max_x = printer.toolhead.axis_maximum.x|float %} {% set max_y = printer.toolhead.axis_maximum.y|float %} {% if status_leds_enabled %} STATUS_LEDS COLOR="HEATING" {% endif %} {% if printer.heater_bed.temperature < (BED_TEMP - %} {% if (CHAMBER_TEMP > 0) and filter_enabled %} START_FILTER SPEED=1 {% endif %} {% if SOAK > 0 %} G0 X{max_x|int / 2} Y{max_y|int / 3} Z50 F{St} {% endif %} HEATSOAK_BED TEMP={BED_TEMP} SOAKTIME={SOAK} {% else %} HEATSOAK_BED TEMP={BED_TEMP} SOAKTIME=0 {% endif %} [gcode_macro _MODULE_HEATSOAK_CHAMBER] gcode = {% set CHAMBER_TEMP = printer["gcode_macro START_PRINT"].chamber_temp %} {% set CHAMBER_MAXTIME = printer["gcode_macro START_PRINT"].chamber_maxtime %} {% set chamber_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].chamber_temperature_sensor_enabled %} {% set filter_enabled = printer["gcode_macro _USER_VARIABLES"].filter_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set max_x = printer.toolhead.axis_maximum.x|float %} {% set max_y = printer.toolhead.axis_maximum.y|float %} {% if chamber_sensor_enabled %} {% if CHAMBER_TEMP > 0 %} {% set chamber_sensor_name = printer["gcode_macro _USER_VARIABLES"].chamber_temperature_sensor_name %} {% set CURRENT_TEMP = printer["temperature_sensor " ~ chamber_sensor_name].temperature|float %} {% if CURRENT_TEMP <= CHAMBER_TEMP %} G0 X{max_x|int / 2} Y{max_y|int / 3} Z50 F{St} {% if filter_enabled %} START_FILTER SPEED=1 {% endif %} HEATSOAK_CHAMBER TEMP={CHAMBER_TEMP} MAXTIME={CHAMBER_MAXTIME} {% if filter_enabled %} STOP_FILTER {% endif %} {% endif %} {% endif %} {% endif %} [gcode_macro _MODULE_TILTING] gcode = {% set force_homing_in_start_print = printer["gcode_macro _USER_VARIABLES"].force_homing_in_start_print %} _TILT_CALIBRATE FORCE={force_homing_in_start_print} [gcode_macro _MODULE_EXTRUDER_HEATING] gcode = {% set EXTRUDER_TEMP = printer["gcode_macro START_PRINT"].extruder_temp %} {% set INITIAL_TOOL = printer["gcode_macro START_PRINT"].initial_tool %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% set purgeclean_servo_enabled = printer["gcode_macro _USER_VARIABLES"].purgeclean_servo_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Px, Py, Pz = printer["gcode_macro _USER_VARIABLES"].purge_bucket_xyz|map('float') %} {% set max_x = printer.toolhead.axis_maximum.x|float %} {% set max_y = printer.toolhead.axis_maximum.y|float %} {% if status_leds_enabled %} STATUS_LEDS COLOR="HEATING" {% endif %} {% if verbose %} RESPOND MSG="Extruder heating to print temperature..." {% endif %} _CONDITIONAL_MOVE_TO_PURGE_BUCKET {% if not purge_and_brush_enabled %} G0 X{max_x|int / 2} Y{max_y|int / 3} Z50 F{St} {% endif %} M109 S{EXTRUDER_TEMP} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_LOAD_INITIAL_TOOL {% endif %} {% if purgeclean_servo_enabled %} _SERVO_RETRACT ITEM="purge" {% endif %} {% if verbose %} RESPOND MSG="Extruder temperature OK" {% endif %} [gcode_macro _MODULE_PURGE] gcode = {% set EXTRUDER_TEMP = printer["gcode_macro START_PRINT"].extruder_temp %} {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% if purge_and_brush_enabled %} PURGE TEMP={EXTRUDER_TEMP} {% endif %} [gcode_macro _MODULE_CLEAN] gcode = {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% set force_homing_before_brush = printer["gcode_macro _USER_VARIABLES"].force_homing_before_brush %} {% if purge_and_brush_enabled %} {% if force_homing_before_brush %} G28 Z {% endif %} CLEAN_NOZZLE {% endif %} [gcode_macro _MODULE_Z_CALIB] gcode = {% set zcalib_plugin_enabled = printer["gcode_macro _USER_VARIABLES"].zcalib_plugin_enabled %} {% if zcalib_plugin_enabled %} G28 Z CALIBRATE_Z {% else %} G28 Z {% endif %} [gcode_macro _MODULE_BED_MESH] gcode = {% set FL_SIZE = printer["gcode_macro START_PRINT"].fl_size %} {% set BED_MESH_PROFILE = printer["gcode_macro START_PRINT"].bed_mesh_profile %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% if bed_mesh_enabled %} {% if BED_MESH_PROFILE == "" %} {% if verbose %} RESPOND MSG="Bed mesh measurement..." {% endif %} ADAPTIVE_BED_MESH SIZE={FL_SIZE} {% else %} {% if verbose %} RESPOND MSG="Load bed mesh profile : {BED_MESH_PROFILE}" {% endif %} BED_MESH_PROFILE LOAD={BED_MESH_PROFILE} {% endif %} {% endif %} [gcode_macro _MODULE_EXTRUDER_PREHEATING] gcode = {% set safe_extruder_temp = printer["gcode_macro _USER_VARIABLES"].safe_extruder_temp|float %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% if status_leds_enabled %} STATUS_LEDS COLOR="HEATING" {% endif %} {% if verbose %} RESPOND MSG="Pre-heating the nozzle to a safe temperature..." {% endif %} {% if probe_type_enabled == "vorontap" %} M109 S{safe_extruder_temp} {% if verbose %} RESPOND MSG="Extruder at safe temperature of {safe_extruder_temp} degrees" {% endif %} {% else %} {% if printer.extruder.target < safe_extruder_temp %} M104 S{safe_extruder_temp} {% if verbose %} RESPOND MSG="Extruder is heating at temperature of {safe_extruder_temp} degrees" {% endif %} {% else %} {% if verbose %} RESPOND MSG="Extruder is already hot" {% endif %} {% endif %} {% endif %} [gcode_macro _MODULE_CUSTOM1] gcode = [gcode_macro _MODULE_CUSTOM2] gcode = [gcode_macro _MODULE_CUSTOM3] gcode = [gcode_macro _CG28] description = Homing only if necessary gcode = {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% if "xyz" not in printer.toolhead.homed_axes %} {% if status_leds_enabled %} STATUS_LEDS COLOR="HOMING" {% endif %} G28 {% if status_leds_enabled %} STATUS_LEDS COLOR="READY" {% endif %} {% endif %} [homing_override] axes = xyz gcode = {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set kinematics = printer["configfile"].config["printer"]["kinematics"] %} {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled %} {% set homing_zhop = printer["gcode_macro _USER_VARIABLES"].homing_zhop|float|abs %} {% set homing_travel_speed = printer["gcode_macro _USER_VARIABLES"].homing_travel_speed * 60 %} {% set homing_travel_accel = printer["gcode_macro _USER_VARIABLES"].homing_travel_accel %} {% set sensorless_homing_enabled = printer["gcode_macro _USER_VARIABLES"].sensorless_homing_enabled %} {% set sensorless_current_factor = printer["gcode_macro _USER_VARIABLES"].sensorless_current_factor / 100 %} {% set x_driver = printer["gcode_macro _USER_VARIABLES"].x_driver %} {% set y_driver = printer["gcode_macro _USER_VARIABLES"].y_driver %} {% set z_driver = printer["gcode_macro _USER_VARIABLES"].z_driver %} {% set z_drop_speed = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set homing_first = printer["gcode_macro _USER_VARIABLES"].homing_first|string|upper %} {% set x_homing_backoff, y_homing_backoff = printer["gcode_macro _USER_VARIABLES"].homing_backoff_distance_xy|map('float') %} {% set x_position_endstop = printer["configfile"].config["stepper_x"]["position_endstop"]|float %} {% set y_position_endstop = printer["configfile"].config["stepper_y"]["position_endstop"]|float %} {% set x_position_center = printer.toolhead.axis_maximum.x|int/2 - printer.toolhead.axis_minimum.x|int/2 %} {% set y_position_center = printer.toolhead.axis_maximum.y|int/2 - printer.toolhead.axis_minimum.y|int/2 %} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _CHECK_PROBE action=query {% endif %} {% set X, Y, Z = False, False, False %} {% if status_leds_enabled %} STATUS_LEDS COLOR="HOMING" {% endif %} {% if not 'X' in params and not 'Y' in params and not 'Z' in params %} {% set X, Y, Z = True, True, True %} {% else %} {% if 'X' in params %} {% set X = True %} {% endif %} {% if 'Y' in params %} {% set Y = True %} {% endif %} {% if 'Z' in params %} {% set Z = True %} {% endif %} {% if 'X' in params and 'Y' in params and 'Z' in params %} _HOMING_VARIABLES reset=1 {% endif %} {% endif %} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _ENTRY_POINT FUNCTION=homing_override {% endif %} {% set saved_accel = printer.toolhead.max_accel %} M204 S{homing_travel_accel} {% if bed_mesh_enabled %} BED_MESH_CLEAR {% endif %} G90 {% if Z %} {% if ('z' in printer.toolhead.homed_axes) %} {% if (printer.toolhead.position.z < homing_zhop) %} {% if verbose %} { action_respond_info("Z too low, performing ZHOP to rehome Z") } {% endif %} G91 G0 Z{homing_zhop} F{z_drop_speed} M400 G90 {% else %} {% if verbose %} { action_respond_info("Z already safe, no ZHOP needed to rehome Z") } {% endif %} {% endif %} {% elif ('xy' in printer.toolhead.homed_axes) %} {% if verbose %} { action_respond_info("X and Y already homed, no ZHOP needed to home Z") } {% endif %} {% else %} {% if verbose %} { action_respond_info("X and Y not homed, forcing full G28 to home Z properly") } {% endif %} SET_KINEMATIC_POSITION X=0 Y=0 Z=0 G0 Z{homing_zhop} F{z_drop_speed} {% if sensorless_homing_enabled and kinematics == "corexz" %} M400 {% endif %} {% set X, Y, Z = True, True, True %} {% endif %} {% endif %} {% if homing_first == "X" %} {% if X %} {% if verbose %} { action_respond_info("Homing X") } {% endif %} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "corexz" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_z = printer.configfile.config[z_driver ~ ' stepper_z'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_z = sensorless_current_factor * old_current_z %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_z CURRENT={new_current_z} M400 {% elif kinematics == "cartesian" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} M400 {% endif %} {% endif %} G28 X0 G1 X{x_position_endstop + x_homing_backoff} F{homing_travel_speed} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "corexz" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_z CURRENT={old_current_z} {% elif kinematics == "cartesian" %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} {% endif %} {% endif %} {% endif %} {% if Y %} {% if verbose %} { action_respond_info("Homing Y") } {% endif %} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "corexz" %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "cartesian" %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% endif %} {% endif %} G28 Y0 G1 Y{y_position_endstop + y_homing_backoff} F{homing_travel_speed} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "corexz" %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "cartesian" %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% endif %} {% endif %} {% endif %} {% elif homing_first == "Y" %} {% if Y %} {% if verbose %} { action_respond_info("Homing Y") } {% endif %} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "corexz" %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "cartesian" %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% endif %} {% endif %} G28 Y0 G1 Y{y_position_endstop + y_homing_backoff} F{homing_travel_speed} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "corexz" %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "cartesian" %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% endif %} {% endif %} {% endif %} {% if X %} {% if verbose %} { action_respond_info("Homing X") } {% endif %} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "corexz" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_z = printer.configfile.config[z_driver ~ ' stepper_z'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_z = sensorless_current_factor * old_current_z %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_z CURRENT={new_current_z} M400 {% elif kinematics == "cartesian" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} M400 {% endif %} {% endif %} G28 X0 G1 X{x_position_endstop + x_homing_backoff} F{homing_travel_speed} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "corexz" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_z CURRENT={old_current_z} {% elif kinematics == "cartesian" %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} {% endif %} {% endif %} {% endif %} {% else %} { action_respond_error("Axis homing order not valid. Choose either X or Y first in the variables.cfg file!") } {% endif %} {% if Z %} {% if verbose %} { action_respond_info("Homing Z") } {% endif %} {% if printer["configfile"].config["stepper_z"]["endstop_pin"]|lower == "probe:z_virtual_endstop" %} {% if probe_type_enabled == "dockable_virtual" or probe_type_enabled == "vorontap" %} ACTIVATE_PROBE {% endif %} {% if not bed_mesh_enabled or not printer["configfile"].config["bed_mesh"]["zero_reference_position"] %} G0 X{x_position_center} Y{y_position_center} F{homing_travel_speed} {% else %} {% set ZRPx, ZRPy = printer["configfile"].config["bed_mesh"]["zero_reference_position"].split(',')|map('trim')|map('float') %} G0 X{ZRPx} Y{ZRPy} F{homing_travel_speed} {% endif %} {% else %} _GOTO_Z_PROBE {% endif %} G28 Z0 G91 {% if printer["configfile"].settings["stepper_z"]["homing_positive_dir"] == False %} G0 Z{homing_zhop} F{z_drop_speed} {% elif printer["configfile"].settings["stepper_z"]["homing_positive_dir"] == True %} G0 Z-{homing_zhop} F{z_drop_speed} {% endif %} G90 {% if probe_type_enabled == "vorontap" or probe_type_enabled == "dockable_virtual" %} DEACTIVATE_PROBE {% endif %} {% endif %} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _CHECK_PROBE action=query {% endif %} SET_VELOCITY_LIMIT ACCEL={saved_accel} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _EXIT_POINT FUNCTION=homing_override {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="READY" {% endif %} [gcode_macro _GOTO_Z_PROBE] description = Move to z probe avoiding the probe dock gcode = {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set zcalib_plugin_enabled = printer["gcode_macro _USER_VARIABLES"].zcalib_plugin_enabled %} {% if zcalib_plugin_enabled %} {% set z_endstop_x, z_endstop_y = printer["configfile"].config["z_calibration"]["nozzle_xy_position"].split(',')|map('trim')|map('float') %} {% else %} {% set z_endstop_x, z_endstop_y = printer["gcode_macro _USER_VARIABLES"].zendstop_position|map('float') %} {% endif %} {% set homing_travel_speed = printer["gcode_macro _USER_VARIABLES"].homing_travel_speed|float * 60 %} {% set probe_dock_location_x, probe_dock_location_y = printer["gcode_macro _USER_VARIABLES"].probe_dock_location_xy|map('float') %} {% set probe_dock_margin_x, probe_dock_margin_y = printer["gcode_macro _USER_VARIABLES"].probe_dock_margin_xy|map('float') %} {% set current_x = printer.toolhead.position.x|float %} {% set current_y = printer.toolhead.position.y|float %} SAVE_GCODE_STATE NAME=goto_ZProbe G90 {% set avoid_dock = false %} {% if probe_dock_location_x < z_endstop_x|float %} {% if current_x < (probe_dock_location_x + probe_dock_margin_x) %} {% set avoid_dock = true %} {% endif %} {% else %} {% if current_x > (probe_dock_location_x - probe_dock_margin_x) %} {% set avoid_dock = true %} {% endif %} {% endif %} {% if avoid_dock == true %} {% if verbose %} { action_respond_info("Avoiding probe dock to home Z...") } {% endif %} G0 Y{probe_dock_location_y - probe_dock_margin_y} F{homing_travel_speed} G0 X{z_endstop_x} F{homing_travel_speed} {% endif %} G0 X{z_endstop_x} Y{z_endstop_y} F{homing_travel_speed} RESTORE_GCODE_STATE NAME=goto_ZProbe [gcode_macro CALIBRATE] description = Calibrate the printer flow or pressure advance gcode = {% set TYPE = params.TYPE|default("")|string|lower %} {% set BED_TEMP = params.BED_TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_bed_temp)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set MATERIAL = params.MATERIAL|default("ABS")|string %} {% set TOOL = params.TOOL|default(0)| int %} {% set center_x = printer.toolhead.axis_maximum.x|float / 2 %} {% set center_y = printer.toolhead.axis_maximum.y|float / 2 %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and printer.mmu.filament == "Loaded" %} {% set TOOL = printer.mmu.tool|int %} {% endif %} {% endif %} {% if TYPE=="flow" %} {% set computed_size = (center_x - 20)|string + '_' + (center_y - 20)|string + '_' + (center_x + 20)|string + '_' + (center_y + 20)|string %} START_PRINT EXTRUDER_TEMP={EXTRUDER_TEMP} BED_TEMP={BED_TEMP} MATERIAL={MATERIAL} SOAK=1 SIZE={computed_size} INITIAL_TOOL={TOOL} TOOLS_USED={TOOL} FLOW_MULTIPLIER_CALIBRATION EXTRUSION_WIDTH=0.471 END_PRINT FILTER_TIME=0 {% elif TYPE=="pressure_advance" %} {% set computed_size = (center_x - 60)|string + '_' + (center_y - 60)|string + '_' + (center_x + 60)|string + '_' + (center_y + 60)|string %} START_PRINT EXTRUDER_TEMP={EXTRUDER_TEMP} BED_TEMP={BED_TEMP} MATERIAL={MATERIAL} SOAK=1 SIZE={computed_size} INITIAL_TOOL={TOOL} TOOLS_USED={TOOL} PRESSURE_ADVANCE_CALIBRATION END_PRINT FILTER_TIME=0 {% else %} {action_respond_info("Please call this macro using TYPE= \"flow\" or \"pressure_advance\"")} {action_raise_error("not enough parameters to start a calibration!")} {% endif %} [gcode_macro _FLOW_CALIB_VARIABLES] variable_last_shell_thickness = 0.0 variable_last_evalue = 0.0 gcode = [gcode_macro FLOW_MULTIPLIER_CALIBRATION] description = Print a small tower to calibrate the extrusion flow multiplier by measuring the shell gcode = {% set do_raft = params.DO_RAFT|default(1)|int %} {% set do_retract = params.DO_RECTRACT|default(0)|int %} {% set print_size = params.PRINT_SIZE|default(40)|int %} {% set print_height = params.HEIGHT|default(15)|int %} {% set corner_radius = params.CORNER_RADIUS|default(8)|int %} {% set number_of_perimeters = params.PERIMETERS|default(2)|int %} {% set fan_speed = params.FAN_SPEED|default(20)|int %} {% set e_multiplier = params.EXTRUSION_MULTIPLIER|default(1.00)|float %} {% set filament_diameter = params.FILAMENT_DIAMETER|default(1.75)|float %} {% set extrusion_width = params.EXTRUSION_WIDTH|default(0.4)|float %} {% set layer_height = params.LAYER_HEIGHT|default(0.2)|float %} {% set retract_length = params.RETRACT_LENGTH|default(0.5)|float %} {% set initial_purge = params.PURGE_MM|default(1)|int %} {% set z_hop_height = 2 * layer_height %} {% set feedrate_print = params.CONTROL_SPEED|default(100)|int * 60 %} {% set feedrate_travel = params.TRAVEL_SPEED|default(200)|int * 60 %} {% set feedrate_raft = params.RAFT_SPEED|default(60)|int * 60 %} {% set feedrate_z = params.Z_LIFT_SPEED|default(20)|int * 60 %} {% set feedrate_retract = params.RETRACT_SPEED|default(50)|int * 60 %} {% set e_per_mm = ((extrusion_width - layer_height) * layer_height + 3.14159 * (layer_height / 2)**2) / (3.14159 * (filament_diameter / 2)**2) %} {% set spacing = extrusion_width - layer_height * (1 - 3.14159 / 4) %} {% set shell_thickness = extrusion_width + (number_of_perimeters|float - 1) * spacing %} {% set max_x = printer.toolhead.axis_maximum.x|float %} {% set max_y = printer.toolhead.axis_maximum.y|float %} {% set x_start = max_x / 2 - print_size / 2 %} {% set y_start = max_y / 2 - print_size / 2 %} {% set x_end = x_start + print_size %} {% set y_end = y_start + print_size %} {% set num_raft_lines = ([print_size, max_x]|min / spacing)|round(0, 'floor')|int %} {% set raft_size = num_raft_lines * spacing %} {action_respond_info("")} {action_respond_info("Starting extrusion flow calibration print")} {action_respond_info("This operation can not be interrupted by normal means. Hit the \"emergency stop\" button to stop it if needed")} {action_respond_info("")} {action_respond_info("Exrusion multiplier used: %.4f" % e_multiplier)} {action_respond_info("Number of perimeters to print: %d" % number_of_perimeters)} {action_respond_info("THEORIC SHELL THICKNESS: %.4f" % shell_thickness)} {action_respond_info("")} {action_respond_info("Measure the shell thickness using a caliper or micrometer. Then call the computation macro with the measured value:")} {action_respond_info("COMPUTE_FLOW_MULTIPLIER MEASURED_THICKNESS=xxx.xxx")} {action_respond_info("")} SAVE_GCODE_STATE NAME=STATE_FLOW_MULTIPLIER_CALIBRATION SET_GCODE_VARIABLE MACRO=_FLOW_CALIB_VARIABLES VARIABLE=last_shell_thickness VALUE={shell_thickness} SET_GCODE_VARIABLE MACRO=_FLOW_CALIB_VARIABLES VARIABLE=last_evalue VALUE={e_multiplier} G90 M83 G92 E0.0 G0 X{x_start} Y{y_start - 5} Z{layer_height} F{feedrate_travel} G91 G1 E{initial_purge} F{5 * 60} G1 X{raft_size} E{raft_size * e_per_mm * 1.5} F{feedrate_raft / 2} G1 Y-{extrusion_width} E{extrusion_width * e_per_mm} F{feedrate_raft / 2} G1 X-{raft_size} E{raft_size * e_per_mm} F{feedrate_raft / 2} G1 E-{retract_length} F{feedrate_retract} G0 Z{z_hop_height} F{feedrate_z} G90 G0 X{x_start} Y{y_start} F{feedrate_travel} G1 Z{layer_height} F{feedrate_z} G1 E{retract_length} F{feedrate_retract} M221 S{e_multiplier * 100} {% if do_raft == 1 %} G91 {% for curr_raft_line in range(1, num_raft_lines + 2) %} G1 Y{loop.cycle(1.0, -1.0) * raft_size} E{raft_size * e_per_mm} F{feedrate_raft} {% if not loop.last %} G1 X{spacing} E{spacing * e_per_mm} F{feedrate_raft} {% endif %} {% endfor %} G1 E-{retract_length} F{feedrate_retract} G0 Z{z_hop_height} F{feedrate_z} G90 {% endif %} G90 M106 S{fan_speed * 255 / 100} {% for curr_layer in range(1, (print_height / layer_height)|round|int) %} G0 X{x_start + corner_radius} Y{y_start} F{feedrate_travel} G1 Z{(curr_layer * layer_height) + (layer_height if do_raft == 1 else 0)} F{feedrate_z} {% for perim_num in range(number_of_perimeters) %} {% set perim_offset = perim_num * spacing %} {% set perim_radius = corner_radius - (perim_num * spacing) %} G1 X{x_start + corner_radius} Y{y_start + perim_offset} F{feedrate_travel} {% if do_retract == 1 %} G1 E{retract_length} F{feedrate_retract} {% endif %} G1 X{x_end - corner_radius} Y{y_start + perim_offset} E{(print_size - (2 * corner_radius)) * e_per_mm} F{feedrate_print} G3 X{x_end - perim_offset} Y{y_start + corner_radius} J{perim_radius} E{(3.14159 / 2) * perim_radius * e_per_mm} F{feedrate_print} G1 X{x_end - perim_offset} Y{y_end - corner_radius} E{(print_size - (2 * corner_radius)) * e_per_mm} F{feedrate_print} G3 X{x_end - corner_radius} Y{y_end - perim_offset} I-{perim_radius} E{(3.14159 / 2) * perim_radius * e_per_mm} F{feedrate_print} G1 X{x_start + corner_radius} Y{y_end - perim_offset} E{(print_size - (2 * corner_radius)) * e_per_mm} F{feedrate_print} G3 X{x_start + perim_offset} Y{y_end - corner_radius} J-{perim_radius} E{(3.14159 / 2) * perim_radius * e_per_mm} F{feedrate_print} G1 X{x_start + perim_offset} Y{y_start + corner_radius} E{(print_size - (2 * corner_radius)) * e_per_mm} F{feedrate_print} G3 X{x_start + corner_radius} Y{y_start + perim_offset} I{perim_radius} E{(3.14159 / 2) * perim_radius * e_per_mm} F{feedrate_print} {% if do_retract == 1 %} G1 E-{retract_length} F{feedrate_retract} {% endif %} {% endfor %} {% if do_retract == 1 %} G91 G0 Z{z_hop_height} F{feedrate_z} G90 {% endif %} {% endfor %} G1 E-{retract_length} F{feedrate_retract} G91 G0 Z20 F{feedrate_travel} RESTORE_GCODE_STATE NAME=STATE_FLOW_MULTIPLIER_CALIBRATION [gcode_macro COMPUTE_FLOW_MULTIPLIER] description = Compute a new flow multiplier by using the measured shell thickness on the calibration print gcode = {% set evalue = params.OLD_EXTRUSION_MULTIPLIER|default(0.0)|float %} {% set theorical_thickness = params.THEORICAL_THICKNESS|default(0.0)|float %} {% set measured_thickness = params.MEASURED_THICKNESS|default(0.0)|float %} {% if evalue == 0.0 %} {% set last_evalue = printer["gcode_macro _FLOW_CALIB_VARIABLES"].last_evalue %} {% if last_evalue == 0.0 %} {action_respond_info("It seems that no calibration print was run prior to this (or a restart of Klipper occured).")} {action_respond_info("You can still manually use it by calling again this macro like that:")} {action_respond_info("COMPUTE_FLOW_MULTIPLIER OLD_EXTRUSION_MULTIPLIER=xxx.xxx THEORICAL_THICKNESS=xxx.xxx MEASURED_THICKNESS=xxx.xxx")} {action_raise_error("not enough data to perform the computation of the new flow !")} {% else %} {% set final_evalue = last_evalue %} {action_respond_info("Using OLD_EXTRUSION_MULTIPLIER: %.3f" % final_evalue)} {% endif %} {% else %} {% set final_evalue = evalue %} {action_respond_info("Using OLD_EXTRUSION_MULTIPLIER: %.3f" % final_evalue)} {% endif %} {% if theorical_thickness == 0.0 %} {% set last_shell_thickness = printer["gcode_macro _FLOW_CALIB_VARIABLES"].last_shell_thickness %} {% if last_shell_thickness == 0.0 %} {action_respond_info("It seems that no calibration print was run prior to this (or a restart of Klipper occured).")} {action_respond_info("You can still manually use it by calling again this macro like that:")} {action_respond_info("COMPUTE_FLOW_MULTIPLIER OLD_EXTRUSION_MULTIPLIER=xxx.xxx THEORICAL_THICKNESS=xxx.xxx MEASURED_THICKNESS=xxx.xxx")} {action_raise_error("not enough data to perform the computation of the new flow !")} {% else %} {% set final_theorical_thickness = last_shell_thickness %} {action_respond_info("Using THEORICAL_THICKNESS: %.3f" % final_theorical_thickness)} {% endif %} {% else %} {% set final_theorical_thickness = theorical_thickness %} {action_respond_info("Using THEORICAL_THICKNESS: %.3f" % final_theorical_thickness)} {% endif %} {% if measured_thickness == 0.0 %} {action_respond_info("You must use a caliper or micrometer to measure the calibration print shell thickness and call this macro with the measured value !!!")} {action_respond_info("COMPUTE_FLOW_MULTIPLIER MEASURED_THICKNESS=xxx.xxx")} {action_raise_error("not enough data to perform the computation of the new flow !")} {% else %} {% set new_evalue = final_theorical_thickness * final_evalue / measured_thickness %} {action_respond_info("NEW COMPUTED FLOW VALUE: %.3f" % new_evalue)} {action_respond_info("Use this new value as extrusion multiplier in your slicer of choice")} {action_respond_info("")} {% endif %} [gcode_macro PRESSURE_ADVANCE_CALIBRATION] description = Calibrate the pressure advance by printing a grid pattern gcode = {% set pa_start = params.START|default(0.02)|float %} {% set pa_increment = params.INCREMENT|default(0.005)|float %} {% set do_raft = params.DO_RAFT|default(1)|int %} {% set print_size = params.PRINT_SIZE|default(120)|int %} {% set num_bands = params.BANDS_LIMIT|default(999)|int %} {% set lines_per_band = params.LINES_PER_BAND|default(6)|int %} {% set e_multiplier = params.EXTRUSION_MULTIPLIER|default(1.25 if do_raft == 1 else 1.5)|float %}, {% set retract_length = params.RETRACT_LENGTH|default(0.6)|float %} {% set initial_purge = params.PURGE_MM|default(8)|int %} {% set feedrate_control = params.CONTROL_SPEED|default(30)|int * 60 %} {% set feedrate_outer = params.OUTER_SPEED|default(40)|int * 60 %} {% set feedrate_inner = params.INNER_SPEED|default(120)|int * 60 %} {% set feedrate_travel = params.TRAVEL_SPEED|default(200)|int * 60 %} {% set feedrate_raft = params.RAFT_SPEED|default(120)|int * 60 %} {% set feedrate_z = 5 * 60 %} {% set feedrate_retract = 50 * 60 %} {% set spacing_line = params.LINE_SPACING|default(0.4)|float %} {% set spacing_band = 2 %} {% set spacing_raft = 2 %} {% set fast_line_ratio_percent = 50 %} {% set lines_per_band = [2, lines_per_band]|max %} {% set e_multiplier = [1, e_multiplier]|max %} {% set num_lines_control = (lines_per_band / 2)|round(0, 'floor')|int %} {% set num_lines_test = (lines_per_band / 2)|round(0, 'ceil')|int %} {% set spacing_line = spacing_line * (1 + e_multiplier - 1.25) %} {% set max_x = printer.toolhead.axis_maximum.x|float %} {% set max_y = printer.toolhead.axis_maximum.y|float %} {% set nozzle_diameter = printer.configfile.config['extruder'].nozzle_diameter|float %} {% set line_width = nozzle_diameter * 1.25 %} {% set line_height = nozzle_diameter / 2 %} {% set z_hop_height = 2 * line_height %} {% set e_per_mm = (line_width * line_height) / (3.1415 * (1.75/2)**2) %} {% set spacing_purge = line_height * 0.8 %} {% set spacing_raft = (spacing_raft / line_width)|round * line_width %} {% set num_raft_lines = ([print_size, max_x]|min / spacing_raft)|round(0, 'floor')|int %} {% set print_width = num_raft_lines * spacing_raft %} {% set band_height = lines_per_band * line_width + (lines_per_band - 1) * spacing_line + spacing_band %} {% set bands_per_height = (([print_size, max_y]|min - spacing_purge - 2 * line_width + spacing_band) / band_height)|round(0, 'floor')|int %} {% set num_bands = [num_bands, bands_per_height]|min %} {% set print_height = num_bands * band_height - spacing_band + spacing_purge + 2 * line_width %} {% set slow_line_length = ((print_width * (1 - fast_line_ratio_percent / 100) / 2) / spacing_raft)|round * spacing_raft + spacing_raft / 2 %} {% set fast_line_length = print_width - slow_line_length * 2 %} {% set thick_raft_num1 = (slow_line_length / spacing_raft)|round|int %} {% set thick_raft_num2 = num_raft_lines - thick_raft_num1 + 1 %} {% set x_start = max_x / 2 - print_width / 2 %} {% set y_start = max_y / 2 - print_height / 2 %} {action_respond_info("")} {action_respond_info("Starting Pressure Advance calibration print.")} {action_respond_info("")} {action_respond_info("This operation can not be interrupted by normal means. Hit the \"emergency stop\" button once the print starts exhibiting PA values that are obviously too high.")} {action_respond_info("")} {action_respond_info("PA of first band: %.4f" % pa_start)} {action_respond_info("PA of last band: %.4f" % (pa_start + ((num_bands - 1) * pa_increment)))} {action_respond_info("PA increment per band: %.4f" % pa_increment)} {action_respond_info("Number of bands: %d" % num_bands)} {action_respond_info("")} {action_respond_info("Inspect the printed model. " "Look at the top and bottom lines in each band, on the right side of the two vertical raft bars (where the print speeds change). " "Find the highest band from the bottom where the lines at its top still resemble the lines at its bottom, with no visible extrusion width irregularities. " "Your final Pressure Advance value would then be:" )} {action_respond_info("")} {action_respond_info("Assuming that first band_number is 0")} {action_respond_info("PA = %.4f + (%.4f * band_number)" % (pa_start, pa_increment))} {action_respond_info("")} {action_respond_info("Update your [extruder] config section and set \"pressure_advance\" to the value you calculated.")} {action_respond_info("")} SAVE_GCODE_STATE NAME=STATE_PRESSURE_ADVANCE_CALIBRATION {% set pa_saved = printer.configfile.settings['extruder'].pressure_advance %} SET_PRESSURE_ADVANCE ADVANCE={pa_start} M221 S100 M117 Priming G90 G0 X{x_start} Y{y_start} Z{line_height} F{feedrate_travel} G91 G1 E{initial_purge} F{5 * 60} G1 X{print_width} E{print_width * e_per_mm} F{feedrate_raft / 2} G1 Y{line_width} E{line_width * e_per_mm} F{feedrate_raft / 2} G1 X-{print_width} E{print_width * e_per_mm} F{feedrate_raft / 2} {% if do_raft == 1 %} G0 F{feedrate_raft} {% for curr_raft_line in range(1, num_raft_lines + 2) %} {% if curr_raft_line == thick_raft_num1 or curr_raft_line == thick_raft_num2 %} G1 Y{loop.cycle(1.0, -1.0) * print_height} E{print_height * e_per_mm} G1 X{line_width} E{line_width * e_per_mm} G1 Y{loop.cycle(-1.0, 1.0) * print_height} E{print_height * e_per_mm} G1 X{line_width} E{line_width * e_per_mm} {% endif %} G1 Y{loop.cycle(1.0, -1.0) * print_height} E{print_height * e_per_mm} {% if not loop.last %} {% set horizontal_move = spacing_raft - (2 * line_width if curr_raft_line == thick_raft_num1 - 1 or curr_raft_line == thick_raft_num2 - 1 else 0) %} G1 X{horizontal_move} E{horizontal_move * e_per_mm} {% endif %} {% endfor %} G1 E-{retract_length} F{feedrate_retract} G0 Z{z_hop_height} F{feedrate_z} {% endif %} M117 Printing bands G90 G0 X{x_start} Y{y_start + 2 * line_width + spacing_purge} F{feedrate_travel} G0 Z{line_height + (line_height if do_raft == 1 else 0)} F{feedrate_z} G91 G1 E{retract_length} F{feedrate_retract} {% for curr_band_num in range(0, num_bands ) %} {% set outer_loop = loop %} {% set curr_pa_value = pa_start + curr_band_num * pa_increment %} SET_PRESSURE_ADVANCE ADVANCE={curr_pa_value} M117 Band {curr_band_num} PA {curr_pa_value|round(4)} {% for _ in range(num_lines_control) %} G1 X{print_width} E{print_width * e_per_mm * e_multiplier} F{feedrate_control} G1 E-{retract_length} F{feedrate_retract} G0 Z{z_hop_height} F{feedrate_z} G0 X-{print_width} Y{spacing_line + line_width} F{feedrate_travel} G0 Z-{z_hop_height} F{feedrate_z} G1 E{retract_length} F{feedrate_retract} {% endfor %} {% for _ in range(num_lines_test) %} {% for data in [{'mm': slow_line_length, 'f': feedrate_outer}, {'mm': fast_line_length, 'f': feedrate_inner}, {'mm': slow_line_length, 'f': feedrate_outer}] %} G1 X{data.mm} E{data.mm * e_per_mm * e_multiplier} F{data.f} {% endfor %} G1 E-{retract_length} F{feedrate_retract} G0 Z{z_hop_height} F{feedrate_z} {% if not (outer_loop.last and loop.last) %} G0 X-{print_width} Y{(spacing_line if not loop.last else spacing_band) + line_width} F{feedrate_travel} G0 Z-{z_hop_height} F{feedrate_z} G1 E{retract_length} F{feedrate_retract} {% endif %} {% endfor %} {% endfor %} G1 E-{retract_length} F{feedrate_retract} G0 Z20 F{feedrate_z} G0 X-{print_width / 2} Y{[50, max_y - (y_start + print_height)]|min} F{feedrate_travel} M117 SET_PRESSURE_ADVANCE ADVANCE={pa_saved} RESTORE_GCODE_STATE NAME=STATE_PRESSURE_ADVANCE_CALIBRATION [gcode_macro CHANGE_FILAMENT] description = Do a PAUSE, park the toolhead over the purge bucket and unload the filament gcode = {% set TEMP = params.TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set DISTANCE = params.DISTANCE|default(105)|float %} SAVE_GCODE_STATE NAME=CHANGE_FILAMENT_state PAUSE _CONDITIONAL_MOVE_TO_PURGE_BUCKET Z_DROP=0 UNLOAD_FILAMENT TEMP={TEMP} DISTANCE={DISTANCE} RESTORE_GCODE_STATE NAME=CHANGE_FILAMENT_state [gcode_macro UNLOAD_FILAMENT] description = Basic unload of the filament (used with M600/CHANGE_FILAMENT) gcode = {% set TEMP = params.TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set DISTANCE = params.DISTANCE|default(105)|float %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set re_enable_filament_sensor = 0 %} {% if filament_sensor_enabled %} {% if (printer['filament_motion_sensor runout_sensor'] is defined and printer['filament_motion_sensor runout_sensor'].enabled) or (printer['filament_switch_sensor runout_sensor'] is defined and printer['filament_switch_sensor runout_sensor'].enabled) %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% set re_enable_filament_sensor = 1 %} {% if verbose %} RESPOND MSG="Runout sensor deactivated to unload filament" {% endif %} {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE=0 {% endif %} SAVE_GCODE_STATE NAME=UNLOAD_FILAMENT_state _LOW_TEMP_CHECK T={TEMP} _TIP_SHAPING M83 G1 E-20 F3600 G4 P3000 G1 E{DISTANCE|float * -1} F3000 M400 RESTORE_GCODE_STATE NAME=UNLOAD_FILAMENT_state {% if filament_sensor_enabled and re_enable_filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% if verbose %} RESPOND MSG="Filament unloaded, runout sensor reactivated" {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE={printer.mmu.clog_detection} {% endif %} [gcode_macro LOAD_FILAMENT] description = Basic load of the filament (used with M600/CHANGE_FILAMENT) gcode = {% set TEMP = params.TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set DISTANCE = params.DISTANCE|default(105)|float %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set re_enable_filament_sensor = 0 %} {% if filament_sensor_enabled %} {% if (printer['filament_motion_sensor runout_sensor'] is defined and printer['filament_motion_sensor runout_sensor'].enabled) or (printer['filament_switch_sensor runout_sensor'] is defined and printer['filament_switch_sensor runout_sensor'].enabled) %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% set re_enable_filament_sensor = 1 %} {% if verbose %} RESPOND MSG="Runout sensor deactivated to load filament" {% endif %} {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE=0 {% endif %} SAVE_GCODE_STATE NAME=LOAD_FILAMENT_state _LOW_TEMP_CHECK T={TEMP} M83 G92 E0 G1 E{DISTANCE|float} F200 G1 E50 F150 M400 G92 E0 RESTORE_GCODE_STATE NAME=LOAD_FILAMENT_state {% if filament_sensor_enabled and re_enable_filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% if verbose %} RESPOND MSG="Filament loaded, runout sensor reactivated" {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE={printer.mmu.clog_detection} {% endif %} [gcode_macro _TIP_SHAPING] description = Filament tip shaping sequence gcode = {% set TEMP = params.TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set re_enable_filament_sensor = 0 %} {% if filament_sensor_enabled %} {% if (printer['filament_motion_sensor runout_sensor'] is defined and printer['filament_motion_sensor runout_sensor'].enabled) or (printer['filament_switch_sensor runout_sensor'] is defined and printer['filament_switch_sensor runout_sensor'].enabled) %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% set re_enable_filament_sensor = 1 %} {% if verbose %} RESPOND MSG="Runout sensor deactivated for filament tip shaping" {% endif %} {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE=0 {% endif %} SAVE_GCODE_STATE NAME=TIP_SHAPING_state _LOW_TEMP_CHECK T={TEMP} {% set old_pressure_advance = printer.extruder.pressure_advance|default(0) %} SET_PRESSURE_ADVANCE ADVANCE=0 M82 G92 E0 G1 E2 F3600 G1 E0 F3600 G1 E3 F3600 G1 E0 F3600 G1 E4 F3600 G1 E0 F3600 SET_PRESSURE_ADVANCE ADVANCE={old_pressure_advance} M400 RESTORE_GCODE_STATE NAME=TIP_SHAPING_state {% if filament_sensor_enabled and re_enable_filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% if verbose %} RESPOND MSG="Filament tip shaping done, runout sensor reactivated" {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE={printer.mmu.clog_detection} {% endif %} [gcode_macro HEATSOAK_CHAMBER] description = Heatsoak chamber to a specific temperature with a timeout gcode = {% set chamber_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].chamber_temperature_sensor_enabled %} {% if chamber_sensor_enabled %} {% set SETPOINT_TEMP = params.TEMP|default(0)|float %} {% set MAXTIME = params.MAXTIME|default(printer["gcode_macro _USER_VARIABLES"].print_default_chamber_max_heating_time)|int %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% for _ in range(1, MAXTIME) %} _WAIT_CHAMBER_TEMP TEMP={SETPOINT_TEMP} {% endfor %} {% if verbose %} RESPOND MSG="Chamber temperature OK or timeout reached!" {% endif %} {% endif %} [gcode_macro _WAIT_CHAMBER_TEMP] gcode = {% set chamber_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].chamber_temperature_sensor_enabled %} {% if chamber_sensor_enabled %} {% set chamber_sensor_name = printer["gcode_macro _USER_VARIABLES"].chamber_temperature_sensor_name %} {% set SETPOINT_TEMP = params.TEMP|default(0)|float %} {% set CURRENT_TEMP = printer["temperature_sensor " ~ chamber_sensor_name].temperature|float %} {% if CURRENT_TEMP <= SETPOINT_TEMP %} RESPOND MSG="Heating up the chamber : {CURRENT_TEMP}/{SETPOINT_TEMP}" G4 P{60000 * 1} {% endif %} {% endif %} [gcode_macro HEATSOAK_BED] description = Heatsoak bed at specified temperature and wait for a specific amount of time gcode = {% set SETPOINT_TEMP = params.TEMP|default(0)|int %} {% set TIME = params.SOAKTIME|default(8)|int %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set heaterbed_enabled = printer["gcode_macro _USER_VARIABLES"].heaterbed_enabled %} {% set heatsoak_bed_enabled = printer["gcode_macro _USER_VARIABLES"].print_default_soak > 0 %} {% if heaterbed_enabled %} {% if verbose %} RESPOND MSG="Heating up bed..." {% endif %} M190 S{SETPOINT_TEMP} {% if TIME > 0 %} {% for i in range(0, TIME) %} RESPOND MSG="Heatsoak bed, {TIME-i}mn left..." G4 P{60000 * 1} {% endfor %} {% else %} {% if heatsoak_bed_enabled %} RESPOND MSG="No heatsoak needed, continue" {% endif %} {% endif %} {% if verbose %} RESPOND MSG="Bed temperature OK" {% endif %} {% else %} {% if verbose %} RESPOND MSG="No bed heater defined: nothing to do, continuing..." {% endif %} {% endif %} [gcode_macro PRIMELINE] gcode = {% set prime_line_length = params.LINE_LENGTH|default(printer["gcode_macro _USER_VARIABLES"].prime_line_length)|float %} {% set prime_line_purge_distance = params.PURGE_LENGTH|default(printer["gcode_macro _USER_VARIABLES"].prime_line_purge_distance)|float %} {% set prime_line_flowrate = params.FLOWRATE|default(printer["gcode_macro _USER_VARIABLES"].prime_line_flowrate)|float %} {% set prime_line_height = params.LINE_HEIGHT|default(printer["gcode_macro _USER_VARIABLES"].prime_line_height)|default(0.6)|float %} {% set prime_line_adaptive = params.ADAPTIVE_MODE|default(1)|int %} {% set prime_line_margin = params.LINE_MARGIN|default(printer["gcode_macro _USER_VARIABLES"].prime_line_margin)|default(5.0)|float %} {% set prime_line_unretract_length = printer["gcode_macro _USER_VARIABLES"].unretract_length|default(23)|float %} {% set prime_line_wipe = printer["gcode_macro _USER_VARIABLES"].prime_line_wipe|default(False) %} {% set prime_line_wipe_length = prime_line_length * 0.8 %} {% set coordinatesFound = false %} {% if params.SIZE is defined and params.SIZE != "0_0_0_0" %} {% set xMinSpec, yMinSpec, xMaxSpec, yMaxSpec = params.SIZE.split('_')|map('trim')|map('int') %} {% set coordinatesFound = true %} {% elif printer.exclude_object is defined %} {% if printer.exclude_object.objects %} {% set eo_points = printer.exclude_object.objects|map(attribute='polygon')|sum(start=[]) %} {% set xMinSpec = eo_points|map(attribute=0)|min %} {% set yMinSpec = eo_points|map(attribute=1)|min %} {% set xMaxSpec = eo_points|map(attribute=0)|max %} {% set yMaxSpec = eo_points|map(attribute=1)|max %} {% set coordinatesFound = true %} {% endif %} {% endif %} {% set prime_line_x, prime_line_y = printer["gcode_macro _USER_VARIABLES"].prime_line_xy|map('float') %} {% set prime_line_x = params.START_X|default(prime_line_x)|float %} {% set prime_line_y = params.START_Y|default(prime_line_y)|float %} {% set prime_line_direction = params.LINE_DIRECTION|default(printer["gcode_macro _USER_VARIABLES"].prime_line_direction)|string|upper %} {% set center_x, center_y = [printer.toolhead.axis_maximum.x / 2, printer.toolhead.axis_maximum.y / 2]|map("float") %} {% if coordinatesFound and prime_line_adaptive == 1 %} {% set prime_line_x = 2*center_x - prime_line_x if (prime_line_x > center_x and xMaxSpec < center_x) or (prime_line_x < center_x and xMinSpec > center_x) else prime_line_x %} {% set prime_line_y = 2*center_y - prime_line_y if (prime_line_y > center_y and yMaxSpec < center_y) or (prime_line_y < center_y and yMinSpec > center_y) else prime_line_y %} {% set prime_line_x = [[prime_line_x, xMinSpec - prime_line_margin]|max, xMaxSpec + prime_line_margin]|min %} {% set prime_line_y = [[prime_line_y, yMinSpec - prime_line_margin]|max, yMaxSpec + prime_line_margin]|min %} {% endif %} {% set prime_line_way = -1 if (prime_line_direction == "X" and prime_line_x > center_x) or (prime_line_direction == "Y" and prime_line_y > center_y) else 1 %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set re_enable_filament_sensor = 0 %} {% set max_extrude_cross_section = printer["configfile"].config["extruder"]["max_extrude_cross_section"]|float %} {% set filament_diameter = printer["configfile"].config["extruder"]["filament_diameter"]|float %} {% set purge_volume = prime_line_purge_distance * 3.14159 * (filament_diameter / 2)**2 %} {% set line_width = purge_volume / (prime_line_height * prime_line_length) %} {% if (prime_line_height * line_width) > max_extrude_cross_section %} {% if verbose %} {action_respond_info("The prime_line_purge_distance of %.4f mm is too high and will exceed the max_extrude_cross_section!" % prime_line_purge_distance)} {% endif %} {% set prime_line_purge_distance = 0.98 * (max_extrude_cross_section * prime_line_length) / (3.14159 * (filament_diameter / 2)**2) %} {% set purge_volume = prime_line_purge_distance * 3.14159 * (filament_diameter / 2)**2 %} {% set line_width = purge_volume / (prime_line_height * prime_line_length) %} {% if verbose %} {action_respond_info("Klippain corrected the prime_line_purge_distance to %.4f mm" % prime_line_purge_distance)} {% endif %} {% endif %} {% if (prime_line_height / line_width) >= 0.5 %} {action_raise_error("The prime line will be too thin and will probably not stick properly to the bed. Increase its purge distance or decrease its length!")} {% endif %} {% set speed = (prime_line_flowrate / (prime_line_height * line_width)) * 60 |float %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE=0 {% endif %} {% if filament_sensor_enabled %} {% if (printer['filament_motion_sensor runout_sensor'] is defined and printer['filament_motion_sensor runout_sensor'].enabled) or (printer['filament_switch_sensor runout_sensor'] is defined and printer['filament_switch_sensor runout_sensor'].enabled) %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% set re_enable_filament_sensor = 1 %} {% endif %} {% endif %} G91 M83 {% if (printer.toolhead.position.z < 5) %} G1 Z5 F{Sz} {% endif %} G90 G0 X{prime_line_x} Y{prime_line_y} F{St} G1 Z{prime_line_height} F{Sz|int / 2} G92 E0 G1 E{prime_line_unretract_length} F300 G92 E0 {% if prime_line_direction == "X" %} G1 X{prime_line_x + prime_line_way*prime_line_length} E{prime_line_purge_distance} F{speed} {% if prime_line_wipe %} G0 X{prime_line_x + prime_line_way*prime_line_wipe_length} F{St} {% endif %} {% elif prime_line_direction == "Y" %} G1 Y{prime_line_y + prime_line_way*prime_line_length} E{prime_line_purge_distance} F{speed} {% if prime_line_wipe %} G0 Y{prime_line_y + prime_line_way*prime_line_wipe_length} F{St} {% endif %} {% else %} { action_respond_error("Prime line direction is not valid. Choose either X or Y in the variables.cfg file!") } {% endif %} G92 E0 G1 E-0.2 F2100 G92 E0 G1 Z3 F{Sz} G91 G1 X2 Y2 F{St} G90 M400 {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE={printer.mmu.clog_detection} {% endif %} {% if filament_sensor_enabled and re_enable_filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% endif %} [gcode_macro CLEAN_NOZZLE] description = Wipe the nozzle on the brush gcode = {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% set purgeclean_servo_enabled = printer["gcode_macro _USER_VARIABLES"].purgeclean_servo_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set brush_clean_accel = printer["gcode_macro _USER_VARIABLES"].brush_clean_accel %} {% set brush_over_y_axis = printer["gcode_macro _USER_VARIABLES"].brush_over_y_axis %} {% set brush_offset = printer["gcode_macro _USER_VARIABLES"].brush_center_offset|default(0)|float %} {% set brush_size = printer["gcode_macro _USER_VARIABLES"].brush_width_x|default(40)|float %} {% set brushes = printer["gcode_macro _USER_VARIABLES"].brushes|default(6)|int %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% if purge_and_brush_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set Sc = printer["gcode_macro _USER_VARIABLES"].brush_clean_speed * 60 %} {% set Bx, By, Bz = printer["gcode_macro _USER_VARIABLES"].brush_xyz|map('float') %} {% set Bx = Bx + brush_offset %} {% if status_leds_enabled %} STATUS_LEDS COLOR="CLEANING" {% endif %} {% if verbose %} RESPOND MSG="Nozzle cleaning..." {% endif %} {% set saved_accel = printer.toolhead.max_accel %} SET_VELOCITY_LIMIT ACCEL={brush_clean_accel} G90 _CONDITIONAL_MOVE_TO_PURGE_BUCKET Z_DROP=1 G1 X{Bx} Y{By} F{St} G1 Z{Bz} F{St} G91 {% if brush_over_y_axis %} {% for wipe in range(brushes) %} G1 Y-5 F{Sc} G1 Y+5 F{Sc} {% endfor %} {% endif %} {% if brush_offset < 0 %} G1 X+{ brush_size/2 } F{Sc} {% else %} G1 X+{ (brush_size/2) - brush_offset} F{Sc} {% endif %} {% for wipe in range(brushes) %} G1 X-{ (brush_size) - brush_offset } F{Sc} G1 X+{ (brush_size) - brush_offset } F{Sc} {% endfor %} G90 SET_VELOCITY_LIMIT ACCEL={saved_accel} {% if purgeclean_servo_enabled %} _SERVO_RETRACT ITEM="clean" {% endif %} {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="READY" {% endif %} [gcode_macro PURGE] description = Purge a specific amount of filament ontop of the purge bucket gcode = {% set DISTANCE = params.DISTANCE|default(printer["gcode_macro _USER_VARIABLES"].purge_distance)|int %} {% set OOZE_TIME = params.OOZE_TIME|default(printer["gcode_macro _USER_VARIABLES"].purge_ooze_time)|int %} {% set TEMP = params.TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set Z_DROP = params.Z_DROP|default(1)|int %} {% set RETRACT = params.RETRACT|default(printer["gcode_macro _USER_VARIABLES"].retract_length)|default(20)|float %} {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% set purgeclean_servo_enabled = printer["gcode_macro _USER_VARIABLES"].purgeclean_servo_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set re_enable_filament_sensor = 0 %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% if purge_and_brush_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% if status_leds_enabled %} STATUS_LEDS COLOR="CLEANING" {% endif %} {% if verbose %} RESPOND MSG="Purge filament..." {% endif %} {% if filament_sensor_enabled %} {% if (printer['filament_motion_sensor runout_sensor'] is defined and printer['filament_motion_sensor runout_sensor'].enabled) or (printer['filament_switch_sensor runout_sensor'] is defined and printer['filament_switch_sensor runout_sensor'].enabled) %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% set re_enable_filament_sensor = 1 %} {% endif %} {% endif %} G90 _CONDITIONAL_MOVE_TO_PURGE_BUCKET Z_DROP={Z_DROP} _LOW_TEMP_CHECK T={TEMP} G92 E0 G1 E{DISTANCE|float} F150 G92 E0 G1 E-{RETRACT * 0.1} F2100 G1 E-{RETRACT - (RETRACT * 0.1)} F150 G92 E0 G4 P{OOZE_TIME * 1000} {% if filament_sensor_enabled and re_enable_filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% endif %} {% if purgeclean_servo_enabled %} _SERVO_RETRACT ITEM="purge" {% endif %} {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="READY" {% endif %} [gcode_macro _CONDITIONAL_MOVE_TO_PURGE_BUCKET] description = Move over the purge bucket gcode = {% set Z_DROP = params.Z_DROP|default(1)|int %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% set purgeclean_servo_enabled = printer["gcode_macro _USER_VARIABLES"].purgeclean_servo_enabled %} {% set Px, Py, Pz = printer["gcode_macro _USER_VARIABLES"].purge_bucket_xyz|map('float') %} {% if purge_and_brush_enabled %} SAVE_GCODE_STATE NAME=CONDITIONAL_MOVE_TO_PURGE_BUCKET_STATE G90 {% if Z_DROP == 1 %} {% if purgeclean_servo_enabled %} G1 Z{Pz} F{Sz} _SERVO_DEPLOY ITEM="purge" {% endif %} G1 X{Px} Y{Py} F{St} G1 Z{Pz} F{St} {% else %} G1 X{Px} Y{Py} F{St} {% endif %} RESTORE_GCODE_STATE NAME=CONDITIONAL_MOVE_TO_PURGE_BUCKET_STATE {% endif %} [gcode_macro _LOW_TEMP_CHECK] description = Check the nozzle is at temperature and heat it if needed gcode = {% set T = params.T|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% if printer.extruder.target != 0 %} {% if printer.extruder.temperature < printer.extruder.target %} M109 S{printer.extruder.target|float} {% endif %} {% else %} {% if printer.extruder.target < T %} M109 S{T} {% endif %} {% endif %} [gcode_macro M701] description = Map M701 to LOAD_FILAMENT gcode = LOAD_FILAMENT [gcode_macro M702] description = Map M702 to UNLOAD_FILAMENT gcode = UNLOAD_FILAMENT [gcode_macro M600] description = Map M600 to CHANGE_FILAMENT gcode = CHANGE_FILAMENT [gcode_macro M125] description = Map M125 to PARK gcode = PARK [gcode_macro M900] description = Map M900 to SET_PRESSURE_ADVANCE gcode = {% if 'K' in params %} {% if 'E' in params %} SET_PRESSURE_ADVANCE EXTRUDER={params.E} ADVANCE={params.K} {% else %} SET_PRESSURE_ADVANCE ADVANCE={params.K} {% endif %} {% endif %} [gcode_macro M204] description = Map M204 to SET_VELOCITY_LIMIT for ACCEL rename_existing = M204.1 gcode = {% if 'S' in params %} {% set S = params.S|float %} SET_VELOCITY_LIMIT ACCEL={S} {% endif %} [gcode_macro M205] description = Map M205 to SET_VELOCITY_LIMIT for SQUARE_CORNER_VELOCITY gcode = {% if 'X' in params %} SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={params.X} {% elif 'Y' in params %} SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={params.Y} {% endif %} [gcode_macro G00] gcode = G0 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} [gcode_macro G01] gcode = G1 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} [gcode_macro G02] gcode = G2 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} [gcode_macro G03] gcode = G2 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} [gcode_macro G04] gcode = G4 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} [gcode_macro _SEARCH_VARS] description = Search for variables in the "printer" object from Klipper gcode = {% set search = params.S|lower %} {% set ns = namespace() %} {% for item in printer %} {% if ' ' in item %} {% set ns.path = ['printer', "['%s']" % (item), ''] %} {% else %} {% set ns.path = ['printer.', item, ''] %} {% endif %} {% if search in ns.path|lower %} { action_respond_info(ns.path|join) } {% endif %} {% if printer[item].items() %} {% for childkey, child in printer[item].items() recursive %} {% set ns.path = ns.path[:loop.depth|int + 1] %} {% if ' ' in childkey %} {% set null = ns.path.append("['%s']" % (childkey)) %} {% else %} {% set null = ns.path.append(".%s" % (childkey)) %} {% endif %} {% if child is mapping %} { loop(child.items()) } {% else %} {% if search in ns.path|lower %} { action_respond_info("%s : %s" % (ns.path|join, child)) } {% endif %} {% endif %} {% endfor %} {% endif %} {% endfor %} [delayed_gcode KLIPPAIN_STARTUP] initial_duration = 1 gcode = _KLIPPAIN_STARTUP [gcode_macro _KLIPPAIN_STARTUP] gcode = {% if printer["gcode_macro _USER_VARIABLES"].minidisplay_bootlogo_enabled %} _INIT_BOOT_LOGO {% endif %} RUN_SHELL_COMMAND CMD=system_info _INIT_MCU_VER {% set extruder_enabled = printer["gcode_macro _USER_VARIABLES"].extruder_enabled %} {% if not extruder_enabled %} { action_raise_error("Klippain need to have an extruder defined to work properly. Check your printer.cfg includes!") } {% endif %} _INIT_CHECKPROBECONF {% set e_driver = printer["gcode_macro _USER_VARIABLES"].e_driver|string %} {% if e_driver == "TMC2240" %} _INIT_TMC2240 {% endif %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set klippain_ercf_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_ercf_enabled %} {% if klippain_mmu_enabled or klippain_ercf_enabled %} _INIT_CHECK_MMU {% endif %} _INIT_LEDS _INIT_USERCUSTOM {% if klippain_mmu_enabled %} RESPOND MSG="Klippain with MMU support started and ready!" {% else %} RESPOND MSG="Klippain started and ready!" {% endif %} [gcode_macro _INIT_LEDS] gcode = {% if printer["gcode_macro _USER_VARIABLES"].status_leds_enabled or printer["gcode_macro _USER_VARIABLES"].status_leds_caselight_enabled %} {% if printer["gcode_macro _USER_VARIABLES"].caselight_on_at_startup|default(False) %} {% if printer["gcode_macro _USER_VARIABLES"].light_enabled %} LIGHT_ON {% endif %} STATUS_LEDS COLOR="READY" {% else %} {% if printer["gcode_macro _USER_VARIABLES"].light_enabled %} LIGHT_OFF {% endif %} STATUS_LEDS COLOR="OFF" {% endif %} {% endif %} [gcode_macro _INIT_TMC2240] gcode = [gcode_macro _INIT_CHECKPROBECONF] gcode = {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled|string %} {% set zcalib_plugin_enabled = printer["gcode_macro _USER_VARIABLES"].zcalib_plugin_enabled %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set qgl_enabled = printer["gcode_macro _USER_VARIABLES"].qgl_enabled %} {% set ztilt_enabled = printer["gcode_macro _USER_VARIABLES"].ztilt_enabled %} {% if zcalib_plugin_enabled %} {% if probe_type_enabled == "vorontap" %} { action_raise_error("Voron TAP Probe and Z calibration plugin cannot be used at the same time in Klippain!") } {% elif probe_type_enabled == "bltouch" %} { action_raise_error("BLTouch Probe and Z calibration plugin cannot be used at the same time in Klippain!") } {% elif probe_type_enabled == "inductive" %} { action_raise_error("Inductive probe and Z calibration plugin cannot be used at the same time in Klippain!") } {% elif probe_type_enabled == "dockable_virtual" or probe_type_enabled == "inductive_virtual" %} { action_raise_error("Virtual Z endstop probes are not compatible with the Z calibration plugin!") } {% elif probe_type_enabled == "none" %} { action_raise_error("You need a probe to use the Z calibration plugin in Klippain!") } {% endif %} {% endif %} {% if bed_mesh_enabled and probe_type_enabled == "none" %} { action_raise_error("You need a to define a probe to be able to perform a bed mesh in Klippain!") } {% endif %} {% if qgl_enabled and probe_type_enabled == "none" %} { action_raise_error("You need a to define a probe to be able to perform a quad gantry leveling in Klippain!") } {% endif %} {% if ztilt_enabled and probe_type_enabled == "none" %} { action_raise_error("You need a to define a probe to be able to perform a Z tilt adjust in Klippain!") } {% endif %} [gcode_macro _INIT_MCU_VER] gcode = {% set parameters = namespace(output = 'Currently configured MCU(s): \n') %} {% for name1 in printer %} {% for name2 in printer[name1] %} {% set show = ['mcu_version'] %} {% if name2 is in show %} {% set param = "%s: %s" % (name1, printer[name1][name2]) %} {% set parameters.output = parameters.output + param + "\n" %} {% endif %} {% endfor %} {% endfor %} {action_respond_info(parameters.output)} [gcode_macro _INIT_CHECK_MMU] gcode = {% if printer.mmu is not defined %} {% if printer.ercf is not defined %} { action_raise_error("MMU support is enabled in Klippain, but HappyHare, the supported MMU/ERCF backend software is not detected. See the corresponding documentation: https://github.com/Frix-x/klippain/blob/main/docs/mmu.md") } {% else %} { action_raise_error("ERCF support is enabled in Klippain, but the old version of version of HappyHare (ie. ERCF-Software-V3) is installed. Please uninstall it and install the latest HappyHare instead. See the corresponding documentation: https://github.com/Frix-x/klippain/blob/main/docs/mmu.md") } {% endif %} {% elif printer['gcode_macro _USER_VARIABLES'].mmu_force_homing_in_start_print is not defined or printer['gcode_macro _USER_VARIABLES'].mmu_unload_on_cancel_print is not defined or printer['gcode_macro _USER_VARIABLES'].mmu_unload_on_end_print is not defined or printer['gcode_macro _USER_VARIABLES'].mmu_check_gates_on_start_print is not defined or printer['gcode_macro _USER_VARIABLES'].mmu_check_errors_on_start_print is not defined %} { action_raise_error("MMU support is enabled in Klippain, but some variables are missing from your variables.cfg. Please update your template or refer to the corresponding documentation: https://github.com/Frix-x/klippain/blob/main/docs/mmu.md") } {% elif printer["gcode_macro _USER_VARIABLES"].mmu_check_errors_on_start_print and printer.mmu.print_start_detection|int == 1 %} RESPOND MSG="The HappyHare function to automatically detect the start and end of a print has been automatically disabled to allow early detection of an error during the Klippain START_PRINT sequence. This allow a more efficient debugging of the MMU. Refer to the <a href="https://github.com/Frix-x/klippain/blob/main/docs/mmu.md">Klippain MMU documentation</a>" MMU_TEST_CONFIG print_start_detection=0 {% endif %} [gcode_macro _INIT_USERCUSTOM] gcode = [stepper_x] rotation_distance = 40 microsteps = 32 full_steps_per_rotation = 200 step_pin = X_STEP dir_pin = X_DIR enable_pin = !X_ENABLE endstop_pin = X_STOP homing_speed = 60 homing_retract_dist = 0 position_endstop = 0 position_max = 235 [stepper_y] rotation_distance = 40 microsteps = 32 full_steps_per_rotation = 200 step_pin = Y_STEP dir_pin = Y_DIR enable_pin = !Y_ENABLE endstop_pin = Y_STOP homing_speed = 60 homing_retract_dist = 0 position_endstop = 0 position_max = 235 [stepper_z] rotation_distance = 8 microsteps = 32 full_steps_per_rotation = 200 step_pin = Z_STEP dir_pin = Z_DIR enable_pin = !Z_ENABLE endstop_pin = Z_STOP homing_speed = 15 second_homing_speed = 8 homing_retract_dist = 3.0 position_endstop = 0 position_max = 245 [stepper_z1] rotation_distance = 8 microsteps = 32 full_steps_per_rotation = 200 step_pin = Z1_STEP dir_pin = Z1_DIR enable_pin = !Z1_ENABLE [stepper_z2] rotation_distance = 8 microsteps = 32 full_steps_per_rotation = 200 step_pin = Z2_STEP dir_pin = Z2_DIR enable_pin = !Z2_ENABLE [gcode_macro _USER_VARIABLES] variable_heaterbed_enabled = True gcode = variable_probe_type_enabled = "dockable" variable_startprint_actions = "bed_soak", "extruder_preheating", "chamber_soak", "tilt_calib", "extruder_heating", "purge", "clean", "z_offset", "bedmesh", "primeline" variable_verbose = True variable_homing_travel_speed = 350 variable_travel_speed = 350 variable_z_drop_speed = 15 variable_brush_clean_speed = 100 variable_probe_dock_speed = 60 variable_homing_travel_accel = 3000 variable_tilting_travel_accel = 3000 variable_brush_clean_accel = 1500 variable_probe_dock_accel = 2000 variable_zendstop_position = -1, -1 variable_force_homing_in_start_print = False variable_homing_zhop = 5 variable_homing_first = "X" variable_homing_backoff_distance_xy = -5, -5 variable_sensorless_current_factor = 75 variable_probe_dock_margin_xy = 0, 0 variable_safe_extruder_temp = 150 variable_prime_line_xy = 5, 2.5 variable_prime_line_direction = "X" variable_prime_line_length = 40 variable_prime_line_purge_distance = 30 variable_prime_line_flowrate = 10 variable_prime_line_height = 0.6 variable_prime_line_margin = 5 variable_prime_line_wipe = False variable_retract_length = 20 variable_unretract_length = 23 variable_park_position_xy = -1, -1 variable_park_lift_z = 50 variable_disable_motors_in_end_print = False variable_turn_off_heaters_in_end_print = True variable_idle_timeout_on_pause = 0 variable_min_bed_xy = 0, 0 variable_max_bed_xy = 9999, 9999 variable_probe_min_z_travel = 20 variable_probe_stow_z_height = None variable_probe_dock_location_xy = -1, -1 variable_probe_servo_angle_retracted = 0 variable_probe_servo_angle_deployed = 90 variable_probe_before_attach_position = "front" variable_probe_after_attach_position = "front" variable_probe_before_dock_position = "front" variable_probe_after_dock_position = "left" variable_probe_move_attach_length = 30 variable_probe_move_dock_length = 30 variable_autodock_on_probe_error = True variable_tap_max_probing_temp = 150 variable_tap_deactivation_zhop = 5 variable_print_default_bed_temp = 105 variable_print_default_extruder_temp = 240 variable_print_default_chamber_temp = 0 variable_print_default_chamber_max_heating_time = 15 variable_print_default_soak = 8 variable_print_default_material = "XXX" variable_material_parameters = { 'PLA': { 'pressure_advance': 0.0525, 'retract_length': 0.75, 'unretract_extra_length': 0, 'retract_speed': 40, 'unretract_speed': 30, 'filter_speed': 0, 'additional_z_offset': 0, 'filament_sensor': 1 }, 'PET': { 'pressure_advance': 0.0650, 'retract_length': 1.4, 'unretract_extra_length': 0, 'retract_speed': 30, 'unretract_speed': 20, 'filter_speed': 0, 'additional_z_offset': 0.020, 'filament_sensor': 1 }, 'ABS': { 'pressure_advance': 0.0480, 'retract_length': 0.5, 'unretract_extra_length': 0, 'retract_speed': 40, 'unretract_speed': 30, 'filter_speed': 80, 'additional_z_offset': 0, 'filament_sensor': 1 }, 'TPU': { 'pressure_advance': 0.0500, 'retract_length': 0.2, 'unretract_extra_length': 0, 'retract_speed': 5, 'unretract_speed': 5, 'filter_speed': 0, 'additional_z_offset': 0.040, 'filament_sensor': 0 } } variable_mmu_force_homing_in_start_print = False variable_mmu_unload_on_cancel_print = False variable_mmu_unload_on_end_print = True variable_mmu_check_gates_on_start_print = False variable_mmu_check_errors_on_start_print = False variable_filter_default_time_on_end_print = 600 variable_purge_and_brush_enabled = False variable_force_homing_before_brush = False variable_brush_over_y_axis = True variable_brush_xyz = -1, -1, -1 variable_brush_width_x = 40 variable_brush_center_offset = 0 variable_brushes = 6 variable_purge_bucket_xyz = -1, -1, -1 variable_purge_distance = 30 variable_purge_ooze_time = 10 variable_purgeclean_servo_angle_retracted = 0 variable_purgeclean_servo_angle_deployed = 90 variable_light_intensity_start_print = 100 variable_light_intensity_printing = 30 variable_light_intensity_end_print = 0 variable_caselight_on_at_startup = False variable_fix_heaters_temperature_settle = False variable_resonnance_test_point_xy = -1, -1 variable_resonnance_test_z_clearance = 50 variable_x_driver = "tmc2209" variable_y_driver = "tmc2209" variable_z_driver = "tmc2209" variable_e_driver = "tmc2209" [heater_bed] heater_pin = BED_HEATER sensor_type = EPCOS 100K B57560G104F sensor_pin = BED_TEMPERATURE max_power = 1 min_temp = 0 max_temp = 100 control = pid pid_kp = 38.771 pid_ki = 1.746 pid_kd = 215.177 [gcode_macro M190] rename_existing = M190.1 gcode = {% set S = params.S|float %} {% set actual_temp = printer.heater_bed.temperature|float %} {% set fix_heaters_temperature_settle = printer["gcode_macro _USER_VARIABLES"].fix_heaters_temperature_settle %} {% if fix_heaters_temperature_settle %} M140 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} {% if S != 0 %} {% if actual_temp <= S %} TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={S} {% else %} TEMPERATURE_WAIT SENSOR=heater_bed MAXIMUM={S} {% endif %} {% endif %} {% else %} M190.1 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} {% endif %} [gcode_macro ACTIVATE_PROBE] description = Put the machine in a state being able to probe variable_temperature = 0 gcode = {% set LOCK = params.LOCK|default(False, boolean=true) %} {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled %} {% set tap_max_probing_temp = printer["gcode_macro _USER_VARIABLES"].tap_max_probing_temp|float %} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _CHECK_PROBE action=query {% if LOCK %} _ATTACH_PROBE_LOCK {% else %} _ATTACH_PROBE {% endif %} {% elif probe_type_enabled == "vorontap" %} SAVE_GCODE_STATE NAME=BEFORE_TAP_ACTION {% set ACTUAL_TEMP = printer.extruder.temperature %} {% set TARGET_TEMP = printer.extruder.target %} SET_GCODE_VARIABLE MACRO=ACTIVATE_PROBE VARIABLE=temperature VALUE={TARGET_TEMP} {% if TARGET_TEMP > tap_max_probing_temp %} { action_respond_info('Extruder temperature target of %.1fC is too high for TAP probing, lowering to %.1fC' % (TARGET_TEMP, tap_max_probing_temp)) } M106 S255 M109 S{tap_max_probing_temp} M106 S0 {% else %} {% if ACTUAL_TEMP > tap_max_probing_temp + 3 %} M106 S255 TEMPERATURE_WAIT SENSOR=extruder MAXIMUM={tap_max_probing_temp} M106 S0 {% endif %} {% endif %} {% endif %} [gcode_macro DEACTIVATE_PROBE] description = Revert the machine to a normal state after probing gcode = {% set UNLOCK = params.UNLOCK|default(False, boolean=true) %} {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled %} {% set tap_deactivation_zhop = printer["gcode_macro _USER_VARIABLES"].tap_deactivation_zhop %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _CHECK_PROBE action=query {% if UNLOCK %} _DOCK_PROBE_UNLOCK {% else %} _DOCK_PROBE {% endif %} {% elif probe_type_enabled == "vorontap" %} {% set z_safe = printer.toolhead.position.z + tap_deactivation_zhop %} {% if z_safe > printer.toolhead.axis_maximum.z %} {% set z_safe = printer.toolhead.axis_maximum.z %} {% endif %} G90 G1 Z{z_safe} F{Sz} {% set old_target_temperature = printer["gcode_macro ACTIVATE_PROBE"].temperature %} M109 S{old_target_temperature} RESTORE_GCODE_STATE NAME=BEFORE_TAP_ACTION {% endif %} [gcode_macro _PROBE_VARIABLES] variable_probe_attached = False variable_probe_state = False variable_probe_lock = False gcode = [gcode_macro _EXIT_POINT] gcode = {% set function = 'pre_' ~ params.FUNCTION %} {% set move = params.MOVE|default(0) %} {% set speed = params.MOVE_SPEED|default(0) %} RESTORE_GCODE_STATE NAME={function} MOVE={move} MOVE_SPEED={speed} [gcode_macro _ENTRY_POINT] gcode = {% set function = 'pre_' ~ params.FUNCTION %} SAVE_GCODE_STATE NAME={function} G90 [gcode_macro _HOMING_VARIABLES] gcode = {% set Reset = params.RESET|default(0) %} {% if Reset %} SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_lock VALUE={ False } {% endif %} [gcode_macro _ATTACH_PROBE_LOCK] description = Attaches probe, can only be docked after unlocking gcode = _ATTACH_PROBE SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_lock VALUE={ True } [gcode_macro _DOCK_PROBE_UNLOCK] description = Docks probe even if it was locked gcode = SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_lock VALUE={ False } _DOCK_PROBE [gcode_macro _PROBE_UNLOCK] description = Unlocks probe state gcode = SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_lock VALUE={ False } [gcode_macro _PROBE_LOCK] description = Locks probe state gcode = SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_lock VALUE={ True } [gcode_macro _PROBE_MOVE_TO] description = positioning toolhead for dock/attach operation gcode = {% set location = params.LOCATION|default('')|string %} {% set distance = params.DISTANCE|default(0)|float %} {% set speed = params.SPEED|default(0)|float %} {% set probe_dock_location_x, probe_dock_location_y = printer["gcode_macro _USER_VARIABLES"].probe_dock_location_xy|map('float') %} {% set location_factor = { 'left' : { 'x': -1, 'y': 0 }, 'right' : { 'x': 1, 'y': 0 }, 'front' : { 'x': 0, 'y': -1 }, 'back' : { 'x': 0, 'y': 1 }, 'dock' : { 'x': 0, 'y': 0 } } %} {% if location in location_factor %} G1 X{probe_dock_location_x + location_factor[location].x * distance} Y{probe_dock_location_y + location_factor[location].y * distance} F{speed} {% else %} { action_raise_error("Error in probe attach/dock movement. Check the directions in your variables.cfg file!") } {% endif %} [gcode_macro _ATTACH_PROBE] description = Attaches probe gcode = {% set probe_attached = printer["gcode_macro _PROBE_VARIABLES"].probe_attached %} {% set probe_lock = printer["gcode_macro _PROBE_VARIABLES"].probe_lock %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set probe_dock_location_x, probe_dock_location_y = printer["gcode_macro _USER_VARIABLES"].probe_dock_location_xy|map('float') %} {% set probe_before_attach_position = printer["gcode_macro _USER_VARIABLES"].probe_before_attach_position|string %} {% set probe_after_attach_position = printer["gcode_macro _USER_VARIABLES"].probe_after_attach_position|string %} {% set probe_move_attach_length = printer["gcode_macro _USER_VARIABLES"].probe_move_attach_length %} {% set probe_min_z_travel = printer["gcode_macro _USER_VARIABLES"].probe_min_z_travel|float %} {% set probe_dock_speed = printer["gcode_macro _USER_VARIABLES"].probe_dock_speed * 60 %} {% set probe_dock_accel = printer["gcode_macro _USER_VARIABLES"].probe_dock_accel %} {% set travel_speed = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set z_drop_speed = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set probe_servo_enabled = printer["gcode_macro _USER_VARIABLES"].probe_servo_enabled %} {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled|string %} _ENTRY_POINT FUNCTION=ATTACH_PROBE {% if probe_type_enabled == "dockable" and not 'xyz' in printer.toolhead.homed_axes %} { action_raise_error("Must home all axis first to attach the probe!") } {% elif probe_type_enabled == "dockable_virtual" and not 'xy' in printer.toolhead.homed_axes %} { action_raise_error("Must home XY axes first to attach the probe!") } {% elif not probe_attached and not probe_lock %} {% if verbose %} { action_respond_info("Attaching Probe") } {% endif %} {% if probe_type_enabled == "dockable_virtual" and not 'z' in printer.toolhead.homed_axes %} {% if verbose %} { action_respond_info("Attaching the probe can only be done during G28 if Z is not already homed") } {% endif %} {% endif %} {% if (printer.toolhead.position.z < probe_min_z_travel) %} {% if verbose %} { action_respond_info("Moving to a safe Z distance") } {% endif %} G0 Z{probe_min_z_travel} F{z_drop_speed} {% endif %} {% set saved_accel = printer.toolhead.max_accel %} M204 S{probe_dock_accel} _PROBE_MOVE_TO LOCATION={probe_before_attach_position} DISTANCE={probe_move_attach_length} SPEED={travel_speed} {% if probe_servo_enabled %} _SERVO_DEPLOY ITEM="probe" {% endif %} _PROBE_MOVE_TO LOCATION='dock' SPEED={probe_dock_speed} _PROBE_MOVE_TO LOCATION={probe_after_attach_position} DISTANCE={probe_move_attach_length} SPEED={probe_dock_speed} {% if probe_servo_enabled %} _SERVO_RETRACT ITEM="probe" {% endif %} SET_VELOCITY_LIMIT ACCEL={saved_accel} _CHECK_PROBE action=attach {% elif probe_lock %} {% if verbose %} { action_respond_info("Probe locked!") } {% endif %} _CHECK_PROBE action=query {% else %} {% if verbose %} { action_respond_info("Probe already attached!") } {% endif %} _CHECK_PROBE action=query {% endif %} _EXIT_POINT FUNCTION=ATTACH_PROBE [gcode_macro _DOCK_PROBE] description = Docks probe gcode = {% set probe_attached = printer["gcode_macro _PROBE_VARIABLES"].probe_attached %} {% set probe_lock = printer["gcode_macro _PROBE_VARIABLES"].probe_lock %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set probe_dock_location_x, probe_dock_location_y = printer["gcode_macro _USER_VARIABLES"].probe_dock_location_xy|map('float') %} {% set probe_before_dock_position = printer["gcode_macro _USER_VARIABLES"].probe_before_dock_position|string %} {% set probe_after_dock_position = printer["gcode_macro _USER_VARIABLES"].probe_after_dock_position|string %} {% set probe_move_dock_length = printer["gcode_macro _USER_VARIABLES"].probe_move_dock_length %} {% set probe_min_z_travel = printer["gcode_macro _USER_VARIABLES"].probe_min_z_travel|float %} {% set probe_dock_speed = printer["gcode_macro _USER_VARIABLES"].probe_dock_speed * 60 %} {% set probe_dock_accel = printer["gcode_macro _USER_VARIABLES"].probe_dock_accel %} {% set travel_speed = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set z_drop_speed = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set probe_servo_enabled = printer["gcode_macro _USER_VARIABLES"].probe_servo_enabled %} {% set probe_stow_z_height = printer["gcode_macro _USER_VARIABLES"].probe_stow_z_height|default(None) %} _ENTRY_POINT FUNCTION=DOCK_PROBE {% if probe_type_enabled == "dockable" and not 'xyz' in printer.toolhead.homed_axes %} { action_raise_error("Must home all axis first to dock the probe!") } {% elif probe_type_enabled == "dockable_virtual" and not 'xy' in printer.toolhead.homed_axes %} { action_raise_error("Must home XY axes first to dock the probe!") } {% elif probe_attached and not probe_lock %} {% if verbose %} { action_respond_info("Docking Probe") } {% endif %} {% if probe_type_enabled == "dockable_virtual" and not 'z' in printer.toolhead.homed_axes %} {% if verbose %} { action_respond_info("Docking the probe can only be done during G28 if Z is not already homed") } {% endif %} {% endif %} {% if (printer.toolhead.position.z < probe_min_z_travel) %} {% if verbose %} { action_respond_info("Moving to a safe Z distance") } {% endif %} G0 Z{probe_min_z_travel} F{z_drop_speed} {% endif %} {% set saved_accel = printer.toolhead.max_accel %} M204 S{probe_dock_accel} _PROBE_MOVE_TO LOCATION={probe_before_dock_position} DISTANCE={probe_move_dock_length} SPEED={travel_speed} {% if probe_servo_enabled %} _SERVO_DEPLOY ITEM="probe" {% endif %} _PROBE_MOVE_TO LOCATION='dock' SPEED={probe_dock_speed} {% if probe_stow_z_height is not none %} G0 Z{probe_stow_z_height} F{z_drop_speed} {% endif %} _PROBE_MOVE_TO LOCATION={probe_after_dock_position} DISTANCE={probe_move_dock_length} SPEED={probe_dock_speed} {% if probe_servo_enabled %} _SERVO_RETRACT ITEM="probe" {% endif %} SET_VELOCITY_LIMIT ACCEL={saved_accel} G4 P500 _CHECK_PROBE action=dock {% elif probe_lock %} {% if verbose %} { action_respond_info("Probe locked!") } {% endif %} _CHECK_PROBE action=query {% else %} {% if verbose %} { action_respond_info("Probe already docked!") } {% endif %} _CHECK_PROBE action=query {% endif %} _EXIT_POINT FUNCTION=DOCK_PROBE [gcode_macro _CHECK_PROBE] variable_probe_state = 0 gcode = Query_Probe _SET_PROBE_STATE action={ params.ACTION } [gcode_macro _SET_PROBE_STATE] gcode = {% set probe_last_query = printer.probe.last_query %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% if probe_last_query %} SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_attached VALUE={ False } {% else %} SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_attached VALUE={ True } {% endif %} {% if params.ACTION == 'query' %} SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_state VALUE={ probe_last_query } {% endif %} {% if (not probe_last_query and params.ACTION == 'dock') %} { action_raise_error("Probe dock failed!") } {% endif %} {% if probe_last_query and params.ACTION == 'attach' %} { action_raise_error("Probe attach failed!") } {% endif %} [gcode_macro PROBE_CALIBRATE] rename_existing = _BASE_PROBE_CALIBRATE description = Calibrate the probe z_offset with klicky automount gcode = {% set probe_min_z_travel = printer["gcode_macro _USER_VARIABLES"].probe_min_z_travel|float %} {% set z_drop_speed = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set travel_speed = printer["gcode_macro _USER_VARIABLES"].travel_speed %} {% set min_bed_x, min_bed_y = printer["gcode_macro _USER_VARIABLES"].min_bed_xy|map('float') %} {% set max_bed_x, max_bed_y = printer["gcode_macro _USER_VARIABLES"].max_bed_xy|map('float') %} {% set probe_offset_x = printer['configfile'].config["probe"]["x_offset"]|float %} {% set probe_offset_y = printer['configfile'].config["probe"]["y_offset"]|float %} {% if not 'xyz' in printer.toolhead.homed_axes %} { action_raise_error("Must home axis first!") } {% endif %} {% if (printer['gcode_move'].position.x + probe_offset_x) >= max_bed_x or (printer['gcode_move'].position.y + probe_offset_y) >= max_bed_y or (printer['gcode_move'].position.x + probe_offset_x) <= min_bed_x or (printer['gcode_move'].position.y + probe_offset_y) <= min_bed_y %} { action_raise_error("You must perform PROBE_CALIBRATE with the probe inside the BED area, check variables min/max_bed_xy !") } {% endif %} {% if (printer.toolhead.position.z < probe_min_z_travel) %} G0 Z{probe_min_z_travel} F{z_drop_speed} {% endif %} M400 _ENTRY_POINT FUNCTION=PROBE_CALIBRATE ACTIVATE_PROBE _EXIT_POINT FUNCTION=PROBE_CALIBRATE MOVE=1 MOVE_SPEED={travel_speed} _BASE_PROBE_CALIBRATE {% for p in params %}{'%s=%s ' % (p, params[p])}{% endfor %} M400 _ENTRY_POINT FUNCTION=PROBE_CALIBRATE DEACTIVATE_PROBE _EXIT_POINT FUNCTION=PROBE_CALIBRATE MOVE=1 MOVE_SPEED={travel_speed} [gcode_macro PROBE_ACCURACY] rename_existing = _BASE_PROBE_ACCURACY description = Probe Z-height accuracy at current XY position with klicky automount gcode = {% set probe_min_z_travel = printer["gcode_macro _USER_VARIABLES"].probe_min_z_travel|float %} {% set z_drop_speed = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set travel_speed = printer["gcode_macro _USER_VARIABLES"].travel_speed %} {% set min_bed_x, min_bed_y = printer["gcode_macro _USER_VARIABLES"].min_bed_xy|map('float') %} {% set max_bed_x, max_bed_y = printer["gcode_macro _USER_VARIABLES"].max_bed_xy|map('float') %} {% set probe_offset_x = printer['configfile'].config["probe"]["x_offset"]|float %} {% set probe_offset_y = printer['configfile'].config["probe"]["y_offset"]|float %} {% if not 'xyz' in printer.toolhead.homed_axes %} { action_raise_error("Must home axis first!") } {% endif %} {% if (printer['gcode_move'].position.x + probe_offset_x) >= max_bed_x or (printer['gcode_move'].position.y + probe_offset_y) >= max_bed_y or (printer['gcode_move'].position.x + probe_offset_x) <= min_bed_x or (printer['gcode_move'].position.y + probe_offset_y) <= min_bed_y %} { action_raise_error("You must perform PROBE_ACCURACY with the probe inside the BED area, check variables min/max_bed_xy !") } {% endif %} {% if (printer.toolhead.position.z < probe_min_z_travel) %} G0 Z{probe_min_z_travel} F{z_drop_speed} {% endif %} M400 _ENTRY_POINT FUNCTION=PROBE_ACCURACY ACTIVATE_PROBE _EXIT_POINT FUNCTION=PROBE_ACCURACY MOVE=1 MOVE_SPEED={travel_speed} _BASE_PROBE_ACCURACY {% for p in params %}{'%s=%s ' % (p, params[p])}{% endfor %} M400 _ENTRY_POINT FUNCTION=PROBE_CALIBRATE DEACTIVATE_PROBE _EXIT_POINT FUNCTION=PROBE_ACCURACY MOVE=1 MOVE_SPEED={travel_speed} [gcode_macro _PROBE_ON_ERROR_ACTION] variable_probing = False gcode = {% set autodock_on_probe_error = printer["gcode_macro _USER_VARIABLES"].autodock_on_probe_error %} {% set probing = printer["gcode_macro _PROBE_ON_ERROR_ACTION"].probing %} {% if autodock_on_probe_error and probing %} DEACTIVATE_PROBE {% endif %} SET_GCODE_VARIABLE MACRO=_PROBE_ON_ERROR_ACTION VARIABLE=probing VALUE=False [probe] pin = ^PROBE_INPUT x_offset = 0 y_offset = 19.75 z_offset = 6.42 speed = 8 lift_speed = 15 samples = 2 samples_result = median sample_retract_dist = 2.0 samples_tolerance = 0.007 samples_tolerance_retries = 3 [heater_fan hotend_fan] pin = E_FAN max_power = 1.0 kick_start_time = 0.100 heater = extruder heater_temp = 50.0 [fan] pin = PART_FAN kick_start_time = 0.100 cycle_time = 0.010 [controller_fan controller_fan] pin = CONTROLLER_FAN kick_start_time = 0.5 fan_speed = 1.0 idle_timeout = 60 [temperature_sensor Raspberry_Pi] sensor_type = temperature_host [temperature_sensor mcu] sensor_type = temperature_mcu min_temp = 0 max_temp = 90 [input_shaper] shaper_freq_x = 56.4 shaper_type_x = zv shaper_freq_y = 38.4 shaper_type_y = mzv [save_variables] filename = ~/printer_data/config/save_variables.cfg [tmc2209 stepper_x] uart_pin = X_TMCUART interpolate = True run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [tmc2209 stepper_y] uart_pin = Y_TMCUART interpolate = True run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [tmc2209 stepper_z] uart_pin = Z_TMCUART interpolate = True run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [tmc2209 stepper_z1] uart_pin = Z1_TMCUART interpolate = True run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [tmc2209 stepper_z2] uart_pin = Z2_TMCUART interpolate = True run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [tmc2209 extruder] uart_pin = E_TMCUART interpolate = True run_current = 0.45 sense_resistor = 0.110 stealthchop_threshold = 0 [mcu] serial = usb-Klipper_stm32f446xx_4A0031000151303532383235-if00 [board_pins mcu_manufacturer] aliases = MCU_MOTOR0_STEP=PF13 , MCU_MOTOR0_DIR=PF12 , MCU_MOTOR0_ENABLE=PF14 , MCU_MOTOR0_UART=PC4 , MCU_MOTOR1_STEP=PG0 , MCU_MOTOR1_DIR=PG1 , MCU_MOTOR1_ENABLE=PF15 , MCU_MOTOR1_UART=PD11 , MCU_MOTOR2_1_STEP=PF11 , MCU_MOTOR2_1_DIR=PG3 , MCU_MOTOR2_1_ENABLE=PG5 , MCU_MOTOR2_1_UART=PC6 , MCU_MOTOR3_STEP=PG4 , MCU_MOTOR3_DIR=PC1 , MCU_MOTOR3_ENABLE=PA0 , MCU_MOTOR3_UART=PC7 , MCU_MOTOR4_STEP=PF9 , MCU_MOTOR4_DIR=PF10 , MCU_MOTOR4_ENABLE=PG2 , MCU_MOTOR4_UART=PF2 , MCU_MOTOR5_STEP=PC13 , MCU_MOTOR5_DIR=PF0 , MCU_MOTOR5_ENABLE=PF1 , MCU_MOTOR5_UART=PE4 , MCU_MOTOR6_STEP=PE2 , MCU_MOTOR6_DIR=PE3 , MCU_MOTOR6_ENABLE=PD4 , MCU_MOTOR6_UART=PE1 , MCU_MOTOR7_STEP=PE6 , MCU_MOTOR7_DIR=PA14 , MCU_MOTOR7_ENABLE=PE0 , MCU_MOTOR7_UART=PD3 , MCU_STOP0=PG6 , MCU_STOP1=PG9 , MCU_STOP2=PG10 , MCU_STOP3=PG11 , MCU_STOP4=PG12 , MCU_STOP5=PG13 , MCU_STOP6=PG14 , MCU_STOP7=PG15 , MCU_PROBE=PB7 , MCU_SERVOS=PB6 , MCU_HE0=PA2 , MCU_HE1=PA3 , MCU_HE2=PB10 , MCU_HE3=PB11 , MCU_BED0=PA1 , MCU_TB=PF3 , MCU_T0=PF4 , MCU_T1=PF5 , MCU_T2=PF6 , MCU_T3=PF7 , MCU_FAN0=PA8 , MCU_FAN1=PE5 , MCU_FAN2=PD12 , MCU_FAN3=PD13 , MCU_FAN4=PD14 , MCU_FAN5=PD15 , MCU_NEOPIXEL=PB0 , MCU_PS_ON=PE11 , MCU_POWER_DET=PC0 , EXP1_1=PE8 , EXP1_2=PE7 , EXP1_3=PE9 , EXP1_4=PE10 , EXP1_5=PE12 , EXP1_6=PE13 , EXP1_7=PE14 , EXP1_8=PE15 , EXP1_9=<GND> , EXP1_10=<5V> , EXP2_1=PA6 , EXP2_2=PA5 , EXP2_3=PB1 , EXP2_4=PA4 , EXP2_5=PB2 , EXP2_6=PA7 , EXP2_7=PC15 , EXP2_8=<RST> , EXP2_9=<GND> , EXP2_10=<5V> , [board_pins octopus_mcu] mcu = mcu aliases = X_STEP=MCU_MOTOR0_STEP , X_DIR=MCU_MOTOR0_DIR , X_ENABLE=MCU_MOTOR0_ENABLE , X_TMCUART=MCU_MOTOR0_UART , Y_STEP=MCU_MOTOR1_STEP , Y_DIR=MCU_MOTOR1_DIR , Y_ENABLE=MCU_MOTOR1_ENABLE , Y_TMCUART=MCU_MOTOR1_UART , Z_STEP=MCU_MOTOR2_1_STEP , Z_DIR=MCU_MOTOR2_1_DIR , Z_ENABLE=MCU_MOTOR2_1_ENABLE , Z_TMCUART=MCU_MOTOR2_1_UART , Z1_STEP=MCU_MOTOR3_STEP , Z1_DIR=MCU_MOTOR3_DIR , Z1_ENABLE=MCU_MOTOR3_ENABLE , Z1_TMCUART=MCU_MOTOR3_UART , Z2_STEP=MCU_MOTOR4_STEP , Z2_DIR=MCU_MOTOR4_DIR , Z2_ENABLE=MCU_MOTOR4_ENABLE , Z2_TMCUART=MCU_MOTOR4_UART , Z3_STEP=MCU_MOTOR5_STEP , Z3_DIR=MCU_MOTOR5_DIR , Z3_ENABLE=MCU_MOTOR5_ENABLE , Z3_TMCUART=MCU_MOTOR5_UART , E_STEP=MCU_MOTOR6_STEP , E_DIR=MCU_MOTOR6_DIR , E_ENABLE=MCU_MOTOR6_ENABLE , E_TMCUART=MCU_MOTOR6_UART , X_STOP=MCU_STOP0 , Y_STOP=MCU_STOP1 , Z_STOP=MCU_STOP2 , PROBE_INPUT=MCU_STOP7 , RUNOUT_SENSOR=MCU_STOP3 , E_HEATER=MCU_HE0 , E_TEMPERATURE=MCU_T0 , BED_HEATER=MCU_HE1 , BED_TEMPERATURE=MCU_TB , PART_FAN=MCU_FAN0 , E_FAN=MCU_FAN1 , CONTROLLER_FAN=MCU_FAN2 , EXHAUST_FAN=MCU_FAN3 , FILTER_FAN=MCU_FAN4 , HOST_CONTROLLER_FAN=MCU_FAN5 , CHAMBER_TEMPERATURE=MCU_T1 , ELECTRICAL_CABINET_TEMPERATURE=MCU_T2 , LIGHT_OUTPUT=MCU_HE2 , LIGHT_NEOPIXEL=MCU_STOP5 , STATUS_NEOPIXEL=MCU_NEOPIXEL , SERVO_PIN=MCU_SERVOS , [extruder] step_pin = PE2 dir_pin = PE3 enable_pin = !PD4 heater_pin = PA2 sensor_pin = PA0 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 26.359 nozzle_diameter = 0.400 filament_diameter = 1.750 max_extrude_only_distance = 1000 max_extrude_only_velocity = 120 pressure_advance = 0.03 pressure_advance_smooth_time = 0.03 sensor_type = EPCOS 100K B57560G104F control = pid pid_kp = 26.015 pid_ki = 1.770 pid_kd = 95.603 min_temp = 0 max_temp = 300 ======================= Args: ['/home/E3NG/klipper/klippy/klippy.py', '/home/E3NG/printer_data/config/printer.cfg', '-l', '/home/E3NG/printer_data/logs/klippy.log', '-I', '/home/E3NG/printer_data/comms/klippy.serial', '-a', '/home/E3NG/printer_data/comms/klippy.sock'] Git version: 'v0.12.0-456-gfbd5b4921-dirty' Untracked files: klippy/extras/gcode_shell_command.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ? Python: '3.9.2 (default, Dec 1 2024, 12:12:57) \n[GCC 10.2.1 20210110]' webhooks client 548454259824: {'program': 'Moonraker', 'version': 'v0.9.3-67-g4eb23ef'} =============== Log rollover at Fri Mar 14 23:13:31 2025 =============== mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' MCU error during connect Traceback (most recent call last): File "/home/E3NG/klipper/klippy/mcu.py", line 794, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/E3NG/klipper/klippy/serialhdl.py", line 183, in connect_uart self._error("Unable to connect") File "/home/E3NG/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/E3NG/klipper/klippy/klippy.py", line 131, in _connect self.send_event("klippy:mcu_identify") File "/home/E3NG/klipper/klippy/klippy.py", line 223, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/E3NG/klipper/klippy/klippy.py", line 223, in <listcomp> return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/E3NG/klipper/klippy/mcu.py", line 799, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect mcu 'mcu': Unable to connect Once the underlying issue is corrected, use the "FIRMWARE_RESTART" command to reset the firmware, reload the config, and restart the host software. Error configuring printer Build file /home/E3NG/klipper/klippy/../.config(3600): Tue Mar 11 18:00:12 2025 ========= Last MCU build config ========= CONFIG_LOW_LEVEL_OPTIONS=y # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set CONFIG_MACH_STM32=y # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RPXXXX is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set # CONFIG_MACH_LINUX is not set # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="stm32" CONFIG_MCU="stm32f446xx" CONFIG_CLOCK_FREQ=180000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x80000 CONFIG_FLASH_BOOT_ADDRESS=0x8000000 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x20000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x8008000 CONFIG_STM32_SELECT=y # CONFIG_MACH_STM32F103 is not set # CONFIG_MACH_STM32F207 is not set # CONFIG_MACH_STM32F401 is not set # CONFIG_MACH_STM32F405 is not set # CONFIG_MACH_STM32F407 is not set # CONFIG_MACH_STM32F429 is not set CONFIG_MACH_STM32F446=y # CONFIG_MACH_STM32F765 is not set # CONFIG_MACH_STM32F031 is not set # CONFIG_MACH_STM32F042 is not set # CONFIG_MACH_STM32F070 is not set # CONFIG_MACH_STM32F072 is not set # CONFIG_MACH_STM32G070 is not set # CONFIG_MACH_STM32G071 is not set # CONFIG_MACH_STM32G0B0 is not set # CONFIG_MACH_STM32G0B1 is not set # CONFIG_MACH_STM32G431 is not set # CONFIG_MACH_STM32G474 is not set # CONFIG_MACH_STM32H723 is not set # CONFIG_MACH_STM32H743 is not set # CONFIG_MACH_STM32H750 is not set # CONFIG_MACH_STM32L412 is not set # CONFIG_MACH_N32G452 is not set # CONFIG_MACH_N32G455 is not set CONFIG_MACH_STM32F4=y CONFIG_HAVE_STM32_USBOTG=y CONFIG_HAVE_STM32_CANBUS=y CONFIG_HAVE_STM32_USBCANBUS=y CONFIG_STM32_DFU_ROM_ADDRESS=0x1fff0000 CONFIG_STM32_FLASH_START_8000=y # CONFIG_STM32_FLASH_START_10000 is not set # CONFIG_STM32_FLASH_START_0000 is not set # CONFIG_STM32_CLOCK_REF_8M is not set CONFIG_STM32_CLOCK_REF_12M=y # CONFIG_STM32_CLOCK_REF_16M is not set # CONFIG_STM32_CLOCK_REF_20M is not set # CONFIG_STM32_CLOCK_REF_24M is not set # CONFIG_STM32_CLOCK_REF_25M is not set # CONFIG_STM32_CLOCK_REF_INTERNAL is not set CONFIG_CLOCK_REF_FREQ=12000000 CONFIG_STM32F0_TRIM=16 CONFIG_STM32_USB_PA11_PA12=y # CONFIG_STM32_SERIAL_USART1 is not set # CONFIG_STM32_SERIAL_USART1_ALT_PB7_PB6 is not set # CONFIG_STM32_SERIAL_USART2 is not set # CONFIG_STM32_SERIAL_USART2_ALT_PD6_PD5 is not set # CONFIG_STM32_SERIAL_USART3 is not set # CONFIG_STM32_SERIAL_USART3_ALT_PD9_PD8 is not set # CONFIG_STM32_CANBUS_PA11_PA12 is not set # CONFIG_STM32_CANBUS_PA11_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB8_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PI9_PH13 is not set # CONFIG_STM32_MMENU_CANBUS_PB5_PB6 is not set # CONFIG_STM32_MMENU_CANBUS_PB12_PB13 is not set # CONFIG_STM32_MMENU_CANBUS_PD0_PD1 is not set # CONFIG_STM32_USBCANBUS_PA11_PA12 is not set CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" # # USB ids # # end of USB ids CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_THERMOCOUPLE=y CONFIG_WANT_ADXL345=y CONFIG_WANT_LIS2DW=y CONFIG_WANT_MPU9250=y CONFIG_WANT_ICM20948=y CONFIG_WANT_HX71X=y CONFIG_WANT_ADS1220=y CONFIG_WANT_LDC1612=y CONFIG_WANT_SENSOR_ANGLE=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_NEED_SENSOR_BULK=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_INITIAL_PINS="" CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_SDIO=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_STRICT_TIMING=y CONFIG_HAVE_CHIPID=y CONFIG_HAVE_STEPPER_BOTH_EDGE=y CONFIG_HAVE_BOOTLOADER_REQUEST=y CONFIG_INLINE_STEPPER_HACK=y ======================= No build file /home/E3NG/klipper/klippy/../out/klipper.dict No build file /home/E3NG/klipper/klippy/../out/klipper.elf webhooks client 548454259824: Disconnected Restarting printer Start printer at Fri Mar 14 23:16:33 2025 (1741990593.4 223.2) ===== Config file ===== [printer] kinematics = corexy max_velocity = 400 max_accel = 8000 max_z_velocity = 30 max_z_accel = 500 square_corner_velocity = 5.0 [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = {% if printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} STATUS_LEDS COLOR="ERROR" {% endif %} {% if printer["gcode_macro _USER_VARIABLES"].probe_type_enabled == "dockable" or printer["gcode_macro _USER_VARIABLES"].probe_type_enabled == "dockable_virtual" %} _PROBE_ON_ERROR_ACTION {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} PARK {% endif %} [idle_timeout] timeout = 1800 gcode = RESPOND MSG="Idle timeout reached" TURN_OFF_HEATERS M84 {% if printer["gcode_macro _USER_VARIABLES"].light_enabled %} LIGHT_OFF {% endif %} {% if printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} STATUS_LEDS COLOR="OFF" {% endif %} [pause_resume] [display_status] [exclude_object] [respond] [force_move] enable_force_move = True [gcode_arcs] resolution = 0.1 [thermistor CMFB103F3950FANT] temperature1 = 0.0 resistance1 = 32116.0 temperature2 = 40.0 resistance2 = 5309.0 temperature3 = 80.0 resistance3 = 1228.0 [gcode_shell_command shaketune] command = ~/printer_data/config/scripts/K-ShakeTune/shaketune.sh timeout = 600.0 verbose = True [gcode_shell_command system_info] command = ~/printer_data/config/scripts/system_info.py timeout = 5.0 verbose = True [gcode_macro CANCEL_PRINT] rename_existing = BASE_CANCEL_PRINT description = Cancel the print, retract 10mm of filament and park gcode = {% set turn_off_heaters_in_end_print = printer["gcode_macro _USER_VARIABLES"].turn_off_heaters_in_end_print %} {% set safe_extruder_temp = printer["gcode_macro _USER_VARIABLES"].safe_extruder_temp|float %} {% set light_intensity_end_print = printer["gcode_macro _USER_VARIABLES"].light_intensity_end_print %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set mmu_unload_on_cancel_print = printer["gcode_macro _USER_VARIABLES"].mmu_unload_on_cancel_print %} {% set filter_enabled = printer["gcode_macro _USER_VARIABLES"].filter_enabled %} {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set filter_default_time = printer["gcode_macro _USER_VARIABLES"].filter_default_time_on_end_print|default(600)|int %} {% set hotend_fan_tach_enabled = printer["gcode_macro _USER_VARIABLES"].hotend_fan_tach_enabled %} {% set retract_length = printer["gcode_macro _USER_VARIABLES"].retract_length|default(20)|float %} PARK {% if klippain_mmu_enabled and mmu_unload_on_cancel_print %} {% if printer.mmu.enabled and printer.mmu.tool|int != -2 %} MMU_UNLOAD {% endif %} {% elif printer.extruder.can_extrude %} G92 E0 G1 E-{retract_length} F2100 {% endif %} {% if turn_off_heaters_in_end_print %} TURN_OFF_HEATERS {% else %} SET_HEATER_TEMPERATURE HEATER=extruder TARGET={safe_extruder_temp} {% endif %} {% if hotend_fan_tach_enabled %} UPDATE_DELAYED_GCODE ID=_BACKGROUND_HOTEND_TACHO_CHECK DURATION=0 {% endif %} M107 M400 CLEAR_PAUSE {% if bed_mesh_enabled %} BED_MESH_CLEAR {% endif %} SDCARD_RESET_FILE {% if filter_enabled %} {% if printer['fan_generic filter'].speed > 0 %} {% set FILTER_TIME = params.FILTER_TIME|default(filter_default_time)|int %} START_FILTER SPEED=1 UPDATE_DELAYED_GCODE ID=_STOP_FILTER_DELAYED DURATION={FILTER_TIME} {% endif %} {% endif %} {% if light_enabled %} LIGHT_ON S={light_intensity_end_print} {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="OFF" {% endif %} {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and printer.mmu.print_start_detection|int == 0 %} _MMU_PRINT_END STATE=cancelled {% endif %} {% endif %} {% if filament_sensor_enabled %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% endif %} BASE_CANCEL_PRINT [gcode_macro _OFF] description = Turn off the printer gcode = {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set display_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_minidisplay_enabled %} M84 TURN_OFF_HEATERS M107 {% if light_enabled %} LIGHT_OFF {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="SHUTDOWN" {% endif %} {% if display_leds_enabled %} _SET_ALLLEDS_BY_NAME LEDS="minidisplay" COLOR="shutdown" {% endif %} [gcode_macro SHUTDOWN] description = Turn off the printer and shutdown the host gcode = _OFF {action_respond_info('action:poweroff')} {action_call_remote_method("shutdown_machine")} [gcode_macro END_PRINT] description = Stop the print and filter the atmosphere for 10min before shuting down gcode = {% set disable_motors_in_end_print = printer["gcode_macro _USER_VARIABLES"].disable_motors_in_end_print %} {% set turn_off_heaters_in_end_print = printer["gcode_macro _USER_VARIABLES"].turn_off_heaters_in_end_print %} {% set safe_extruder_temp = printer["gcode_macro _USER_VARIABLES"].safe_extruder_temp|float %} {% set light_intensity_end_print = printer["gcode_macro _USER_VARIABLES"].light_intensity_end_print %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set mmu_unload = params.MMU_UNLOAD_AT_END|default(printer["gcode_macro _USER_VARIABLES"].mmu_unload_on_end_print)|default(0)|int %} {% set filter_enabled = printer["gcode_macro _USER_VARIABLES"].filter_enabled %} {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set filter_default_time = printer["gcode_macro _USER_VARIABLES"].filter_default_time_on_end_print|default(600)|int %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set hotend_fan_tach_enabled = printer["gcode_macro _USER_VARIABLES"].hotend_fan_tach_enabled %} {% set retract_length = printer["gcode_macro _USER_VARIABLES"].retract_length|default(20)|float %} PARK {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and mmu_unload %} MMU_UNLOAD {% endif %} {% elif printer.extruder.can_extrude %} G92 E0 G1 E-{retract_length} F2100 {% endif %} {% if turn_off_heaters_in_end_print %} TURN_OFF_HEATERS {% else %} SET_HEATER_TEMPERATURE HEATER=extruder TARGET={safe_extruder_temp} {% endif %} {% if hotend_fan_tach_enabled %} UPDATE_DELAYED_GCODE ID=_BACKGROUND_HOTEND_TACHO_CHECK DURATION=0 {% endif %} M107 M400 {% if bed_mesh_enabled %} BED_MESH_CLEAR {% endif %} {% if disable_motors_in_end_print %} M84 {% endif %} {% if filter_enabled %} {% if printer['fan_generic filter'].speed > 0 %} {% set FILTER_TIME = params.FILTER_TIME|default(filter_default_time)|int %} START_FILTER SPEED=1 UPDATE_DELAYED_GCODE ID=_STOP_FILTER_DELAYED DURATION={FILTER_TIME} {% endif %} {% endif %} {% if light_enabled %} LIGHT_ON S={light_intensity_end_print} {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="DONE_PRINTING" {% endif %} {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and printer.mmu.print_start_detection|int == 0 %} _MMU_PRINT_END {% endif %} {% endif %} {% if filament_sensor_enabled %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% endif %} [gcode_macro PARK] description = Park the toolhead at the back and retract some filament if the nozzle is hot gcode = {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set material = printer['gcode_macro START_PRINT'].material %} {% set Px, Py = printer["gcode_macro _USER_VARIABLES"].park_position_xy|map('float') %} {% set Px = params.X|default(Px)|float %} {% set Py = params.Y|default(Py)|float %} {% set park_lift_z = printer["gcode_macro _USER_VARIABLES"].park_lift_z %} {% set Z_HOP = params.Z_HOP|default(park_lift_z)|float %} {% set firmware_retraction_enabled = printer["gcode_macro _USER_VARIABLES"].firmware_retraction_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set max_z = printer.toolhead.axis_maximum.z - printer.gcode_move.homing_origin.z |float %} {% set act_z = printer.toolhead.position.z|float %} {% set z_safe = act_z + Z_HOP %} {% if z_safe > max_z %} {% set z_safe = max_z %} {% endif %} {% if printer.toolhead.homed_axes != "xyz" %} {action_raise_error("Cannot park the toolhead because axis are not homed!")} {% endif %} SAVE_GCODE_STATE NAME=PARK {% if printer.extruder.can_extrude %} {% if params.E is defined %} {% set E = params.E|float|abs %} {% if verbose %} RESPOND MSG="Retraction overrided with parameter, Extruder retraction = {E}" {% endif %} {% else %} {% if firmware_retraction_enabled %} {% if verbose %} RESPOND MSG="Firmware retraction enabled, Extruder retraction = {printer.firmware_retraction.retract_length}" {% endif %} G10 {% else %} {% if printer["gcode_macro _USER_VARIABLES"].material_parameters[material] is defined %} {% set E = printer["gcode_macro _USER_VARIABLES"].material_parameters[material].retract_length|default(1.7) %} {% else %} {% set E = 1.7 %} {% endif %} {% if verbose %} RESPOND MSG="Firmware retraction disabled, Extruder retraction = {E}" {% endif %} {% endif %} {% endif %} {% if E is defined and E > 0 %} G92 E0 G1 E-{E} F2100 {% endif %} {% endif %} G90 G1 Z{z_safe} F{Sz} G0 X{Px} Y{Py} F{St} RESTORE_GCODE_STATE NAME=PARK [gcode_macro PARK_FRONT] description = Park the toolhead on the front of the printer for maintenance gcode = {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% if printer.toolhead.homed_axes != "xyz" %} {action_raise_error("Cannot park the toolhead in maintenance position because axis are not homed!")} {% endif %} SAVE_GCODE_STATE NAME=PARK_FRONT G90 G0 Z{printer.toolhead.axis_maximum.z/3*2} F{Sz} G0 X{printer.toolhead.axis_maximum.x/2} Y{printer.toolhead.axis_minimum.y+10} F{St} RESTORE_GCODE_STATE NAME=PARK_FRONT [gcode_macro PAUSE] rename_existing = BASE_PAUSE description = Pause the print and park gcode = {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set light_intensity_start_print = printer["gcode_macro _USER_VARIABLES"].light_intensity_start_print %} {% set idle_timeout_on_pause = printer["gcode_macro _USER_VARIABLES"].idle_timeout_on_pause|default(0)|int %} {% if printer.pause_resume.is_paused %} RESPOND MSG="Print is already paused" {% else %} SAVE_GCODE_STATE NAME=PAUSE_state {% if light_enabled %} LIGHT_ON S={light_intensity_start_print} {% endif %} BASE_PAUSE PARK {% if idle_timeout_on_pause > 0 %} SET_IDLE_TIMEOUT TIMEOUT={idle_timeout_on_pause} {% endif %} {% endif %} [gcode_macro RESUME] rename_existing = BASE_RESUME description = Resume the print after an optional unretract gcode = {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed %} {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set light_intensity_printing = printer["gcode_macro _USER_VARIABLES"].light_intensity_printing %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set idle_timeout_on_pause = printer["gcode_macro _USER_VARIABLES"].idle_timeout_on_pause|default(0)|int %} {% if not printer.pause_resume.is_paused %} RESPOND MSG="Print is not paused. Resume ignored" {% else %} {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and printer.mmu.is_locked %} RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=0 {% else %} RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 MOVE_SPEED={St} {% endif %} {% else %} RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 MOVE_SPEED={St} {% endif %} {% if light_enabled %} LIGHT_ON S={light_intensity_printing} {% endif %} {% if idle_timeout_on_pause > 0%} SET_IDLE_TIMEOUT TIMEOUT={printer.configfile.settings.idle_timeout.timeout} {% endif %} BASE_RESUME {% endif %} [gcode_macro START_PRINT] description = Machine heatup procedure before starting a print variable_bed_temp = 0 variable_extruder_temp = 0 variable_z_adjust = 0 variable_soak = 0 variable_chamber_temp = 0 variable_chamber_maxtime = 0 variable_initial_tool = 0 variable_check_gates = 0 variable_tools_used = "" variable_sync_mmu_extruder = 0 variable_material = "XXX" variable_fl_size = "0_0_0_0" variable_bed_mesh_profile = "" variable_total_layer = 0 variable_adaptive_primeline = 1 gcode = {% set BED_TEMP = params.BED_TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_bed_temp)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set Z_ADJUST = params.Z_ADJUST|default(0)|float %} {% set SOAK = params.SOAK|default(printer["gcode_macro _USER_VARIABLES"].print_default_soak)|int %} {% set CHAMBER_TEMP = params.CHAMBER|default(printer["gcode_macro _USER_VARIABLES"].print_default_chamber_temp)|int %} {% set CHAMBER_MAXTIME = params.CHAMBER_MAXTIME|default(printer["gcode_macro _USER_VARIABLES"].print_default_chamber_max_heating_time)|int %} {% set INITIAL_TOOL = params.INITIAL_TOOL|default(0)|int %} {% set MATERIAL = params.MATERIAL|default(printer["gcode_macro _USER_VARIABLES"].print_default_material)|string %} {% set FL_SIZE = params.SIZE|default("0_0_0_0")|string %} {% set CHECK_GATES = params.CHECK_GATES|default(printer['gcode_macro _USER_VARIABLES'].mmu_check_gates_on_start_print)|default(0)|int %} {% set TOOLS_USED = params.TOOLS_USED|default("")|string %} {% set SYNC_MMU_EXTRUDER = params.SYNC_MMU_EXTRUDER|default(0)|int %} {% set BED_MESH_PROFILE = params.MESH|default("")|string %} {% set ADAPTIVE_PRIMELINE = params.ADAPTIVE_PRIMELINE|default(1)|int %} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=bed_temp VALUE={BED_TEMP} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_temp VALUE={EXTRUDER_TEMP} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=soak VALUE={SOAK} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=chamber_temp VALUE={CHAMBER_TEMP} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=chamber_maxtime VALUE={CHAMBER_MAXTIME} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=initial_tool VALUE={INITIAL_TOOL} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=check_gates VALUE={CHECK_GATES} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=tools_used VALUE='"{TOOLS_USED}"' SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=sync_mmu_extruder VALUE={SYNC_MMU_EXTRUDER} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=material VALUE='"{MATERIAL}"' SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=fl_size VALUE='"{FL_SIZE}"' SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=bed_mesh_profile VALUE='"{BED_MESH_PROFILE}"' SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=adaptive_primeline VALUE={ADAPTIVE_PRIMELINE} {% if params.TOTAL_LAYER %} SET_PRINT_STATS_INFO TOTAL_LAYER={params.TOTAL_LAYER|int} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=total_layer VALUE={params.TOTAL_LAYER|int} {% endif %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set light_intensity_start_print = printer["gcode_macro _USER_VARIABLES"].light_intensity_start_print %} {% set light_intensity_printing = printer["gcode_macro _USER_VARIABLES"].light_intensity_printing %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set force_homing_in_start_print = printer["gcode_macro _USER_VARIABLES"].force_homing_in_start_print %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set firmware_retraction_enabled = printer["gcode_macro _USER_VARIABLES"].firmware_retraction_enabled %} {% set filter_enabled = printer["gcode_macro _USER_VARIABLES"].filter_enabled %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set part_fan_tach_enabled = printer["gcode_macro _USER_VARIABLES"].part_fan_tach_enabled %} {% set hotend_fan_tach_enabled = printer["gcode_macro _USER_VARIABLES"].hotend_fan_tach_enabled %} {% if MATERIAL not in printer["gcode_macro _USER_VARIABLES"].material_parameters %} RESPOND MSG="Material '{MATERIAL}' is unknown!" { action_raise_error("Add this new material to your material_parameters variable!") } {% else %} RESPOND MSG="Material '{MATERIAL}' is used" {% set material = printer["gcode_macro _USER_VARIABLES"].material_parameters[MATERIAL] %} {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="BUSY" {% endif %} {% if light_enabled %} LIGHT_ON S={light_intensity_start_print} {% endif %} CLEAR_PAUSE {% if bed_mesh_enabled %} BED_MESH_CLEAR {% endif %} {% if filter_enabled %} UPDATE_DELAYED_GCODE ID=_STOP_FILTER_DELAYED DURATION=0 STOP_FILTER {% endif %} {% if part_fan_tach_enabled %} M106 S255 G4 P2000 _PART_FAN_CHECK M106 S0 {% endif %} {% if hotend_fan_tach_enabled %} UPDATE_DELAYED_GCODE ID=_BACKGROUND_HOTEND_TACHO_CHECK DURATION=1 {% endif %} SET_GCODE_OFFSET Z=0 M221 S100 M220 S100 G90 M83 {% if firmware_retraction_enabled %} SET_RETRACTION RETRACT_LENGTH={material.retract_length} RETRACT_SPEED={material.retract_speed} UNRETRACT_EXTRA_LENGTH={material.unretract_extra_length} UNRETRACT_SPEED={material.unretract_speed} {% endif %} SET_PRESSURE_ADVANCE ADVANCE={material.pressure_advance} {% if force_homing_in_start_print %} G28 {% else %} _CG28 {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_INIT {% endif %} {% set sp_actions = printer["gcode_macro _USER_VARIABLES"].startprint_actions %} {% for action in sp_actions %} {% if action == "bed_soak" %} _MODULE_HEATSOAK_BED {% elif action == "chamber_soak" %} _MODULE_HEATSOAK_CHAMBER {% elif action == "tilt_calib" %} _MODULE_TILTING {% elif action == "extruder_heating" %} _MODULE_EXTRUDER_HEATING {% elif action == "purge" %} _MODULE_PURGE {% elif action == "clean" %} _MODULE_CLEAN {% elif action == "z_offset" %} _MODULE_Z_CALIB {% elif action == "bedmesh" %} _MODULE_BED_MESH {% elif action == "primeline" %} _MODULE_PRIMELINE {% elif action == "extruder_preheating" %} _MODULE_EXTRUDER_PREHEATING {% elif action == "custom1" %} _MODULE_CUSTOM1 {rawparams} {% elif action == "custom2" %} _MODULE_CUSTOM2 {rawparams} {% elif action == "custom3" %} _MODULE_CUSTOM3 {rawparams} {% else %} { action_raise_error("Unknown module called in START_PRINT! Please verify your startprint_actions variable override!") } {% endif %} {% endfor %} SET_GCODE_OFFSET Z_ADJUST={Z_ADJUST} MOVE=1 SET_GCODE_OFFSET Z_ADJUST={material.additional_z_offset} MOVE=1 {% if filter_enabled %} START_FILTER SPEED={material.filter_speed / 100} {% endif %} {% if filament_sensor_enabled and not material.filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="PRINTING" {% endif %} {% if light_enabled %} LIGHT_ON S={light_intensity_printing} {% endif %} {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and printer.mmu.print_start_detection|int == 0 %} _MMU_PRINT_START {% endif %} {% endif %} {% if verbose %} RESPOND MSG="Start printing !" {% endif %} G92 E0.0 [gcode_macro _MODULE_PRIMELINE] gcode = {% set FL_SIZE = printer["gcode_macro START_PRINT"].fl_size %} {% set ADAPTIVE_PRIMELINE = printer["gcode_macro START_PRINT"].adaptive_primeline %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% if verbose %} RESPOND MSG="Executing a primeline..." {% endif %} PRIMELINE SIZE={FL_SIZE} ADAPTIVE_MODE={ADAPTIVE_PRIMELINE} [gcode_macro _MODULE_HEATSOAK_BED] gcode = {% set BED_TEMP = printer["gcode_macro START_PRINT"].bed_temp %} {% set SOAK = printer["gcode_macro START_PRINT"].soak %} {% set CHAMBER_TEMP = printer["gcode_macro START_PRINT"].chamber_temp %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set filter_enabled = printer["gcode_macro _USER_VARIABLES"].filter_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set max_x = printer.toolhead.axis_maximum.x|float %} {% set max_y = printer.toolhead.axis_maximum.y|float %} {% if status_leds_enabled %} STATUS_LEDS COLOR="HEATING" {% endif %} {% if printer.heater_bed.temperature < (BED_TEMP - %} {% if (CHAMBER_TEMP > 0) and filter_enabled %} START_FILTER SPEED=1 {% endif %} {% if SOAK > 0 %} G0 X{max_x|int / 2} Y{max_y|int / 3} Z50 F{St} {% endif %} HEATSOAK_BED TEMP={BED_TEMP} SOAKTIME={SOAK} {% else %} HEATSOAK_BED TEMP={BED_TEMP} SOAKTIME=0 {% endif %} [gcode_macro _MODULE_HEATSOAK_CHAMBER] gcode = {% set CHAMBER_TEMP = printer["gcode_macro START_PRINT"].chamber_temp %} {% set CHAMBER_MAXTIME = printer["gcode_macro START_PRINT"].chamber_maxtime %} {% set chamber_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].chamber_temperature_sensor_enabled %} {% set filter_enabled = printer["gcode_macro _USER_VARIABLES"].filter_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set max_x = printer.toolhead.axis_maximum.x|float %} {% set max_y = printer.toolhead.axis_maximum.y|float %} {% if chamber_sensor_enabled %} {% if CHAMBER_TEMP > 0 %} {% set chamber_sensor_name = printer["gcode_macro _USER_VARIABLES"].chamber_temperature_sensor_name %} {% set CURRENT_TEMP = printer["temperature_sensor " ~ chamber_sensor_name].temperature|float %} {% if CURRENT_TEMP <= CHAMBER_TEMP %} G0 X{max_x|int / 2} Y{max_y|int / 3} Z50 F{St} {% if filter_enabled %} START_FILTER SPEED=1 {% endif %} HEATSOAK_CHAMBER TEMP={CHAMBER_TEMP} MAXTIME={CHAMBER_MAXTIME} {% if filter_enabled %} STOP_FILTER {% endif %} {% endif %} {% endif %} {% endif %} [gcode_macro _MODULE_TILTING] gcode = {% set force_homing_in_start_print = printer["gcode_macro _USER_VARIABLES"].force_homing_in_start_print %} _TILT_CALIBRATE FORCE={force_homing_in_start_print} [gcode_macro _MODULE_EXTRUDER_HEATING] gcode = {% set EXTRUDER_TEMP = printer["gcode_macro START_PRINT"].extruder_temp %} {% set INITIAL_TOOL = printer["gcode_macro START_PRINT"].initial_tool %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% set purgeclean_servo_enabled = printer["gcode_macro _USER_VARIABLES"].purgeclean_servo_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Px, Py, Pz = printer["gcode_macro _USER_VARIABLES"].purge_bucket_xyz|map('float') %} {% set max_x = printer.toolhead.axis_maximum.x|float %} {% set max_y = printer.toolhead.axis_maximum.y|float %} {% if status_leds_enabled %} STATUS_LEDS COLOR="HEATING" {% endif %} {% if verbose %} RESPOND MSG="Extruder heating to print temperature..." {% endif %} _CONDITIONAL_MOVE_TO_PURGE_BUCKET {% if not purge_and_brush_enabled %} G0 X{max_x|int / 2} Y{max_y|int / 3} Z50 F{St} {% endif %} M109 S{EXTRUDER_TEMP} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_LOAD_INITIAL_TOOL {% endif %} {% if purgeclean_servo_enabled %} _SERVO_RETRACT ITEM="purge" {% endif %} {% if verbose %} RESPOND MSG="Extruder temperature OK" {% endif %} [gcode_macro _MODULE_PURGE] gcode = {% set EXTRUDER_TEMP = printer["gcode_macro START_PRINT"].extruder_temp %} {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% if purge_and_brush_enabled %} PURGE TEMP={EXTRUDER_TEMP} {% endif %} [gcode_macro _MODULE_CLEAN] gcode = {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% set force_homing_before_brush = printer["gcode_macro _USER_VARIABLES"].force_homing_before_brush %} {% if purge_and_brush_enabled %} {% if force_homing_before_brush %} G28 Z {% endif %} CLEAN_NOZZLE {% endif %} [gcode_macro _MODULE_Z_CALIB] gcode = {% set zcalib_plugin_enabled = printer["gcode_macro _USER_VARIABLES"].zcalib_plugin_enabled %} {% if zcalib_plugin_enabled %} G28 Z CALIBRATE_Z {% else %} G28 Z {% endif %} [gcode_macro _MODULE_BED_MESH] gcode = {% set FL_SIZE = printer["gcode_macro START_PRINT"].fl_size %} {% set BED_MESH_PROFILE = printer["gcode_macro START_PRINT"].bed_mesh_profile %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% if bed_mesh_enabled %} {% if BED_MESH_PROFILE == "" %} {% if verbose %} RESPOND MSG="Bed mesh measurement..." {% endif %} ADAPTIVE_BED_MESH SIZE={FL_SIZE} {% else %} {% if verbose %} RESPOND MSG="Load bed mesh profile : {BED_MESH_PROFILE}" {% endif %} BED_MESH_PROFILE LOAD={BED_MESH_PROFILE} {% endif %} {% endif %} [gcode_macro _MODULE_EXTRUDER_PREHEATING] gcode = {% set safe_extruder_temp = printer["gcode_macro _USER_VARIABLES"].safe_extruder_temp|float %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% if status_leds_enabled %} STATUS_LEDS COLOR="HEATING" {% endif %} {% if verbose %} RESPOND MSG="Pre-heating the nozzle to a safe temperature..." {% endif %} {% if probe_type_enabled == "vorontap" %} M109 S{safe_extruder_temp} {% if verbose %} RESPOND MSG="Extruder at safe temperature of {safe_extruder_temp} degrees" {% endif %} {% else %} {% if printer.extruder.target < safe_extruder_temp %} M104 S{safe_extruder_temp} {% if verbose %} RESPOND MSG="Extruder is heating at temperature of {safe_extruder_temp} degrees" {% endif %} {% else %} {% if verbose %} RESPOND MSG="Extruder is already hot" {% endif %} {% endif %} {% endif %} [gcode_macro _MODULE_CUSTOM1] gcode = [gcode_macro _MODULE_CUSTOM2] gcode = [gcode_macro _MODULE_CUSTOM3] gcode = [gcode_macro _CG28] description = Homing only if necessary gcode = {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% if "xyz" not in printer.toolhead.homed_axes %} {% if status_leds_enabled %} STATUS_LEDS COLOR="HOMING" {% endif %} G28 {% if status_leds_enabled %} STATUS_LEDS COLOR="READY" {% endif %} {% endif %} [homing_override] axes = xyz gcode = {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set kinematics = printer["configfile"].config["printer"]["kinematics"] %} {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled %} {% set homing_zhop = printer["gcode_macro _USER_VARIABLES"].homing_zhop|float|abs %} {% set homing_travel_speed = printer["gcode_macro _USER_VARIABLES"].homing_travel_speed * 60 %} {% set homing_travel_accel = printer["gcode_macro _USER_VARIABLES"].homing_travel_accel %} {% set sensorless_homing_enabled = printer["gcode_macro _USER_VARIABLES"].sensorless_homing_enabled %} {% set sensorless_current_factor = printer["gcode_macro _USER_VARIABLES"].sensorless_current_factor / 100 %} {% set x_driver = printer["gcode_macro _USER_VARIABLES"].x_driver %} {% set y_driver = printer["gcode_macro _USER_VARIABLES"].y_driver %} {% set z_driver = printer["gcode_macro _USER_VARIABLES"].z_driver %} {% set z_drop_speed = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set homing_first = printer["gcode_macro _USER_VARIABLES"].homing_first|string|upper %} {% set x_homing_backoff, y_homing_backoff = printer["gcode_macro _USER_VARIABLES"].homing_backoff_distance_xy|map('float') %} {% set x_position_endstop = printer["configfile"].config["stepper_x"]["position_endstop"]|float %} {% set y_position_endstop = printer["configfile"].config["stepper_y"]["position_endstop"]|float %} {% set x_position_center = printer.toolhead.axis_maximum.x|int/2 - printer.toolhead.axis_minimum.x|int/2 %} {% set y_position_center = printer.toolhead.axis_maximum.y|int/2 - printer.toolhead.axis_minimum.y|int/2 %} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _CHECK_PROBE action=query {% endif %} {% set X, Y, Z = False, False, False %} {% if status_leds_enabled %} STATUS_LEDS COLOR="HOMING" {% endif %} {% if not 'X' in params and not 'Y' in params and not 'Z' in params %} {% set X, Y, Z = True, True, True %} {% else %} {% if 'X' in params %} {% set X = True %} {% endif %} {% if 'Y' in params %} {% set Y = True %} {% endif %} {% if 'Z' in params %} {% set Z = True %} {% endif %} {% if 'X' in params and 'Y' in params and 'Z' in params %} _HOMING_VARIABLES reset=1 {% endif %} {% endif %} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _ENTRY_POINT FUNCTION=homing_override {% endif %} {% set saved_accel = printer.toolhead.max_accel %} M204 S{homing_travel_accel} {% if bed_mesh_enabled %} BED_MESH_CLEAR {% endif %} G90 {% if Z %} {% if ('z' in printer.toolhead.homed_axes) %} {% if (printer.toolhead.position.z < homing_zhop) %} {% if verbose %} { action_respond_info("Z too low, performing ZHOP to rehome Z") } {% endif %} G91 G0 Z{homing_zhop} F{z_drop_speed} M400 G90 {% else %} {% if verbose %} { action_respond_info("Z already safe, no ZHOP needed to rehome Z") } {% endif %} {% endif %} {% elif ('xy' in printer.toolhead.homed_axes) %} {% if verbose %} { action_respond_info("X and Y already homed, no ZHOP needed to home Z") } {% endif %} {% else %} {% if verbose %} { action_respond_info("X and Y not homed, forcing full G28 to home Z properly") } {% endif %} SET_KINEMATIC_POSITION X=0 Y=0 Z=0 G0 Z{homing_zhop} F{z_drop_speed} {% if sensorless_homing_enabled and kinematics == "corexz" %} M400 {% endif %} {% set X, Y, Z = True, True, True %} {% endif %} {% endif %} {% if homing_first == "X" %} {% if X %} {% if verbose %} { action_respond_info("Homing X") } {% endif %} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "corexz" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_z = printer.configfile.config[z_driver ~ ' stepper_z'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_z = sensorless_current_factor * old_current_z %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_z CURRENT={new_current_z} M400 {% elif kinematics == "cartesian" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} M400 {% endif %} {% endif %} G28 X0 G1 X{x_position_endstop + x_homing_backoff} F{homing_travel_speed} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "corexz" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_z CURRENT={old_current_z} {% elif kinematics == "cartesian" %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} {% endif %} {% endif %} {% endif %} {% if Y %} {% if verbose %} { action_respond_info("Homing Y") } {% endif %} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "corexz" %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "cartesian" %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% endif %} {% endif %} G28 Y0 G1 Y{y_position_endstop + y_homing_backoff} F{homing_travel_speed} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "corexz" %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "cartesian" %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% endif %} {% endif %} {% endif %} {% elif homing_first == "Y" %} {% if Y %} {% if verbose %} { action_respond_info("Homing Y") } {% endif %} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "corexz" %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "cartesian" %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% endif %} {% endif %} G28 Y0 G1 Y{y_position_endstop + y_homing_backoff} F{homing_travel_speed} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "corexz" %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "cartesian" %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% endif %} {% endif %} {% endif %} {% if X %} {% if verbose %} { action_respond_info("Homing X") } {% endif %} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "corexz" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_z = printer.configfile.config[z_driver ~ ' stepper_z'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_z = sensorless_current_factor * old_current_z %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_z CURRENT={new_current_z} M400 {% elif kinematics == "cartesian" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} M400 {% endif %} {% endif %} G28 X0 G1 X{x_position_endstop + x_homing_backoff} F{homing_travel_speed} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "corexz" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_z CURRENT={old_current_z} {% elif kinematics == "cartesian" %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} {% endif %} {% endif %} {% endif %} {% else %} { action_respond_error("Axis homing order not valid. Choose either X or Y first in the variables.cfg file!") } {% endif %} {% if Z %} {% if verbose %} { action_respond_info("Homing Z") } {% endif %} {% if printer["configfile"].config["stepper_z"]["endstop_pin"]|lower == "probe:z_virtual_endstop" %} {% if probe_type_enabled == "dockable_virtual" or probe_type_enabled == "vorontap" %} ACTIVATE_PROBE {% endif %} {% if not bed_mesh_enabled or not printer["configfile"].config["bed_mesh"]["zero_reference_position"] %} G0 X{x_position_center} Y{y_position_center} F{homing_travel_speed} {% else %} {% set ZRPx, ZRPy = printer["configfile"].config["bed_mesh"]["zero_reference_position"].split(',')|map('trim')|map('float') %} G0 X{ZRPx} Y{ZRPy} F{homing_travel_speed} {% endif %} {% else %} _GOTO_Z_PROBE {% endif %} G28 Z0 G91 {% if printer["configfile"].settings["stepper_z"]["homing_positive_dir"] == False %} G0 Z{homing_zhop} F{z_drop_speed} {% elif printer["configfile"].settings["stepper_z"]["homing_positive_dir"] == True %} G0 Z-{homing_zhop} F{z_drop_speed} {% endif %} G90 {% if probe_type_enabled == "vorontap" or probe_type_enabled == "dockable_virtual" %} DEACTIVATE_PROBE {% endif %} {% endif %} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _CHECK_PROBE action=query {% endif %} SET_VELOCITY_LIMIT ACCEL={saved_accel} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _EXIT_POINT FUNCTION=homing_override {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="READY" {% endif %} [gcode_macro _GOTO_Z_PROBE] description = Move to z probe avoiding the probe dock gcode = {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set zcalib_plugin_enabled = printer["gcode_macro _USER_VARIABLES"].zcalib_plugin_enabled %} {% if zcalib_plugin_enabled %} {% set z_endstop_x, z_endstop_y = printer["configfile"].config["z_calibration"]["nozzle_xy_position"].split(',')|map('trim')|map('float') %} {% else %} {% set z_endstop_x, z_endstop_y = printer["gcode_macro _USER_VARIABLES"].zendstop_position|map('float') %} {% endif %} {% set homing_travel_speed = printer["gcode_macro _USER_VARIABLES"].homing_travel_speed|float * 60 %} {% set probe_dock_location_x, probe_dock_location_y = printer["gcode_macro _USER_VARIABLES"].probe_dock_location_xy|map('float') %} {% set probe_dock_margin_x, probe_dock_margin_y = printer["gcode_macro _USER_VARIABLES"].probe_dock_margin_xy|map('float') %} {% set current_x = printer.toolhead.position.x|float %} {% set current_y = printer.toolhead.position.y|float %} SAVE_GCODE_STATE NAME=goto_ZProbe G90 {% set avoid_dock = false %} {% if probe_dock_location_x < z_endstop_x|float %} {% if current_x < (probe_dock_location_x + probe_dock_margin_x) %} {% set avoid_dock = true %} {% endif %} {% else %} {% if current_x > (probe_dock_location_x - probe_dock_margin_x) %} {% set avoid_dock = true %} {% endif %} {% endif %} {% if avoid_dock == true %} {% if verbose %} { action_respond_info("Avoiding probe dock to home Z...") } {% endif %} G0 Y{probe_dock_location_y - probe_dock_margin_y} F{homing_travel_speed} G0 X{z_endstop_x} F{homing_travel_speed} {% endif %} G0 X{z_endstop_x} Y{z_endstop_y} F{homing_travel_speed} RESTORE_GCODE_STATE NAME=goto_ZProbe [gcode_macro CALIBRATE] description = Calibrate the printer flow or pressure advance gcode = {% set TYPE = params.TYPE|default("")|string|lower %} {% set BED_TEMP = params.BED_TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_bed_temp)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set MATERIAL = params.MATERIAL|default("ABS")|string %} {% set TOOL = params.TOOL|default(0)| int %} {% set center_x = printer.toolhead.axis_maximum.x|float / 2 %} {% set center_y = printer.toolhead.axis_maximum.y|float / 2 %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and printer.mmu.filament == "Loaded" %} {% set TOOL = printer.mmu.tool|int %} {% endif %} {% endif %} {% if TYPE=="flow" %} {% set computed_size = (center_x - 20)|string + '_' + (center_y - 20)|string + '_' + (center_x + 20)|string + '_' + (center_y + 20)|string %} START_PRINT EXTRUDER_TEMP={EXTRUDER_TEMP} BED_TEMP={BED_TEMP} MATERIAL={MATERIAL} SOAK=1 SIZE={computed_size} INITIAL_TOOL={TOOL} TOOLS_USED={TOOL} FLOW_MULTIPLIER_CALIBRATION EXTRUSION_WIDTH=0.471 END_PRINT FILTER_TIME=0 {% elif TYPE=="pressure_advance" %} {% set computed_size = (center_x - 60)|string + '_' + (center_y - 60)|string + '_' + (center_x + 60)|string + '_' + (center_y + 60)|string %} START_PRINT EXTRUDER_TEMP={EXTRUDER_TEMP} BED_TEMP={BED_TEMP} MATERIAL={MATERIAL} SOAK=1 SIZE={computed_size} INITIAL_TOOL={TOOL} TOOLS_USED={TOOL} PRESSURE_ADVANCE_CALIBRATION END_PRINT FILTER_TIME=0 {% else %} {action_respond_info("Please call this macro using TYPE= \"flow\" or \"pressure_advance\"")} {action_raise_error("not enough parameters to start a calibration!")} {% endif %} [gcode_macro _FLOW_CALIB_VARIABLES] variable_last_shell_thickness = 0.0 variable_last_evalue = 0.0 gcode = [gcode_macro FLOW_MULTIPLIER_CALIBRATION] description = Print a small tower to calibrate the extrusion flow multiplier by measuring the shell gcode = {% set do_raft = params.DO_RAFT|default(1)|int %} {% set do_retract = params.DO_RECTRACT|default(0)|int %} {% set print_size = params.PRINT_SIZE|default(40)|int %} {% set print_height = params.HEIGHT|default(15)|int %} {% set corner_radius = params.CORNER_RADIUS|default(8)|int %} {% set number_of_perimeters = params.PERIMETERS|default(2)|int %} {% set fan_speed = params.FAN_SPEED|default(20)|int %} {% set e_multiplier = params.EXTRUSION_MULTIPLIER|default(1.00)|float %} {% set filament_diameter = params.FILAMENT_DIAMETER|default(1.75)|float %} {% set extrusion_width = params.EXTRUSION_WIDTH|default(0.4)|float %} {% set layer_height = params.LAYER_HEIGHT|default(0.2)|float %} {% set retract_length = params.RETRACT_LENGTH|default(0.5)|float %} {% set initial_purge = params.PURGE_MM|default(1)|int %} {% set z_hop_height = 2 * layer_height %} {% set feedrate_print = params.CONTROL_SPEED|default(100)|int * 60 %} {% set feedrate_travel = params.TRAVEL_SPEED|default(200)|int * 60 %} {% set feedrate_raft = params.RAFT_SPEED|default(60)|int * 60 %} {% set feedrate_z = params.Z_LIFT_SPEED|default(20)|int * 60 %} {% set feedrate_retract = params.RETRACT_SPEED|default(50)|int * 60 %} {% set e_per_mm = ((extrusion_width - layer_height) * layer_height + 3.14159 * (layer_height / 2)**2) / (3.14159 * (filament_diameter / 2)**2) %} {% set spacing = extrusion_width - layer_height * (1 - 3.14159 / 4) %} {% set shell_thickness = extrusion_width + (number_of_perimeters|float - 1) * spacing %} {% set max_x = printer.toolhead.axis_maximum.x|float %} {% set max_y = printer.toolhead.axis_maximum.y|float %} {% set x_start = max_x / 2 - print_size / 2 %} {% set y_start = max_y / 2 - print_size / 2 %} {% set x_end = x_start + print_size %} {% set y_end = y_start + print_size %} {% set num_raft_lines = ([print_size, max_x]|min / spacing)|round(0, 'floor')|int %} {% set raft_size = num_raft_lines * spacing %} {action_respond_info("")} {action_respond_info("Starting extrusion flow calibration print")} {action_respond_info("This operation can not be interrupted by normal means. Hit the \"emergency stop\" button to stop it if needed")} {action_respond_info("")} {action_respond_info("Exrusion multiplier used: %.4f" % e_multiplier)} {action_respond_info("Number of perimeters to print: %d" % number_of_perimeters)} {action_respond_info("THEORIC SHELL THICKNESS: %.4f" % shell_thickness)} {action_respond_info("")} {action_respond_info("Measure the shell thickness using a caliper or micrometer. Then call the computation macro with the measured value:")} {action_respond_info("COMPUTE_FLOW_MULTIPLIER MEASURED_THICKNESS=xxx.xxx")} {action_respond_info("")} SAVE_GCODE_STATE NAME=STATE_FLOW_MULTIPLIER_CALIBRATION SET_GCODE_VARIABLE MACRO=_FLOW_CALIB_VARIABLES VARIABLE=last_shell_thickness VALUE={shell_thickness} SET_GCODE_VARIABLE MACRO=_FLOW_CALIB_VARIABLES VARIABLE=last_evalue VALUE={e_multiplier} G90 M83 G92 E0.0 G0 X{x_start} Y{y_start - 5} Z{layer_height} F{feedrate_travel} G91 G1 E{initial_purge} F{5 * 60} G1 X{raft_size} E{raft_size * e_per_mm * 1.5} F{feedrate_raft / 2} G1 Y-{extrusion_width} E{extrusion_width * e_per_mm} F{feedrate_raft / 2} G1 X-{raft_size} E{raft_size * e_per_mm} F{feedrate_raft / 2} G1 E-{retract_length} F{feedrate_retract} G0 Z{z_hop_height} F{feedrate_z} G90 G0 X{x_start} Y{y_start} F{feedrate_travel} G1 Z{layer_height} F{feedrate_z} G1 E{retract_length} F{feedrate_retract} M221 S{e_multiplier * 100} {% if do_raft == 1 %} G91 {% for curr_raft_line in range(1, num_raft_lines + 2) %} G1 Y{loop.cycle(1.0, -1.0) * raft_size} E{raft_size * e_per_mm} F{feedrate_raft} {% if not loop.last %} G1 X{spacing} E{spacing * e_per_mm} F{feedrate_raft} {% endif %} {% endfor %} G1 E-{retract_length} F{feedrate_retract} G0 Z{z_hop_height} F{feedrate_z} G90 {% endif %} G90 M106 S{fan_speed * 255 / 100} {% for curr_layer in range(1, (print_height / layer_height)|round|int) %} G0 X{x_start + corner_radius} Y{y_start} F{feedrate_travel} G1 Z{(curr_layer * layer_height) + (layer_height if do_raft == 1 else 0)} F{feedrate_z} {% for perim_num in range(number_of_perimeters) %} {% set perim_offset = perim_num * spacing %} {% set perim_radius = corner_radius - (perim_num * spacing) %} G1 X{x_start + corner_radius} Y{y_start + perim_offset} F{feedrate_travel} {% if do_retract == 1 %} G1 E{retract_length} F{feedrate_retract} {% endif %} G1 X{x_end - corner_radius} Y{y_start + perim_offset} E{(print_size - (2 * corner_radius)) * e_per_mm} F{feedrate_print} G3 X{x_end - perim_offset} Y{y_start + corner_radius} J{perim_radius} E{(3.14159 / 2) * perim_radius * e_per_mm} F{feedrate_print} G1 X{x_end - perim_offset} Y{y_end - corner_radius} E{(print_size - (2 * corner_radius)) * e_per_mm} F{feedrate_print} G3 X{x_end - corner_radius} Y{y_end - perim_offset} I-{perim_radius} E{(3.14159 / 2) * perim_radius * e_per_mm} F{feedrate_print} G1 X{x_start + corner_radius} Y{y_end - perim_offset} E{(print_size - (2 * corner_radius)) * e_per_mm} F{feedrate_print} G3 X{x_start + perim_offset} Y{y_end - corner_radius} J-{perim_radius} E{(3.14159 / 2) * perim_radius * e_per_mm} F{feedrate_print} G1 X{x_start + perim_offset} Y{y_start + corner_radius} E{(print_size - (2 * corner_radius)) * e_per_mm} F{feedrate_print} G3 X{x_start + corner_radius} Y{y_start + perim_offset} I{perim_radius} E{(3.14159 / 2) * perim_radius * e_per_mm} F{feedrate_print} {% if do_retract == 1 %} G1 E-{retract_length} F{feedrate_retract} {% endif %} {% endfor %} {% if do_retract == 1 %} G91 G0 Z{z_hop_height} F{feedrate_z} G90 {% endif %} {% endfor %} G1 E-{retract_length} F{feedrate_retract} G91 G0 Z20 F{feedrate_travel} RESTORE_GCODE_STATE NAME=STATE_FLOW_MULTIPLIER_CALIBRATION [gcode_macro COMPUTE_FLOW_MULTIPLIER] description = Compute a new flow multiplier by using the measured shell thickness on the calibration print gcode = {% set evalue = params.OLD_EXTRUSION_MULTIPLIER|default(0.0)|float %} {% set theorical_thickness = params.THEORICAL_THICKNESS|default(0.0)|float %} {% set measured_thickness = params.MEASURED_THICKNESS|default(0.0)|float %} {% if evalue == 0.0 %} {% set last_evalue = printer["gcode_macro _FLOW_CALIB_VARIABLES"].last_evalue %} {% if last_evalue == 0.0 %} {action_respond_info("It seems that no calibration print was run prior to this (or a restart of Klipper occured).")} {action_respond_info("You can still manually use it by calling again this macro like that:")} {action_respond_info("COMPUTE_FLOW_MULTIPLIER OLD_EXTRUSION_MULTIPLIER=xxx.xxx THEORICAL_THICKNESS=xxx.xxx MEASURED_THICKNESS=xxx.xxx")} {action_raise_error("not enough data to perform the computation of the new flow !")} {% else %} {% set final_evalue = last_evalue %} {action_respond_info("Using OLD_EXTRUSION_MULTIPLIER: %.3f" % final_evalue)} {% endif %} {% else %} {% set final_evalue = evalue %} {action_respond_info("Using OLD_EXTRUSION_MULTIPLIER: %.3f" % final_evalue)} {% endif %} {% if theorical_thickness == 0.0 %} {% set last_shell_thickness = printer["gcode_macro _FLOW_CALIB_VARIABLES"].last_shell_thickness %} {% if last_shell_thickness == 0.0 %} {action_respond_info("It seems that no calibration print was run prior to this (or a restart of Klipper occured).")} {action_respond_info("You can still manually use it by calling again this macro like that:")} {action_respond_info("COMPUTE_FLOW_MULTIPLIER OLD_EXTRUSION_MULTIPLIER=xxx.xxx THEORICAL_THICKNESS=xxx.xxx MEASURED_THICKNESS=xxx.xxx")} {action_raise_error("not enough data to perform the computation of the new flow !")} {% else %} {% set final_theorical_thickness = last_shell_thickness %} {action_respond_info("Using THEORICAL_THICKNESS: %.3f" % final_theorical_thickness)} {% endif %} {% else %} {% set final_theorical_thickness = theorical_thickness %} {action_respond_info("Using THEORICAL_THICKNESS: %.3f" % final_theorical_thickness)} {% endif %} {% if measured_thickness == 0.0 %} {action_respond_info("You must use a caliper or micrometer to measure the calibration print shell thickness and call this macro with the measured value !!!")} {action_respond_info("COMPUTE_FLOW_MULTIPLIER MEASURED_THICKNESS=xxx.xxx")} {action_raise_error("not enough data to perform the computation of the new flow !")} {% else %} {% set new_evalue = final_theorical_thickness * final_evalue / measured_thickness %} {action_respond_info("NEW COMPUTED FLOW VALUE: %.3f" % new_evalue)} {action_respond_info("Use this new value as extrusion multiplier in your slicer of choice")} {action_respond_info("")} {% endif %} [gcode_macro PRESSURE_ADVANCE_CALIBRATION] description = Calibrate the pressure advance by printing a grid pattern gcode = {% set pa_start = params.START|default(0.02)|float %} {% set pa_increment = params.INCREMENT|default(0.005)|float %} {% set do_raft = params.DO_RAFT|default(1)|int %} {% set print_size = params.PRINT_SIZE|default(120)|int %} {% set num_bands = params.BANDS_LIMIT|default(999)|int %} {% set lines_per_band = params.LINES_PER_BAND|default(6)|int %} {% set e_multiplier = params.EXTRUSION_MULTIPLIER|default(1.25 if do_raft == 1 else 1.5)|float %}, {% set retract_length = params.RETRACT_LENGTH|default(0.6)|float %} {% set initial_purge = params.PURGE_MM|default(8)|int %} {% set feedrate_control = params.CONTROL_SPEED|default(30)|int * 60 %} {% set feedrate_outer = params.OUTER_SPEED|default(40)|int * 60 %} {% set feedrate_inner = params.INNER_SPEED|default(120)|int * 60 %} {% set feedrate_travel = params.TRAVEL_SPEED|default(200)|int * 60 %} {% set feedrate_raft = params.RAFT_SPEED|default(120)|int * 60 %} {% set feedrate_z = 5 * 60 %} {% set feedrate_retract = 50 * 60 %} {% set spacing_line = params.LINE_SPACING|default(0.4)|float %} {% set spacing_band = 2 %} {% set spacing_raft = 2 %} {% set fast_line_ratio_percent = 50 %} {% set lines_per_band = [2, lines_per_band]|max %} {% set e_multiplier = [1, e_multiplier]|max %} {% set num_lines_control = (lines_per_band / 2)|round(0, 'floor')|int %} {% set num_lines_test = (lines_per_band / 2)|round(0, 'ceil')|int %} {% set spacing_line = spacing_line * (1 + e_multiplier - 1.25) %} {% set max_x = printer.toolhead.axis_maximum.x|float %} {% set max_y = printer.toolhead.axis_maximum.y|float %} {% set nozzle_diameter = printer.configfile.config['extruder'].nozzle_diameter|float %} {% set line_width = nozzle_diameter * 1.25 %} {% set line_height = nozzle_diameter / 2 %} {% set z_hop_height = 2 * line_height %} {% set e_per_mm = (line_width * line_height) / (3.1415 * (1.75/2)**2) %} {% set spacing_purge = line_height * 0.8 %} {% set spacing_raft = (spacing_raft / line_width)|round * line_width %} {% set num_raft_lines = ([print_size, max_x]|min / spacing_raft)|round(0, 'floor')|int %} {% set print_width = num_raft_lines * spacing_raft %} {% set band_height = lines_per_band * line_width + (lines_per_band - 1) * spacing_line + spacing_band %} {% set bands_per_height = (([print_size, max_y]|min - spacing_purge - 2 * line_width + spacing_band) / band_height)|round(0, 'floor')|int %} {% set num_bands = [num_bands, bands_per_height]|min %} {% set print_height = num_bands * band_height - spacing_band + spacing_purge + 2 * line_width %} {% set slow_line_length = ((print_width * (1 - fast_line_ratio_percent / 100) / 2) / spacing_raft)|round * spacing_raft + spacing_raft / 2 %} {% set fast_line_length = print_width - slow_line_length * 2 %} {% set thick_raft_num1 = (slow_line_length / spacing_raft)|round|int %} {% set thick_raft_num2 = num_raft_lines - thick_raft_num1 + 1 %} {% set x_start = max_x / 2 - print_width / 2 %} {% set y_start = max_y / 2 - print_height / 2 %} {action_respond_info("")} {action_respond_info("Starting Pressure Advance calibration print.")} {action_respond_info("")} {action_respond_info("This operation can not be interrupted by normal means. Hit the \"emergency stop\" button once the print starts exhibiting PA values that are obviously too high.")} {action_respond_info("")} {action_respond_info("PA of first band: %.4f" % pa_start)} {action_respond_info("PA of last band: %.4f" % (pa_start + ((num_bands - 1) * pa_increment)))} {action_respond_info("PA increment per band: %.4f" % pa_increment)} {action_respond_info("Number of bands: %d" % num_bands)} {action_respond_info("")} {action_respond_info("Inspect the printed model. " "Look at the top and bottom lines in each band, on the right side of the two vertical raft bars (where the print speeds change). " "Find the highest band from the bottom where the lines at its top still resemble the lines at its bottom, with no visible extrusion width irregularities. " "Your final Pressure Advance value would then be:" )} {action_respond_info("")} {action_respond_info("Assuming that first band_number is 0")} {action_respond_info("PA = %.4f + (%.4f * band_number)" % (pa_start, pa_increment))} {action_respond_info("")} {action_respond_info("Update your [extruder] config section and set \"pressure_advance\" to the value you calculated.")} {action_respond_info("")} SAVE_GCODE_STATE NAME=STATE_PRESSURE_ADVANCE_CALIBRATION {% set pa_saved = printer.configfile.settings['extruder'].pressure_advance %} SET_PRESSURE_ADVANCE ADVANCE={pa_start} M221 S100 M117 Priming G90 G0 X{x_start} Y{y_start} Z{line_height} F{feedrate_travel} G91 G1 E{initial_purge} F{5 * 60} G1 X{print_width} E{print_width * e_per_mm} F{feedrate_raft / 2} G1 Y{line_width} E{line_width * e_per_mm} F{feedrate_raft / 2} G1 X-{print_width} E{print_width * e_per_mm} F{feedrate_raft / 2} {% if do_raft == 1 %} G0 F{feedrate_raft} {% for curr_raft_line in range(1, num_raft_lines + 2) %} {% if curr_raft_line == thick_raft_num1 or curr_raft_line == thick_raft_num2 %} G1 Y{loop.cycle(1.0, -1.0) * print_height} E{print_height * e_per_mm} G1 X{line_width} E{line_width * e_per_mm} G1 Y{loop.cycle(-1.0, 1.0) * print_height} E{print_height * e_per_mm} G1 X{line_width} E{line_width * e_per_mm} {% endif %} G1 Y{loop.cycle(1.0, -1.0) * print_height} E{print_height * e_per_mm} {% if not loop.last %} {% set horizontal_move = spacing_raft - (2 * line_width if curr_raft_line == thick_raft_num1 - 1 or curr_raft_line == thick_raft_num2 - 1 else 0) %} G1 X{horizontal_move} E{horizontal_move * e_per_mm} {% endif %} {% endfor %} G1 E-{retract_length} F{feedrate_retract} G0 Z{z_hop_height} F{feedrate_z} {% endif %} M117 Printing bands G90 G0 X{x_start} Y{y_start + 2 * line_width + spacing_purge} F{feedrate_travel} G0 Z{line_height + (line_height if do_raft == 1 else 0)} F{feedrate_z} G91 G1 E{retract_length} F{feedrate_retract} {% for curr_band_num in range(0, num_bands ) %} {% set outer_loop = loop %} {% set curr_pa_value = pa_start + curr_band_num * pa_increment %} SET_PRESSURE_ADVANCE ADVANCE={curr_pa_value} M117 Band {curr_band_num} PA {curr_pa_value|round(4)} {% for _ in range(num_lines_control) %} G1 X{print_width} E{print_width * e_per_mm * e_multiplier} F{feedrate_control} G1 E-{retract_length} F{feedrate_retract} G0 Z{z_hop_height} F{feedrate_z} G0 X-{print_width} Y{spacing_line + line_width} F{feedrate_travel} G0 Z-{z_hop_height} F{feedrate_z} G1 E{retract_length} F{feedrate_retract} {% endfor %} {% for _ in range(num_lines_test) %} {% for data in [{'mm': slow_line_length, 'f': feedrate_outer}, {'mm': fast_line_length, 'f': feedrate_inner}, {'mm': slow_line_length, 'f': feedrate_outer}] %} G1 X{data.mm} E{data.mm * e_per_mm * e_multiplier} F{data.f} {% endfor %} G1 E-{retract_length} F{feedrate_retract} G0 Z{z_hop_height} F{feedrate_z} {% if not (outer_loop.last and loop.last) %} G0 X-{print_width} Y{(spacing_line if not loop.last else spacing_band) + line_width} F{feedrate_travel} G0 Z-{z_hop_height} F{feedrate_z} G1 E{retract_length} F{feedrate_retract} {% endif %} {% endfor %} {% endfor %} G1 E-{retract_length} F{feedrate_retract} G0 Z20 F{feedrate_z} G0 X-{print_width / 2} Y{[50, max_y - (y_start + print_height)]|min} F{feedrate_travel} M117 SET_PRESSURE_ADVANCE ADVANCE={pa_saved} RESTORE_GCODE_STATE NAME=STATE_PRESSURE_ADVANCE_CALIBRATION [gcode_macro CHANGE_FILAMENT] description = Do a PAUSE, park the toolhead over the purge bucket and unload the filament gcode = {% set TEMP = params.TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set DISTANCE = params.DISTANCE|default(105)|float %} SAVE_GCODE_STATE NAME=CHANGE_FILAMENT_state PAUSE _CONDITIONAL_MOVE_TO_PURGE_BUCKET Z_DROP=0 UNLOAD_FILAMENT TEMP={TEMP} DISTANCE={DISTANCE} RESTORE_GCODE_STATE NAME=CHANGE_FILAMENT_state [gcode_macro UNLOAD_FILAMENT] description = Basic unload of the filament (used with M600/CHANGE_FILAMENT) gcode = {% set TEMP = params.TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set DISTANCE = params.DISTANCE|default(105)|float %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set re_enable_filament_sensor = 0 %} {% if filament_sensor_enabled %} {% if (printer['filament_motion_sensor runout_sensor'] is defined and printer['filament_motion_sensor runout_sensor'].enabled) or (printer['filament_switch_sensor runout_sensor'] is defined and printer['filament_switch_sensor runout_sensor'].enabled) %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% set re_enable_filament_sensor = 1 %} {% if verbose %} RESPOND MSG="Runout sensor deactivated to unload filament" {% endif %} {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE=0 {% endif %} SAVE_GCODE_STATE NAME=UNLOAD_FILAMENT_state _LOW_TEMP_CHECK T={TEMP} _TIP_SHAPING M83 G1 E-20 F3600 G4 P3000 G1 E{DISTANCE|float * -1} F3000 M400 RESTORE_GCODE_STATE NAME=UNLOAD_FILAMENT_state {% if filament_sensor_enabled and re_enable_filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% if verbose %} RESPOND MSG="Filament unloaded, runout sensor reactivated" {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE={printer.mmu.clog_detection} {% endif %} [gcode_macro LOAD_FILAMENT] description = Basic load of the filament (used with M600/CHANGE_FILAMENT) gcode = {% set TEMP = params.TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set DISTANCE = params.DISTANCE|default(105)|float %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set re_enable_filament_sensor = 0 %} {% if filament_sensor_enabled %} {% if (printer['filament_motion_sensor runout_sensor'] is defined and printer['filament_motion_sensor runout_sensor'].enabled) or (printer['filament_switch_sensor runout_sensor'] is defined and printer['filament_switch_sensor runout_sensor'].enabled) %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% set re_enable_filament_sensor = 1 %} {% if verbose %} RESPOND MSG="Runout sensor deactivated to load filament" {% endif %} {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE=0 {% endif %} SAVE_GCODE_STATE NAME=LOAD_FILAMENT_state _LOW_TEMP_CHECK T={TEMP} M83 G92 E0 G1 E{DISTANCE|float} F200 G1 E50 F150 M400 G92 E0 RESTORE_GCODE_STATE NAME=LOAD_FILAMENT_state {% if filament_sensor_enabled and re_enable_filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% if verbose %} RESPOND MSG="Filament loaded, runout sensor reactivated" {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE={printer.mmu.clog_detection} {% endif %} [gcode_macro _TIP_SHAPING] description = Filament tip shaping sequence gcode = {% set TEMP = params.TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set re_enable_filament_sensor = 0 %} {% if filament_sensor_enabled %} {% if (printer['filament_motion_sensor runout_sensor'] is defined and printer['filament_motion_sensor runout_sensor'].enabled) or (printer['filament_switch_sensor runout_sensor'] is defined and printer['filament_switch_sensor runout_sensor'].enabled) %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% set re_enable_filament_sensor = 1 %} {% if verbose %} RESPOND MSG="Runout sensor deactivated for filament tip shaping" {% endif %} {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE=0 {% endif %} SAVE_GCODE_STATE NAME=TIP_SHAPING_state _LOW_TEMP_CHECK T={TEMP} {% set old_pressure_advance = printer.extruder.pressure_advance|default(0) %} SET_PRESSURE_ADVANCE ADVANCE=0 M82 G92 E0 G1 E2 F3600 G1 E0 F3600 G1 E3 F3600 G1 E0 F3600 G1 E4 F3600 G1 E0 F3600 SET_PRESSURE_ADVANCE ADVANCE={old_pressure_advance} M400 RESTORE_GCODE_STATE NAME=TIP_SHAPING_state {% if filament_sensor_enabled and re_enable_filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% if verbose %} RESPOND MSG="Filament tip shaping done, runout sensor reactivated" {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE={printer.mmu.clog_detection} {% endif %} [gcode_macro HEATSOAK_CHAMBER] description = Heatsoak chamber to a specific temperature with a timeout gcode = {% set chamber_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].chamber_temperature_sensor_enabled %} {% if chamber_sensor_enabled %} {% set SETPOINT_TEMP = params.TEMP|default(0)|float %} {% set MAXTIME = params.MAXTIME|default(printer["gcode_macro _USER_VARIABLES"].print_default_chamber_max_heating_time)|int %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% for _ in range(1, MAXTIME) %} _WAIT_CHAMBER_TEMP TEMP={SETPOINT_TEMP} {% endfor %} {% if verbose %} RESPOND MSG="Chamber temperature OK or timeout reached!" {% endif %} {% endif %} [gcode_macro _WAIT_CHAMBER_TEMP] gcode = {% set chamber_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].chamber_temperature_sensor_enabled %} {% if chamber_sensor_enabled %} {% set chamber_sensor_name = printer["gcode_macro _USER_VARIABLES"].chamber_temperature_sensor_name %} {% set SETPOINT_TEMP = params.TEMP|default(0)|float %} {% set CURRENT_TEMP = printer["temperature_sensor " ~ chamber_sensor_name].temperature|float %} {% if CURRENT_TEMP <= SETPOINT_TEMP %} RESPOND MSG="Heating up the chamber : {CURRENT_TEMP}/{SETPOINT_TEMP}" G4 P{60000 * 1} {% endif %} {% endif %} [gcode_macro HEATSOAK_BED] description = Heatsoak bed at specified temperature and wait for a specific amount of time gcode = {% set SETPOINT_TEMP = params.TEMP|default(0)|int %} {% set TIME = params.SOAKTIME|default(8)|int %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set heaterbed_enabled = printer["gcode_macro _USER_VARIABLES"].heaterbed_enabled %} {% set heatsoak_bed_enabled = printer["gcode_macro _USER_VARIABLES"].print_default_soak > 0 %} {% if heaterbed_enabled %} {% if verbose %} RESPOND MSG="Heating up bed..." {% endif %} M190 S{SETPOINT_TEMP} {% if TIME > 0 %} {% for i in range(0, TIME) %} RESPOND MSG="Heatsoak bed, {TIME-i}mn left..." G4 P{60000 * 1} {% endfor %} {% else %} {% if heatsoak_bed_enabled %} RESPOND MSG="No heatsoak needed, continue" {% endif %} {% endif %} {% if verbose %} RESPOND MSG="Bed temperature OK" {% endif %} {% else %} {% if verbose %} RESPOND MSG="No bed heater defined: nothing to do, continuing..." {% endif %} {% endif %} [gcode_macro PRIMELINE] gcode = {% set prime_line_length = params.LINE_LENGTH|default(printer["gcode_macro _USER_VARIABLES"].prime_line_length)|float %} {% set prime_line_purge_distance = params.PURGE_LENGTH|default(printer["gcode_macro _USER_VARIABLES"].prime_line_purge_distance)|float %} {% set prime_line_flowrate = params.FLOWRATE|default(printer["gcode_macro _USER_VARIABLES"].prime_line_flowrate)|float %} {% set prime_line_height = params.LINE_HEIGHT|default(printer["gcode_macro _USER_VARIABLES"].prime_line_height)|default(0.6)|float %} {% set prime_line_adaptive = params.ADAPTIVE_MODE|default(1)|int %} {% set prime_line_margin = params.LINE_MARGIN|default(printer["gcode_macro _USER_VARIABLES"].prime_line_margin)|default(5.0)|float %} {% set prime_line_unretract_length = printer["gcode_macro _USER_VARIABLES"].unretract_length|default(23)|float %} {% set prime_line_wipe = printer["gcode_macro _USER_VARIABLES"].prime_line_wipe|default(False) %} {% set prime_line_wipe_length = prime_line_length * 0.8 %} {% set coordinatesFound = false %} {% if params.SIZE is defined and params.SIZE != "0_0_0_0" %} {% set xMinSpec, yMinSpec, xMaxSpec, yMaxSpec = params.SIZE.split('_')|map('trim')|map('int') %} {% set coordinatesFound = true %} {% elif printer.exclude_object is defined %} {% if printer.exclude_object.objects %} {% set eo_points = printer.exclude_object.objects|map(attribute='polygon')|sum(start=[]) %} {% set xMinSpec = eo_points|map(attribute=0)|min %} {% set yMinSpec = eo_points|map(attribute=1)|min %} {% set xMaxSpec = eo_points|map(attribute=0)|max %} {% set yMaxSpec = eo_points|map(attribute=1)|max %} {% set coordinatesFound = true %} {% endif %} {% endif %} {% set prime_line_x, prime_line_y = printer["gcode_macro _USER_VARIABLES"].prime_line_xy|map('float') %} {% set prime_line_x = params.START_X|default(prime_line_x)|float %} {% set prime_line_y = params.START_Y|default(prime_line_y)|float %} {% set prime_line_direction = params.LINE_DIRECTION|default(printer["gcode_macro _USER_VARIABLES"].prime_line_direction)|string|upper %} {% set center_x, center_y = [printer.toolhead.axis_maximum.x / 2, printer.toolhead.axis_maximum.y / 2]|map("float") %} {% if coordinatesFound and prime_line_adaptive == 1 %} {% set prime_line_x = 2*center_x - prime_line_x if (prime_line_x > center_x and xMaxSpec < center_x) or (prime_line_x < center_x and xMinSpec > center_x) else prime_line_x %} {% set prime_line_y = 2*center_y - prime_line_y if (prime_line_y > center_y and yMaxSpec < center_y) or (prime_line_y < center_y and yMinSpec > center_y) else prime_line_y %} {% set prime_line_x = [[prime_line_x, xMinSpec - prime_line_margin]|max, xMaxSpec + prime_line_margin]|min %} {% set prime_line_y = [[prime_line_y, yMinSpec - prime_line_margin]|max, yMaxSpec + prime_line_margin]|min %} {% endif %} {% set prime_line_way = -1 if (prime_line_direction == "X" and prime_line_x > center_x) or (prime_line_direction == "Y" and prime_line_y > center_y) else 1 %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set re_enable_filament_sensor = 0 %} {% set max_extrude_cross_section = printer["configfile"].config["extruder"]["max_extrude_cross_section"]|float %} {% set filament_diameter = printer["configfile"].config["extruder"]["filament_diameter"]|float %} {% set purge_volume = prime_line_purge_distance * 3.14159 * (filament_diameter / 2)**2 %} {% set line_width = purge_volume / (prime_line_height * prime_line_length) %} {% if (prime_line_height * line_width) > max_extrude_cross_section %} {% if verbose %} {action_respond_info("The prime_line_purge_distance of %.4f mm is too high and will exceed the max_extrude_cross_section!" % prime_line_purge_distance)} {% endif %} {% set prime_line_purge_distance = 0.98 * (max_extrude_cross_section * prime_line_length) / (3.14159 * (filament_diameter / 2)**2) %} {% set purge_volume = prime_line_purge_distance * 3.14159 * (filament_diameter / 2)**2 %} {% set line_width = purge_volume / (prime_line_height * prime_line_length) %} {% if verbose %} {action_respond_info("Klippain corrected the prime_line_purge_distance to %.4f mm" % prime_line_purge_distance)} {% endif %} {% endif %} {% if (prime_line_height / line_width) >= 0.5 %} {action_raise_error("The prime line will be too thin and will probably not stick properly to the bed. Increase its purge distance or decrease its length!")} {% endif %} {% set speed = (prime_line_flowrate / (prime_line_height * line_width)) * 60 |float %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE=0 {% endif %} {% if filament_sensor_enabled %} {% if (printer['filament_motion_sensor runout_sensor'] is defined and printer['filament_motion_sensor runout_sensor'].enabled) or (printer['filament_switch_sensor runout_sensor'] is defined and printer['filament_switch_sensor runout_sensor'].enabled) %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% set re_enable_filament_sensor = 1 %} {% endif %} {% endif %} G91 M83 {% if (printer.toolhead.position.z < 5) %} G1 Z5 F{Sz} {% endif %} G90 G0 X{prime_line_x} Y{prime_line_y} F{St} G1 Z{prime_line_height} F{Sz|int / 2} G92 E0 G1 E{prime_line_unretract_length} F300 G92 E0 {% if prime_line_direction == "X" %} G1 X{prime_line_x + prime_line_way*prime_line_length} E{prime_line_purge_distance} F{speed} {% if prime_line_wipe %} G0 X{prime_line_x + prime_line_way*prime_line_wipe_length} F{St} {% endif %} {% elif prime_line_direction == "Y" %} G1 Y{prime_line_y + prime_line_way*prime_line_length} E{prime_line_purge_distance} F{speed} {% if prime_line_wipe %} G0 Y{prime_line_y + prime_line_way*prime_line_wipe_length} F{St} {% endif %} {% else %} { action_respond_error("Prime line direction is not valid. Choose either X or Y in the variables.cfg file!") } {% endif %} G92 E0 G1 E-0.2 F2100 G92 E0 G1 Z3 F{Sz} G91 G1 X2 Y2 F{St} G90 M400 {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE={printer.mmu.clog_detection} {% endif %} {% if filament_sensor_enabled and re_enable_filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% endif %} [gcode_macro CLEAN_NOZZLE] description = Wipe the nozzle on the brush gcode = {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% set purgeclean_servo_enabled = printer["gcode_macro _USER_VARIABLES"].purgeclean_servo_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set brush_clean_accel = printer["gcode_macro _USER_VARIABLES"].brush_clean_accel %} {% set brush_over_y_axis = printer["gcode_macro _USER_VARIABLES"].brush_over_y_axis %} {% set brush_offset = printer["gcode_macro _USER_VARIABLES"].brush_center_offset|default(0)|float %} {% set brush_size = printer["gcode_macro _USER_VARIABLES"].brush_width_x|default(40)|float %} {% set brushes = printer["gcode_macro _USER_VARIABLES"].brushes|default(6)|int %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% if purge_and_brush_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set Sc = printer["gcode_macro _USER_VARIABLES"].brush_clean_speed * 60 %} {% set Bx, By, Bz = printer["gcode_macro _USER_VARIABLES"].brush_xyz|map('float') %} {% set Bx = Bx + brush_offset %} {% if status_leds_enabled %} STATUS_LEDS COLOR="CLEANING" {% endif %} {% if verbose %} RESPOND MSG="Nozzle cleaning..." {% endif %} {% set saved_accel = printer.toolhead.max_accel %} SET_VELOCITY_LIMIT ACCEL={brush_clean_accel} G90 _CONDITIONAL_MOVE_TO_PURGE_BUCKET Z_DROP=1 G1 X{Bx} Y{By} F{St} G1 Z{Bz} F{St} G91 {% if brush_over_y_axis %} {% for wipe in range(brushes) %} G1 Y-5 F{Sc} G1 Y+5 F{Sc} {% endfor %} {% endif %} {% if brush_offset < 0 %} G1 X+{ brush_size/2 } F{Sc} {% else %} G1 X+{ (brush_size/2) - brush_offset} F{Sc} {% endif %} {% for wipe in range(brushes) %} G1 X-{ (brush_size) - brush_offset } F{Sc} G1 X+{ (brush_size) - brush_offset } F{Sc} {% endfor %} G90 SET_VELOCITY_LIMIT ACCEL={saved_accel} {% if purgeclean_servo_enabled %} _SERVO_RETRACT ITEM="clean" {% endif %} {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="READY" {% endif %} [gcode_macro PURGE] description = Purge a specific amount of filament ontop of the purge bucket gcode = {% set DISTANCE = params.DISTANCE|default(printer["gcode_macro _USER_VARIABLES"].purge_distance)|int %} {% set OOZE_TIME = params.OOZE_TIME|default(printer["gcode_macro _USER_VARIABLES"].purge_ooze_time)|int %} {% set TEMP = params.TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set Z_DROP = params.Z_DROP|default(1)|int %} {% set RETRACT = params.RETRACT|default(printer["gcode_macro _USER_VARIABLES"].retract_length)|default(20)|float %} {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% set purgeclean_servo_enabled = printer["gcode_macro _USER_VARIABLES"].purgeclean_servo_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set re_enable_filament_sensor = 0 %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% if purge_and_brush_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% if status_leds_enabled %} STATUS_LEDS COLOR="CLEANING" {% endif %} {% if verbose %} RESPOND MSG="Purge filament..." {% endif %} {% if filament_sensor_enabled %} {% if (printer['filament_motion_sensor runout_sensor'] is defined and printer['filament_motion_sensor runout_sensor'].enabled) or (printer['filament_switch_sensor runout_sensor'] is defined and printer['filament_switch_sensor runout_sensor'].enabled) %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% set re_enable_filament_sensor = 1 %} {% endif %} {% endif %} G90 _CONDITIONAL_MOVE_TO_PURGE_BUCKET Z_DROP={Z_DROP} _LOW_TEMP_CHECK T={TEMP} G92 E0 G1 E{DISTANCE|float} F150 G92 E0 G1 E-{RETRACT * 0.1} F2100 G1 E-{RETRACT - (RETRACT * 0.1)} F150 G92 E0 G4 P{OOZE_TIME * 1000} {% if filament_sensor_enabled and re_enable_filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% endif %} {% if purgeclean_servo_enabled %} _SERVO_RETRACT ITEM="purge" {% endif %} {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="READY" {% endif %} [gcode_macro _CONDITIONAL_MOVE_TO_PURGE_BUCKET] description = Move over the purge bucket gcode = {% set Z_DROP = params.Z_DROP|default(1)|int %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% set purgeclean_servo_enabled = printer["gcode_macro _USER_VARIABLES"].purgeclean_servo_enabled %} {% set Px, Py, Pz = printer["gcode_macro _USER_VARIABLES"].purge_bucket_xyz|map('float') %} {% if purge_and_brush_enabled %} SAVE_GCODE_STATE NAME=CONDITIONAL_MOVE_TO_PURGE_BUCKET_STATE G90 {% if Z_DROP == 1 %} {% if purgeclean_servo_enabled %} G1 Z{Pz} F{Sz} _SERVO_DEPLOY ITEM="purge" {% endif %} G1 X{Px} Y{Py} F{St} G1 Z{Pz} F{St} {% else %} G1 X{Px} Y{Py} F{St} {% endif %} RESTORE_GCODE_STATE NAME=CONDITIONAL_MOVE_TO_PURGE_BUCKET_STATE {% endif %} [gcode_macro _LOW_TEMP_CHECK] description = Check the nozzle is at temperature and heat it if needed gcode = {% set T = params.T|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% if printer.extruder.target != 0 %} {% if printer.extruder.temperature < printer.extruder.target %} M109 S{printer.extruder.target|float} {% endif %} {% else %} {% if printer.extruder.target < T %} M109 S{T} {% endif %} {% endif %} [gcode_macro M701] description = Map M701 to LOAD_FILAMENT gcode = LOAD_FILAMENT [gcode_macro M702] description = Map M702 to UNLOAD_FILAMENT gcode = UNLOAD_FILAMENT [gcode_macro M600] description = Map M600 to CHANGE_FILAMENT gcode = CHANGE_FILAMENT [gcode_macro M125] description = Map M125 to PARK gcode = PARK [gcode_macro M900] description = Map M900 to SET_PRESSURE_ADVANCE gcode = {% if 'K' in params %} {% if 'E' in params %} SET_PRESSURE_ADVANCE EXTRUDER={params.E} ADVANCE={params.K} {% else %} SET_PRESSURE_ADVANCE ADVANCE={params.K} {% endif %} {% endif %} [gcode_macro M204] description = Map M204 to SET_VELOCITY_LIMIT for ACCEL rename_existing = M204.1 gcode = {% if 'S' in params %} {% set S = params.S|float %} SET_VELOCITY_LIMIT ACCEL={S} {% endif %} [gcode_macro M205] description = Map M205 to SET_VELOCITY_LIMIT for SQUARE_CORNER_VELOCITY gcode = {% if 'X' in params %} SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={params.X} {% elif 'Y' in params %} SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={params.Y} {% endif %} [gcode_macro G00] gcode = G0 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} [gcode_macro G01] gcode = G1 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} [gcode_macro G02] gcode = G2 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} [gcode_macro G03] gcode = G2 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} [gcode_macro G04] gcode = G4 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} [gcode_macro _SEARCH_VARS] description = Search for variables in the "printer" object from Klipper gcode = {% set search = params.S|lower %} {% set ns = namespace() %} {% for item in printer %} {% if ' ' in item %} {% set ns.path = ['printer', "['%s']" % (item), ''] %} {% else %} {% set ns.path = ['printer.', item, ''] %} {% endif %} {% if search in ns.path|lower %} { action_respond_info(ns.path|join) } {% endif %} {% if printer[item].items() %} {% for childkey, child in printer[item].items() recursive %} {% set ns.path = ns.path[:loop.depth|int + 1] %} {% if ' ' in childkey %} {% set null = ns.path.append("['%s']" % (childkey)) %} {% else %} {% set null = ns.path.append(".%s" % (childkey)) %} {% endif %} {% if child is mapping %} { loop(child.items()) } {% else %} {% if search in ns.path|lower %} { action_respond_info("%s : %s" % (ns.path|join, child)) } {% endif %} {% endif %} {% endfor %} {% endif %} {% endfor %} [delayed_gcode KLIPPAIN_STARTUP] initial_duration = 1 gcode = _KLIPPAIN_STARTUP [gcode_macro _KLIPPAIN_STARTUP] gcode = {% if printer["gcode_macro _USER_VARIABLES"].minidisplay_bootlogo_enabled %} _INIT_BOOT_LOGO {% endif %} RUN_SHELL_COMMAND CMD=system_info _INIT_MCU_VER {% set extruder_enabled = printer["gcode_macro _USER_VARIABLES"].extruder_enabled %} {% if not extruder_enabled %} { action_raise_error("Klippain need to have an extruder defined to work properly. Check your printer.cfg includes!") } {% endif %} _INIT_CHECKPROBECONF {% set e_driver = printer["gcode_macro _USER_VARIABLES"].e_driver|string %} {% if e_driver == "TMC2240" %} _INIT_TMC2240 {% endif %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set klippain_ercf_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_ercf_enabled %} {% if klippain_mmu_enabled or klippain_ercf_enabled %} _INIT_CHECK_MMU {% endif %} _INIT_LEDS _INIT_USERCUSTOM {% if klippain_mmu_enabled %} RESPOND MSG="Klippain with MMU support started and ready!" {% else %} RESPOND MSG="Klippain started and ready!" {% endif %} [gcode_macro _INIT_LEDS] gcode = {% if printer["gcode_macro _USER_VARIABLES"].status_leds_enabled or printer["gcode_macro _USER_VARIABLES"].status_leds_caselight_enabled %} {% if printer["gcode_macro _USER_VARIABLES"].caselight_on_at_startup|default(False) %} {% if printer["gcode_macro _USER_VARIABLES"].light_enabled %} LIGHT_ON {% endif %} STATUS_LEDS COLOR="READY" {% else %} {% if printer["gcode_macro _USER_VARIABLES"].light_enabled %} LIGHT_OFF {% endif %} STATUS_LEDS COLOR="OFF" {% endif %} {% endif %} [gcode_macro _INIT_TMC2240] gcode = [gcode_macro _INIT_CHECKPROBECONF] gcode = {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled|string %} {% set zcalib_plugin_enabled = printer["gcode_macro _USER_VARIABLES"].zcalib_plugin_enabled %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set qgl_enabled = printer["gcode_macro _USER_VARIABLES"].qgl_enabled %} {% set ztilt_enabled = printer["gcode_macro _USER_VARIABLES"].ztilt_enabled %} {% if zcalib_plugin_enabled %} {% if probe_type_enabled == "vorontap" %} { action_raise_error("Voron TAP Probe and Z calibration plugin cannot be used at the same time in Klippain!") } {% elif probe_type_enabled == "bltouch" %} { action_raise_error("BLTouch Probe and Z calibration plugin cannot be used at the same time in Klippain!") } {% elif probe_type_enabled == "inductive" %} { action_raise_error("Inductive probe and Z calibration plugin cannot be used at the same time in Klippain!") } {% elif probe_type_enabled == "dockable_virtual" or probe_type_enabled == "inductive_virtual" %} { action_raise_error("Virtual Z endstop probes are not compatible with the Z calibration plugin!") } {% elif probe_type_enabled == "none" %} { action_raise_error("You need a probe to use the Z calibration plugin in Klippain!") } {% endif %} {% endif %} {% if bed_mesh_enabled and probe_type_enabled == "none" %} { action_raise_error("You need a to define a probe to be able to perform a bed mesh in Klippain!") } {% endif %} {% if qgl_enabled and probe_type_enabled == "none" %} { action_raise_error("You need a to define a probe to be able to perform a quad gantry leveling in Klippain!") } {% endif %} {% if ztilt_enabled and probe_type_enabled == "none" %} { action_raise_error("You need a to define a probe to be able to perform a Z tilt adjust in Klippain!") } {% endif %} [gcode_macro _INIT_MCU_VER] gcode = {% set parameters = namespace(output = 'Currently configured MCU(s): \n') %} {% for name1 in printer %} {% for name2 in printer[name1] %} {% set show = ['mcu_version'] %} {% if name2 is in show %} {% set param = "%s: %s" % (name1, printer[name1][name2]) %} {% set parameters.output = parameters.output + param + "\n" %} {% endif %} {% endfor %} {% endfor %} {action_respond_info(parameters.output)} [gcode_macro _INIT_CHECK_MMU] gcode = {% if printer.mmu is not defined %} {% if printer.ercf is not defined %} { action_raise_error("MMU support is enabled in Klippain, but HappyHare, the supported MMU/ERCF backend software is not detected. See the corresponding documentation: https://github.com/Frix-x/klippain/blob/main/docs/mmu.md") } {% else %} { action_raise_error("ERCF support is enabled in Klippain, but the old version of version of HappyHare (ie. ERCF-Software-V3) is installed. Please uninstall it and install the latest HappyHare instead. See the corresponding documentation: https://github.com/Frix-x/klippain/blob/main/docs/mmu.md") } {% endif %} {% elif printer['gcode_macro _USER_VARIABLES'].mmu_force_homing_in_start_print is not defined or printer['gcode_macro _USER_VARIABLES'].mmu_unload_on_cancel_print is not defined or printer['gcode_macro _USER_VARIABLES'].mmu_unload_on_end_print is not defined or printer['gcode_macro _USER_VARIABLES'].mmu_check_gates_on_start_print is not defined or printer['gcode_macro _USER_VARIABLES'].mmu_check_errors_on_start_print is not defined %} { action_raise_error("MMU support is enabled in Klippain, but some variables are missing from your variables.cfg. Please update your template or refer to the corresponding documentation: https://github.com/Frix-x/klippain/blob/main/docs/mmu.md") } {% elif printer["gcode_macro _USER_VARIABLES"].mmu_check_errors_on_start_print and printer.mmu.print_start_detection|int == 1 %} RESPOND MSG="The HappyHare function to automatically detect the start and end of a print has been automatically disabled to allow early detection of an error during the Klippain START_PRINT sequence. This allow a more efficient debugging of the MMU. Refer to the <a href="https://github.com/Frix-x/klippain/blob/main/docs/mmu.md">Klippain MMU documentation</a>" MMU_TEST_CONFIG print_start_detection=0 {% endif %} [gcode_macro _INIT_USERCUSTOM] gcode = [stepper_x] rotation_distance = 40 microsteps = 32 full_steps_per_rotation = 200 step_pin = X_STEP dir_pin = X_DIR enable_pin = !X_ENABLE endstop_pin = X_STOP homing_speed = 60 homing_retract_dist = 0 position_endstop = 0 position_max = 235 [stepper_y] rotation_distance = 40 microsteps = 32 full_steps_per_rotation = 200 step_pin = Y_STEP dir_pin = Y_DIR enable_pin = !Y_ENABLE endstop_pin = Y_STOP homing_speed = 60 homing_retract_dist = 0 position_endstop = 0 position_max = 235 [stepper_z] rotation_distance = 8 microsteps = 32 full_steps_per_rotation = 200 step_pin = Z_STEP dir_pin = Z_DIR enable_pin = !Z_ENABLE endstop_pin = Z_STOP homing_speed = 15 second_homing_speed = 8 homing_retract_dist = 3.0 position_endstop = 0 position_max = 245 [stepper_z1] rotation_distance = 8 microsteps = 32 full_steps_per_rotation = 200 step_pin = Z1_STEP dir_pin = Z1_DIR enable_pin = !Z1_ENABLE [stepper_z2] rotation_distance = 8 microsteps = 32 full_steps_per_rotation = 200 step_pin = Z2_STEP dir_pin = Z2_DIR enable_pin = !Z2_ENABLE [gcode_macro _USER_VARIABLES] variable_heaterbed_enabled = True gcode = variable_probe_type_enabled = "dockable" variable_startprint_actions = "bed_soak", "extruder_preheating", "chamber_soak", "tilt_calib", "extruder_heating", "purge", "clean", "z_offset", "bedmesh", "primeline" variable_verbose = True variable_homing_travel_speed = 350 variable_travel_speed = 350 variable_z_drop_speed = 15 variable_brush_clean_speed = 100 variable_probe_dock_speed = 60 variable_homing_travel_accel = 3000 variable_tilting_travel_accel = 3000 variable_brush_clean_accel = 1500 variable_probe_dock_accel = 2000 variable_zendstop_position = -1, -1 variable_force_homing_in_start_print = False variable_homing_zhop = 5 variable_homing_first = "X" variable_homing_backoff_distance_xy = -5, -5 variable_sensorless_current_factor = 75 variable_probe_dock_margin_xy = 0, 0 variable_safe_extruder_temp = 150 variable_prime_line_xy = 5, 2.5 variable_prime_line_direction = "X" variable_prime_line_length = 40 variable_prime_line_purge_distance = 30 variable_prime_line_flowrate = 10 variable_prime_line_height = 0.6 variable_prime_line_margin = 5 variable_prime_line_wipe = False variable_retract_length = 20 variable_unretract_length = 23 variable_park_position_xy = -1, -1 variable_park_lift_z = 50 variable_disable_motors_in_end_print = False variable_turn_off_heaters_in_end_print = True variable_idle_timeout_on_pause = 0 variable_min_bed_xy = 0, 0 variable_max_bed_xy = 9999, 9999 variable_probe_min_z_travel = 20 variable_probe_stow_z_height = None variable_probe_dock_location_xy = -1, -1 variable_probe_servo_angle_retracted = 0 variable_probe_servo_angle_deployed = 90 variable_probe_before_attach_position = "front" variable_probe_after_attach_position = "front" variable_probe_before_dock_position = "front" variable_probe_after_dock_position = "left" variable_probe_move_attach_length = 30 variable_probe_move_dock_length = 30 variable_autodock_on_probe_error = True variable_tap_max_probing_temp = 150 variable_tap_deactivation_zhop = 5 variable_print_default_bed_temp = 105 variable_print_default_extruder_temp = 240 variable_print_default_chamber_temp = 0 variable_print_default_chamber_max_heating_time = 15 variable_print_default_soak = 8 variable_print_default_material = "XXX" variable_material_parameters = { 'PLA': { 'pressure_advance': 0.0525, 'retract_length': 0.75, 'unretract_extra_length': 0, 'retract_speed': 40, 'unretract_speed': 30, 'filter_speed': 0, 'additional_z_offset': 0, 'filament_sensor': 1 }, 'PET': { 'pressure_advance': 0.0650, 'retract_length': 1.4, 'unretract_extra_length': 0, 'retract_speed': 30, 'unretract_speed': 20, 'filter_speed': 0, 'additional_z_offset': 0.020, 'filament_sensor': 1 }, 'ABS': { 'pressure_advance': 0.0480, 'retract_length': 0.5, 'unretract_extra_length': 0, 'retract_speed': 40, 'unretract_speed': 30, 'filter_speed': 80, 'additional_z_offset': 0, 'filament_sensor': 1 }, 'TPU': { 'pressure_advance': 0.0500, 'retract_length': 0.2, 'unretract_extra_length': 0, 'retract_speed': 5, 'unretract_speed': 5, 'filter_speed': 0, 'additional_z_offset': 0.040, 'filament_sensor': 0 } } variable_mmu_force_homing_in_start_print = False variable_mmu_unload_on_cancel_print = False variable_mmu_unload_on_end_print = True variable_mmu_check_gates_on_start_print = False variable_mmu_check_errors_on_start_print = False variable_filter_default_time_on_end_print = 600 variable_purge_and_brush_enabled = False variable_force_homing_before_brush = False variable_brush_over_y_axis = True variable_brush_xyz = -1, -1, -1 variable_brush_width_x = 40 variable_brush_center_offset = 0 variable_brushes = 6 variable_purge_bucket_xyz = -1, -1, -1 variable_purge_distance = 30 variable_purge_ooze_time = 10 variable_purgeclean_servo_angle_retracted = 0 variable_purgeclean_servo_angle_deployed = 90 variable_light_intensity_start_print = 100 variable_light_intensity_printing = 30 variable_light_intensity_end_print = 0 variable_caselight_on_at_startup = False variable_fix_heaters_temperature_settle = False variable_resonnance_test_point_xy = -1, -1 variable_resonnance_test_z_clearance = 50 variable_x_driver = "tmc2209" variable_y_driver = "tmc2209" variable_z_driver = "tmc2209" variable_e_driver = "tmc2209" [heater_bed] heater_pin = BED_HEATER sensor_type = EPCOS 100K B57560G104F sensor_pin = BED_TEMPERATURE max_power = 1 min_temp = 0 max_temp = 100 control = pid pid_kp = 38.771 pid_ki = 1.746 pid_kd = 215.177 [gcode_macro M190] rename_existing = M190.1 gcode = {% set S = params.S|float %} {% set actual_temp = printer.heater_bed.temperature|float %} {% set fix_heaters_temperature_settle = printer["gcode_macro _USER_VARIABLES"].fix_heaters_temperature_settle %} {% if fix_heaters_temperature_settle %} M140 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} {% if S != 0 %} {% if actual_temp <= S %} TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={S} {% else %} TEMPERATURE_WAIT SENSOR=heater_bed MAXIMUM={S} {% endif %} {% endif %} {% else %} M190.1 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} {% endif %} [gcode_macro ACTIVATE_PROBE] description = Put the machine in a state being able to probe variable_temperature = 0 gcode = {% set LOCK = params.LOCK|default(False, boolean=true) %} {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled %} {% set tap_max_probing_temp = printer["gcode_macro _USER_VARIABLES"].tap_max_probing_temp|float %} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _CHECK_PROBE action=query {% if LOCK %} _ATTACH_PROBE_LOCK {% else %} _ATTACH_PROBE {% endif %} {% elif probe_type_enabled == "vorontap" %} SAVE_GCODE_STATE NAME=BEFORE_TAP_ACTION {% set ACTUAL_TEMP = printer.extruder.temperature %} {% set TARGET_TEMP = printer.extruder.target %} SET_GCODE_VARIABLE MACRO=ACTIVATE_PROBE VARIABLE=temperature VALUE={TARGET_TEMP} {% if TARGET_TEMP > tap_max_probing_temp %} { action_respond_info('Extruder temperature target of %.1fC is too high for TAP probing, lowering to %.1fC' % (TARGET_TEMP, tap_max_probing_temp)) } M106 S255 M109 S{tap_max_probing_temp} M106 S0 {% else %} {% if ACTUAL_TEMP > tap_max_probing_temp + 3 %} M106 S255 TEMPERATURE_WAIT SENSOR=extruder MAXIMUM={tap_max_probing_temp} M106 S0 {% endif %} {% endif %} {% endif %} [gcode_macro DEACTIVATE_PROBE] description = Revert the machine to a normal state after probing gcode = {% set UNLOCK = params.UNLOCK|default(False, boolean=true) %} {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled %} {% set tap_deactivation_zhop = printer["gcode_macro _USER_VARIABLES"].tap_deactivation_zhop %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _CHECK_PROBE action=query {% if UNLOCK %} _DOCK_PROBE_UNLOCK {% else %} _DOCK_PROBE {% endif %} {% elif probe_type_enabled == "vorontap" %} {% set z_safe = printer.toolhead.position.z + tap_deactivation_zhop %} {% if z_safe > printer.toolhead.axis_maximum.z %} {% set z_safe = printer.toolhead.axis_maximum.z %} {% endif %} G90 G1 Z{z_safe} F{Sz} {% set old_target_temperature = printer["gcode_macro ACTIVATE_PROBE"].temperature %} M109 S{old_target_temperature} RESTORE_GCODE_STATE NAME=BEFORE_TAP_ACTION {% endif %} [gcode_macro _PROBE_VARIABLES] variable_probe_attached = False variable_probe_state = False variable_probe_lock = False gcode = [gcode_macro _EXIT_POINT] gcode = {% set function = 'pre_' ~ params.FUNCTION %} {% set move = params.MOVE|default(0) %} {% set speed = params.MOVE_SPEED|default(0) %} RESTORE_GCODE_STATE NAME={function} MOVE={move} MOVE_SPEED={speed} [gcode_macro _ENTRY_POINT] gcode = {% set function = 'pre_' ~ params.FUNCTION %} SAVE_GCODE_STATE NAME={function} G90 [gcode_macro _HOMING_VARIABLES] gcode = {% set Reset = params.RESET|default(0) %} {% if Reset %} SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_lock VALUE={ False } {% endif %} [gcode_macro _ATTACH_PROBE_LOCK] description = Attaches probe, can only be docked after unlocking gcode = _ATTACH_PROBE SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_lock VALUE={ True } [gcode_macro _DOCK_PROBE_UNLOCK] description = Docks probe even if it was locked gcode = SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_lock VALUE={ False } _DOCK_PROBE [gcode_macro _PROBE_UNLOCK] description = Unlocks probe state gcode = SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_lock VALUE={ False } [gcode_macro _PROBE_LOCK] description = Locks probe state gcode = SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_lock VALUE={ True } [gcode_macro _PROBE_MOVE_TO] description = positioning toolhead for dock/attach operation gcode = {% set location = params.LOCATION|default('')|string %} {% set distance = params.DISTANCE|default(0)|float %} {% set speed = params.SPEED|default(0)|float %} {% set probe_dock_location_x, probe_dock_location_y = printer["gcode_macro _USER_VARIABLES"].probe_dock_location_xy|map('float') %} {% set location_factor = { 'left' : { 'x': -1, 'y': 0 }, 'right' : { 'x': 1, 'y': 0 }, 'front' : { 'x': 0, 'y': -1 }, 'back' : { 'x': 0, 'y': 1 }, 'dock' : { 'x': 0, 'y': 0 } } %} {% if location in location_factor %} G1 X{probe_dock_location_x + location_factor[location].x * distance} Y{probe_dock_location_y + location_factor[location].y * distance} F{speed} {% else %} { action_raise_error("Error in probe attach/dock movement. Check the directions in your variables.cfg file!") } {% endif %} [gcode_macro _ATTACH_PROBE] description = Attaches probe gcode = {% set probe_attached = printer["gcode_macro _PROBE_VARIABLES"].probe_attached %} {% set probe_lock = printer["gcode_macro _PROBE_VARIABLES"].probe_lock %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set probe_dock_location_x, probe_dock_location_y = printer["gcode_macro _USER_VARIABLES"].probe_dock_location_xy|map('float') %} {% set probe_before_attach_position = printer["gcode_macro _USER_VARIABLES"].probe_before_attach_position|string %} {% set probe_after_attach_position = printer["gcode_macro _USER_VARIABLES"].probe_after_attach_position|string %} {% set probe_move_attach_length = printer["gcode_macro _USER_VARIABLES"].probe_move_attach_length %} {% set probe_min_z_travel = printer["gcode_macro _USER_VARIABLES"].probe_min_z_travel|float %} {% set probe_dock_speed = printer["gcode_macro _USER_VARIABLES"].probe_dock_speed * 60 %} {% set probe_dock_accel = printer["gcode_macro _USER_VARIABLES"].probe_dock_accel %} {% set travel_speed = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set z_drop_speed = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set probe_servo_enabled = printer["gcode_macro _USER_VARIABLES"].probe_servo_enabled %} {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled|string %} _ENTRY_POINT FUNCTION=ATTACH_PROBE {% if probe_type_enabled == "dockable" and not 'xyz' in printer.toolhead.homed_axes %} { action_raise_error("Must home all axis first to attach the probe!") } {% elif probe_type_enabled == "dockable_virtual" and not 'xy' in printer.toolhead.homed_axes %} { action_raise_error("Must home XY axes first to attach the probe!") } {% elif not probe_attached and not probe_lock %} {% if verbose %} { action_respond_info("Attaching Probe") } {% endif %} {% if probe_type_enabled == "dockable_virtual" and not 'z' in printer.toolhead.homed_axes %} {% if verbose %} { action_respond_info("Attaching the probe can only be done during G28 if Z is not already homed") } {% endif %} {% endif %} {% if (printer.toolhead.position.z < probe_min_z_travel) %} {% if verbose %} { action_respond_info("Moving to a safe Z distance") } {% endif %} G0 Z{probe_min_z_travel} F{z_drop_speed} {% endif %} {% set saved_accel = printer.toolhead.max_accel %} M204 S{probe_dock_accel} _PROBE_MOVE_TO LOCATION={probe_before_attach_position} DISTANCE={probe_move_attach_length} SPEED={travel_speed} {% if probe_servo_enabled %} _SERVO_DEPLOY ITEM="probe" {% endif %} _PROBE_MOVE_TO LOCATION='dock' SPEED={probe_dock_speed} _PROBE_MOVE_TO LOCATION={probe_after_attach_position} DISTANCE={probe_move_attach_length} SPEED={probe_dock_speed} {% if probe_servo_enabled %} _SERVO_RETRACT ITEM="probe" {% endif %} SET_VELOCITY_LIMIT ACCEL={saved_accel} _CHECK_PROBE action=attach {% elif probe_lock %} {% if verbose %} { action_respond_info("Probe locked!") } {% endif %} _CHECK_PROBE action=query {% else %} {% if verbose %} { action_respond_info("Probe already attached!") } {% endif %} _CHECK_PROBE action=query {% endif %} _EXIT_POINT FUNCTION=ATTACH_PROBE [gcode_macro _DOCK_PROBE] description = Docks probe gcode = {% set probe_attached = printer["gcode_macro _PROBE_VARIABLES"].probe_attached %} {% set probe_lock = printer["gcode_macro _PROBE_VARIABLES"].probe_lock %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set probe_dock_location_x, probe_dock_location_y = printer["gcode_macro _USER_VARIABLES"].probe_dock_location_xy|map('float') %} {% set probe_before_dock_position = printer["gcode_macro _USER_VARIABLES"].probe_before_dock_position|string %} {% set probe_after_dock_position = printer["gcode_macro _USER_VARIABLES"].probe_after_dock_position|string %} {% set probe_move_dock_length = printer["gcode_macro _USER_VARIABLES"].probe_move_dock_length %} {% set probe_min_z_travel = printer["gcode_macro _USER_VARIABLES"].probe_min_z_travel|float %} {% set probe_dock_speed = printer["gcode_macro _USER_VARIABLES"].probe_dock_speed * 60 %} {% set probe_dock_accel = printer["gcode_macro _USER_VARIABLES"].probe_dock_accel %} {% set travel_speed = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set z_drop_speed = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set probe_servo_enabled = printer["gcode_macro _USER_VARIABLES"].probe_servo_enabled %} {% set probe_stow_z_height = printer["gcode_macro _USER_VARIABLES"].probe_stow_z_height|default(None) %} _ENTRY_POINT FUNCTION=DOCK_PROBE {% if probe_type_enabled == "dockable" and not 'xyz' in printer.toolhead.homed_axes %} { action_raise_error("Must home all axis first to dock the probe!") } {% elif probe_type_enabled == "dockable_virtual" and not 'xy' in printer.toolhead.homed_axes %} { action_raise_error("Must home XY axes first to dock the probe!") } {% elif probe_attached and not probe_lock %} {% if verbose %} { action_respond_info("Docking Probe") } {% endif %} {% if probe_type_enabled == "dockable_virtual" and not 'z' in printer.toolhead.homed_axes %} {% if verbose %} { action_respond_info("Docking the probe can only be done during G28 if Z is not already homed") } {% endif %} {% endif %} {% if (printer.toolhead.position.z < probe_min_z_travel) %} {% if verbose %} { action_respond_info("Moving to a safe Z distance") } {% endif %} G0 Z{probe_min_z_travel} F{z_drop_speed} {% endif %} {% set saved_accel = printer.toolhead.max_accel %} M204 S{probe_dock_accel} _PROBE_MOVE_TO LOCATION={probe_before_dock_position} DISTANCE={probe_move_dock_length} SPEED={travel_speed} {% if probe_servo_enabled %} _SERVO_DEPLOY ITEM="probe" {% endif %} _PROBE_MOVE_TO LOCATION='dock' SPEED={probe_dock_speed} {% if probe_stow_z_height is not none %} G0 Z{probe_stow_z_height} F{z_drop_speed} {% endif %} _PROBE_MOVE_TO LOCATION={probe_after_dock_position} DISTANCE={probe_move_dock_length} SPEED={probe_dock_speed} {% if probe_servo_enabled %} _SERVO_RETRACT ITEM="probe" {% endif %} SET_VELOCITY_LIMIT ACCEL={saved_accel} G4 P500 _CHECK_PROBE action=dock {% elif probe_lock %} {% if verbose %} { action_respond_info("Probe locked!") } {% endif %} _CHECK_PROBE action=query {% else %} {% if verbose %} { action_respond_info("Probe already docked!") } {% endif %} _CHECK_PROBE action=query {% endif %} _EXIT_POINT FUNCTION=DOCK_PROBE [gcode_macro _CHECK_PROBE] variable_probe_state = 0 gcode = Query_Probe _SET_PROBE_STATE action={ params.ACTION } [gcode_macro _SET_PROBE_STATE] gcode = {% set probe_last_query = printer.probe.last_query %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% if probe_last_query %} SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_attached VALUE={ False } {% else %} SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_attached VALUE={ True } {% endif %} {% if params.ACTION == 'query' %} SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_state VALUE={ probe_last_query } {% endif %} {% if (not probe_last_query and params.ACTION == 'dock') %} { action_raise_error("Probe dock failed!") } {% endif %} {% if probe_last_query and params.ACTION == 'attach' %} { action_raise_error("Probe attach failed!") } {% endif %} [gcode_macro PROBE_CALIBRATE] rename_existing = _BASE_PROBE_CALIBRATE description = Calibrate the probe z_offset with klicky automount gcode = {% set probe_min_z_travel = printer["gcode_macro _USER_VARIABLES"].probe_min_z_travel|float %} {% set z_drop_speed = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set travel_speed = printer["gcode_macro _USER_VARIABLES"].travel_speed %} {% set min_bed_x, min_bed_y = printer["gcode_macro _USER_VARIABLES"].min_bed_xy|map('float') %} {% set max_bed_x, max_bed_y = printer["gcode_macro _USER_VARIABLES"].max_bed_xy|map('float') %} {% set probe_offset_x = printer['configfile'].config["probe"]["x_offset"]|float %} {% set probe_offset_y = printer['configfile'].config["probe"]["y_offset"]|float %} {% if not 'xyz' in printer.toolhead.homed_axes %} { action_raise_error("Must home axis first!") } {% endif %} {% if (printer['gcode_move'].position.x + probe_offset_x) >= max_bed_x or (printer['gcode_move'].position.y + probe_offset_y) >= max_bed_y or (printer['gcode_move'].position.x + probe_offset_x) <= min_bed_x or (printer['gcode_move'].position.y + probe_offset_y) <= min_bed_y %} { action_raise_error("You must perform PROBE_CALIBRATE with the probe inside the BED area, check variables min/max_bed_xy !") } {% endif %} {% if (printer.toolhead.position.z < probe_min_z_travel) %} G0 Z{probe_min_z_travel} F{z_drop_speed} {% endif %} M400 _ENTRY_POINT FUNCTION=PROBE_CALIBRATE ACTIVATE_PROBE _EXIT_POINT FUNCTION=PROBE_CALIBRATE MOVE=1 MOVE_SPEED={travel_speed} _BASE_PROBE_CALIBRATE {% for p in params %}{'%s=%s ' % (p, params[p])}{% endfor %} M400 _ENTRY_POINT FUNCTION=PROBE_CALIBRATE DEACTIVATE_PROBE _EXIT_POINT FUNCTION=PROBE_CALIBRATE MOVE=1 MOVE_SPEED={travel_speed} [gcode_macro PROBE_ACCURACY] rename_existing = _BASE_PROBE_ACCURACY description = Probe Z-height accuracy at current XY position with klicky automount gcode = {% set probe_min_z_travel = printer["gcode_macro _USER_VARIABLES"].probe_min_z_travel|float %} {% set z_drop_speed = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set travel_speed = printer["gcode_macro _USER_VARIABLES"].travel_speed %} {% set min_bed_x, min_bed_y = printer["gcode_macro _USER_VARIABLES"].min_bed_xy|map('float') %} {% set max_bed_x, max_bed_y = printer["gcode_macro _USER_VARIABLES"].max_bed_xy|map('float') %} {% set probe_offset_x = printer['configfile'].config["probe"]["x_offset"]|float %} {% set probe_offset_y = printer['configfile'].config["probe"]["y_offset"]|float %} {% if not 'xyz' in printer.toolhead.homed_axes %} { action_raise_error("Must home axis first!") } {% endif %} {% if (printer['gcode_move'].position.x + probe_offset_x) >= max_bed_x or (printer['gcode_move'].position.y + probe_offset_y) >= max_bed_y or (printer['gcode_move'].position.x + probe_offset_x) <= min_bed_x or (printer['gcode_move'].position.y + probe_offset_y) <= min_bed_y %} { action_raise_error("You must perform PROBE_ACCURACY with the probe inside the BED area, check variables min/max_bed_xy !") } {% endif %} {% if (printer.toolhead.position.z < probe_min_z_travel) %} G0 Z{probe_min_z_travel} F{z_drop_speed} {% endif %} M400 _ENTRY_POINT FUNCTION=PROBE_ACCURACY ACTIVATE_PROBE _EXIT_POINT FUNCTION=PROBE_ACCURACY MOVE=1 MOVE_SPEED={travel_speed} _BASE_PROBE_ACCURACY {% for p in params %}{'%s=%s ' % (p, params[p])}{% endfor %} M400 _ENTRY_POINT FUNCTION=PROBE_CALIBRATE DEACTIVATE_PROBE _EXIT_POINT FUNCTION=PROBE_ACCURACY MOVE=1 MOVE_SPEED={travel_speed} [gcode_macro _PROBE_ON_ERROR_ACTION] variable_probing = False gcode = {% set autodock_on_probe_error = printer["gcode_macro _USER_VARIABLES"].autodock_on_probe_error %} {% set probing = printer["gcode_macro _PROBE_ON_ERROR_ACTION"].probing %} {% if autodock_on_probe_error and probing %} DEACTIVATE_PROBE {% endif %} SET_GCODE_VARIABLE MACRO=_PROBE_ON_ERROR_ACTION VARIABLE=probing VALUE=False [probe] pin = ^PROBE_INPUT x_offset = 0 y_offset = 19.75 z_offset = 6.42 speed = 8 lift_speed = 15 samples = 2 samples_result = median sample_retract_dist = 2.0 samples_tolerance = 0.007 samples_tolerance_retries = 3 [heater_fan hotend_fan] pin = E_FAN max_power = 1.0 kick_start_time = 0.100 heater = extruder heater_temp = 50.0 [fan] pin = PART_FAN kick_start_time = 0.100 cycle_time = 0.010 [controller_fan controller_fan] pin = CONTROLLER_FAN kick_start_time = 0.5 fan_speed = 1.0 idle_timeout = 60 [temperature_sensor Raspberry_Pi] sensor_type = temperature_host [temperature_sensor mcu] sensor_type = temperature_mcu min_temp = 0 max_temp = 90 [input_shaper] shaper_freq_x = 56.4 shaper_type_x = zv shaper_freq_y = 38.4 shaper_type_y = mzv [save_variables] filename = ~/printer_data/config/save_variables.cfg [tmc2209 stepper_x] uart_pin = X_TMCUART interpolate = True run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [tmc2209 stepper_y] uart_pin = Y_TMCUART interpolate = True run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [tmc2209 stepper_z] uart_pin = Z_TMCUART interpolate = True run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [tmc2209 stepper_z1] uart_pin = Z1_TMCUART interpolate = True run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [tmc2209 stepper_z2] uart_pin = Z2_TMCUART interpolate = True run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [tmc2209 extruder] uart_pin = E_TMCUART interpolate = True run_current = 0.45 sense_resistor = 0.110 stealthchop_threshold = 0 [mcu] serial = usb-Klipper_stm32f446xx_4A0031000151303532383235-if00 [board_pins mcu_manufacturer] aliases = MCU_MOTOR0_STEP=PF13 , MCU_MOTOR0_DIR=PF12 , MCU_MOTOR0_ENABLE=PF14 , MCU_MOTOR0_UART=PC4 , MCU_MOTOR1_STEP=PG0 , MCU_MOTOR1_DIR=PG1 , MCU_MOTOR1_ENABLE=PF15 , MCU_MOTOR1_UART=PD11 , MCU_MOTOR2_1_STEP=PF11 , MCU_MOTOR2_1_DIR=PG3 , MCU_MOTOR2_1_ENABLE=PG5 , MCU_MOTOR2_1_UART=PC6 , MCU_MOTOR3_STEP=PG4 , MCU_MOTOR3_DIR=PC1 , MCU_MOTOR3_ENABLE=PA0 , MCU_MOTOR3_UART=PC7 , MCU_MOTOR4_STEP=PF9 , MCU_MOTOR4_DIR=PF10 , MCU_MOTOR4_ENABLE=PG2 , MCU_MOTOR4_UART=PF2 , MCU_MOTOR5_STEP=PC13 , MCU_MOTOR5_DIR=PF0 , MCU_MOTOR5_ENABLE=PF1 , MCU_MOTOR5_UART=PE4 , MCU_MOTOR6_STEP=PE2 , MCU_MOTOR6_DIR=PE3 , MCU_MOTOR6_ENABLE=PD4 , MCU_MOTOR6_UART=PE1 , MCU_MOTOR7_STEP=PE6 , MCU_MOTOR7_DIR=PA14 , MCU_MOTOR7_ENABLE=PE0 , MCU_MOTOR7_UART=PD3 , MCU_STOP0=PG6 , MCU_STOP1=PG9 , MCU_STOP2=PG10 , MCU_STOP3=PG11 , MCU_STOP4=PG12 , MCU_STOP5=PG13 , MCU_STOP6=PG14 , MCU_STOP7=PG15 , MCU_PROBE=PB7 , MCU_SERVOS=PB6 , MCU_HE0=PA2 , MCU_HE1=PA3 , MCU_HE2=PB10 , MCU_HE3=PB11 , MCU_BED0=PA1 , MCU_TB=PF3 , MCU_T0=PF4 , MCU_T1=PF5 , MCU_T2=PF6 , MCU_T3=PF7 , MCU_FAN0=PA8 , MCU_FAN1=PE5 , MCU_FAN2=PD12 , MCU_FAN3=PD13 , MCU_FAN4=PD14 , MCU_FAN5=PD15 , MCU_NEOPIXEL=PB0 , MCU_PS_ON=PE11 , MCU_POWER_DET=PC0 , EXP1_1=PE8 , EXP1_2=PE7 , EXP1_3=PE9 , EXP1_4=PE10 , EXP1_5=PE12 , EXP1_6=PE13 , EXP1_7=PE14 , EXP1_8=PE15 , EXP1_9=<GND> , EXP1_10=<5V> , EXP2_1=PA6 , EXP2_2=PA5 , EXP2_3=PB1 , EXP2_4=PA4 , EXP2_5=PB2 , EXP2_6=PA7 , EXP2_7=PC15 , EXP2_8=<RST> , EXP2_9=<GND> , EXP2_10=<5V> , [board_pins octopus_mcu] mcu = mcu aliases = X_STEP=MCU_MOTOR0_STEP , X_DIR=MCU_MOTOR0_DIR , X_ENABLE=MCU_MOTOR0_ENABLE , X_TMCUART=MCU_MOTOR0_UART , Y_STEP=MCU_MOTOR1_STEP , Y_DIR=MCU_MOTOR1_DIR , Y_ENABLE=MCU_MOTOR1_ENABLE , Y_TMCUART=MCU_MOTOR1_UART , Z_STEP=MCU_MOTOR2_1_STEP , Z_DIR=MCU_MOTOR2_1_DIR , Z_ENABLE=MCU_MOTOR2_1_ENABLE , Z_TMCUART=MCU_MOTOR2_1_UART , Z1_STEP=MCU_MOTOR3_STEP , Z1_DIR=MCU_MOTOR3_DIR , Z1_ENABLE=MCU_MOTOR3_ENABLE , Z1_TMCUART=MCU_MOTOR3_UART , Z2_STEP=MCU_MOTOR4_STEP , Z2_DIR=MCU_MOTOR4_DIR , Z2_ENABLE=MCU_MOTOR4_ENABLE , Z2_TMCUART=MCU_MOTOR4_UART , Z3_STEP=MCU_MOTOR5_STEP , Z3_DIR=MCU_MOTOR5_DIR , Z3_ENABLE=MCU_MOTOR5_ENABLE , Z3_TMCUART=MCU_MOTOR5_UART , E_STEP=MCU_MOTOR6_STEP , E_DIR=MCU_MOTOR6_DIR , E_ENABLE=MCU_MOTOR6_ENABLE , E_TMCUART=MCU_MOTOR6_UART , X_STOP=MCU_STOP0 , Y_STOP=MCU_STOP1 , Z_STOP=MCU_STOP2 , PROBE_INPUT=MCU_STOP7 , RUNOUT_SENSOR=MCU_STOP3 , E_HEATER=MCU_HE0 , E_TEMPERATURE=MCU_T0 , BED_HEATER=MCU_HE1 , BED_TEMPERATURE=MCU_TB , PART_FAN=MCU_FAN0 , E_FAN=MCU_FAN1 , CONTROLLER_FAN=MCU_FAN2 , EXHAUST_FAN=MCU_FAN3 , FILTER_FAN=MCU_FAN4 , HOST_CONTROLLER_FAN=MCU_FAN5 , CHAMBER_TEMPERATURE=MCU_T1 , ELECTRICAL_CABINET_TEMPERATURE=MCU_T2 , LIGHT_OUTPUT=MCU_HE2 , LIGHT_NEOPIXEL=MCU_STOP5 , STATUS_NEOPIXEL=MCU_NEOPIXEL , SERVO_PIN=MCU_SERVOS , [extruder] step_pin = PE2 dir_pin = PE3 enable_pin = !PD4 heater_pin = PA2 sensor_pin = PA0 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 26.359 nozzle_diameter = 0.400 filament_diameter = 1.750 max_extrude_only_distance = 1000 max_extrude_only_velocity = 120 pressure_advance = 0.03 pressure_advance_smooth_time = 0.03 sensor_type = EPCOS 100K B57560G104F control = pid pid_kp = 26.015 pid_ki = 1.770 pid_kd = 95.603 min_temp = 0 max_temp = 300 ======================= Extruder max_extrude_ratio=0.266081 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' webhooks client 548454581296: New connection webhooks client 548454581296: Client info {'program': 'Moonraker', 'version': 'v0.9.3-67-g4eb23ef'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' MCU error during connect Traceback (most recent call last): File "/home/E3NG/klipper/klippy/mcu.py", line 794, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/E3NG/klipper/klippy/serialhdl.py", line 183, in connect_uart self._error("Unable to connect") File "/home/E3NG/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/E3NG/klipper/klippy/klippy.py", line 131, in _connect self.send_event("klippy:mcu_identify") File "/home/E3NG/klipper/klippy/klippy.py", line 223, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/E3NG/klipper/klippy/klippy.py", line 223, in <listcomp> return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/E3NG/klipper/klippy/mcu.py", line 799, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect mcu 'mcu': Unable to connect Once the underlying issue is corrected, use the "FIRMWARE_RESTART" command to reset the firmware, reload the config, and restart the host software. Error configuring printer Build file /home/E3NG/klipper/klippy/../.config(3600): Tue Mar 11 18:00:12 2025 ========= Last MCU build config ========= CONFIG_LOW_LEVEL_OPTIONS=y # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set CONFIG_MACH_STM32=y # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RPXXXX is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set # CONFIG_MACH_LINUX is not set # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="stm32" CONFIG_MCU="stm32f446xx" CONFIG_CLOCK_FREQ=180000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x80000 CONFIG_FLASH_BOOT_ADDRESS=0x8000000 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x20000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x8008000 CONFIG_STM32_SELECT=y # CONFIG_MACH_STM32F103 is not set # CONFIG_MACH_STM32F207 is not set # CONFIG_MACH_STM32F401 is not set # CONFIG_MACH_STM32F405 is not set # CONFIG_MACH_STM32F407 is not set # CONFIG_MACH_STM32F429 is not set CONFIG_MACH_STM32F446=y # CONFIG_MACH_STM32F765 is not set # CONFIG_MACH_STM32F031 is not set # CONFIG_MACH_STM32F042 is not set # CONFIG_MACH_STM32F070 is not set # CONFIG_MACH_STM32F072 is not set # CONFIG_MACH_STM32G070 is not set # CONFIG_MACH_STM32G071 is not set # CONFIG_MACH_STM32G0B0 is not set # CONFIG_MACH_STM32G0B1 is not set # CONFIG_MACH_STM32G431 is not set # CONFIG_MACH_STM32G474 is not set # CONFIG_MACH_STM32H723 is not set # CONFIG_MACH_STM32H743 is not set # CONFIG_MACH_STM32H750 is not set # CONFIG_MACH_STM32L412 is not set # CONFIG_MACH_N32G452 is not set # CONFIG_MACH_N32G455 is not set CONFIG_MACH_STM32F4=y CONFIG_HAVE_STM32_USBOTG=y CONFIG_HAVE_STM32_CANBUS=y CONFIG_HAVE_STM32_USBCANBUS=y CONFIG_STM32_DFU_ROM_ADDRESS=0x1fff0000 CONFIG_STM32_FLASH_START_8000=y # CONFIG_STM32_FLASH_START_10000 is not set # CONFIG_STM32_FLASH_START_0000 is not set # CONFIG_STM32_CLOCK_REF_8M is not set CONFIG_STM32_CLOCK_REF_12M=y # CONFIG_STM32_CLOCK_REF_16M is not set # CONFIG_STM32_CLOCK_REF_20M is not set # CONFIG_STM32_CLOCK_REF_24M is not set # CONFIG_STM32_CLOCK_REF_25M is not set # CONFIG_STM32_CLOCK_REF_INTERNAL is not set CONFIG_CLOCK_REF_FREQ=12000000 CONFIG_STM32F0_TRIM=16 CONFIG_STM32_USB_PA11_PA12=y # CONFIG_STM32_SERIAL_USART1 is not set # CONFIG_STM32_SERIAL_USART1_ALT_PB7_PB6 is not set # CONFIG_STM32_SERIAL_USART2 is not set # CONFIG_STM32_SERIAL_USART2_ALT_PD6_PD5 is not set # CONFIG_STM32_SERIAL_USART3 is not set # CONFIG_STM32_SERIAL_USART3_ALT_PD9_PD8 is not set # CONFIG_STM32_CANBUS_PA11_PA12 is not set # CONFIG_STM32_CANBUS_PA11_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB8_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PI9_PH13 is not set # CONFIG_STM32_MMENU_CANBUS_PB5_PB6 is not set # CONFIG_STM32_MMENU_CANBUS_PB12_PB13 is not set # CONFIG_STM32_MMENU_CANBUS_PD0_PD1 is not set # CONFIG_STM32_USBCANBUS_PA11_PA12 is not set CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" # # USB ids # # end of USB ids CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_THERMOCOUPLE=y CONFIG_WANT_ADXL345=y CONFIG_WANT_LIS2DW=y CONFIG_WANT_MPU9250=y CONFIG_WANT_ICM20948=y CONFIG_WANT_HX71X=y CONFIG_WANT_ADS1220=y CONFIG_WANT_LDC1612=y CONFIG_WANT_SENSOR_ANGLE=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_NEED_SENSOR_BULK=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_INITIAL_PINS="" CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_SDIO=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_STRICT_TIMING=y CONFIG_HAVE_CHIPID=y CONFIG_HAVE_STEPPER_BOTH_EDGE=y CONFIG_HAVE_BOOTLOADER_REQUEST=y CONFIG_INLINE_STEPPER_HACK=y ======================= No build file /home/E3NG/klipper/klippy/../out/klipper.dict No build file /home/E3NG/klipper/klippy/../out/klipper.elf Attempting MCU 'mcu' reset Unhandled exception during post run Traceback (most recent call last): File "/home/E3NG/klippy-env/lib/python3.9/site-packages/serial/serialposix.py", line 265, in open self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK) FileNotFoundError: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/E3NG/klipper/klippy/klippy.py", line 193, in run self.send_event("klippy:firmware_restart") File "/home/E3NG/klipper/klippy/klippy.py", line 223, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/E3NG/klipper/klippy/klippy.py", line 223, in <listcomp> return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/E3NG/klipper/klippy/mcu.py", line 957, in _firmware_restart self._restart_arduino() File "/home/E3NG/klipper/klippy/mcu.py", line 917, in _restart_arduino serialhdl.arduino_reset(self._serialport, self._reactor) File "/home/E3NG/klipper/klippy/serialhdl.py", line 380, in arduino_reset ser = serial.Serial(serialport, 2400, timeout=0, exclusive=True) File "/home/E3NG/klippy-env/lib/python3.9/site-packages/serial/serialutil.py", line 240, in __init__ self.open() File "/home/E3NG/klippy-env/lib/python3.9/site-packages/serial/serialposix.py", line 268, in open raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg)) serial.serialutil.SerialException: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' Restarting printer Start printer at Fri Mar 14 23:18:32 2025 (1741990712.5 342.2) ===== Config file ===== [printer] kinematics = corexy max_velocity = 400 max_accel = 8000 max_z_velocity = 30 max_z_accel = 500 square_corner_velocity = 5.0 [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = {% if printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} STATUS_LEDS COLOR="ERROR" {% endif %} {% if printer["gcode_macro _USER_VARIABLES"].probe_type_enabled == "dockable" or printer["gcode_macro _USER_VARIABLES"].probe_type_enabled == "dockable_virtual" %} _PROBE_ON_ERROR_ACTION {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} PARK {% endif %} [idle_timeout] timeout = 1800 gcode = RESPOND MSG="Idle timeout reached" TURN_OFF_HEATERS M84 {% if printer["gcode_macro _USER_VARIABLES"].light_enabled %} LIGHT_OFF {% endif %} {% if printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} STATUS_LEDS COLOR="OFF" {% endif %} [pause_resume] [display_status] [exclude_object] [respond] [force_move] enable_force_move = True [gcode_arcs] resolution = 0.1 [thermistor CMFB103F3950FANT] temperature1 = 0.0 resistance1 = 32116.0 temperature2 = 40.0 resistance2 = 5309.0 temperature3 = 80.0 resistance3 = 1228.0 [gcode_shell_command shaketune] command = ~/printer_data/config/scripts/K-ShakeTune/shaketune.sh timeout = 600.0 verbose = True [gcode_shell_command system_info] command = ~/printer_data/config/scripts/system_info.py timeout = 5.0 verbose = True [gcode_macro CANCEL_PRINT] rename_existing = BASE_CANCEL_PRINT description = Cancel the print, retract 10mm of filament and park gcode = {% set turn_off_heaters_in_end_print = printer["gcode_macro _USER_VARIABLES"].turn_off_heaters_in_end_print %} {% set safe_extruder_temp = printer["gcode_macro _USER_VARIABLES"].safe_extruder_temp|float %} {% set light_intensity_end_print = printer["gcode_macro _USER_VARIABLES"].light_intensity_end_print %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set mmu_unload_on_cancel_print = printer["gcode_macro _USER_VARIABLES"].mmu_unload_on_cancel_print %} {% set filter_enabled = printer["gcode_macro _USER_VARIABLES"].filter_enabled %} {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set filter_default_time = printer["gcode_macro _USER_VARIABLES"].filter_default_time_on_end_print|default(600)|int %} {% set hotend_fan_tach_enabled = printer["gcode_macro _USER_VARIABLES"].hotend_fan_tach_enabled %} {% set retract_length = printer["gcode_macro _USER_VARIABLES"].retract_length|default(20)|float %} PARK {% if klippain_mmu_enabled and mmu_unload_on_cancel_print %} {% if printer.mmu.enabled and printer.mmu.tool|int != -2 %} MMU_UNLOAD {% endif %} {% elif printer.extruder.can_extrude %} G92 E0 G1 E-{retract_length} F2100 {% endif %} {% if turn_off_heaters_in_end_print %} TURN_OFF_HEATERS {% else %} SET_HEATER_TEMPERATURE HEATER=extruder TARGET={safe_extruder_temp} {% endif %} {% if hotend_fan_tach_enabled %} UPDATE_DELAYED_GCODE ID=_BACKGROUND_HOTEND_TACHO_CHECK DURATION=0 {% endif %} M107 M400 CLEAR_PAUSE {% if bed_mesh_enabled %} BED_MESH_CLEAR {% endif %} SDCARD_RESET_FILE {% if filter_enabled %} {% if printer['fan_generic filter'].speed > 0 %} {% set FILTER_TIME = params.FILTER_TIME|default(filter_default_time)|int %} START_FILTER SPEED=1 UPDATE_DELAYED_GCODE ID=_STOP_FILTER_DELAYED DURATION={FILTER_TIME} {% endif %} {% endif %} {% if light_enabled %} LIGHT_ON S={light_intensity_end_print} {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="OFF" {% endif %} {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and printer.mmu.print_start_detection|int == 0 %} _MMU_PRINT_END STATE=cancelled {% endif %} {% endif %} {% if filament_sensor_enabled %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% endif %} BASE_CANCEL_PRINT [gcode_macro _OFF] description = Turn off the printer gcode = {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set display_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_minidisplay_enabled %} M84 TURN_OFF_HEATERS M107 {% if light_enabled %} LIGHT_OFF {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="SHUTDOWN" {% endif %} {% if display_leds_enabled %} _SET_ALLLEDS_BY_NAME LEDS="minidisplay" COLOR="shutdown" {% endif %} [gcode_macro SHUTDOWN] description = Turn off the printer and shutdown the host gcode = _OFF {action_respond_info('action:poweroff')} {action_call_remote_method("shutdown_machine")} [gcode_macro END_PRINT] description = Stop the print and filter the atmosphere for 10min before shuting down gcode = {% set disable_motors_in_end_print = printer["gcode_macro _USER_VARIABLES"].disable_motors_in_end_print %} {% set turn_off_heaters_in_end_print = printer["gcode_macro _USER_VARIABLES"].turn_off_heaters_in_end_print %} {% set safe_extruder_temp = printer["gcode_macro _USER_VARIABLES"].safe_extruder_temp|float %} {% set light_intensity_end_print = printer["gcode_macro _USER_VARIABLES"].light_intensity_end_print %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set mmu_unload = params.MMU_UNLOAD_AT_END|default(printer["gcode_macro _USER_VARIABLES"].mmu_unload_on_end_print)|default(0)|int %} {% set filter_enabled = printer["gcode_macro _USER_VARIABLES"].filter_enabled %} {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set filter_default_time = printer["gcode_macro _USER_VARIABLES"].filter_default_time_on_end_print|default(600)|int %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set hotend_fan_tach_enabled = printer["gcode_macro _USER_VARIABLES"].hotend_fan_tach_enabled %} {% set retract_length = printer["gcode_macro _USER_VARIABLES"].retract_length|default(20)|float %} PARK {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and mmu_unload %} MMU_UNLOAD {% endif %} {% elif printer.extruder.can_extrude %} G92 E0 G1 E-{retract_length} F2100 {% endif %} {% if turn_off_heaters_in_end_print %} TURN_OFF_HEATERS {% else %} SET_HEATER_TEMPERATURE HEATER=extruder TARGET={safe_extruder_temp} {% endif %} {% if hotend_fan_tach_enabled %} UPDATE_DELAYED_GCODE ID=_BACKGROUND_HOTEND_TACHO_CHECK DURATION=0 {% endif %} M107 M400 {% if bed_mesh_enabled %} BED_MESH_CLEAR {% endif %} {% if disable_motors_in_end_print %} M84 {% endif %} {% if filter_enabled %} {% if printer['fan_generic filter'].speed > 0 %} {% set FILTER_TIME = params.FILTER_TIME|default(filter_default_time)|int %} START_FILTER SPEED=1 UPDATE_DELAYED_GCODE ID=_STOP_FILTER_DELAYED DURATION={FILTER_TIME} {% endif %} {% endif %} {% if light_enabled %} LIGHT_ON S={light_intensity_end_print} {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="DONE_PRINTING" {% endif %} {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and printer.mmu.print_start_detection|int == 0 %} _MMU_PRINT_END {% endif %} {% endif %} {% if filament_sensor_enabled %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% endif %} [gcode_macro PARK] description = Park the toolhead at the back and retract some filament if the nozzle is hot gcode = {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set material = printer['gcode_macro START_PRINT'].material %} {% set Px, Py = printer["gcode_macro _USER_VARIABLES"].park_position_xy|map('float') %} {% set Px = params.X|default(Px)|float %} {% set Py = params.Y|default(Py)|float %} {% set park_lift_z = printer["gcode_macro _USER_VARIABLES"].park_lift_z %} {% set Z_HOP = params.Z_HOP|default(park_lift_z)|float %} {% set firmware_retraction_enabled = printer["gcode_macro _USER_VARIABLES"].firmware_retraction_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set max_z = printer.toolhead.axis_maximum.z - printer.gcode_move.homing_origin.z |float %} {% set act_z = printer.toolhead.position.z|float %} {% set z_safe = act_z + Z_HOP %} {% if z_safe > max_z %} {% set z_safe = max_z %} {% endif %} {% if printer.toolhead.homed_axes != "xyz" %} {action_raise_error("Cannot park the toolhead because axis are not homed!")} {% endif %} SAVE_GCODE_STATE NAME=PARK {% if printer.extruder.can_extrude %} {% if params.E is defined %} {% set E = params.E|float|abs %} {% if verbose %} RESPOND MSG="Retraction overrided with parameter, Extruder retraction = {E}" {% endif %} {% else %} {% if firmware_retraction_enabled %} {% if verbose %} RESPOND MSG="Firmware retraction enabled, Extruder retraction = {printer.firmware_retraction.retract_length}" {% endif %} G10 {% else %} {% if printer["gcode_macro _USER_VARIABLES"].material_parameters[material] is defined %} {% set E = printer["gcode_macro _USER_VARIABLES"].material_parameters[material].retract_length|default(1.7) %} {% else %} {% set E = 1.7 %} {% endif %} {% if verbose %} RESPOND MSG="Firmware retraction disabled, Extruder retraction = {E}" {% endif %} {% endif %} {% endif %} {% if E is defined and E > 0 %} G92 E0 G1 E-{E} F2100 {% endif %} {% endif %} G90 G1 Z{z_safe} F{Sz} G0 X{Px} Y{Py} F{St} RESTORE_GCODE_STATE NAME=PARK [gcode_macro PARK_FRONT] description = Park the toolhead on the front of the printer for maintenance gcode = {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% if printer.toolhead.homed_axes != "xyz" %} {action_raise_error("Cannot park the toolhead in maintenance position because axis are not homed!")} {% endif %} SAVE_GCODE_STATE NAME=PARK_FRONT G90 G0 Z{printer.toolhead.axis_maximum.z/3*2} F{Sz} G0 X{printer.toolhead.axis_maximum.x/2} Y{printer.toolhead.axis_minimum.y+10} F{St} RESTORE_GCODE_STATE NAME=PARK_FRONT [gcode_macro PAUSE] rename_existing = BASE_PAUSE description = Pause the print and park gcode = {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set light_intensity_start_print = printer["gcode_macro _USER_VARIABLES"].light_intensity_start_print %} {% set idle_timeout_on_pause = printer["gcode_macro _USER_VARIABLES"].idle_timeout_on_pause|default(0)|int %} {% if printer.pause_resume.is_paused %} RESPOND MSG="Print is already paused" {% else %} SAVE_GCODE_STATE NAME=PAUSE_state {% if light_enabled %} LIGHT_ON S={light_intensity_start_print} {% endif %} BASE_PAUSE PARK {% if idle_timeout_on_pause > 0 %} SET_IDLE_TIMEOUT TIMEOUT={idle_timeout_on_pause} {% endif %} {% endif %} [gcode_macro RESUME] rename_existing = BASE_RESUME description = Resume the print after an optional unretract gcode = {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed %} {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set light_intensity_printing = printer["gcode_macro _USER_VARIABLES"].light_intensity_printing %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set idle_timeout_on_pause = printer["gcode_macro _USER_VARIABLES"].idle_timeout_on_pause|default(0)|int %} {% if not printer.pause_resume.is_paused %} RESPOND MSG="Print is not paused. Resume ignored" {% else %} {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and printer.mmu.is_locked %} RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=0 {% else %} RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 MOVE_SPEED={St} {% endif %} {% else %} RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 MOVE_SPEED={St} {% endif %} {% if light_enabled %} LIGHT_ON S={light_intensity_printing} {% endif %} {% if idle_timeout_on_pause > 0%} SET_IDLE_TIMEOUT TIMEOUT={printer.configfile.settings.idle_timeout.timeout} {% endif %} BASE_RESUME {% endif %} [gcode_macro START_PRINT] description = Machine heatup procedure before starting a print variable_bed_temp = 0 variable_extruder_temp = 0 variable_z_adjust = 0 variable_soak = 0 variable_chamber_temp = 0 variable_chamber_maxtime = 0 variable_initial_tool = 0 variable_check_gates = 0 variable_tools_used = "" variable_sync_mmu_extruder = 0 variable_material = "XXX" variable_fl_size = "0_0_0_0" variable_bed_mesh_profile = "" variable_total_layer = 0 variable_adaptive_primeline = 1 gcode = {% set BED_TEMP = params.BED_TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_bed_temp)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set Z_ADJUST = params.Z_ADJUST|default(0)|float %} {% set SOAK = params.SOAK|default(printer["gcode_macro _USER_VARIABLES"].print_default_soak)|int %} {% set CHAMBER_TEMP = params.CHAMBER|default(printer["gcode_macro _USER_VARIABLES"].print_default_chamber_temp)|int %} {% set CHAMBER_MAXTIME = params.CHAMBER_MAXTIME|default(printer["gcode_macro _USER_VARIABLES"].print_default_chamber_max_heating_time)|int %} {% set INITIAL_TOOL = params.INITIAL_TOOL|default(0)|int %} {% set MATERIAL = params.MATERIAL|default(printer["gcode_macro _USER_VARIABLES"].print_default_material)|string %} {% set FL_SIZE = params.SIZE|default("0_0_0_0")|string %} {% set CHECK_GATES = params.CHECK_GATES|default(printer['gcode_macro _USER_VARIABLES'].mmu_check_gates_on_start_print)|default(0)|int %} {% set TOOLS_USED = params.TOOLS_USED|default("")|string %} {% set SYNC_MMU_EXTRUDER = params.SYNC_MMU_EXTRUDER|default(0)|int %} {% set BED_MESH_PROFILE = params.MESH|default("")|string %} {% set ADAPTIVE_PRIMELINE = params.ADAPTIVE_PRIMELINE|default(1)|int %} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=bed_temp VALUE={BED_TEMP} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=extruder_temp VALUE={EXTRUDER_TEMP} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=soak VALUE={SOAK} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=chamber_temp VALUE={CHAMBER_TEMP} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=chamber_maxtime VALUE={CHAMBER_MAXTIME} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=initial_tool VALUE={INITIAL_TOOL} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=check_gates VALUE={CHECK_GATES} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=tools_used VALUE='"{TOOLS_USED}"' SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=sync_mmu_extruder VALUE={SYNC_MMU_EXTRUDER} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=material VALUE='"{MATERIAL}"' SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=fl_size VALUE='"{FL_SIZE}"' SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=bed_mesh_profile VALUE='"{BED_MESH_PROFILE}"' SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=adaptive_primeline VALUE={ADAPTIVE_PRIMELINE} {% if params.TOTAL_LAYER %} SET_PRINT_STATS_INFO TOTAL_LAYER={params.TOTAL_LAYER|int} SET_GCODE_VARIABLE MACRO=START_PRINT VARIABLE=total_layer VALUE={params.TOTAL_LAYER|int} {% endif %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set light_enabled = printer["gcode_macro _USER_VARIABLES"].light_enabled %} {% set light_intensity_start_print = printer["gcode_macro _USER_VARIABLES"].light_intensity_start_print %} {% set light_intensity_printing = printer["gcode_macro _USER_VARIABLES"].light_intensity_printing %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set force_homing_in_start_print = printer["gcode_macro _USER_VARIABLES"].force_homing_in_start_print %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set firmware_retraction_enabled = printer["gcode_macro _USER_VARIABLES"].firmware_retraction_enabled %} {% set filter_enabled = printer["gcode_macro _USER_VARIABLES"].filter_enabled %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set part_fan_tach_enabled = printer["gcode_macro _USER_VARIABLES"].part_fan_tach_enabled %} {% set hotend_fan_tach_enabled = printer["gcode_macro _USER_VARIABLES"].hotend_fan_tach_enabled %} {% if MATERIAL not in printer["gcode_macro _USER_VARIABLES"].material_parameters %} RESPOND MSG="Material '{MATERIAL}' is unknown!" { action_raise_error("Add this new material to your material_parameters variable!") } {% else %} RESPOND MSG="Material '{MATERIAL}' is used" {% set material = printer["gcode_macro _USER_VARIABLES"].material_parameters[MATERIAL] %} {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="BUSY" {% endif %} {% if light_enabled %} LIGHT_ON S={light_intensity_start_print} {% endif %} CLEAR_PAUSE {% if bed_mesh_enabled %} BED_MESH_CLEAR {% endif %} {% if filter_enabled %} UPDATE_DELAYED_GCODE ID=_STOP_FILTER_DELAYED DURATION=0 STOP_FILTER {% endif %} {% if part_fan_tach_enabled %} M106 S255 G4 P2000 _PART_FAN_CHECK M106 S0 {% endif %} {% if hotend_fan_tach_enabled %} UPDATE_DELAYED_GCODE ID=_BACKGROUND_HOTEND_TACHO_CHECK DURATION=1 {% endif %} SET_GCODE_OFFSET Z=0 M221 S100 M220 S100 G90 M83 {% if firmware_retraction_enabled %} SET_RETRACTION RETRACT_LENGTH={material.retract_length} RETRACT_SPEED={material.retract_speed} UNRETRACT_EXTRA_LENGTH={material.unretract_extra_length} UNRETRACT_SPEED={material.unretract_speed} {% endif %} SET_PRESSURE_ADVANCE ADVANCE={material.pressure_advance} {% if force_homing_in_start_print %} G28 {% else %} _CG28 {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_INIT {% endif %} {% set sp_actions = printer["gcode_macro _USER_VARIABLES"].startprint_actions %} {% for action in sp_actions %} {% if action == "bed_soak" %} _MODULE_HEATSOAK_BED {% elif action == "chamber_soak" %} _MODULE_HEATSOAK_CHAMBER {% elif action == "tilt_calib" %} _MODULE_TILTING {% elif action == "extruder_heating" %} _MODULE_EXTRUDER_HEATING {% elif action == "purge" %} _MODULE_PURGE {% elif action == "clean" %} _MODULE_CLEAN {% elif action == "z_offset" %} _MODULE_Z_CALIB {% elif action == "bedmesh" %} _MODULE_BED_MESH {% elif action == "primeline" %} _MODULE_PRIMELINE {% elif action == "extruder_preheating" %} _MODULE_EXTRUDER_PREHEATING {% elif action == "custom1" %} _MODULE_CUSTOM1 {rawparams} {% elif action == "custom2" %} _MODULE_CUSTOM2 {rawparams} {% elif action == "custom3" %} _MODULE_CUSTOM3 {rawparams} {% else %} { action_raise_error("Unknown module called in START_PRINT! Please verify your startprint_actions variable override!") } {% endif %} {% endfor %} SET_GCODE_OFFSET Z_ADJUST={Z_ADJUST} MOVE=1 SET_GCODE_OFFSET Z_ADJUST={material.additional_z_offset} MOVE=1 {% if filter_enabled %} START_FILTER SPEED={material.filter_speed / 100} {% endif %} {% if filament_sensor_enabled and not material.filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="PRINTING" {% endif %} {% if light_enabled %} LIGHT_ON S={light_intensity_printing} {% endif %} {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and printer.mmu.print_start_detection|int == 0 %} _MMU_PRINT_START {% endif %} {% endif %} {% if verbose %} RESPOND MSG="Start printing !" {% endif %} G92 E0.0 [gcode_macro _MODULE_PRIMELINE] gcode = {% set FL_SIZE = printer["gcode_macro START_PRINT"].fl_size %} {% set ADAPTIVE_PRIMELINE = printer["gcode_macro START_PRINT"].adaptive_primeline %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% if verbose %} RESPOND MSG="Executing a primeline..." {% endif %} PRIMELINE SIZE={FL_SIZE} ADAPTIVE_MODE={ADAPTIVE_PRIMELINE} [gcode_macro _MODULE_HEATSOAK_BED] gcode = {% set BED_TEMP = printer["gcode_macro START_PRINT"].bed_temp %} {% set SOAK = printer["gcode_macro START_PRINT"].soak %} {% set CHAMBER_TEMP = printer["gcode_macro START_PRINT"].chamber_temp %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set filter_enabled = printer["gcode_macro _USER_VARIABLES"].filter_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set max_x = printer.toolhead.axis_maximum.x|float %} {% set max_y = printer.toolhead.axis_maximum.y|float %} {% if status_leds_enabled %} STATUS_LEDS COLOR="HEATING" {% endif %} {% if printer.heater_bed.temperature < (BED_TEMP - %} {% if (CHAMBER_TEMP > 0) and filter_enabled %} START_FILTER SPEED=1 {% endif %} {% if SOAK > 0 %} G0 X{max_x|int / 2} Y{max_y|int / 3} Z50 F{St} {% endif %} HEATSOAK_BED TEMP={BED_TEMP} SOAKTIME={SOAK} {% else %} HEATSOAK_BED TEMP={BED_TEMP} SOAKTIME=0 {% endif %} [gcode_macro _MODULE_HEATSOAK_CHAMBER] gcode = {% set CHAMBER_TEMP = printer["gcode_macro START_PRINT"].chamber_temp %} {% set CHAMBER_MAXTIME = printer["gcode_macro START_PRINT"].chamber_maxtime %} {% set chamber_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].chamber_temperature_sensor_enabled %} {% set filter_enabled = printer["gcode_macro _USER_VARIABLES"].filter_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set max_x = printer.toolhead.axis_maximum.x|float %} {% set max_y = printer.toolhead.axis_maximum.y|float %} {% if chamber_sensor_enabled %} {% if CHAMBER_TEMP > 0 %} {% set chamber_sensor_name = printer["gcode_macro _USER_VARIABLES"].chamber_temperature_sensor_name %} {% set CURRENT_TEMP = printer["temperature_sensor " ~ chamber_sensor_name].temperature|float %} {% if CURRENT_TEMP <= CHAMBER_TEMP %} G0 X{max_x|int / 2} Y{max_y|int / 3} Z50 F{St} {% if filter_enabled %} START_FILTER SPEED=1 {% endif %} HEATSOAK_CHAMBER TEMP={CHAMBER_TEMP} MAXTIME={CHAMBER_MAXTIME} {% if filter_enabled %} STOP_FILTER {% endif %} {% endif %} {% endif %} {% endif %} [gcode_macro _MODULE_TILTING] gcode = {% set force_homing_in_start_print = printer["gcode_macro _USER_VARIABLES"].force_homing_in_start_print %} _TILT_CALIBRATE FORCE={force_homing_in_start_print} [gcode_macro _MODULE_EXTRUDER_HEATING] gcode = {% set EXTRUDER_TEMP = printer["gcode_macro START_PRINT"].extruder_temp %} {% set INITIAL_TOOL = printer["gcode_macro START_PRINT"].initial_tool %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% set purgeclean_servo_enabled = printer["gcode_macro _USER_VARIABLES"].purgeclean_servo_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Px, Py, Pz = printer["gcode_macro _USER_VARIABLES"].purge_bucket_xyz|map('float') %} {% set max_x = printer.toolhead.axis_maximum.x|float %} {% set max_y = printer.toolhead.axis_maximum.y|float %} {% if status_leds_enabled %} STATUS_LEDS COLOR="HEATING" {% endif %} {% if verbose %} RESPOND MSG="Extruder heating to print temperature..." {% endif %} _CONDITIONAL_MOVE_TO_PURGE_BUCKET {% if not purge_and_brush_enabled %} G0 X{max_x|int / 2} Y{max_y|int / 3} Z50 F{St} {% endif %} M109 S{EXTRUDER_TEMP} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_LOAD_INITIAL_TOOL {% endif %} {% if purgeclean_servo_enabled %} _SERVO_RETRACT ITEM="purge" {% endif %} {% if verbose %} RESPOND MSG="Extruder temperature OK" {% endif %} [gcode_macro _MODULE_PURGE] gcode = {% set EXTRUDER_TEMP = printer["gcode_macro START_PRINT"].extruder_temp %} {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% if purge_and_brush_enabled %} PURGE TEMP={EXTRUDER_TEMP} {% endif %} [gcode_macro _MODULE_CLEAN] gcode = {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% set force_homing_before_brush = printer["gcode_macro _USER_VARIABLES"].force_homing_before_brush %} {% if purge_and_brush_enabled %} {% if force_homing_before_brush %} G28 Z {% endif %} CLEAN_NOZZLE {% endif %} [gcode_macro _MODULE_Z_CALIB] gcode = {% set zcalib_plugin_enabled = printer["gcode_macro _USER_VARIABLES"].zcalib_plugin_enabled %} {% if zcalib_plugin_enabled %} G28 Z CALIBRATE_Z {% else %} G28 Z {% endif %} [gcode_macro _MODULE_BED_MESH] gcode = {% set FL_SIZE = printer["gcode_macro START_PRINT"].fl_size %} {% set BED_MESH_PROFILE = printer["gcode_macro START_PRINT"].bed_mesh_profile %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% if bed_mesh_enabled %} {% if BED_MESH_PROFILE == "" %} {% if verbose %} RESPOND MSG="Bed mesh measurement..." {% endif %} ADAPTIVE_BED_MESH SIZE={FL_SIZE} {% else %} {% if verbose %} RESPOND MSG="Load bed mesh profile : {BED_MESH_PROFILE}" {% endif %} BED_MESH_PROFILE LOAD={BED_MESH_PROFILE} {% endif %} {% endif %} [gcode_macro _MODULE_EXTRUDER_PREHEATING] gcode = {% set safe_extruder_temp = printer["gcode_macro _USER_VARIABLES"].safe_extruder_temp|float %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% if status_leds_enabled %} STATUS_LEDS COLOR="HEATING" {% endif %} {% if verbose %} RESPOND MSG="Pre-heating the nozzle to a safe temperature..." {% endif %} {% if probe_type_enabled == "vorontap" %} M109 S{safe_extruder_temp} {% if verbose %} RESPOND MSG="Extruder at safe temperature of {safe_extruder_temp} degrees" {% endif %} {% else %} {% if printer.extruder.target < safe_extruder_temp %} M104 S{safe_extruder_temp} {% if verbose %} RESPOND MSG="Extruder is heating at temperature of {safe_extruder_temp} degrees" {% endif %} {% else %} {% if verbose %} RESPOND MSG="Extruder is already hot" {% endif %} {% endif %} {% endif %} [gcode_macro _MODULE_CUSTOM1] gcode = [gcode_macro _MODULE_CUSTOM2] gcode = [gcode_macro _MODULE_CUSTOM3] gcode = [gcode_macro _CG28] description = Homing only if necessary gcode = {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% if "xyz" not in printer.toolhead.homed_axes %} {% if status_leds_enabled %} STATUS_LEDS COLOR="HOMING" {% endif %} G28 {% if status_leds_enabled %} STATUS_LEDS COLOR="READY" {% endif %} {% endif %} [homing_override] axes = xyz gcode = {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set kinematics = printer["configfile"].config["printer"]["kinematics"] %} {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled %} {% set homing_zhop = printer["gcode_macro _USER_VARIABLES"].homing_zhop|float|abs %} {% set homing_travel_speed = printer["gcode_macro _USER_VARIABLES"].homing_travel_speed * 60 %} {% set homing_travel_accel = printer["gcode_macro _USER_VARIABLES"].homing_travel_accel %} {% set sensorless_homing_enabled = printer["gcode_macro _USER_VARIABLES"].sensorless_homing_enabled %} {% set sensorless_current_factor = printer["gcode_macro _USER_VARIABLES"].sensorless_current_factor / 100 %} {% set x_driver = printer["gcode_macro _USER_VARIABLES"].x_driver %} {% set y_driver = printer["gcode_macro _USER_VARIABLES"].y_driver %} {% set z_driver = printer["gcode_macro _USER_VARIABLES"].z_driver %} {% set z_drop_speed = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set homing_first = printer["gcode_macro _USER_VARIABLES"].homing_first|string|upper %} {% set x_homing_backoff, y_homing_backoff = printer["gcode_macro _USER_VARIABLES"].homing_backoff_distance_xy|map('float') %} {% set x_position_endstop = printer["configfile"].config["stepper_x"]["position_endstop"]|float %} {% set y_position_endstop = printer["configfile"].config["stepper_y"]["position_endstop"]|float %} {% set x_position_center = printer.toolhead.axis_maximum.x|int/2 - printer.toolhead.axis_minimum.x|int/2 %} {% set y_position_center = printer.toolhead.axis_maximum.y|int/2 - printer.toolhead.axis_minimum.y|int/2 %} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _CHECK_PROBE action=query {% endif %} {% set X, Y, Z = False, False, False %} {% if status_leds_enabled %} STATUS_LEDS COLOR="HOMING" {% endif %} {% if not 'X' in params and not 'Y' in params and not 'Z' in params %} {% set X, Y, Z = True, True, True %} {% else %} {% if 'X' in params %} {% set X = True %} {% endif %} {% if 'Y' in params %} {% set Y = True %} {% endif %} {% if 'Z' in params %} {% set Z = True %} {% endif %} {% if 'X' in params and 'Y' in params and 'Z' in params %} _HOMING_VARIABLES reset=1 {% endif %} {% endif %} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _ENTRY_POINT FUNCTION=homing_override {% endif %} {% set saved_accel = printer.toolhead.max_accel %} M204 S{homing_travel_accel} {% if bed_mesh_enabled %} BED_MESH_CLEAR {% endif %} G90 {% if Z %} {% if ('z' in printer.toolhead.homed_axes) %} {% if (printer.toolhead.position.z < homing_zhop) %} {% if verbose %} { action_respond_info("Z too low, performing ZHOP to rehome Z") } {% endif %} G91 G0 Z{homing_zhop} F{z_drop_speed} M400 G90 {% else %} {% if verbose %} { action_respond_info("Z already safe, no ZHOP needed to rehome Z") } {% endif %} {% endif %} {% elif ('xy' in printer.toolhead.homed_axes) %} {% if verbose %} { action_respond_info("X and Y already homed, no ZHOP needed to home Z") } {% endif %} {% else %} {% if verbose %} { action_respond_info("X and Y not homed, forcing full G28 to home Z properly") } {% endif %} SET_KINEMATIC_POSITION X=0 Y=0 Z=0 G0 Z{homing_zhop} F{z_drop_speed} {% if sensorless_homing_enabled and kinematics == "corexz" %} M400 {% endif %} {% set X, Y, Z = True, True, True %} {% endif %} {% endif %} {% if homing_first == "X" %} {% if X %} {% if verbose %} { action_respond_info("Homing X") } {% endif %} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "corexz" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_z = printer.configfile.config[z_driver ~ ' stepper_z'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_z = sensorless_current_factor * old_current_z %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_z CURRENT={new_current_z} M400 {% elif kinematics == "cartesian" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} M400 {% endif %} {% endif %} G28 X0 G1 X{x_position_endstop + x_homing_backoff} F{homing_travel_speed} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "corexz" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_z CURRENT={old_current_z} {% elif kinematics == "cartesian" %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} {% endif %} {% endif %} {% endif %} {% if Y %} {% if verbose %} { action_respond_info("Homing Y") } {% endif %} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "corexz" %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "cartesian" %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% endif %} {% endif %} G28 Y0 G1 Y{y_position_endstop + y_homing_backoff} F{homing_travel_speed} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "corexz" %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "cartesian" %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% endif %} {% endif %} {% endif %} {% elif homing_first == "Y" %} {% if Y %} {% if verbose %} { action_respond_info("Homing Y") } {% endif %} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "corexz" %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "cartesian" %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% endif %} {% endif %} G28 Y0 G1 Y{y_position_endstop + y_homing_backoff} F{homing_travel_speed} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "corexz" %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "cartesian" %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% endif %} {% endif %} {% endif %} {% if X %} {% if verbose %} { action_respond_info("Homing X") } {% endif %} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_y = printer.configfile.config[y_driver ~ ' stepper_y'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_y = sensorless_current_factor * old_current_y %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={new_current_y} M400 {% elif kinematics == "corexz" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set old_current_z = printer.configfile.config[z_driver ~ ' stepper_z'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} {% set new_current_z = sensorless_current_factor * old_current_z %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} SET_TMC_CURRENT STEPPER=stepper_z CURRENT={new_current_z} M400 {% elif kinematics == "cartesian" %} {% set old_current_x = printer.configfile.config[x_driver ~ ' stepper_x'].run_current|float %} {% set new_current_x = sensorless_current_factor * old_current_x %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={new_current_x} M400 {% endif %} {% endif %} G28 X0 G1 X{x_position_endstop + x_homing_backoff} F{homing_travel_speed} {% if sensorless_homing_enabled %} {% if kinematics == "corexy" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={old_current_y} {% elif kinematics == "corexz" %} M400 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} SET_TMC_CURRENT STEPPER=stepper_z CURRENT={old_current_z} {% elif kinematics == "cartesian" %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={old_current_x} {% endif %} {% endif %} {% endif %} {% else %} { action_respond_error("Axis homing order not valid. Choose either X or Y first in the variables.cfg file!") } {% endif %} {% if Z %} {% if verbose %} { action_respond_info("Homing Z") } {% endif %} {% if printer["configfile"].config["stepper_z"]["endstop_pin"]|lower == "probe:z_virtual_endstop" %} {% if probe_type_enabled == "dockable_virtual" or probe_type_enabled == "vorontap" %} ACTIVATE_PROBE {% endif %} {% if not bed_mesh_enabled or not printer["configfile"].config["bed_mesh"]["zero_reference_position"] %} G0 X{x_position_center} Y{y_position_center} F{homing_travel_speed} {% else %} {% set ZRPx, ZRPy = printer["configfile"].config["bed_mesh"]["zero_reference_position"].split(',')|map('trim')|map('float') %} G0 X{ZRPx} Y{ZRPy} F{homing_travel_speed} {% endif %} {% else %} _GOTO_Z_PROBE {% endif %} G28 Z0 G91 {% if printer["configfile"].settings["stepper_z"]["homing_positive_dir"] == False %} G0 Z{homing_zhop} F{z_drop_speed} {% elif printer["configfile"].settings["stepper_z"]["homing_positive_dir"] == True %} G0 Z-{homing_zhop} F{z_drop_speed} {% endif %} G90 {% if probe_type_enabled == "vorontap" or probe_type_enabled == "dockable_virtual" %} DEACTIVATE_PROBE {% endif %} {% endif %} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _CHECK_PROBE action=query {% endif %} SET_VELOCITY_LIMIT ACCEL={saved_accel} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _EXIT_POINT FUNCTION=homing_override {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="READY" {% endif %} [gcode_macro _GOTO_Z_PROBE] description = Move to z probe avoiding the probe dock gcode = {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set zcalib_plugin_enabled = printer["gcode_macro _USER_VARIABLES"].zcalib_plugin_enabled %} {% if zcalib_plugin_enabled %} {% set z_endstop_x, z_endstop_y = printer["configfile"].config["z_calibration"]["nozzle_xy_position"].split(',')|map('trim')|map('float') %} {% else %} {% set z_endstop_x, z_endstop_y = printer["gcode_macro _USER_VARIABLES"].zendstop_position|map('float') %} {% endif %} {% set homing_travel_speed = printer["gcode_macro _USER_VARIABLES"].homing_travel_speed|float * 60 %} {% set probe_dock_location_x, probe_dock_location_y = printer["gcode_macro _USER_VARIABLES"].probe_dock_location_xy|map('float') %} {% set probe_dock_margin_x, probe_dock_margin_y = printer["gcode_macro _USER_VARIABLES"].probe_dock_margin_xy|map('float') %} {% set current_x = printer.toolhead.position.x|float %} {% set current_y = printer.toolhead.position.y|float %} SAVE_GCODE_STATE NAME=goto_ZProbe G90 {% set avoid_dock = false %} {% if probe_dock_location_x < z_endstop_x|float %} {% if current_x < (probe_dock_location_x + probe_dock_margin_x) %} {% set avoid_dock = true %} {% endif %} {% else %} {% if current_x > (probe_dock_location_x - probe_dock_margin_x) %} {% set avoid_dock = true %} {% endif %} {% endif %} {% if avoid_dock == true %} {% if verbose %} { action_respond_info("Avoiding probe dock to home Z...") } {% endif %} G0 Y{probe_dock_location_y - probe_dock_margin_y} F{homing_travel_speed} G0 X{z_endstop_x} F{homing_travel_speed} {% endif %} G0 X{z_endstop_x} Y{z_endstop_y} F{homing_travel_speed} RESTORE_GCODE_STATE NAME=goto_ZProbe [gcode_macro CALIBRATE] description = Calibrate the printer flow or pressure advance gcode = {% set TYPE = params.TYPE|default("")|string|lower %} {% set BED_TEMP = params.BED_TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_bed_temp)|float %} {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set MATERIAL = params.MATERIAL|default("ABS")|string %} {% set TOOL = params.TOOL|default(0)| int %} {% set center_x = printer.toolhead.axis_maximum.x|float / 2 %} {% set center_y = printer.toolhead.axis_maximum.y|float / 2 %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% if klippain_mmu_enabled %} {% if printer.mmu.enabled and printer.mmu.filament == "Loaded" %} {% set TOOL = printer.mmu.tool|int %} {% endif %} {% endif %} {% if TYPE=="flow" %} {% set computed_size = (center_x - 20)|string + '_' + (center_y - 20)|string + '_' + (center_x + 20)|string + '_' + (center_y + 20)|string %} START_PRINT EXTRUDER_TEMP={EXTRUDER_TEMP} BED_TEMP={BED_TEMP} MATERIAL={MATERIAL} SOAK=1 SIZE={computed_size} INITIAL_TOOL={TOOL} TOOLS_USED={TOOL} FLOW_MULTIPLIER_CALIBRATION EXTRUSION_WIDTH=0.471 END_PRINT FILTER_TIME=0 {% elif TYPE=="pressure_advance" %} {% set computed_size = (center_x - 60)|string + '_' + (center_y - 60)|string + '_' + (center_x + 60)|string + '_' + (center_y + 60)|string %} START_PRINT EXTRUDER_TEMP={EXTRUDER_TEMP} BED_TEMP={BED_TEMP} MATERIAL={MATERIAL} SOAK=1 SIZE={computed_size} INITIAL_TOOL={TOOL} TOOLS_USED={TOOL} PRESSURE_ADVANCE_CALIBRATION END_PRINT FILTER_TIME=0 {% else %} {action_respond_info("Please call this macro using TYPE= \"flow\" or \"pressure_advance\"")} {action_raise_error("not enough parameters to start a calibration!")} {% endif %} [gcode_macro _FLOW_CALIB_VARIABLES] variable_last_shell_thickness = 0.0 variable_last_evalue = 0.0 gcode = [gcode_macro FLOW_MULTIPLIER_CALIBRATION] description = Print a small tower to calibrate the extrusion flow multiplier by measuring the shell gcode = {% set do_raft = params.DO_RAFT|default(1)|int %} {% set do_retract = params.DO_RECTRACT|default(0)|int %} {% set print_size = params.PRINT_SIZE|default(40)|int %} {% set print_height = params.HEIGHT|default(15)|int %} {% set corner_radius = params.CORNER_RADIUS|default(8)|int %} {% set number_of_perimeters = params.PERIMETERS|default(2)|int %} {% set fan_speed = params.FAN_SPEED|default(20)|int %} {% set e_multiplier = params.EXTRUSION_MULTIPLIER|default(1.00)|float %} {% set filament_diameter = params.FILAMENT_DIAMETER|default(1.75)|float %} {% set extrusion_width = params.EXTRUSION_WIDTH|default(0.4)|float %} {% set layer_height = params.LAYER_HEIGHT|default(0.2)|float %} {% set retract_length = params.RETRACT_LENGTH|default(0.5)|float %} {% set initial_purge = params.PURGE_MM|default(1)|int %} {% set z_hop_height = 2 * layer_height %} {% set feedrate_print = params.CONTROL_SPEED|default(100)|int * 60 %} {% set feedrate_travel = params.TRAVEL_SPEED|default(200)|int * 60 %} {% set feedrate_raft = params.RAFT_SPEED|default(60)|int * 60 %} {% set feedrate_z = params.Z_LIFT_SPEED|default(20)|int * 60 %} {% set feedrate_retract = params.RETRACT_SPEED|default(50)|int * 60 %} {% set e_per_mm = ((extrusion_width - layer_height) * layer_height + 3.14159 * (layer_height / 2)**2) / (3.14159 * (filament_diameter / 2)**2) %} {% set spacing = extrusion_width - layer_height * (1 - 3.14159 / 4) %} {% set shell_thickness = extrusion_width + (number_of_perimeters|float - 1) * spacing %} {% set max_x = printer.toolhead.axis_maximum.x|float %} {% set max_y = printer.toolhead.axis_maximum.y|float %} {% set x_start = max_x / 2 - print_size / 2 %} {% set y_start = max_y / 2 - print_size / 2 %} {% set x_end = x_start + print_size %} {% set y_end = y_start + print_size %} {% set num_raft_lines = ([print_size, max_x]|min / spacing)|round(0, 'floor')|int %} {% set raft_size = num_raft_lines * spacing %} {action_respond_info("")} {action_respond_info("Starting extrusion flow calibration print")} {action_respond_info("This operation can not be interrupted by normal means. Hit the \"emergency stop\" button to stop it if needed")} {action_respond_info("")} {action_respond_info("Exrusion multiplier used: %.4f" % e_multiplier)} {action_respond_info("Number of perimeters to print: %d" % number_of_perimeters)} {action_respond_info("THEORIC SHELL THICKNESS: %.4f" % shell_thickness)} {action_respond_info("")} {action_respond_info("Measure the shell thickness using a caliper or micrometer. Then call the computation macro with the measured value:")} {action_respond_info("COMPUTE_FLOW_MULTIPLIER MEASURED_THICKNESS=xxx.xxx")} {action_respond_info("")} SAVE_GCODE_STATE NAME=STATE_FLOW_MULTIPLIER_CALIBRATION SET_GCODE_VARIABLE MACRO=_FLOW_CALIB_VARIABLES VARIABLE=last_shell_thickness VALUE={shell_thickness} SET_GCODE_VARIABLE MACRO=_FLOW_CALIB_VARIABLES VARIABLE=last_evalue VALUE={e_multiplier} G90 M83 G92 E0.0 G0 X{x_start} Y{y_start - 5} Z{layer_height} F{feedrate_travel} G91 G1 E{initial_purge} F{5 * 60} G1 X{raft_size} E{raft_size * e_per_mm * 1.5} F{feedrate_raft / 2} G1 Y-{extrusion_width} E{extrusion_width * e_per_mm} F{feedrate_raft / 2} G1 X-{raft_size} E{raft_size * e_per_mm} F{feedrate_raft / 2} G1 E-{retract_length} F{feedrate_retract} G0 Z{z_hop_height} F{feedrate_z} G90 G0 X{x_start} Y{y_start} F{feedrate_travel} G1 Z{layer_height} F{feedrate_z} G1 E{retract_length} F{feedrate_retract} M221 S{e_multiplier * 100} {% if do_raft == 1 %} G91 {% for curr_raft_line in range(1, num_raft_lines + 2) %} G1 Y{loop.cycle(1.0, -1.0) * raft_size} E{raft_size * e_per_mm} F{feedrate_raft} {% if not loop.last %} G1 X{spacing} E{spacing * e_per_mm} F{feedrate_raft} {% endif %} {% endfor %} G1 E-{retract_length} F{feedrate_retract} G0 Z{z_hop_height} F{feedrate_z} G90 {% endif %} G90 M106 S{fan_speed * 255 / 100} {% for curr_layer in range(1, (print_height / layer_height)|round|int) %} G0 X{x_start + corner_radius} Y{y_start} F{feedrate_travel} G1 Z{(curr_layer * layer_height) + (layer_height if do_raft == 1 else 0)} F{feedrate_z} {% for perim_num in range(number_of_perimeters) %} {% set perim_offset = perim_num * spacing %} {% set perim_radius = corner_radius - (perim_num * spacing) %} G1 X{x_start + corner_radius} Y{y_start + perim_offset} F{feedrate_travel} {% if do_retract == 1 %} G1 E{retract_length} F{feedrate_retract} {% endif %} G1 X{x_end - corner_radius} Y{y_start + perim_offset} E{(print_size - (2 * corner_radius)) * e_per_mm} F{feedrate_print} G3 X{x_end - perim_offset} Y{y_start + corner_radius} J{perim_radius} E{(3.14159 / 2) * perim_radius * e_per_mm} F{feedrate_print} G1 X{x_end - perim_offset} Y{y_end - corner_radius} E{(print_size - (2 * corner_radius)) * e_per_mm} F{feedrate_print} G3 X{x_end - corner_radius} Y{y_end - perim_offset} I-{perim_radius} E{(3.14159 / 2) * perim_radius * e_per_mm} F{feedrate_print} G1 X{x_start + corner_radius} Y{y_end - perim_offset} E{(print_size - (2 * corner_radius)) * e_per_mm} F{feedrate_print} G3 X{x_start + perim_offset} Y{y_end - corner_radius} J-{perim_radius} E{(3.14159 / 2) * perim_radius * e_per_mm} F{feedrate_print} G1 X{x_start + perim_offset} Y{y_start + corner_radius} E{(print_size - (2 * corner_radius)) * e_per_mm} F{feedrate_print} G3 X{x_start + corner_radius} Y{y_start + perim_offset} I{perim_radius} E{(3.14159 / 2) * perim_radius * e_per_mm} F{feedrate_print} {% if do_retract == 1 %} G1 E-{retract_length} F{feedrate_retract} {% endif %} {% endfor %} {% if do_retract == 1 %} G91 G0 Z{z_hop_height} F{feedrate_z} G90 {% endif %} {% endfor %} G1 E-{retract_length} F{feedrate_retract} G91 G0 Z20 F{feedrate_travel} RESTORE_GCODE_STATE NAME=STATE_FLOW_MULTIPLIER_CALIBRATION [gcode_macro COMPUTE_FLOW_MULTIPLIER] description = Compute a new flow multiplier by using the measured shell thickness on the calibration print gcode = {% set evalue = params.OLD_EXTRUSION_MULTIPLIER|default(0.0)|float %} {% set theorical_thickness = params.THEORICAL_THICKNESS|default(0.0)|float %} {% set measured_thickness = params.MEASURED_THICKNESS|default(0.0)|float %} {% if evalue == 0.0 %} {% set last_evalue = printer["gcode_macro _FLOW_CALIB_VARIABLES"].last_evalue %} {% if last_evalue == 0.0 %} {action_respond_info("It seems that no calibration print was run prior to this (or a restart of Klipper occured).")} {action_respond_info("You can still manually use it by calling again this macro like that:")} {action_respond_info("COMPUTE_FLOW_MULTIPLIER OLD_EXTRUSION_MULTIPLIER=xxx.xxx THEORICAL_THICKNESS=xxx.xxx MEASURED_THICKNESS=xxx.xxx")} {action_raise_error("not enough data to perform the computation of the new flow !")} {% else %} {% set final_evalue = last_evalue %} {action_respond_info("Using OLD_EXTRUSION_MULTIPLIER: %.3f" % final_evalue)} {% endif %} {% else %} {% set final_evalue = evalue %} {action_respond_info("Using OLD_EXTRUSION_MULTIPLIER: %.3f" % final_evalue)} {% endif %} {% if theorical_thickness == 0.0 %} {% set last_shell_thickness = printer["gcode_macro _FLOW_CALIB_VARIABLES"].last_shell_thickness %} {% if last_shell_thickness == 0.0 %} {action_respond_info("It seems that no calibration print was run prior to this (or a restart of Klipper occured).")} {action_respond_info("You can still manually use it by calling again this macro like that:")} {action_respond_info("COMPUTE_FLOW_MULTIPLIER OLD_EXTRUSION_MULTIPLIER=xxx.xxx THEORICAL_THICKNESS=xxx.xxx MEASURED_THICKNESS=xxx.xxx")} {action_raise_error("not enough data to perform the computation of the new flow !")} {% else %} {% set final_theorical_thickness = last_shell_thickness %} {action_respond_info("Using THEORICAL_THICKNESS: %.3f" % final_theorical_thickness)} {% endif %} {% else %} {% set final_theorical_thickness = theorical_thickness %} {action_respond_info("Using THEORICAL_THICKNESS: %.3f" % final_theorical_thickness)} {% endif %} {% if measured_thickness == 0.0 %} {action_respond_info("You must use a caliper or micrometer to measure the calibration print shell thickness and call this macro with the measured value !!!")} {action_respond_info("COMPUTE_FLOW_MULTIPLIER MEASURED_THICKNESS=xxx.xxx")} {action_raise_error("not enough data to perform the computation of the new flow !")} {% else %} {% set new_evalue = final_theorical_thickness * final_evalue / measured_thickness %} {action_respond_info("NEW COMPUTED FLOW VALUE: %.3f" % new_evalue)} {action_respond_info("Use this new value as extrusion multiplier in your slicer of choice")} {action_respond_info("")} {% endif %} [gcode_macro PRESSURE_ADVANCE_CALIBRATION] description = Calibrate the pressure advance by printing a grid pattern gcode = {% set pa_start = params.START|default(0.02)|float %} {% set pa_increment = params.INCREMENT|default(0.005)|float %} {% set do_raft = params.DO_RAFT|default(1)|int %} {% set print_size = params.PRINT_SIZE|default(120)|int %} {% set num_bands = params.BANDS_LIMIT|default(999)|int %} {% set lines_per_band = params.LINES_PER_BAND|default(6)|int %} {% set e_multiplier = params.EXTRUSION_MULTIPLIER|default(1.25 if do_raft == 1 else 1.5)|float %}, {% set retract_length = params.RETRACT_LENGTH|default(0.6)|float %} {% set initial_purge = params.PURGE_MM|default(8)|int %} {% set feedrate_control = params.CONTROL_SPEED|default(30)|int * 60 %} {% set feedrate_outer = params.OUTER_SPEED|default(40)|int * 60 %} {% set feedrate_inner = params.INNER_SPEED|default(120)|int * 60 %} {% set feedrate_travel = params.TRAVEL_SPEED|default(200)|int * 60 %} {% set feedrate_raft = params.RAFT_SPEED|default(120)|int * 60 %} {% set feedrate_z = 5 * 60 %} {% set feedrate_retract = 50 * 60 %} {% set spacing_line = params.LINE_SPACING|default(0.4)|float %} {% set spacing_band = 2 %} {% set spacing_raft = 2 %} {% set fast_line_ratio_percent = 50 %} {% set lines_per_band = [2, lines_per_band]|max %} {% set e_multiplier = [1, e_multiplier]|max %} {% set num_lines_control = (lines_per_band / 2)|round(0, 'floor')|int %} {% set num_lines_test = (lines_per_band / 2)|round(0, 'ceil')|int %} {% set spacing_line = spacing_line * (1 + e_multiplier - 1.25) %} {% set max_x = printer.toolhead.axis_maximum.x|float %} {% set max_y = printer.toolhead.axis_maximum.y|float %} {% set nozzle_diameter = printer.configfile.config['extruder'].nozzle_diameter|float %} {% set line_width = nozzle_diameter * 1.25 %} {% set line_height = nozzle_diameter / 2 %} {% set z_hop_height = 2 * line_height %} {% set e_per_mm = (line_width * line_height) / (3.1415 * (1.75/2)**2) %} {% set spacing_purge = line_height * 0.8 %} {% set spacing_raft = (spacing_raft / line_width)|round * line_width %} {% set num_raft_lines = ([print_size, max_x]|min / spacing_raft)|round(0, 'floor')|int %} {% set print_width = num_raft_lines * spacing_raft %} {% set band_height = lines_per_band * line_width + (lines_per_band - 1) * spacing_line + spacing_band %} {% set bands_per_height = (([print_size, max_y]|min - spacing_purge - 2 * line_width + spacing_band) / band_height)|round(0, 'floor')|int %} {% set num_bands = [num_bands, bands_per_height]|min %} {% set print_height = num_bands * band_height - spacing_band + spacing_purge + 2 * line_width %} {% set slow_line_length = ((print_width * (1 - fast_line_ratio_percent / 100) / 2) / spacing_raft)|round * spacing_raft + spacing_raft / 2 %} {% set fast_line_length = print_width - slow_line_length * 2 %} {% set thick_raft_num1 = (slow_line_length / spacing_raft)|round|int %} {% set thick_raft_num2 = num_raft_lines - thick_raft_num1 + 1 %} {% set x_start = max_x / 2 - print_width / 2 %} {% set y_start = max_y / 2 - print_height / 2 %} {action_respond_info("")} {action_respond_info("Starting Pressure Advance calibration print.")} {action_respond_info("")} {action_respond_info("This operation can not be interrupted by normal means. Hit the \"emergency stop\" button once the print starts exhibiting PA values that are obviously too high.")} {action_respond_info("")} {action_respond_info("PA of first band: %.4f" % pa_start)} {action_respond_info("PA of last band: %.4f" % (pa_start + ((num_bands - 1) * pa_increment)))} {action_respond_info("PA increment per band: %.4f" % pa_increment)} {action_respond_info("Number of bands: %d" % num_bands)} {action_respond_info("")} {action_respond_info("Inspect the printed model. " "Look at the top and bottom lines in each band, on the right side of the two vertical raft bars (where the print speeds change). " "Find the highest band from the bottom where the lines at its top still resemble the lines at its bottom, with no visible extrusion width irregularities. " "Your final Pressure Advance value would then be:" )} {action_respond_info("")} {action_respond_info("Assuming that first band_number is 0")} {action_respond_info("PA = %.4f + (%.4f * band_number)" % (pa_start, pa_increment))} {action_respond_info("")} {action_respond_info("Update your [extruder] config section and set \"pressure_advance\" to the value you calculated.")} {action_respond_info("")} SAVE_GCODE_STATE NAME=STATE_PRESSURE_ADVANCE_CALIBRATION {% set pa_saved = printer.configfile.settings['extruder'].pressure_advance %} SET_PRESSURE_ADVANCE ADVANCE={pa_start} M221 S100 M117 Priming G90 G0 X{x_start} Y{y_start} Z{line_height} F{feedrate_travel} G91 G1 E{initial_purge} F{5 * 60} G1 X{print_width} E{print_width * e_per_mm} F{feedrate_raft / 2} G1 Y{line_width} E{line_width * e_per_mm} F{feedrate_raft / 2} G1 X-{print_width} E{print_width * e_per_mm} F{feedrate_raft / 2} {% if do_raft == 1 %} G0 F{feedrate_raft} {% for curr_raft_line in range(1, num_raft_lines + 2) %} {% if curr_raft_line == thick_raft_num1 or curr_raft_line == thick_raft_num2 %} G1 Y{loop.cycle(1.0, -1.0) * print_height} E{print_height * e_per_mm} G1 X{line_width} E{line_width * e_per_mm} G1 Y{loop.cycle(-1.0, 1.0) * print_height} E{print_height * e_per_mm} G1 X{line_width} E{line_width * e_per_mm} {% endif %} G1 Y{loop.cycle(1.0, -1.0) * print_height} E{print_height * e_per_mm} {% if not loop.last %} {% set horizontal_move = spacing_raft - (2 * line_width if curr_raft_line == thick_raft_num1 - 1 or curr_raft_line == thick_raft_num2 - 1 else 0) %} G1 X{horizontal_move} E{horizontal_move * e_per_mm} {% endif %} {% endfor %} G1 E-{retract_length} F{feedrate_retract} G0 Z{z_hop_height} F{feedrate_z} {% endif %} M117 Printing bands G90 G0 X{x_start} Y{y_start + 2 * line_width + spacing_purge} F{feedrate_travel} G0 Z{line_height + (line_height if do_raft == 1 else 0)} F{feedrate_z} G91 G1 E{retract_length} F{feedrate_retract} {% for curr_band_num in range(0, num_bands ) %} {% set outer_loop = loop %} {% set curr_pa_value = pa_start + curr_band_num * pa_increment %} SET_PRESSURE_ADVANCE ADVANCE={curr_pa_value} M117 Band {curr_band_num} PA {curr_pa_value|round(4)} {% for _ in range(num_lines_control) %} G1 X{print_width} E{print_width * e_per_mm * e_multiplier} F{feedrate_control} G1 E-{retract_length} F{feedrate_retract} G0 Z{z_hop_height} F{feedrate_z} G0 X-{print_width} Y{spacing_line + line_width} F{feedrate_travel} G0 Z-{z_hop_height} F{feedrate_z} G1 E{retract_length} F{feedrate_retract} {% endfor %} {% for _ in range(num_lines_test) %} {% for data in [{'mm': slow_line_length, 'f': feedrate_outer}, {'mm': fast_line_length, 'f': feedrate_inner}, {'mm': slow_line_length, 'f': feedrate_outer}] %} G1 X{data.mm} E{data.mm * e_per_mm * e_multiplier} F{data.f} {% endfor %} G1 E-{retract_length} F{feedrate_retract} G0 Z{z_hop_height} F{feedrate_z} {% if not (outer_loop.last and loop.last) %} G0 X-{print_width} Y{(spacing_line if not loop.last else spacing_band) + line_width} F{feedrate_travel} G0 Z-{z_hop_height} F{feedrate_z} G1 E{retract_length} F{feedrate_retract} {% endif %} {% endfor %} {% endfor %} G1 E-{retract_length} F{feedrate_retract} G0 Z20 F{feedrate_z} G0 X-{print_width / 2} Y{[50, max_y - (y_start + print_height)]|min} F{feedrate_travel} M117 SET_PRESSURE_ADVANCE ADVANCE={pa_saved} RESTORE_GCODE_STATE NAME=STATE_PRESSURE_ADVANCE_CALIBRATION [gcode_macro CHANGE_FILAMENT] description = Do a PAUSE, park the toolhead over the purge bucket and unload the filament gcode = {% set TEMP = params.TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set DISTANCE = params.DISTANCE|default(105)|float %} SAVE_GCODE_STATE NAME=CHANGE_FILAMENT_state PAUSE _CONDITIONAL_MOVE_TO_PURGE_BUCKET Z_DROP=0 UNLOAD_FILAMENT TEMP={TEMP} DISTANCE={DISTANCE} RESTORE_GCODE_STATE NAME=CHANGE_FILAMENT_state [gcode_macro UNLOAD_FILAMENT] description = Basic unload of the filament (used with M600/CHANGE_FILAMENT) gcode = {% set TEMP = params.TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set DISTANCE = params.DISTANCE|default(105)|float %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set re_enable_filament_sensor = 0 %} {% if filament_sensor_enabled %} {% if (printer['filament_motion_sensor runout_sensor'] is defined and printer['filament_motion_sensor runout_sensor'].enabled) or (printer['filament_switch_sensor runout_sensor'] is defined and printer['filament_switch_sensor runout_sensor'].enabled) %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% set re_enable_filament_sensor = 1 %} {% if verbose %} RESPOND MSG="Runout sensor deactivated to unload filament" {% endif %} {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE=0 {% endif %} SAVE_GCODE_STATE NAME=UNLOAD_FILAMENT_state _LOW_TEMP_CHECK T={TEMP} _TIP_SHAPING M83 G1 E-20 F3600 G4 P3000 G1 E{DISTANCE|float * -1} F3000 M400 RESTORE_GCODE_STATE NAME=UNLOAD_FILAMENT_state {% if filament_sensor_enabled and re_enable_filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% if verbose %} RESPOND MSG="Filament unloaded, runout sensor reactivated" {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE={printer.mmu.clog_detection} {% endif %} [gcode_macro LOAD_FILAMENT] description = Basic load of the filament (used with M600/CHANGE_FILAMENT) gcode = {% set TEMP = params.TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set DISTANCE = params.DISTANCE|default(105)|float %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set re_enable_filament_sensor = 0 %} {% if filament_sensor_enabled %} {% if (printer['filament_motion_sensor runout_sensor'] is defined and printer['filament_motion_sensor runout_sensor'].enabled) or (printer['filament_switch_sensor runout_sensor'] is defined and printer['filament_switch_sensor runout_sensor'].enabled) %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% set re_enable_filament_sensor = 1 %} {% if verbose %} RESPOND MSG="Runout sensor deactivated to load filament" {% endif %} {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE=0 {% endif %} SAVE_GCODE_STATE NAME=LOAD_FILAMENT_state _LOW_TEMP_CHECK T={TEMP} M83 G92 E0 G1 E{DISTANCE|float} F200 G1 E50 F150 M400 G92 E0 RESTORE_GCODE_STATE NAME=LOAD_FILAMENT_state {% if filament_sensor_enabled and re_enable_filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% if verbose %} RESPOND MSG="Filament loaded, runout sensor reactivated" {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE={printer.mmu.clog_detection} {% endif %} [gcode_macro _TIP_SHAPING] description = Filament tip shaping sequence gcode = {% set TEMP = params.TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set re_enable_filament_sensor = 0 %} {% if filament_sensor_enabled %} {% if (printer['filament_motion_sensor runout_sensor'] is defined and printer['filament_motion_sensor runout_sensor'].enabled) or (printer['filament_switch_sensor runout_sensor'] is defined and printer['filament_switch_sensor runout_sensor'].enabled) %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% set re_enable_filament_sensor = 1 %} {% if verbose %} RESPOND MSG="Runout sensor deactivated for filament tip shaping" {% endif %} {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE=0 {% endif %} SAVE_GCODE_STATE NAME=TIP_SHAPING_state _LOW_TEMP_CHECK T={TEMP} {% set old_pressure_advance = printer.extruder.pressure_advance|default(0) %} SET_PRESSURE_ADVANCE ADVANCE=0 M82 G92 E0 G1 E2 F3600 G1 E0 F3600 G1 E3 F3600 G1 E0 F3600 G1 E4 F3600 G1 E0 F3600 SET_PRESSURE_ADVANCE ADVANCE={old_pressure_advance} M400 RESTORE_GCODE_STATE NAME=TIP_SHAPING_state {% if filament_sensor_enabled and re_enable_filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% if verbose %} RESPOND MSG="Filament tip shaping done, runout sensor reactivated" {% endif %} {% endif %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE={printer.mmu.clog_detection} {% endif %} [gcode_macro HEATSOAK_CHAMBER] description = Heatsoak chamber to a specific temperature with a timeout gcode = {% set chamber_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].chamber_temperature_sensor_enabled %} {% if chamber_sensor_enabled %} {% set SETPOINT_TEMP = params.TEMP|default(0)|float %} {% set MAXTIME = params.MAXTIME|default(printer["gcode_macro _USER_VARIABLES"].print_default_chamber_max_heating_time)|int %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% for _ in range(1, MAXTIME) %} _WAIT_CHAMBER_TEMP TEMP={SETPOINT_TEMP} {% endfor %} {% if verbose %} RESPOND MSG="Chamber temperature OK or timeout reached!" {% endif %} {% endif %} [gcode_macro _WAIT_CHAMBER_TEMP] gcode = {% set chamber_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].chamber_temperature_sensor_enabled %} {% if chamber_sensor_enabled %} {% set chamber_sensor_name = printer["gcode_macro _USER_VARIABLES"].chamber_temperature_sensor_name %} {% set SETPOINT_TEMP = params.TEMP|default(0)|float %} {% set CURRENT_TEMP = printer["temperature_sensor " ~ chamber_sensor_name].temperature|float %} {% if CURRENT_TEMP <= SETPOINT_TEMP %} RESPOND MSG="Heating up the chamber : {CURRENT_TEMP}/{SETPOINT_TEMP}" G4 P{60000 * 1} {% endif %} {% endif %} [gcode_macro HEATSOAK_BED] description = Heatsoak bed at specified temperature and wait for a specific amount of time gcode = {% set SETPOINT_TEMP = params.TEMP|default(0)|int %} {% set TIME = params.SOAKTIME|default(8)|int %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set heaterbed_enabled = printer["gcode_macro _USER_VARIABLES"].heaterbed_enabled %} {% set heatsoak_bed_enabled = printer["gcode_macro _USER_VARIABLES"].print_default_soak > 0 %} {% if heaterbed_enabled %} {% if verbose %} RESPOND MSG="Heating up bed..." {% endif %} M190 S{SETPOINT_TEMP} {% if TIME > 0 %} {% for i in range(0, TIME) %} RESPOND MSG="Heatsoak bed, {TIME-i}mn left..." G4 P{60000 * 1} {% endfor %} {% else %} {% if heatsoak_bed_enabled %} RESPOND MSG="No heatsoak needed, continue" {% endif %} {% endif %} {% if verbose %} RESPOND MSG="Bed temperature OK" {% endif %} {% else %} {% if verbose %} RESPOND MSG="No bed heater defined: nothing to do, continuing..." {% endif %} {% endif %} [gcode_macro PRIMELINE] gcode = {% set prime_line_length = params.LINE_LENGTH|default(printer["gcode_macro _USER_VARIABLES"].prime_line_length)|float %} {% set prime_line_purge_distance = params.PURGE_LENGTH|default(printer["gcode_macro _USER_VARIABLES"].prime_line_purge_distance)|float %} {% set prime_line_flowrate = params.FLOWRATE|default(printer["gcode_macro _USER_VARIABLES"].prime_line_flowrate)|float %} {% set prime_line_height = params.LINE_HEIGHT|default(printer["gcode_macro _USER_VARIABLES"].prime_line_height)|default(0.6)|float %} {% set prime_line_adaptive = params.ADAPTIVE_MODE|default(1)|int %} {% set prime_line_margin = params.LINE_MARGIN|default(printer["gcode_macro _USER_VARIABLES"].prime_line_margin)|default(5.0)|float %} {% set prime_line_unretract_length = printer["gcode_macro _USER_VARIABLES"].unretract_length|default(23)|float %} {% set prime_line_wipe = printer["gcode_macro _USER_VARIABLES"].prime_line_wipe|default(False) %} {% set prime_line_wipe_length = prime_line_length * 0.8 %} {% set coordinatesFound = false %} {% if params.SIZE is defined and params.SIZE != "0_0_0_0" %} {% set xMinSpec, yMinSpec, xMaxSpec, yMaxSpec = params.SIZE.split('_')|map('trim')|map('int') %} {% set coordinatesFound = true %} {% elif printer.exclude_object is defined %} {% if printer.exclude_object.objects %} {% set eo_points = printer.exclude_object.objects|map(attribute='polygon')|sum(start=[]) %} {% set xMinSpec = eo_points|map(attribute=0)|min %} {% set yMinSpec = eo_points|map(attribute=1)|min %} {% set xMaxSpec = eo_points|map(attribute=0)|max %} {% set yMaxSpec = eo_points|map(attribute=1)|max %} {% set coordinatesFound = true %} {% endif %} {% endif %} {% set prime_line_x, prime_line_y = printer["gcode_macro _USER_VARIABLES"].prime_line_xy|map('float') %} {% set prime_line_x = params.START_X|default(prime_line_x)|float %} {% set prime_line_y = params.START_Y|default(prime_line_y)|float %} {% set prime_line_direction = params.LINE_DIRECTION|default(printer["gcode_macro _USER_VARIABLES"].prime_line_direction)|string|upper %} {% set center_x, center_y = [printer.toolhead.axis_maximum.x / 2, printer.toolhead.axis_maximum.y / 2]|map("float") %} {% if coordinatesFound and prime_line_adaptive == 1 %} {% set prime_line_x = 2*center_x - prime_line_x if (prime_line_x > center_x and xMaxSpec < center_x) or (prime_line_x < center_x and xMinSpec > center_x) else prime_line_x %} {% set prime_line_y = 2*center_y - prime_line_y if (prime_line_y > center_y and yMaxSpec < center_y) or (prime_line_y < center_y and yMinSpec > center_y) else prime_line_y %} {% set prime_line_x = [[prime_line_x, xMinSpec - prime_line_margin]|max, xMaxSpec + prime_line_margin]|min %} {% set prime_line_y = [[prime_line_y, yMinSpec - prime_line_margin]|max, yMaxSpec + prime_line_margin]|min %} {% endif %} {% set prime_line_way = -1 if (prime_line_direction == "X" and prime_line_x > center_x) or (prime_line_direction == "Y" and prime_line_y > center_y) else 1 %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set re_enable_filament_sensor = 0 %} {% set max_extrude_cross_section = printer["configfile"].config["extruder"]["max_extrude_cross_section"]|float %} {% set filament_diameter = printer["configfile"].config["extruder"]["filament_diameter"]|float %} {% set purge_volume = prime_line_purge_distance * 3.14159 * (filament_diameter / 2)**2 %} {% set line_width = purge_volume / (prime_line_height * prime_line_length) %} {% if (prime_line_height * line_width) > max_extrude_cross_section %} {% if verbose %} {action_respond_info("The prime_line_purge_distance of %.4f mm is too high and will exceed the max_extrude_cross_section!" % prime_line_purge_distance)} {% endif %} {% set prime_line_purge_distance = 0.98 * (max_extrude_cross_section * prime_line_length) / (3.14159 * (filament_diameter / 2)**2) %} {% set purge_volume = prime_line_purge_distance * 3.14159 * (filament_diameter / 2)**2 %} {% set line_width = purge_volume / (prime_line_height * prime_line_length) %} {% if verbose %} {action_respond_info("Klippain corrected the prime_line_purge_distance to %.4f mm" % prime_line_purge_distance)} {% endif %} {% endif %} {% if (prime_line_height / line_width) >= 0.5 %} {action_raise_error("The prime line will be too thin and will probably not stick properly to the bed. Increase its purge distance or decrease its length!")} {% endif %} {% set speed = (prime_line_flowrate / (prime_line_height * line_width)) * 60 |float %} {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE=0 {% endif %} {% if filament_sensor_enabled %} {% if (printer['filament_motion_sensor runout_sensor'] is defined and printer['filament_motion_sensor runout_sensor'].enabled) or (printer['filament_switch_sensor runout_sensor'] is defined and printer['filament_switch_sensor runout_sensor'].enabled) %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% set re_enable_filament_sensor = 1 %} {% endif %} {% endif %} G91 M83 {% if (printer.toolhead.position.z < 5) %} G1 Z5 F{Sz} {% endif %} G90 G0 X{prime_line_x} Y{prime_line_y} F{St} G1 Z{prime_line_height} F{Sz|int / 2} G92 E0 G1 E{prime_line_unretract_length} F300 G92 E0 {% if prime_line_direction == "X" %} G1 X{prime_line_x + prime_line_way*prime_line_length} E{prime_line_purge_distance} F{speed} {% if prime_line_wipe %} G0 X{prime_line_x + prime_line_way*prime_line_wipe_length} F{St} {% endif %} {% elif prime_line_direction == "Y" %} G1 Y{prime_line_y + prime_line_way*prime_line_length} E{prime_line_purge_distance} F{speed} {% if prime_line_wipe %} G0 Y{prime_line_y + prime_line_way*prime_line_wipe_length} F{St} {% endif %} {% else %} { action_respond_error("Prime line direction is not valid. Choose either X or Y in the variables.cfg file!") } {% endif %} G92 E0 G1 E-0.2 F2100 G92 E0 G1 Z3 F{Sz} G91 G1 X2 Y2 F{St} G90 M400 {% if klippain_mmu_enabled %} _KLIPPAIN_MMU_SET_CLOGDETECTION STATE={printer.mmu.clog_detection} {% endif %} {% if filament_sensor_enabled and re_enable_filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% endif %} [gcode_macro CLEAN_NOZZLE] description = Wipe the nozzle on the brush gcode = {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% set purgeclean_servo_enabled = printer["gcode_macro _USER_VARIABLES"].purgeclean_servo_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set brush_clean_accel = printer["gcode_macro _USER_VARIABLES"].brush_clean_accel %} {% set brush_over_y_axis = printer["gcode_macro _USER_VARIABLES"].brush_over_y_axis %} {% set brush_offset = printer["gcode_macro _USER_VARIABLES"].brush_center_offset|default(0)|float %} {% set brush_size = printer["gcode_macro _USER_VARIABLES"].brush_width_x|default(40)|float %} {% set brushes = printer["gcode_macro _USER_VARIABLES"].brushes|default(6)|int %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% if purge_and_brush_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set Sc = printer["gcode_macro _USER_VARIABLES"].brush_clean_speed * 60 %} {% set Bx, By, Bz = printer["gcode_macro _USER_VARIABLES"].brush_xyz|map('float') %} {% set Bx = Bx + brush_offset %} {% if status_leds_enabled %} STATUS_LEDS COLOR="CLEANING" {% endif %} {% if verbose %} RESPOND MSG="Nozzle cleaning..." {% endif %} {% set saved_accel = printer.toolhead.max_accel %} SET_VELOCITY_LIMIT ACCEL={brush_clean_accel} G90 _CONDITIONAL_MOVE_TO_PURGE_BUCKET Z_DROP=1 G1 X{Bx} Y{By} F{St} G1 Z{Bz} F{St} G91 {% if brush_over_y_axis %} {% for wipe in range(brushes) %} G1 Y-5 F{Sc} G1 Y+5 F{Sc} {% endfor %} {% endif %} {% if brush_offset < 0 %} G1 X+{ brush_size/2 } F{Sc} {% else %} G1 X+{ (brush_size/2) - brush_offset} F{Sc} {% endif %} {% for wipe in range(brushes) %} G1 X-{ (brush_size) - brush_offset } F{Sc} G1 X+{ (brush_size) - brush_offset } F{Sc} {% endfor %} G90 SET_VELOCITY_LIMIT ACCEL={saved_accel} {% if purgeclean_servo_enabled %} _SERVO_RETRACT ITEM="clean" {% endif %} {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="READY" {% endif %} [gcode_macro PURGE] description = Purge a specific amount of filament ontop of the purge bucket gcode = {% set DISTANCE = params.DISTANCE|default(printer["gcode_macro _USER_VARIABLES"].purge_distance)|int %} {% set OOZE_TIME = params.OOZE_TIME|default(printer["gcode_macro _USER_VARIABLES"].purge_ooze_time)|int %} {% set TEMP = params.TEMP|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% set Z_DROP = params.Z_DROP|default(1)|int %} {% set RETRACT = params.RETRACT|default(printer["gcode_macro _USER_VARIABLES"].retract_length)|default(20)|float %} {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% set purgeclean_servo_enabled = printer["gcode_macro _USER_VARIABLES"].purgeclean_servo_enabled %} {% set status_leds_enabled = printer["gcode_macro _USER_VARIABLES"].status_leds_enabled %} {% set filament_sensor_enabled = printer["gcode_macro _USER_VARIABLES"].filament_sensor_enabled %} {% set re_enable_filament_sensor = 0 %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% if purge_and_brush_enabled %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% if status_leds_enabled %} STATUS_LEDS COLOR="CLEANING" {% endif %} {% if verbose %} RESPOND MSG="Purge filament..." {% endif %} {% if filament_sensor_enabled %} {% if (printer['filament_motion_sensor runout_sensor'] is defined and printer['filament_motion_sensor runout_sensor'].enabled) or (printer['filament_switch_sensor runout_sensor'] is defined and printer['filament_switch_sensor runout_sensor'].enabled) %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=0 {% set re_enable_filament_sensor = 1 %} {% endif %} {% endif %} G90 _CONDITIONAL_MOVE_TO_PURGE_BUCKET Z_DROP={Z_DROP} _LOW_TEMP_CHECK T={TEMP} G92 E0 G1 E{DISTANCE|float} F150 G92 E0 G1 E-{RETRACT * 0.1} F2100 G1 E-{RETRACT - (RETRACT * 0.1)} F150 G92 E0 G4 P{OOZE_TIME * 1000} {% if filament_sensor_enabled and re_enable_filament_sensor %} SET_FILAMENT_SENSOR SENSOR="runout_sensor" ENABLE=1 {% endif %} {% if purgeclean_servo_enabled %} _SERVO_RETRACT ITEM="purge" {% endif %} {% endif %} {% if status_leds_enabled %} STATUS_LEDS COLOR="READY" {% endif %} [gcode_macro _CONDITIONAL_MOVE_TO_PURGE_BUCKET] description = Move over the purge bucket gcode = {% set Z_DROP = params.Z_DROP|default(1)|int %} {% set St = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set purge_and_brush_enabled = printer["gcode_macro _USER_VARIABLES"].purge_and_brush_enabled %} {% set purgeclean_servo_enabled = printer["gcode_macro _USER_VARIABLES"].purgeclean_servo_enabled %} {% set Px, Py, Pz = printer["gcode_macro _USER_VARIABLES"].purge_bucket_xyz|map('float') %} {% if purge_and_brush_enabled %} SAVE_GCODE_STATE NAME=CONDITIONAL_MOVE_TO_PURGE_BUCKET_STATE G90 {% if Z_DROP == 1 %} {% if purgeclean_servo_enabled %} G1 Z{Pz} F{Sz} _SERVO_DEPLOY ITEM="purge" {% endif %} G1 X{Px} Y{Py} F{St} G1 Z{Pz} F{St} {% else %} G1 X{Px} Y{Py} F{St} {% endif %} RESTORE_GCODE_STATE NAME=CONDITIONAL_MOVE_TO_PURGE_BUCKET_STATE {% endif %} [gcode_macro _LOW_TEMP_CHECK] description = Check the nozzle is at temperature and heat it if needed gcode = {% set T = params.T|default(printer["gcode_macro _USER_VARIABLES"].print_default_extruder_temp)|float %} {% if printer.extruder.target != 0 %} {% if printer.extruder.temperature < printer.extruder.target %} M109 S{printer.extruder.target|float} {% endif %} {% else %} {% if printer.extruder.target < T %} M109 S{T} {% endif %} {% endif %} [gcode_macro M701] description = Map M701 to LOAD_FILAMENT gcode = LOAD_FILAMENT [gcode_macro M702] description = Map M702 to UNLOAD_FILAMENT gcode = UNLOAD_FILAMENT [gcode_macro M600] description = Map M600 to CHANGE_FILAMENT gcode = CHANGE_FILAMENT [gcode_macro M125] description = Map M125 to PARK gcode = PARK [gcode_macro M900] description = Map M900 to SET_PRESSURE_ADVANCE gcode = {% if 'K' in params %} {% if 'E' in params %} SET_PRESSURE_ADVANCE EXTRUDER={params.E} ADVANCE={params.K} {% else %} SET_PRESSURE_ADVANCE ADVANCE={params.K} {% endif %} {% endif %} [gcode_macro M204] description = Map M204 to SET_VELOCITY_LIMIT for ACCEL rename_existing = M204.1 gcode = {% if 'S' in params %} {% set S = params.S|float %} SET_VELOCITY_LIMIT ACCEL={S} {% endif %} [gcode_macro M205] description = Map M205 to SET_VELOCITY_LIMIT for SQUARE_CORNER_VELOCITY gcode = {% if 'X' in params %} SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={params.X} {% elif 'Y' in params %} SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={params.Y} {% endif %} [gcode_macro G00] gcode = G0 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} [gcode_macro G01] gcode = G1 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} [gcode_macro G02] gcode = G2 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} [gcode_macro G03] gcode = G2 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} [gcode_macro G04] gcode = G4 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} [gcode_macro _SEARCH_VARS] description = Search for variables in the "printer" object from Klipper gcode = {% set search = params.S|lower %} {% set ns = namespace() %} {% for item in printer %} {% if ' ' in item %} {% set ns.path = ['printer', "['%s']" % (item), ''] %} {% else %} {% set ns.path = ['printer.', item, ''] %} {% endif %} {% if search in ns.path|lower %} { action_respond_info(ns.path|join) } {% endif %} {% if printer[item].items() %} {% for childkey, child in printer[item].items() recursive %} {% set ns.path = ns.path[:loop.depth|int + 1] %} {% if ' ' in childkey %} {% set null = ns.path.append("['%s']" % (childkey)) %} {% else %} {% set null = ns.path.append(".%s" % (childkey)) %} {% endif %} {% if child is mapping %} { loop(child.items()) } {% else %} {% if search in ns.path|lower %} { action_respond_info("%s : %s" % (ns.path|join, child)) } {% endif %} {% endif %} {% endfor %} {% endif %} {% endfor %} [delayed_gcode KLIPPAIN_STARTUP] initial_duration = 1 gcode = _KLIPPAIN_STARTUP [gcode_macro _KLIPPAIN_STARTUP] gcode = {% if printer["gcode_macro _USER_VARIABLES"].minidisplay_bootlogo_enabled %} _INIT_BOOT_LOGO {% endif %} RUN_SHELL_COMMAND CMD=system_info _INIT_MCU_VER {% set extruder_enabled = printer["gcode_macro _USER_VARIABLES"].extruder_enabled %} {% if not extruder_enabled %} { action_raise_error("Klippain need to have an extruder defined to work properly. Check your printer.cfg includes!") } {% endif %} _INIT_CHECKPROBECONF {% set e_driver = printer["gcode_macro _USER_VARIABLES"].e_driver|string %} {% if e_driver == "TMC2240" %} _INIT_TMC2240 {% endif %} {% set klippain_mmu_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_mmu_enabled %} {% set klippain_ercf_enabled = printer["gcode_macro _USER_VARIABLES"].klippain_ercf_enabled %} {% if klippain_mmu_enabled or klippain_ercf_enabled %} _INIT_CHECK_MMU {% endif %} _INIT_LEDS _INIT_USERCUSTOM {% if klippain_mmu_enabled %} RESPOND MSG="Klippain with MMU support started and ready!" {% else %} RESPOND MSG="Klippain started and ready!" {% endif %} [gcode_macro _INIT_LEDS] gcode = {% if printer["gcode_macro _USER_VARIABLES"].status_leds_enabled or printer["gcode_macro _USER_VARIABLES"].status_leds_caselight_enabled %} {% if printer["gcode_macro _USER_VARIABLES"].caselight_on_at_startup|default(False) %} {% if printer["gcode_macro _USER_VARIABLES"].light_enabled %} LIGHT_ON {% endif %} STATUS_LEDS COLOR="READY" {% else %} {% if printer["gcode_macro _USER_VARIABLES"].light_enabled %} LIGHT_OFF {% endif %} STATUS_LEDS COLOR="OFF" {% endif %} {% endif %} [gcode_macro _INIT_TMC2240] gcode = [gcode_macro _INIT_CHECKPROBECONF] gcode = {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled|string %} {% set zcalib_plugin_enabled = printer["gcode_macro _USER_VARIABLES"].zcalib_plugin_enabled %} {% set bed_mesh_enabled = printer["gcode_macro _USER_VARIABLES"].bed_mesh_enabled %} {% set qgl_enabled = printer["gcode_macro _USER_VARIABLES"].qgl_enabled %} {% set ztilt_enabled = printer["gcode_macro _USER_VARIABLES"].ztilt_enabled %} {% if zcalib_plugin_enabled %} {% if probe_type_enabled == "vorontap" %} { action_raise_error("Voron TAP Probe and Z calibration plugin cannot be used at the same time in Klippain!") } {% elif probe_type_enabled == "bltouch" %} { action_raise_error("BLTouch Probe and Z calibration plugin cannot be used at the same time in Klippain!") } {% elif probe_type_enabled == "inductive" %} { action_raise_error("Inductive probe and Z calibration plugin cannot be used at the same time in Klippain!") } {% elif probe_type_enabled == "dockable_virtual" or probe_type_enabled == "inductive_virtual" %} { action_raise_error("Virtual Z endstop probes are not compatible with the Z calibration plugin!") } {% elif probe_type_enabled == "none" %} { action_raise_error("You need a probe to use the Z calibration plugin in Klippain!") } {% endif %} {% endif %} {% if bed_mesh_enabled and probe_type_enabled == "none" %} { action_raise_error("You need a to define a probe to be able to perform a bed mesh in Klippain!") } {% endif %} {% if qgl_enabled and probe_type_enabled == "none" %} { action_raise_error("You need a to define a probe to be able to perform a quad gantry leveling in Klippain!") } {% endif %} {% if ztilt_enabled and probe_type_enabled == "none" %} { action_raise_error("You need a to define a probe to be able to perform a Z tilt adjust in Klippain!") } {% endif %} [gcode_macro _INIT_MCU_VER] gcode = {% set parameters = namespace(output = 'Currently configured MCU(s): \n') %} {% for name1 in printer %} {% for name2 in printer[name1] %} {% set show = ['mcu_version'] %} {% if name2 is in show %} {% set param = "%s: %s" % (name1, printer[name1][name2]) %} {% set parameters.output = parameters.output + param + "\n" %} {% endif %} {% endfor %} {% endfor %} {action_respond_info(parameters.output)} [gcode_macro _INIT_CHECK_MMU] gcode = {% if printer.mmu is not defined %} {% if printer.ercf is not defined %} { action_raise_error("MMU support is enabled in Klippain, but HappyHare, the supported MMU/ERCF backend software is not detected. See the corresponding documentation: https://github.com/Frix-x/klippain/blob/main/docs/mmu.md") } {% else %} { action_raise_error("ERCF support is enabled in Klippain, but the old version of version of HappyHare (ie. ERCF-Software-V3) is installed. Please uninstall it and install the latest HappyHare instead. See the corresponding documentation: https://github.com/Frix-x/klippain/blob/main/docs/mmu.md") } {% endif %} {% elif printer['gcode_macro _USER_VARIABLES'].mmu_force_homing_in_start_print is not defined or printer['gcode_macro _USER_VARIABLES'].mmu_unload_on_cancel_print is not defined or printer['gcode_macro _USER_VARIABLES'].mmu_unload_on_end_print is not defined or printer['gcode_macro _USER_VARIABLES'].mmu_check_gates_on_start_print is not defined or printer['gcode_macro _USER_VARIABLES'].mmu_check_errors_on_start_print is not defined %} { action_raise_error("MMU support is enabled in Klippain, but some variables are missing from your variables.cfg. Please update your template or refer to the corresponding documentation: https://github.com/Frix-x/klippain/blob/main/docs/mmu.md") } {% elif printer["gcode_macro _USER_VARIABLES"].mmu_check_errors_on_start_print and printer.mmu.print_start_detection|int == 1 %} RESPOND MSG="The HappyHare function to automatically detect the start and end of a print has been automatically disabled to allow early detection of an error during the Klippain START_PRINT sequence. This allow a more efficient debugging of the MMU. Refer to the <a href="https://github.com/Frix-x/klippain/blob/main/docs/mmu.md">Klippain MMU documentation</a>" MMU_TEST_CONFIG print_start_detection=0 {% endif %} [gcode_macro _INIT_USERCUSTOM] gcode = [stepper_x] rotation_distance = 40 microsteps = 32 full_steps_per_rotation = 200 step_pin = X_STEP dir_pin = X_DIR enable_pin = !X_ENABLE endstop_pin = X_STOP homing_speed = 60 homing_retract_dist = 0 position_endstop = 0 position_max = 235 [stepper_y] rotation_distance = 40 microsteps = 32 full_steps_per_rotation = 200 step_pin = Y_STEP dir_pin = Y_DIR enable_pin = !Y_ENABLE endstop_pin = Y_STOP homing_speed = 60 homing_retract_dist = 0 position_endstop = 0 position_max = 235 [stepper_z] rotation_distance = 8 microsteps = 32 full_steps_per_rotation = 200 step_pin = Z_STEP dir_pin = Z_DIR enable_pin = !Z_ENABLE endstop_pin = Z_STOP homing_speed = 15 second_homing_speed = 8 homing_retract_dist = 3.0 position_endstop = 0 position_max = 245 [stepper_z1] rotation_distance = 8 microsteps = 32 full_steps_per_rotation = 200 step_pin = Z1_STEP dir_pin = Z1_DIR enable_pin = !Z1_ENABLE [stepper_z2] rotation_distance = 8 microsteps = 32 full_steps_per_rotation = 200 step_pin = Z2_STEP dir_pin = Z2_DIR enable_pin = !Z2_ENABLE [gcode_macro _USER_VARIABLES] variable_heaterbed_enabled = True gcode = variable_probe_type_enabled = "dockable" variable_startprint_actions = "bed_soak", "extruder_preheating", "chamber_soak", "tilt_calib", "extruder_heating", "purge", "clean", "z_offset", "bedmesh", "primeline" variable_verbose = True variable_homing_travel_speed = 350 variable_travel_speed = 350 variable_z_drop_speed = 15 variable_brush_clean_speed = 100 variable_probe_dock_speed = 60 variable_homing_travel_accel = 3000 variable_tilting_travel_accel = 3000 variable_brush_clean_accel = 1500 variable_probe_dock_accel = 2000 variable_zendstop_position = -1, -1 variable_force_homing_in_start_print = False variable_homing_zhop = 5 variable_homing_first = "X" variable_homing_backoff_distance_xy = -5, -5 variable_sensorless_current_factor = 75 variable_probe_dock_margin_xy = 0, 0 variable_safe_extruder_temp = 150 variable_prime_line_xy = 5, 2.5 variable_prime_line_direction = "X" variable_prime_line_length = 40 variable_prime_line_purge_distance = 30 variable_prime_line_flowrate = 10 variable_prime_line_height = 0.6 variable_prime_line_margin = 5 variable_prime_line_wipe = False variable_retract_length = 20 variable_unretract_length = 23 variable_park_position_xy = -1, -1 variable_park_lift_z = 50 variable_disable_motors_in_end_print = False variable_turn_off_heaters_in_end_print = True variable_idle_timeout_on_pause = 0 variable_min_bed_xy = 0, 0 variable_max_bed_xy = 9999, 9999 variable_probe_min_z_travel = 20 variable_probe_stow_z_height = None variable_probe_dock_location_xy = -1, -1 variable_probe_servo_angle_retracted = 0 variable_probe_servo_angle_deployed = 90 variable_probe_before_attach_position = "front" variable_probe_after_attach_position = "front" variable_probe_before_dock_position = "front" variable_probe_after_dock_position = "left" variable_probe_move_attach_length = 30 variable_probe_move_dock_length = 30 variable_autodock_on_probe_error = True variable_tap_max_probing_temp = 150 variable_tap_deactivation_zhop = 5 variable_print_default_bed_temp = 105 variable_print_default_extruder_temp = 240 variable_print_default_chamber_temp = 0 variable_print_default_chamber_max_heating_time = 15 variable_print_default_soak = 8 variable_print_default_material = "XXX" variable_material_parameters = { 'PLA': { 'pressure_advance': 0.0525, 'retract_length': 0.75, 'unretract_extra_length': 0, 'retract_speed': 40, 'unretract_speed': 30, 'filter_speed': 0, 'additional_z_offset': 0, 'filament_sensor': 1 }, 'PET': { 'pressure_advance': 0.0650, 'retract_length': 1.4, 'unretract_extra_length': 0, 'retract_speed': 30, 'unretract_speed': 20, 'filter_speed': 0, 'additional_z_offset': 0.020, 'filament_sensor': 1 }, 'ABS': { 'pressure_advance': 0.0480, 'retract_length': 0.5, 'unretract_extra_length': 0, 'retract_speed': 40, 'unretract_speed': 30, 'filter_speed': 80, 'additional_z_offset': 0, 'filament_sensor': 1 }, 'TPU': { 'pressure_advance': 0.0500, 'retract_length': 0.2, 'unretract_extra_length': 0, 'retract_speed': 5, 'unretract_speed': 5, 'filter_speed': 0, 'additional_z_offset': 0.040, 'filament_sensor': 0 } } variable_mmu_force_homing_in_start_print = False variable_mmu_unload_on_cancel_print = False variable_mmu_unload_on_end_print = True variable_mmu_check_gates_on_start_print = False variable_mmu_check_errors_on_start_print = False variable_filter_default_time_on_end_print = 600 variable_purge_and_brush_enabled = False variable_force_homing_before_brush = False variable_brush_over_y_axis = True variable_brush_xyz = -1, -1, -1 variable_brush_width_x = 40 variable_brush_center_offset = 0 variable_brushes = 6 variable_purge_bucket_xyz = -1, -1, -1 variable_purge_distance = 30 variable_purge_ooze_time = 10 variable_purgeclean_servo_angle_retracted = 0 variable_purgeclean_servo_angle_deployed = 90 variable_light_intensity_start_print = 100 variable_light_intensity_printing = 30 variable_light_intensity_end_print = 0 variable_caselight_on_at_startup = False variable_fix_heaters_temperature_settle = False variable_resonnance_test_point_xy = -1, -1 variable_resonnance_test_z_clearance = 50 variable_x_driver = "tmc2209" variable_y_driver = "tmc2209" variable_z_driver = "tmc2209" variable_e_driver = "tmc2209" [heater_bed] heater_pin = BED_HEATER sensor_type = EPCOS 100K B57560G104F sensor_pin = BED_TEMPERATURE max_power = 1 min_temp = 0 max_temp = 100 control = pid pid_kp = 38.771 pid_ki = 1.746 pid_kd = 215.177 [gcode_macro M190] rename_existing = M190.1 gcode = {% set S = params.S|float %} {% set actual_temp = printer.heater_bed.temperature|float %} {% set fix_heaters_temperature_settle = printer["gcode_macro _USER_VARIABLES"].fix_heaters_temperature_settle %} {% if fix_heaters_temperature_settle %} M140 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} {% if S != 0 %} {% if actual_temp <= S %} TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={S} {% else %} TEMPERATURE_WAIT SENSOR=heater_bed MAXIMUM={S} {% endif %} {% endif %} {% else %} M190.1 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} {% endif %} [gcode_macro ACTIVATE_PROBE] description = Put the machine in a state being able to probe variable_temperature = 0 gcode = {% set LOCK = params.LOCK|default(False, boolean=true) %} {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled %} {% set tap_max_probing_temp = printer["gcode_macro _USER_VARIABLES"].tap_max_probing_temp|float %} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _CHECK_PROBE action=query {% if LOCK %} _ATTACH_PROBE_LOCK {% else %} _ATTACH_PROBE {% endif %} {% elif probe_type_enabled == "vorontap" %} SAVE_GCODE_STATE NAME=BEFORE_TAP_ACTION {% set ACTUAL_TEMP = printer.extruder.temperature %} {% set TARGET_TEMP = printer.extruder.target %} SET_GCODE_VARIABLE MACRO=ACTIVATE_PROBE VARIABLE=temperature VALUE={TARGET_TEMP} {% if TARGET_TEMP > tap_max_probing_temp %} { action_respond_info('Extruder temperature target of %.1fC is too high for TAP probing, lowering to %.1fC' % (TARGET_TEMP, tap_max_probing_temp)) } M106 S255 M109 S{tap_max_probing_temp} M106 S0 {% else %} {% if ACTUAL_TEMP > tap_max_probing_temp + 3 %} M106 S255 TEMPERATURE_WAIT SENSOR=extruder MAXIMUM={tap_max_probing_temp} M106 S0 {% endif %} {% endif %} {% endif %} [gcode_macro DEACTIVATE_PROBE] description = Revert the machine to a normal state after probing gcode = {% set UNLOCK = params.UNLOCK|default(False, boolean=true) %} {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled %} {% set tap_deactivation_zhop = printer["gcode_macro _USER_VARIABLES"].tap_deactivation_zhop %} {% set Sz = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% if probe_type_enabled == "dockable" or probe_type_enabled == "dockable_virtual" %} _CHECK_PROBE action=query {% if UNLOCK %} _DOCK_PROBE_UNLOCK {% else %} _DOCK_PROBE {% endif %} {% elif probe_type_enabled == "vorontap" %} {% set z_safe = printer.toolhead.position.z + tap_deactivation_zhop %} {% if z_safe > printer.toolhead.axis_maximum.z %} {% set z_safe = printer.toolhead.axis_maximum.z %} {% endif %} G90 G1 Z{z_safe} F{Sz} {% set old_target_temperature = printer["gcode_macro ACTIVATE_PROBE"].temperature %} M109 S{old_target_temperature} RESTORE_GCODE_STATE NAME=BEFORE_TAP_ACTION {% endif %} [gcode_macro _PROBE_VARIABLES] variable_probe_attached = False variable_probe_state = False variable_probe_lock = False gcode = [gcode_macro _EXIT_POINT] gcode = {% set function = 'pre_' ~ params.FUNCTION %} {% set move = params.MOVE|default(0) %} {% set speed = params.MOVE_SPEED|default(0) %} RESTORE_GCODE_STATE NAME={function} MOVE={move} MOVE_SPEED={speed} [gcode_macro _ENTRY_POINT] gcode = {% set function = 'pre_' ~ params.FUNCTION %} SAVE_GCODE_STATE NAME={function} G90 [gcode_macro _HOMING_VARIABLES] gcode = {% set Reset = params.RESET|default(0) %} {% if Reset %} SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_lock VALUE={ False } {% endif %} [gcode_macro _ATTACH_PROBE_LOCK] description = Attaches probe, can only be docked after unlocking gcode = _ATTACH_PROBE SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_lock VALUE={ True } [gcode_macro _DOCK_PROBE_UNLOCK] description = Docks probe even if it was locked gcode = SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_lock VALUE={ False } _DOCK_PROBE [gcode_macro _PROBE_UNLOCK] description = Unlocks probe state gcode = SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_lock VALUE={ False } [gcode_macro _PROBE_LOCK] description = Locks probe state gcode = SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_lock VALUE={ True } [gcode_macro _PROBE_MOVE_TO] description = positioning toolhead for dock/attach operation gcode = {% set location = params.LOCATION|default('')|string %} {% set distance = params.DISTANCE|default(0)|float %} {% set speed = params.SPEED|default(0)|float %} {% set probe_dock_location_x, probe_dock_location_y = printer["gcode_macro _USER_VARIABLES"].probe_dock_location_xy|map('float') %} {% set location_factor = { 'left' : { 'x': -1, 'y': 0 }, 'right' : { 'x': 1, 'y': 0 }, 'front' : { 'x': 0, 'y': -1 }, 'back' : { 'x': 0, 'y': 1 }, 'dock' : { 'x': 0, 'y': 0 } } %} {% if location in location_factor %} G1 X{probe_dock_location_x + location_factor[location].x * distance} Y{probe_dock_location_y + location_factor[location].y * distance} F{speed} {% else %} { action_raise_error("Error in probe attach/dock movement. Check the directions in your variables.cfg file!") } {% endif %} [gcode_macro _ATTACH_PROBE] description = Attaches probe gcode = {% set probe_attached = printer["gcode_macro _PROBE_VARIABLES"].probe_attached %} {% set probe_lock = printer["gcode_macro _PROBE_VARIABLES"].probe_lock %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set probe_dock_location_x, probe_dock_location_y = printer["gcode_macro _USER_VARIABLES"].probe_dock_location_xy|map('float') %} {% set probe_before_attach_position = printer["gcode_macro _USER_VARIABLES"].probe_before_attach_position|string %} {% set probe_after_attach_position = printer["gcode_macro _USER_VARIABLES"].probe_after_attach_position|string %} {% set probe_move_attach_length = printer["gcode_macro _USER_VARIABLES"].probe_move_attach_length %} {% set probe_min_z_travel = printer["gcode_macro _USER_VARIABLES"].probe_min_z_travel|float %} {% set probe_dock_speed = printer["gcode_macro _USER_VARIABLES"].probe_dock_speed * 60 %} {% set probe_dock_accel = printer["gcode_macro _USER_VARIABLES"].probe_dock_accel %} {% set travel_speed = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set z_drop_speed = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set probe_servo_enabled = printer["gcode_macro _USER_VARIABLES"].probe_servo_enabled %} {% set probe_type_enabled = printer["gcode_macro _USER_VARIABLES"].probe_type_enabled|string %} _ENTRY_POINT FUNCTION=ATTACH_PROBE {% if probe_type_enabled == "dockable" and not 'xyz' in printer.toolhead.homed_axes %} { action_raise_error("Must home all axis first to attach the probe!") } {% elif probe_type_enabled == "dockable_virtual" and not 'xy' in printer.toolhead.homed_axes %} { action_raise_error("Must home XY axes first to attach the probe!") } {% elif not probe_attached and not probe_lock %} {% if verbose %} { action_respond_info("Attaching Probe") } {% endif %} {% if probe_type_enabled == "dockable_virtual" and not 'z' in printer.toolhead.homed_axes %} {% if verbose %} { action_respond_info("Attaching the probe can only be done during G28 if Z is not already homed") } {% endif %} {% endif %} {% if (printer.toolhead.position.z < probe_min_z_travel) %} {% if verbose %} { action_respond_info("Moving to a safe Z distance") } {% endif %} G0 Z{probe_min_z_travel} F{z_drop_speed} {% endif %} {% set saved_accel = printer.toolhead.max_accel %} M204 S{probe_dock_accel} _PROBE_MOVE_TO LOCATION={probe_before_attach_position} DISTANCE={probe_move_attach_length} SPEED={travel_speed} {% if probe_servo_enabled %} _SERVO_DEPLOY ITEM="probe" {% endif %} _PROBE_MOVE_TO LOCATION='dock' SPEED={probe_dock_speed} _PROBE_MOVE_TO LOCATION={probe_after_attach_position} DISTANCE={probe_move_attach_length} SPEED={probe_dock_speed} {% if probe_servo_enabled %} _SERVO_RETRACT ITEM="probe" {% endif %} SET_VELOCITY_LIMIT ACCEL={saved_accel} _CHECK_PROBE action=attach {% elif probe_lock %} {% if verbose %} { action_respond_info("Probe locked!") } {% endif %} _CHECK_PROBE action=query {% else %} {% if verbose %} { action_respond_info("Probe already attached!") } {% endif %} _CHECK_PROBE action=query {% endif %} _EXIT_POINT FUNCTION=ATTACH_PROBE [gcode_macro _DOCK_PROBE] description = Docks probe gcode = {% set probe_attached = printer["gcode_macro _PROBE_VARIABLES"].probe_attached %} {% set probe_lock = printer["gcode_macro _PROBE_VARIABLES"].probe_lock %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% set probe_dock_location_x, probe_dock_location_y = printer["gcode_macro _USER_VARIABLES"].probe_dock_location_xy|map('float') %} {% set probe_before_dock_position = printer["gcode_macro _USER_VARIABLES"].probe_before_dock_position|string %} {% set probe_after_dock_position = printer["gcode_macro _USER_VARIABLES"].probe_after_dock_position|string %} {% set probe_move_dock_length = printer["gcode_macro _USER_VARIABLES"].probe_move_dock_length %} {% set probe_min_z_travel = printer["gcode_macro _USER_VARIABLES"].probe_min_z_travel|float %} {% set probe_dock_speed = printer["gcode_macro _USER_VARIABLES"].probe_dock_speed * 60 %} {% set probe_dock_accel = printer["gcode_macro _USER_VARIABLES"].probe_dock_accel %} {% set travel_speed = printer["gcode_macro _USER_VARIABLES"].travel_speed * 60 %} {% set z_drop_speed = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set probe_servo_enabled = printer["gcode_macro _USER_VARIABLES"].probe_servo_enabled %} {% set probe_stow_z_height = printer["gcode_macro _USER_VARIABLES"].probe_stow_z_height|default(None) %} _ENTRY_POINT FUNCTION=DOCK_PROBE {% if probe_type_enabled == "dockable" and not 'xyz' in printer.toolhead.homed_axes %} { action_raise_error("Must home all axis first to dock the probe!") } {% elif probe_type_enabled == "dockable_virtual" and not 'xy' in printer.toolhead.homed_axes %} { action_raise_error("Must home XY axes first to dock the probe!") } {% elif probe_attached and not probe_lock %} {% if verbose %} { action_respond_info("Docking Probe") } {% endif %} {% if probe_type_enabled == "dockable_virtual" and not 'z' in printer.toolhead.homed_axes %} {% if verbose %} { action_respond_info("Docking the probe can only be done during G28 if Z is not already homed") } {% endif %} {% endif %} {% if (printer.toolhead.position.z < probe_min_z_travel) %} {% if verbose %} { action_respond_info("Moving to a safe Z distance") } {% endif %} G0 Z{probe_min_z_travel} F{z_drop_speed} {% endif %} {% set saved_accel = printer.toolhead.max_accel %} M204 S{probe_dock_accel} _PROBE_MOVE_TO LOCATION={probe_before_dock_position} DISTANCE={probe_move_dock_length} SPEED={travel_speed} {% if probe_servo_enabled %} _SERVO_DEPLOY ITEM="probe" {% endif %} _PROBE_MOVE_TO LOCATION='dock' SPEED={probe_dock_speed} {% if probe_stow_z_height is not none %} G0 Z{probe_stow_z_height} F{z_drop_speed} {% endif %} _PROBE_MOVE_TO LOCATION={probe_after_dock_position} DISTANCE={probe_move_dock_length} SPEED={probe_dock_speed} {% if probe_servo_enabled %} _SERVO_RETRACT ITEM="probe" {% endif %} SET_VELOCITY_LIMIT ACCEL={saved_accel} G4 P500 _CHECK_PROBE action=dock {% elif probe_lock %} {% if verbose %} { action_respond_info("Probe locked!") } {% endif %} _CHECK_PROBE action=query {% else %} {% if verbose %} { action_respond_info("Probe already docked!") } {% endif %} _CHECK_PROBE action=query {% endif %} _EXIT_POINT FUNCTION=DOCK_PROBE [gcode_macro _CHECK_PROBE] variable_probe_state = 0 gcode = Query_Probe _SET_PROBE_STATE action={ params.ACTION } [gcode_macro _SET_PROBE_STATE] gcode = {% set probe_last_query = printer.probe.last_query %} {% set verbose = printer["gcode_macro _USER_VARIABLES"].verbose %} {% if probe_last_query %} SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_attached VALUE={ False } {% else %} SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_attached VALUE={ True } {% endif %} {% if params.ACTION == 'query' %} SET_GCODE_VARIABLE MACRO=_PROBE_VARIABLES VARIABLE=probe_state VALUE={ probe_last_query } {% endif %} {% if (not probe_last_query and params.ACTION == 'dock') %} { action_raise_error("Probe dock failed!") } {% endif %} {% if probe_last_query and params.ACTION == 'attach' %} { action_raise_error("Probe attach failed!") } {% endif %} [gcode_macro PROBE_CALIBRATE] rename_existing = _BASE_PROBE_CALIBRATE description = Calibrate the probe z_offset with klicky automount gcode = {% set probe_min_z_travel = printer["gcode_macro _USER_VARIABLES"].probe_min_z_travel|float %} {% set z_drop_speed = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set travel_speed = printer["gcode_macro _USER_VARIABLES"].travel_speed %} {% set min_bed_x, min_bed_y = printer["gcode_macro _USER_VARIABLES"].min_bed_xy|map('float') %} {% set max_bed_x, max_bed_y = printer["gcode_macro _USER_VARIABLES"].max_bed_xy|map('float') %} {% set probe_offset_x = printer['configfile'].config["probe"]["x_offset"]|float %} {% set probe_offset_y = printer['configfile'].config["probe"]["y_offset"]|float %} {% if not 'xyz' in printer.toolhead.homed_axes %} { action_raise_error("Must home axis first!") } {% endif %} {% if (printer['gcode_move'].position.x + probe_offset_x) >= max_bed_x or (printer['gcode_move'].position.y + probe_offset_y) >= max_bed_y or (printer['gcode_move'].position.x + probe_offset_x) <= min_bed_x or (printer['gcode_move'].position.y + probe_offset_y) <= min_bed_y %} { action_raise_error("You must perform PROBE_CALIBRATE with the probe inside the BED area, check variables min/max_bed_xy !") } {% endif %} {% if (printer.toolhead.position.z < probe_min_z_travel) %} G0 Z{probe_min_z_travel} F{z_drop_speed} {% endif %} M400 _ENTRY_POINT FUNCTION=PROBE_CALIBRATE ACTIVATE_PROBE _EXIT_POINT FUNCTION=PROBE_CALIBRATE MOVE=1 MOVE_SPEED={travel_speed} _BASE_PROBE_CALIBRATE {% for p in params %}{'%s=%s ' % (p, params[p])}{% endfor %} M400 _ENTRY_POINT FUNCTION=PROBE_CALIBRATE DEACTIVATE_PROBE _EXIT_POINT FUNCTION=PROBE_CALIBRATE MOVE=1 MOVE_SPEED={travel_speed} [gcode_macro PROBE_ACCURACY] rename_existing = _BASE_PROBE_ACCURACY description = Probe Z-height accuracy at current XY position with klicky automount gcode = {% set probe_min_z_travel = printer["gcode_macro _USER_VARIABLES"].probe_min_z_travel|float %} {% set z_drop_speed = printer["gcode_macro _USER_VARIABLES"].z_drop_speed * 60 %} {% set travel_speed = printer["gcode_macro _USER_VARIABLES"].travel_speed %} {% set min_bed_x, min_bed_y = printer["gcode_macro _USER_VARIABLES"].min_bed_xy|map('float') %} {% set max_bed_x, max_bed_y = printer["gcode_macro _USER_VARIABLES"].max_bed_xy|map('float') %} {% set probe_offset_x = printer['configfile'].config["probe"]["x_offset"]|float %} {% set probe_offset_y = printer['configfile'].config["probe"]["y_offset"]|float %} {% if not 'xyz' in printer.toolhead.homed_axes %} { action_raise_error("Must home axis first!") } {% endif %} {% if (printer['gcode_move'].position.x + probe_offset_x) >= max_bed_x or (printer['gcode_move'].position.y + probe_offset_y) >= max_bed_y or (printer['gcode_move'].position.x + probe_offset_x) <= min_bed_x or (printer['gcode_move'].position.y + probe_offset_y) <= min_bed_y %} { action_raise_error("You must perform PROBE_ACCURACY with the probe inside the BED area, check variables min/max_bed_xy !") } {% endif %} {% if (printer.toolhead.position.z < probe_min_z_travel) %} G0 Z{probe_min_z_travel} F{z_drop_speed} {% endif %} M400 _ENTRY_POINT FUNCTION=PROBE_ACCURACY ACTIVATE_PROBE _EXIT_POINT FUNCTION=PROBE_ACCURACY MOVE=1 MOVE_SPEED={travel_speed} _BASE_PROBE_ACCURACY {% for p in params %}{'%s=%s ' % (p, params[p])}{% endfor %} M400 _ENTRY_POINT FUNCTION=PROBE_CALIBRATE DEACTIVATE_PROBE _EXIT_POINT FUNCTION=PROBE_ACCURACY MOVE=1 MOVE_SPEED={travel_speed} [gcode_macro _PROBE_ON_ERROR_ACTION] variable_probing = False gcode = {% set autodock_on_probe_error = printer["gcode_macro _USER_VARIABLES"].autodock_on_probe_error %} {% set probing = printer["gcode_macro _PROBE_ON_ERROR_ACTION"].probing %} {% if autodock_on_probe_error and probing %} DEACTIVATE_PROBE {% endif %} SET_GCODE_VARIABLE MACRO=_PROBE_ON_ERROR_ACTION VARIABLE=probing VALUE=False [probe] pin = ^PROBE_INPUT x_offset = 0 y_offset = 19.75 z_offset = 6.42 speed = 8 lift_speed = 15 samples = 2 samples_result = median sample_retract_dist = 2.0 samples_tolerance = 0.007 samples_tolerance_retries = 3 [heater_fan hotend_fan] pin = E_FAN max_power = 1.0 kick_start_time = 0.100 heater = extruder heater_temp = 50.0 [fan] pin = PART_FAN kick_start_time = 0.100 cycle_time = 0.010 [controller_fan controller_fan] pin = CONTROLLER_FAN kick_start_time = 0.5 fan_speed = 1.0 idle_timeout = 60 [temperature_sensor Raspberry_Pi] sensor_type = temperature_host [temperature_sensor mcu] sensor_type = temperature_mcu min_temp = 0 max_temp = 90 [input_shaper] shaper_freq_x = 56.4 shaper_type_x = zv shaper_freq_y = 38.4 shaper_type_y = mzv [save_variables] filename = ~/printer_data/config/save_variables.cfg [tmc2209 stepper_x] uart_pin = X_TMCUART interpolate = True run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [tmc2209 stepper_y] uart_pin = Y_TMCUART interpolate = True run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [tmc2209 stepper_z] uart_pin = Z_TMCUART interpolate = True run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [tmc2209 stepper_z1] uart_pin = Z1_TMCUART interpolate = True run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [tmc2209 stepper_z2] uart_pin = Z2_TMCUART interpolate = True run_current = 0.8 sense_resistor = 0.110 stealthchop_threshold = 0 [tmc2209 extruder] uart_pin = E_TMCUART interpolate = True run_current = 0.45 sense_resistor = 0.110 stealthchop_threshold = 0 [mcu] serial = usb-Klipper_stm32f446xx_4A0031000151303532383235-if00 [board_pins mcu_manufacturer] aliases = MCU_MOTOR0_STEP=PF13 , MCU_MOTOR0_DIR=PF12 , MCU_MOTOR0_ENABLE=PF14 , MCU_MOTOR0_UART=PC4 , MCU_MOTOR1_STEP=PG0 , MCU_MOTOR1_DIR=PG1 , MCU_MOTOR1_ENABLE=PF15 , MCU_MOTOR1_UART=PD11 , MCU_MOTOR2_1_STEP=PF11 , MCU_MOTOR2_1_DIR=PG3 , MCU_MOTOR2_1_ENABLE=PG5 , MCU_MOTOR2_1_UART=PC6 , MCU_MOTOR3_STEP=PG4 , MCU_MOTOR3_DIR=PC1 , MCU_MOTOR3_ENABLE=PA0 , MCU_MOTOR3_UART=PC7 , MCU_MOTOR4_STEP=PF9 , MCU_MOTOR4_DIR=PF10 , MCU_MOTOR4_ENABLE=PG2 , MCU_MOTOR4_UART=PF2 , MCU_MOTOR5_STEP=PC13 , MCU_MOTOR5_DIR=PF0 , MCU_MOTOR5_ENABLE=PF1 , MCU_MOTOR5_UART=PE4 , MCU_MOTOR6_STEP=PE2 , MCU_MOTOR6_DIR=PE3 , MCU_MOTOR6_ENABLE=PD4 , MCU_MOTOR6_UART=PE1 , MCU_MOTOR7_STEP=PE6 , MCU_MOTOR7_DIR=PA14 , MCU_MOTOR7_ENABLE=PE0 , MCU_MOTOR7_UART=PD3 , MCU_STOP0=PG6 , MCU_STOP1=PG9 , MCU_STOP2=PG10 , MCU_STOP3=PG11 , MCU_STOP4=PG12 , MCU_STOP5=PG13 , MCU_STOP6=PG14 , MCU_STOP7=PG15 , MCU_PROBE=PB7 , MCU_SERVOS=PB6 , MCU_HE0=PA2 , MCU_HE1=PA3 , MCU_HE2=PB10 , MCU_HE3=PB11 , MCU_BED0=PA1 , MCU_TB=PF3 , MCU_T0=PF4 , MCU_T1=PF5 , MCU_T2=PF6 , MCU_T3=PF7 , MCU_FAN0=PA8 , MCU_FAN1=PE5 , MCU_FAN2=PD12 , MCU_FAN3=PD13 , MCU_FAN4=PD14 , MCU_FAN5=PD15 , MCU_NEOPIXEL=PB0 , MCU_PS_ON=PE11 , MCU_POWER_DET=PC0 , EXP1_1=PE8 , EXP1_2=PE7 , EXP1_3=PE9 , EXP1_4=PE10 , EXP1_5=PE12 , EXP1_6=PE13 , EXP1_7=PE14 , EXP1_8=PE15 , EXP1_9=<GND> , EXP1_10=<5V> , EXP2_1=PA6 , EXP2_2=PA5 , EXP2_3=PB1 , EXP2_4=PA4 , EXP2_5=PB2 , EXP2_6=PA7 , EXP2_7=PC15 , EXP2_8=<RST> , EXP2_9=<GND> , EXP2_10=<5V> , [board_pins octopus_mcu] mcu = mcu aliases = X_STEP=MCU_MOTOR0_STEP , X_DIR=MCU_MOTOR0_DIR , X_ENABLE=MCU_MOTOR0_ENABLE , X_TMCUART=MCU_MOTOR0_UART , Y_STEP=MCU_MOTOR1_STEP , Y_DIR=MCU_MOTOR1_DIR , Y_ENABLE=MCU_MOTOR1_ENABLE , Y_TMCUART=MCU_MOTOR1_UART , Z_STEP=MCU_MOTOR2_1_STEP , Z_DIR=MCU_MOTOR2_1_DIR , Z_ENABLE=MCU_MOTOR2_1_ENABLE , Z_TMCUART=MCU_MOTOR2_1_UART , Z1_STEP=MCU_MOTOR3_STEP , Z1_DIR=MCU_MOTOR3_DIR , Z1_ENABLE=MCU_MOTOR3_ENABLE , Z1_TMCUART=MCU_MOTOR3_UART , Z2_STEP=MCU_MOTOR4_STEP , Z2_DIR=MCU_MOTOR4_DIR , Z2_ENABLE=MCU_MOTOR4_ENABLE , Z2_TMCUART=MCU_MOTOR4_UART , Z3_STEP=MCU_MOTOR5_STEP , Z3_DIR=MCU_MOTOR5_DIR , Z3_ENABLE=MCU_MOTOR5_ENABLE , Z3_TMCUART=MCU_MOTOR5_UART , E_STEP=MCU_MOTOR6_STEP , E_DIR=MCU_MOTOR6_DIR , E_ENABLE=MCU_MOTOR6_ENABLE , E_TMCUART=MCU_MOTOR6_UART , X_STOP=MCU_STOP0 , Y_STOP=MCU_STOP1 , Z_STOP=MCU_STOP2 , PROBE_INPUT=MCU_STOP7 , RUNOUT_SENSOR=MCU_STOP3 , E_HEATER=MCU_HE0 , E_TEMPERATURE=MCU_T0 , BED_HEATER=MCU_HE1 , BED_TEMPERATURE=MCU_TB , PART_FAN=MCU_FAN0 , E_FAN=MCU_FAN1 , CONTROLLER_FAN=MCU_FAN2 , EXHAUST_FAN=MCU_FAN3 , FILTER_FAN=MCU_FAN4 , HOST_CONTROLLER_FAN=MCU_FAN5 , CHAMBER_TEMPERATURE=MCU_T1 , ELECTRICAL_CABINET_TEMPERATURE=MCU_T2 , LIGHT_OUTPUT=MCU_HE2 , LIGHT_NEOPIXEL=MCU_STOP5 , STATUS_NEOPIXEL=MCU_NEOPIXEL , SERVO_PIN=MCU_SERVOS , [extruder] step_pin = PE2 dir_pin = PE3 enable_pin = !PD4 heater_pin = PA2 sensor_pin = PA0 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 26.359 nozzle_diameter = 0.400 filament_diameter = 1.750 max_extrude_only_distance = 1000 max_extrude_only_velocity = 120 pressure_advance = 0.03 pressure_advance_smooth_time = 0.03 sensor_type = EPCOS 100K B57560G104F control = pid pid_kp = 26.015 pid_ki = 1.770 pid_kd = 95.603 min_temp = 0 max_temp = 300 ======================= Extruder max_extrude_ratio=0.266081 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' webhooks client 548456163312: New connection webhooks client 548456163312: Client info {'program': 'Moonraker', 'version': 'v0.9.3-67-g4eb23ef'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port usb-Klipper_stm32f446xx_4A0031000151303532383235-if00: [Errno 2] No such file or directory: 'usb-Klipper_stm32f446xx_4A0031000151303532383235-if00' MCU error during connect Traceback (most recent call last): File "/home/E3NG/klipper/klippy/mcu.py", line 794, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/E3NG/klipper/klippy/serialhdl.py", line 183, in connect_uart self._error("Unable to connect") File "/home/E3NG/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'mcu': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/E3NG/klipper/klippy/klippy.py", line 131, in _connect self.send_event("klippy:mcu_identify") File "/home/E3NG/klipper/klippy/klippy.py", line 223, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/E3NG/klipper/klippy/klippy.py", line 223, in <listcomp> return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/E3NG/klipper/klippy/mcu.py", line 799, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect mcu 'mcu': Unable to connect Once the underlying issue is corrected, use the "FIRMWARE_RESTART" command to reset the firmware, reload the config, and restart the host software. Error configuring printer Build file /home/E3NG/klipper/klippy/../.config(3600): Tue Mar 11 18:00:12 2025 ========= Last MCU build config ========= CONFIG_LOW_LEVEL_OPTIONS=y # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set CONFIG_MACH_STM32=y # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RPXXXX is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set # CONFIG_MACH_LINUX is not set # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="stm32" CONFIG_MCU="stm32f446xx" CONFIG_CLOCK_FREQ=180000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x80000 CONFIG_FLASH_BOOT_ADDRESS=0x8000000 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x20000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x8008000 CONFIG_STM32_SELECT=y # CONFIG_MACH_STM32F103 is not set # CONFIG_MACH_STM32F207 is not set # CONFIG_MACH_STM32F401 is not set # CONFIG_MACH_STM32F405 is not set # CONFIG_MACH_STM32F407 is not set # CONFIG_MACH_STM32F429 is not set CONFIG_MACH_STM32F446=y # CONFIG_MACH_STM32F765 is not set # CONFIG_MACH_STM32F031 is not set # CONFIG_MACH_STM32F042 is not set # CONFIG_MACH_STM32F070 is not set # CONFIG_MACH_STM32F072 is not set # CONFIG_MACH_STM32G070 is not set # CONFIG_MACH_STM32G071 is not set # CONFIG_MACH_STM32G0B0 is not set # CONFIG_MACH_STM32G0B1 is not set # CONFIG_MACH_STM32G431 is not set # CONFIG_MACH_STM32G474 is not set # CONFIG_MACH_STM32H723 is not set # CONFIG_MACH_STM32H743 is not set # CONFIG_MACH_STM32H750 is not set # CONFIG_MACH_STM32L412 is not set # CONFIG_MACH_N32G452 is not set # CONFIG_MACH_N32G455 is not set CONFIG_MACH_STM32F4=y CONFIG_HAVE_STM32_USBOTG=y CONFIG_HAVE_STM32_CANBUS=y CONFIG_HAVE_STM32_USBCANBUS=y CONFIG_STM32_DFU_ROM_ADDRESS=0x1fff0000 CONFIG_STM32_FLASH_START_8000=y # CONFIG_STM32_FLASH_START_10000 is not set # CONFIG_STM32_FLASH_START_0000 is not set # CONFIG_STM32_CLOCK_REF_8M is not set CONFIG_STM32_CLOCK_REF_12M=y # CONFIG_STM32_CLOCK_REF_16M is not set # CONFIG_STM32_CLOCK_REF_20M is not set # CONFIG_STM32_CLOCK_REF_24M is not set # CONFIG_STM32_CLOCK_REF_25M is not set # CONFIG_STM32_CLOCK_REF_INTERNAL is not set CONFIG_CLOCK_REF_FREQ=12000000 CONFIG_STM32F0_TRIM=16 CONFIG_STM32_USB_PA11_PA12=y # CONFIG_STM32_SERIAL_USART1 is not set # CONFIG_STM32_SERIAL_USART1_ALT_PB7_PB6 is not set # CONFIG_STM32_SERIAL_USART2 is not set # CONFIG_STM32_SERIAL_USART2_ALT_PD6_PD5 is not set # CONFIG_STM32_SERIAL_USART3 is not set # CONFIG_STM32_SERIAL_USART3_ALT_PD9_PD8 is not set # CONFIG_STM32_CANBUS_PA11_PA12 is not set # CONFIG_STM32_CANBUS_PA11_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PB8_PB9 is not set # CONFIG_STM32_MMENU_CANBUS_PI9_PH13 is not set # CONFIG_STM32_MMENU_CANBUS_PB5_PB6 is not set # CONFIG_STM32_MMENU_CANBUS_PB12_PB13 is not set # CONFIG_STM32_MMENU_CANBUS_PD0_PD1 is not set # CONFIG_STM32_USBCANBUS_PA11_PA12 is not set CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" # # USB ids # # end of USB ids CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_THERMOCOUPLE=y CONFIG_WANT_ADXL345=y CONFIG_WANT_LIS2DW=y CONFIG_WANT_MPU9250=y CONFIG_WANT_ICM20948=y CONFIG_WANT_HX71X=y CONFIG_WANT_ADS1220=y CONFIG_WANT_LDC1612=y CONFIG_WANT_SENSOR_ANGLE=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_NEED_SENSOR_BULK=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_INITIAL_PINS="" CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_SDIO=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_STRICT_TIMING=y CONFIG_HAVE_CHIPID=y CONFIG_HAVE_STEPPER_BOTH_EDGE=y CONFIG_HAVE_BOOTLOADER_REQUEST=y CONFIG_INLINE_STEPPER_HACK=y ======================= No build file /home/E3NG/klipper/klippy/../out/klipper.dict No build file /home/E3NG/klipper/klippy/../out/klipper.elf Modifié (le) Mars 14 par grozby88
Savate Posté(e) Mars 15 Posté(e) Mars 15 Il y a 6 heures, grozby88 a dit : [mcu] serial = usb-Klipper_stm32f446xx_4A0031000151303532383235-if00 il en manque un bout serial : /dev/serial/by-id/usb-Klipper_stm32f446xx_4A0031000151303532383235-if00
grozby88 Posté(e) Mars 15 Auteur Posté(e) Mars 15 (modifié) Bonjour Savate, Merci de te pencher sur mon cas ! j'avais repéré ce soucis et corrigé çà il y a quelques jours sans succès l'adresse est pourtant bien définie dans le fichier mmu.cfg ci joint : Citation ######################################################### \ #### User MCU and TMCs wiring definition file ########### + --> Everything MCU related ######################################################### / # This file is yours: keep in mind that it will not be erased when updating # the config using moonraker and it will be kept as you've set it. # Put here all your wiring definitions, your MCU serial port, CANbus UUID, etc... # It should be populated automatically with some default wiring templates during # the first time install of the config if you choose to do so when asked by the # script. If it's not the case, you will need to manually define all your # [board_pins] section. You can use the pinout documentation here: ./docs/pinout.md # ------------------------------------------------------------------------------------------ #-------------------------# # TMCs DRIVERS # #-------------------------# # ---------------------------------------------------------------------- AXIS DRIVERS ----> optional, but only one line per axis need to be selected ### 1. X Drivers ------------------------------------------------------------------------- [include config/hardware/axis/X/TMC/TMC2209.cfg] # [include config/hardware/axis/X/TMC/TMC2209_V0specific.cfg] # Should only be used for early LDO V0 kits to mitigate the known VFAs issue # [include config/hardware/axis/X/TMC/TMC2240.cfg] # [include config/hardware/axis/X/TMC/TMC5160.cfg] ### 2. Y Drivers ------------------------------------------------------------------------- [include config/hardware/axis/Y/TMC/TMC2209.cfg] # [include config/hardware/axis/Y/TMC/TMC2209_V0specific.cfg] # Should only be used for early LDO V0 kits to mitigate the known VFAs issue # [include config/hardware/axis/Y/TMC/TMC2240.cfg] # [include config/hardware/axis/Y/TMC/TMC5160.cfg] ### 3. Z Drivers ------------------------------------------------------------------------- # [include config/hardware/axis/Z/TMC/TMC2209_1-Motor.cfg] [include config/hardware/axis/Z/TMC/TMC2209_3-Motors.cfg] # [include config/hardware/axis/Z/TMC/TMC2209_4-Motors.cfg] # [include config/hardware/axis/Z/TMC/TMC2240_1-Motor.cfg] # [include config/hardware/axis/Z/TMC/TMC2240_3-Motors.cfg] # [include config/hardware/axis/Z/TMC/TMC2240_4-Motors.cfg] # [include config/hardware/axis/Z/TMC/TMC5160_1-Motor.cfg] # [include config/hardware/axis/Z/TMC/TMC5160_3-Motors.cfg] # [include config/hardware/axis/Z/TMC/TMC5160_4-Motors.cfg] # ---------------------------------------------------------------------------------------- # ------------------------------------------------------------------- EXTRUDER DRIVER ----> optional, but only one line need to be selected ### -------------------------------------------------------------------------------------- [include config/hardware/extruder/TMC/TMC2209.cfg] # [include config/hardware/extruder/TMC/TMC2240.cfg] # ---------------------------------------------------------------------------------------- #--------------------------------------# #### BTT Octopus MCU definition ######## #--------------------------------------# [mcu] ##-------------------------------------------------------------------- # This board work by using a serial connection by default. If you # want to use CAN, invert the commented lines and use canbus_uuid. serial: /dev/serial/by-id/usb-Klipper_stm32f446xx_4A0031000151303532383235-if00 # canbus_uuid: change-me-to-the-correct-canbus-id ##-------------------------------------------------------------------- [include config/mcu_definitions/main/BTT_Octopus.cfg] # Do not remove this line [board_pins octopus_mcu] mcu: mcu aliases: X_STEP=MCU_MOTOR0_STEP , X_DIR=MCU_MOTOR0_DIR , X_ENABLE=MCU_MOTOR0_ENABLE , X_TMCUART=MCU_MOTOR0_UART , Y_STEP=MCU_MOTOR1_STEP , Y_DIR=MCU_MOTOR1_DIR , Y_ENABLE=MCU_MOTOR1_ENABLE , Y_TMCUART=MCU_MOTOR1_UART , Z_STEP=MCU_MOTOR2_1_STEP , Z_DIR=MCU_MOTOR2_1_DIR , Z_ENABLE=MCU_MOTOR2_1_ENABLE , Z_TMCUART=MCU_MOTOR2_1_UART , Z1_STEP=MCU_MOTOR3_STEP , Z1_DIR=MCU_MOTOR3_DIR , Z1_ENABLE=MCU_MOTOR3_ENABLE , Z1_TMCUART=MCU_MOTOR3_UART , Z2_STEP=MCU_MOTOR4_STEP , Z2_DIR=MCU_MOTOR4_DIR , Z2_ENABLE=MCU_MOTOR4_ENABLE , Z2_TMCUART=MCU_MOTOR4_UART , Z3_STEP=MCU_MOTOR5_STEP , Z3_DIR=MCU_MOTOR5_DIR , Z3_ENABLE=MCU_MOTOR5_ENABLE , Z3_TMCUART=MCU_MOTOR5_UART , E_STEP=MCU_MOTOR6_STEP , E_DIR=MCU_MOTOR6_DIR , E_ENABLE=MCU_MOTOR6_ENABLE , E_TMCUART=MCU_MOTOR6_UART , # DRIVER_SPI_MOSI=EXP2_6 , # Used in case of SPI drivers such as TMC2240 or TMC5160 # DRIVER_SPI_MISO=EXP2_1 , # Used in case of SPI drivers such as TMC2240 or TMC5160 # DRIVER_SPI_SCK=EXP2_2 , # Used in case of SPI drivers such as TMC2240 or TMC5160 X_STOP=MCU_STOP0 , Y_STOP=MCU_STOP1 , Z_STOP=MCU_STOP2 , PROBE_INPUT=MCU_STOP7 , RUNOUT_SENSOR=MCU_STOP3 , E_HEATER=MCU_HE0 , E_TEMPERATURE=MCU_T0 , BED_HEATER=MCU_HE1 , BED_TEMPERATURE=MCU_TB , PART_FAN=MCU_FAN0 , E_FAN=MCU_FAN1 , CONTROLLER_FAN=MCU_FAN2 , EXHAUST_FAN=MCU_FAN3 , FILTER_FAN=MCU_FAN4 , HOST_CONTROLLER_FAN=MCU_FAN5 , CHAMBER_TEMPERATURE=MCU_T1 , ELECTRICAL_CABINET_TEMPERATURE=MCU_T2 , LIGHT_OUTPUT=MCU_HE2 , LIGHT_NEOPIXEL=MCU_STOP5 , STATUS_NEOPIXEL=MCU_NEOPIXEL , SERVO_PIN=MCU_SERVOS , Je pense que mon klippy.log ne se met plus à jour depuis quelques jours on dirait non ? Est il possible de faire un reset du klippy.log pour le vider ? @Savate : J'ai trouvé ! c'est une ligne que j'avais rajouté avec la mauvaise adresse dans le fichier overrides.cfg qui outrepasse le mmu.cfg de base ! Put... 8 jours pour comprendre çà !!! Elle n'est pas démarrée cette imprimante ! Mdr D'ailleurs je me retrouve avec une nouvelle erreur donc je vais continuer à corriger fait à fait jusqu"à ce que ma config soit correcte ! Je reviens vers toi si j'ai vraiment un problème bloquant ! Merci en tout cas de m'avoir mis sur la piste !!! Modifié (le) Mars 15 par grozby88 1
Savate Posté(e) Mars 15 Posté(e) Mars 15 il y a 53 minutes, grozby88 a dit : Est il possible de faire un reset du klippy.log pour le vider ? théoriquement il se vide à chaque redémarrage. 1
fran6p Posté(e) Mars 15 Posté(e) Mars 15 Il y a 14 heures, grozby88 a dit : [mcu] serial = usb-Klipper_stm32f446xx_4A0031000151303532383235-if00 Cette section n'est pas correcte. Avec « serial: /dev/usb-Klipper_stm32f446xx_4A0031000151303532383235-if00 », ça devrait être mieux (à condition que le «usb-Klipper…» soit le bon (ls -l /dev/serial/by-id devrait indiquer le bon périphérique série). Juste un conseil pour une prochaine fois : plutôt que copier le contenu du fichier, tu le zippes et tu le joins à ton message. Parce que là avec toutes les macros, c'est long de trouver l'info.
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant