# 4: config file # 2564: Dumping gcode input 0 blocks [gcode_arcs] [input_shaper] shaper_type_x = 3hump_ei shaper_freq_x = 49.2 shaper_type_y = mzv shaper_freq_y = 70.0 [force_move] enable_force_move = True [gcode_macro VORON_PURGE] description = A purge macro that adapts to be near your actual printed objects gcode = {% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} {% set cross_section = printer.configfile.settings.extruder.max_extrude_cross_section | float %} {% if printer.firmware_retraction is defined %} {% set RETRACT = G10 | string %} {% set UNRETRACT = G11 | string %} {% else %} {% set RETRACT = 'G1 E-.5 F2100' | string %} {% set UNRETRACT = 'G1 E.5 F2100' | string %} {% endif %} {% set kamp_settings = printer["gcode_macro _KAMP_Settings"] %} {% set verbose_enable = kamp_settings.verbose_enable | abs %} {% set purge_height = kamp_settings.purge_height | float %} {% set tip_distance = kamp_settings.tip_distance | float %} {% set purge_margin = kamp_settings.purge_margin | float %} {% set purge_amount = kamp_settings.purge_amount | float %} {% set flow_rate = kamp_settings.flow_rate | float %} {% set size = 10 | float %} {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} {% set purge_x_min = (all_points | map(attribute=0) | min | default(0)) %} {% set purge_x_max = (all_points | map(attribute=0) | max | default(0)) %} {% set purge_y_min = (all_points | map(attribute=1) | min | default(0)) %} {% set purge_y_max = (all_points | map(attribute=1) | max | default(0)) %} {% set purge_x_center = ([((purge_x_max + purge_x_min) / 2) - (purge_amount / 2), 0] | max) %} {% set purge_y_center = ([((purge_y_max + purge_y_min) / 2) - (purge_amount / 2), 0] | max) %} {% set purge_x_origin = ([purge_x_min - purge_margin, 0] | max) %} {% set purge_y_origin = ([purge_y_min - purge_margin, 0] | max) %} {% set purge_move_speed = (flow_rate / 5.0) * 60 | float %} {% if cross_section < 5 %} {action_respond_info("[Extruder] max_extrude_cross_section is insufficient for purge, please set it to 5 or greater. Purge skipped.")} {% else %} {% if verbose_enable == True %} {action_respond_info("Moving filament tip {}mms".format( (tip_distance), )) } {% endif %} {% if printer.firmware_retraction is defined %} {action_respond_info("KAMP purge is using firmware retraction.")} {% else %} {action_respond_info("KAMP purge is not using firmware retraction, it is recommended to configure it.")} {% endif %} SAVE_GCODE_STATE NAME=Prepurge_State G92 E0 G0 F{travel_speed} G90 G0 X{purge_x_origin} Y{purge_y_origin+size/2} G0 Z{purge_height} M83 G1 E{tip_distance} F{purge_move_speed} G1 X{purge_x_origin+size*0.289} Y{purge_y_origin+size} E{purge_amount/4} F{purge_move_speed} {RETRACT} G0 Z{purge_height*2} G0 X{purge_x_origin+size*0.789} Y{purge_y_origin+size} G0 Z{purge_height} {UNRETRACT} G1 X{purge_x_origin+size*0.211} Y{purge_y_origin} E{purge_amount/2} F{purge_move_speed} {RETRACT} G0 Z{purge_height*2} G0 X{purge_x_origin+size*0.711} Y{purge_y_origin} G0 Z{purge_height} {UNRETRACT} G1 X{purge_x_origin+size} Y{purge_y_origin+size/2} E{purge_amount/4} F{purge_move_speed} {RETRACT} G92 E0 M82 G0 Z{purge_height*2} F{travel_speed} RESTORE_GCODE_STATE NAME=Prepurge_State {% endif %} [gcode_macro _KAMP_Settings] description = This macro contains all adjustable settings for KAMP variable_verbose_enable = True variable_mesh_margin = 0 variable_fuzz_amount = 0 variable_probe_dock_enable = False variable_attach_macro = 'Attach_Probe' variable_detach_macro = 'Dock_Probe' variable_purge_height = 0.8 variable_tip_distance = 0 variable_purge_margin = 10 variable_purge_amount = 30 variable_flow_rate = 12 variable_smart_park_height = 10 gcode = {action_respond_info(" Running the KAMP_Settings macro does nothing, it is only used for storing KAMP settings. ")} [mcu scanner] serial = /dev/serial/by-id/usb-Cartographer_614e_27000D00104330394D363620-if00 [scanner] mcu = scanner x_offset = 0 y_offset = 15 backlash_comp = 0.03251 sensor = cartographer sensor_alt = carto mesh_runs = 2 mode = touch scanner_touch_threshold = 2000 scanner_touch_speed = 3 scanner_touch_z_offset = 0.055 [bed_mesh] zero_reference_position = 175, 175 speed = 300 horizontal_move_z = 10 mesh_min = 40, 40 mesh_max = 310,310 probe_count = 5,5 algorithm = bicubic fade_start = 0.6 fade_end = 10.0 [temperature_sensor Cartographer_MCU] sensor_type = temperature_mcu sensor_mcu = scanner min_temp = 0 max_temp = 105 [adxl345] cs_pin = scanner:PA3 spi_bus = spi1 [resonance_tester] accel_chip = adxl345 probe_points = 175, 175, 20 accel_per_hz = 100 sweeping_accel = 400 sweeping_period = 0 [mcu nhk] serial = /dev/serial/by-id/usb-Klipper_rp2040_3136313132015D51-if00 restart_method = command [stepper_x] step_pin = PF13 dir_pin = PF12 enable_pin = !PF14 rotation_distance = 40 microsteps = 16 full_steps_per_rotation = 200 endstop_pin = tmc2209_stepper_x:virtual_endstop position_min = 0 position_endstop = 350 position_max = 350 homing_speed = 150 homing_retract_dist = 0 homing_positive_dir = true [extruder] step_pin = nhk:gpio23 dir_pin = !nhk:gpio24 enable_pin = !nhk:gpio25 microsteps = 32 rotation_distance = 35.2 gear_ratio = 44:8, 25:17 nozzle_diameter = 0.400 filament_diameter = 1.750 heater_pin = nhk:gpio9 sensor_type = Generic 3950 sensor_pin = nhk:gpio29 pullup_resistor = 2200 min_temp = 0 max_temp = 315 min_extrude_temp = 170 max_extrude_only_distance = 1000 max_extrude_cross_section = 40 pressure_advance = 0.042 pressure_advance_smooth_time = 0.040 control = pid pid_kp = 38.743 pid_ki = 12.299 pid_kd = 30.510 [tmc2209 extruder] sense_resistor = 0.100 uart_pin = nhk:gpio0 tx_pin = nhk:gpio1 interpolate = false run_current = 0.6 [fan] pin = nhk:gpio6 [heater_fan hotend_fan] pin = nhk:gpio5 tachometer_pin = nhk:gpio16 tachometer_ppr = 2 [neopixel sb_leds] pin = nhk:gpio7 chain_count = 3 color_order = GRBW initial_red = 0.0 initial_green = 0.0 initial_blue = 1.0 initial_white = 0.0 [output_pin act_led] pin = !nhk:gpio8 [temperature_sensor NH36] sensor_type = temperature_mcu sensor_mcu = nhk min_temp = 0 max_temp = 100 [gcode_shell_command printer_startup_sound] command = sh /home/runtpacket/printer_data/config/scripts/printer_startup.sh timeout = 8. verbose = True [gcode_macro PRINTER_STARTUP_SOUND] gcode = RUN_SHELL_COMMAND CMD=printer_startup_sound [gcode_shell_command print_start_sound] command = sh /home/runtpacket/printer_data/config/scripts/print_start.sh timeout = 8. verbose = True [gcode_macro PRINT_START_SOUND] gcode = RUN_SHELL_COMMAND CMD=print_start_sound [gcode_shell_command print_end_sound] command = sh /home/runtpacket/printer_data/config/scripts/print_end.sh timeout = 8. verbose = True [gcode_macro PRINT_END_SOUND] gcode = RUN_SHELL_COMMAND CMD=print_end_sound [gcode_shell_command filament_runout_sound] command = sh /home/runtpacket/printer_data/config/scripts/filament_runout.sh timeout = 8. verbose = True [gcode_macro FILAMENT_RUNOUT_SOUND] gcode = RUN_SHELL_COMMAND CMD=filament_runout_sound [gcode_shell_command filament_resume_sound] command = sh /home/runtpacket/printer_data/config/scripts/filament_resume.sh timeout = 8. verbose = True [gcode_macro FILAMENT_RESUME_SOUND] gcode = RUN_SHELL_COMMAND CMD=filament_resume_sound [gcode_shell_command backup_cfg] command = ~/printer_data/config/autocommit.sh timeout = 30 verbose = True [gcode_macro BACKUP_CFG] description = Backs up config directory GitHub gcode = RUN_SHELL_COMMAND CMD=backup_cfg [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = BASE_CANCEL_PRINT gcode = SET_IDLE_TIMEOUT TIMEOUT={printer.configfile.settings.idle_timeout.timeout} CLEAR_PAUSE PRINT_END BASE_CANCEL_PRINT [gcode_macro PAUSE] description = Pause the actual running print rename_existing = BASE_PAUSE gcode = {% set z = params.Z|default(10)|int %} {% if printer['pause_resume'].is_paused|int == 0 %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=zhop VALUE={z} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=etemp VALUE={printer['extruder'].target} FILAMENT_RUNOUT_SOUND status_busy SAVE_GCODE_STATE NAME=PAUSE BASE_PAUSE {% if (printer.gcode_move.position.z + z) < printer.toolhead.axis_maximum.z %} G91 G1 Z{z} F900 {% else %} { action_respond_info("Pause zhop exceeds maximum Z height.") } SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=zhop VALUE=0 {% endif %} G90 G1 X{printer.toolhead.axis_maximum.x/2} Y{printer.toolhead.axis_minimum.y+5} F6000 SAVE_GCODE_STATE NAME=PAUSEPARK M104 S0 SET_IDLE_TIMEOUT TIMEOUT=43200 {% endif %} [gcode_macro RESUME] description = Resume the actual running print rename_existing = BASE_RESUME variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set e = params.E|default(2.5)|int %} {% if printer['pause_resume'].is_paused|int == 1 %} status_printing SET_IDLE_TIMEOUT TIMEOUT={printer.configfile.settings.idle_timeout.timeout} {% if etemp > 0 %} M109 S{etemp|int} {% endif %} RESTORE_GCODE_STATE NAME=PAUSEPARK MOVE=1 MOVE_SPEED=100 G91 M83 {% if printer[printer.toolhead.extruder].temperature >= printer.configfile.settings.extruder.min_extrude_temp %} G1 Z{zhop * -1} E{e} F900 {% else %} G1 Z{zhop * -1} F900 {% endif %} RESTORE_GCODE_STATE NAME=PAUSE MOVE=1 MOVE_SPEED=60 BASE_RESUME {% endif %} variable_zhop = 5 variable_etemp = 0 [gcode_macro SET_PAUSE_NEXT_LAYER] description = Enable a pause if the next layer is reached gcode = {% set pause_next_layer = printer['gcode_macro SET_PRINT_STATS_INFO'].pause_next_layer %} {% set ENABLE = params.ENABLE|default(1)|int != 0 %} {% set MACRO = params.MACRO|default(pause_next_layer.call, True) %} SET_GCODE_VARIABLE MACRO=SET_PRINT_STATS_INFO VARIABLE=pause_next_layer VALUE="{{ 'enable': ENABLE, 'call': MACRO }}" [gcode_macro SET_PAUSE_AT_LAYER] description = Enable/disable a pause if a given layer number is reached gcode = {% set pause_at_layer = printer['gcode_macro SET_PRINT_STATS_INFO'].pause_at_layer %} {% set ENABLE = params.ENABLE|int != 0 if params.ENABLE is defined else params.LAYER is defined %} {% set LAYER = params.LAYER|default(pause_at_layer.layer)|int %} {% set MACRO = params.MACRO|default(pause_at_layer.call, True) %} SET_GCODE_VARIABLE MACRO=SET_PRINT_STATS_INFO VARIABLE=pause_at_layer VALUE="{{ 'enable': ENABLE, 'layer': LAYER, 'call': MACRO }}" [gcode_macro SET_PRINT_STATS_INFO] rename_existing = SET_PRINT_STATS_INFO_BASE description = Overwrite, to get pause_next_layer and pause_at_layer feature variable_pause_next_layer = { 'enable': False, 'call': "PAUSE" } variable_pause_at_layer = { 'enable': False, 'layer': 0, 'call': "PAUSE" } gcode = {% if pause_next_layer.enable %} RESPOND TYPE=echo MSG='{"%s, forced by pause_next_layer" % pause_next_layer.call}' {pause_next_layer.call} SET_PAUSE_NEXT_LAYER ENABLE=0 {% elif pause_at_layer.enable and params.CURRENT_LAYER is defined and params.CURRENT_LAYER|int == pause_at_layer.layer %} RESPOND TYPE=echo MSG='{"%s, forced by pause_at_layer [%d]" % (pause_at_layer.call, pause_at_layer.layer)}' {pause_at_layer.call} SET_PAUSE_AT_LAYER ENABLE=0 {% endif %} SET_PRINT_STATS_INFO_BASE {rawparams} [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] description = Helper: park toolhead used in PAUSE and CANCEL_PRINT gcode = {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} {% set use_custom = client.use_custom_pos|default(false)|lower == 'true' %} {% set custom_park_x = client.custom_park_x|default(0.0) %} {% set custom_park_y = client.custom_park_y|default(0.0) %} {% set park_dz = client.custom_park_dz|default(2.0)|abs %} {% set sp_hop = client.speed_hop|default(15) * 60 %} {% set sp_move = client.speed_move|default(velocity) * 60 %} {% set origin = printer.gcode_move.homing_origin %} {% set act = printer.gcode_move.gcode_position %} {% set max = printer.toolhead.axis_maximum %} {% set cone = printer.toolhead.cone_start_z|default(max.z) %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set z_min = params.Z_MIN|default(0)|float %} {% set z_park = [[(act.z + park_dz), z_min]|max, (max.z - origin.z)]|min %} {% set x_park = params.X if params.X is defined else custom_park_x if use_custom else 0.0 if round_bed else (max.x - 5.0) %} {% set y_park = params.Y if params.Y is defined else custom_park_y if use_custom else (max.y - 5.0) if round_bed and z_park < cone else 0.0 if round_bed else (max.y - 5.0) %} _CLIENT_RETRACT {% if "xyz" in printer.toolhead.homed_axes %} G90 G1 Z{z_park} F{sp_hop} G1 X{x_park} Y{y_park} F{sp_move} {% if not printer.gcode_move.absolute_coordinates %} G91 {% endif %} {% else %} RESPOND TYPE=echo MSG='Printer not homed' {% endif %} [gcode_macro _CLIENT_EXTRUDE] description = Extrudes, if the extruder is hot enough gcode = {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set use_fw_retract = (client.use_fw_retract|default(false)|lower == 'true') and (printer.firmware_retraction is defined) %} {% set length = params.LENGTH|default(client.unretract)|default(1.0)|float %} {% set speed = params.SPEED|default(client.speed_unretract)|default(35) %} {% set absolute_extrude = printer.gcode_move.absolute_extrude %} {% if printer.toolhead.extruder != '' %} {% if printer[printer.toolhead.extruder].can_extrude %} {% if use_fw_retract %} {% if length < 0 %} G10 {% else %} G11 {% endif %} {% else %} M83 G1 E{length} F{(speed|float|abs) * 60} {% if absolute_extrude %} M82 {% endif %} {% endif %} {% else %} RESPOND TYPE=echo MSG='{"\"%s\" not hot enough" % printer.toolhead.extruder}' {% endif %} {% endif %} [gcode_macro _CLIENT_RETRACT] description = Retracts, if the extruder is hot enough gcode = {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set length = params.LENGTH|default(client.retract)|default(1.0)|float %} {% set speed = params.SPEED|default(client.speed_retract)|default(35) %} _CLIENT_EXTRUDE LENGTH=-{length|float|abs} SPEED={speed|float|abs} [gcode_macro _CLIENT_LINEAR_MOVE] description = Linear move with save and restore of the gcode state gcode = {% set x_move = "X" ~ params.X if params.X is defined else "" %} {% set y_move = "Y" ~ params.Y if params.Y is defined else "" %} {% set z_move = "Z" ~ params.Z if params.Z is defined else "" %} {% set e_move = "E" ~ params.E if params.E is defined else "" %} {% set rate = "F" ~ params.F if params.F is defined else "" %} {% set ABSOLUTE = params.ABSOLUTE | default(0) | int != 0 %} {% set ABSOLUTE_E = params.ABSOLUTE_E | default(0) | int != 0 %} SAVE_GCODE_STATE NAME=_client_movement {% if x_move or y_move or z_move %} G9{ 0 if ABSOLUTE else 1 } {% endif %} {% if e_move %} M8{ 2 if ABSOLUTE_E else 3 } {% endif %} G1 { x_move } { y_move } { z_move } { e_move } { rate } RESTORE_GCODE_STATE NAME=_client_movement [gcode_macro _HOME_X] gcode = SAVE_GCODE_STATE NAME=HOMING status_homing {% set RUN_CURRENT_X = printer.configfile.settings['tmc2209 stepper_x'].run_current|float %} {% set RUN_CURRENT_Y = printer.configfile.settings['tmc2209 stepper_y'].run_current|float %} {% set HOME_CURRENT = 0.5 %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={HOME_CURRENT} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={HOME_CURRENT} G28 X G91 G1 X-10 F1200 G4 P1000 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={RUN_CURRENT_X} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={RUN_CURRENT_Y} RESTORE_GCODE_STATE NAME=HOMING [gcode_macro _HOME_Y] gcode = SAVE_GCODE_STATE NAME=HOMING {% set RUN_CURRENT_X = printer.configfile.settings['tmc2209 stepper_x'].run_current|float %} {% set RUN_CURRENT_Y = printer.configfile.settings['tmc2209 stepper_y'].run_current|float %} {% set HOME_CURRENT = 0.7 %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={HOME_CURRENT} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={HOME_CURRENT} G28 Y G91 G1 Y-10 F1200 G4 P1000 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={RUN_CURRENT_X} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={RUN_CURRENT_Y} RESTORE_GCODE_STATE NAME=HOMING [homing_override] axes = xyz gcode = {% set home_all = 'X' not in params and 'Y' not in params and 'Z' not in params %} {% if home_all or 'X' in params %} _HOME_X {% endif %} {% if home_all or 'Y' in params %} _HOME_Y {% endif %} {% if home_all or 'Z' in params %} G90 G1 X175 Y175 F6000 G28 Z G1 Z10 {% endif %} [gcode_macro _CG28] description = Homing only if necessary gcode = {% if "xyz" not in printer.toolhead.homed_axes %} G28 {% endif %} [gcode_macro _BEDFANVARS] variable_threshold = 100 variable_fast = 0.6 variable_slow = 0.2 gcode = [fan_generic BedFans] pin = PB10 kick_start_time = 0.5 [gcode_macro BEDFANSSLOW] gcode = {% set SLOW = printer["gcode_macro _BEDFANVARS"].slow|float %} SET_FAN_SPEED FAN=BedFans SPEED={SLOW} [gcode_macro BEDFANSFAST] gcode = {% set FAST = printer["gcode_macro _BEDFANVARS"].fast|float %} SET_FAN_SPEED FAN=BedFans SPEED={FAST} [gcode_macro BEDFANSOFF] gcode = SET_FAN_SPEED FAN=BedFans SPEED=0 [gcode_macro SET_HEATER_TEMPERATURE] rename_existing = _SET_HEATER_TEMPERATURE gcode = {% set HEATER = params.HEATER|default("None") %} {% set TARGET = params.TARGET|default(0)|int %} {% set THRESHOLD = printer["gcode_macro _BEDFANVARS"].threshold|int %} {% if HEATER|lower == "extruder" %} M104 S{TARGET} {% elif HEATER|lower == "heater_bed" %} M99140 S{TARGET} {% else %} {action_respond_info("Heater %s not supported" % HEATER)} {% endif %} {% if HEATER|lower == "heater_bed" %} {% if TARGET >= THRESHOLD %} BEDFANSSLOW UPDATE_DELAYED_GCODE ID=bedfanloop DURATION=1 {% else %} BEDFANSOFF UPDATE_DELAYED_GCODE ID=bedfanloop DURATION=0 {% endif %} {% endif %} [gcode_macro M190] rename_existing = M99190 gcode = {% set S = params.S|int %} {% set THRESHOLD = printer["gcode_macro _BEDFANVARS"].threshold|int %} {% if S >= THRESHOLD %} BEDFANSSLOW {% else %} BEDFANSOFF {% endif %} M140 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} {% if S != 0 %} TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={S|int} MAXIMUM={S|int + 5} {% endif %} {% if S >= THRESHOLD %} BEDFANSFAST {% endif %} [gcode_macro M140] rename_existing = M99140 gcode = {% set S = params.S|float %} SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={S} [gcode_macro TURN_OFF_HEATERS] rename_existing = _TURN_OFF_HEATERS gcode = BEDFANSOFF _TURN_OFF_HEATERS [delayed_gcode bedfanloop] gcode = {% set THRESHOLD = printer["gcode_macro _BEDFANVARS"].threshold|int %} {% if printer.heater_bed.target >= THRESHOLD %} {% if printer.heater_bed.temperature|int >= (printer.heater_bed.target|int - 1) %} BEDFANSFAST {% else %} UPDATE_DELAYED_GCODE ID=bedfanloop DURATION=5 {% endif %} {% endif %} [shaketune] result_folder = ~/printer_data/config/ShakeTune_results number_of_results_to_keep: 3 timeout = 600 [skew_correction] [neopixel btt_mini12864] pin = EXP1_6 chain_count = 3 initial_red = 1.0 initial_green = 1.0 initial_blue = 1.0 color_order = RGB [delayed_gcode setdisplayneopixel] initial_duration = 0 gcode = SET_LED LED="btt_mini12864" RED=0 GREEN=1 BLUE=1 INDEX=1 TRANSMIT=0 SET_LED LED="btt_mini12864" RED=0 GREEN=1 BLUE=1 INDEX=2 TRANSMIT=0 SET_LED LED="btt_mini12864" RED=0 GREEN=1 BLUE=1 INDEX=3 SET_LED LED="btt_mini12864" RED=1 GREEN=1 BLUE=1 SYNC=0 TRANSMIT=1 M117 Welcome [delayed_gcode startup] initial_duration = 2 gcode = PRINTER_STARTUP_SOUND status_ready [gcode_macro SET_ACTIVE_SPOOL] gcode = {% if params.ID %} {% set id = params.ID|int %} {action_call_remote_method( "spoolman_set_active_spool", spool_id=id )} {% else %} {action_respond_info("Parameter 'ID' is required")} {% endif %} [gcode_macro CLEAR_ACTIVE_SPOOL] gcode = {action_call_remote_method( "spoolman_set_active_spool", spool_id=None )} [output_pin Daylight] pin = PB11 pwm = True cycle_time = 0.01 shutdown_value = 0 value = 0.25 [delayed_gcode Daylights] initial_duration = 0 gcode = SET_PIN PIN=Daylight VALUE=.25 [gcode_macro Daylights] gcode = {% set S = params.S|default(1)|int %} SET_PIN PIN=Daylight VALUE={S} [exclude_object] [verify_heater extruder] max_error = 99999999 hysteresis = 10 heating_gain = 2 [mcu] serial = /dev/serial/by-id/usb-Klipper_stm32f446xx_1B000F000650314D35323820-if00 restart_method = command [printer] kinematics = corexy max_velocity = 300 max_accel = 5000 max_z_velocity = 15 max_z_accel = 350 square_corner_velocity = 5.0 [tmc2209 stepper_x] uart_pin = PC4 interpolate = false run_current = 1 sense_resistor = 0.110 stealthchop_threshold = 0 diag_pin = ^PG6 driver_sgthrs = 105 [stepper_y] step_pin = PG0 dir_pin = PG1 enable_pin = !PF15 rotation_distance = 40 microsteps = 16 full_steps_per_rotation = 200 endstop_pin = tmc2209_stepper_y:virtual_endstop position_min = 0 position_endstop = 350 position_max = 350 homing_speed = 150 homing_retract_dist = 0 homing_positive_dir = true [tmc2209 stepper_y] diag_pin = ^PG9 driver_sgthrs = 105 uart_pin = PD11 interpolate = false run_current = .6 stealthchop_threshold = 0 [stepper_z] step_pin = PF11 dir_pin = PG3 enable_pin = !PG5 rotation_distance = 40 gear_ratio = 80:16 microsteps = 16 endstop_pin = probe:z_virtual_endstop homing_retract_dist = 3 position_max = 290 position_min = -10 homing_speed = 8 second_homing_speed = 3 [tmc2209 stepper_z] uart_pin = PC6 interpolate = false run_current = .6 stealthchop_threshold = 0 [stepper_z1] step_pin = !PG4 dir_pin = !PC1 enable_pin = !PA0 rotation_distance = 40 gear_ratio = 80:16 microsteps = 16 [tmc2209 stepper_z1] uart_pin = PC7 interpolate = false run_current = .6 sense_resistor = 0.110 stealthchop_threshold = 0 [stepper_z2] step_pin = PF9 dir_pin = PF10 enable_pin = !PG2 rotation_distance = 40 gear_ratio = 80:16 microsteps = 16 [tmc2209 stepper_z2] uart_pin = PF2 interpolate = false run_current = .6 stealthchop_threshold = 0 [stepper_z3] step_pin = PC13 dir_pin = !PF0 enable_pin = !PF1 rotation_distance = 40 gear_ratio = 80:16 microsteps = 16 [tmc2209 stepper_z3] uart_pin = PE4 interpolate = false run_current = .6 stealthchop_threshold = 0 [heater_bed] heater_pin = PA1 sensor_type = Generic 3950 sensor_pin = PF3 max_power = 1 min_temp = 0 max_temp = 115 control = pid pid_kp = 29.104 pid_ki = 1.459 pid_kd = 145.155 [verify_heater heater_bed] check_gain_time = 120 [controller_fan ebay_controller_fan] pin = PD12 kick_start_time = 0.5 heater = heater_bed [temperature_fan Octopus] pin = PE5 max_power = 1.0 shutdown_speed = 0.0 control = pid off_below = 0.25 sensor_type = temperature_mcu min_speed = 0 max_speed = 1.0 pid_kp = 1.0 pid_ki = 0.5 pid_kd = 2.0 pid_deriv_time = 2.0 min_temp = 0 max_temp = 100 target_temp = 40 [temperature_fan raspberry_Pi] pin = PA8 max_power = 1.0 shutdown_speed = 0.0 control = pid off_below = 0.15 sensor_type = temperature_host min_speed = 0 max_speed = 1.0 pid_kp = 1.0 pid_ki = 0.5 pid_kd = 2.0 pid_deriv_time = 2.0 min_temp = 0 max_temp = 100 target_temp = 53 [temperature_sensor chamber] sensor_type = temperature_combined sensor_list = temperature_sensor chamber_right_rear_upper, temperature_sensor chamber_front_left_lower combination_method = mean min_temp = 0 max_temp = 85 maximum_deviation = 999.9 gcode_id = chamber_Average [temperature_sensor chamber_right_rear_upper] sensor_type = Generic 3950 sensor_pin = PF4 min_temp = 0 max_temp = 200 [temperature_sensor chamber_front_left_lower] sensor_type = Generic 3950 sensor_pin = PF5 min_temp = 0 max_temp = 200 [temperature_sensor room_temperature] sensor_type = Generic 3950 sensor_pin = PF6 min_temp = 0 max_temp = 200 [temperature_sensor electronics_bay] sensor_type = Generic 3950 sensor_pin = PF7 min_temp = 0 max_temp = 200 [idle_timeout] timeout = 1800 [quad_gantry_level] gantry_corners = -60,-10 410,420 points = 50,25 50,275 300,275 300,25 speed = 2000 horizontal_move_z = 10 retries = 5 retry_tolerance = 0.0075 max_adjust = 10 [board_pins] aliases = 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=, 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=, EXP2_9=, EXP2_10=<5V> [display] lcd_type = uc1701 cs_pin = EXP1_3 a0_pin = EXP1_4 rst_pin = EXP1_5 encoder_pins = ^EXP2_5, ^EXP2_3 click_pin = ^!EXP1_2 contrast = 63 spi_software_miso_pin = EXP2_1 spi_software_mosi_pin = EXP2_6 spi_software_sclk_pin = EXP2_2 [gcode_macro G32] gcode = SAVE_GCODE_STATE NAME=STATE_G32 G90 G28 QUAD_GANTRY_LEVEL G28 G0 X175 Y175 Z30 F3600 RESTORE_GCODE_STATE NAME=STATE_G32 [gcode_macro PARKFRONTLOW] gcode = {% if "xyz" not in printer.toolhead.homed_axes %} G28 {% endif %} SAVE_GCODE_STATE NAME=PARKFRONT G90 G0 X{printer.toolhead.axis_maximum.x/2} Y{printer.toolhead.axis_minimum.y+5} Z20 F6000 RESTORE_GCODE_STATE NAME=PARKFRONT [gcode_macro PREHEAT] gcode = G90 G28 G0 X175 Y175 Z50 F3600 M106 S255 SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=110 [gcode_macro M601] gcode = [gcode_macro M600] gcode = [gcode_macro BEEP] gcode = {% set i = params.I|default(1)|int %} {% set dur = params.DUR|default(100)|int %} {% set freq = params.FREQ|default(2000)|int %} {% for iteration in range(i|int) %} SET_PIN PIN=beeper VALUE=0.8 CYCLE_TIME={ 1.0/freq if freq > 0 else 1 } G4 P{dur} SET_PIN PIN=beeper VALUE=0 G4 P{dur} {% endfor %} [gcode_macro _CQGL] gcode = {% if printer.quad_gantry_level.applied|lower == 'false' %} {% if "xyz" not in printer.toolhead.homed_axes %} G28 status_leveling {% endif %} QUAD_GANTRY_LEVEL G28 Z {% endif %} [gcode_macro MATERIAL_SETTINGS] gcode = SET_DISPLAY_TEXT MSG="Setting material G Offset Adjust" {% set MATERIAL = params.MATERIAL|default("XXX")|string %} {% if MATERIAL == "PLA" %} SET_GCODE_OFFSET Z_ADJUST=+0.150 SET_DISPLAY_TEXT MSG="Adjusted for PLA" {% elif MATERIAL == "PET" %} M220 S50 SET_GCODE_OFFSET Z_ADJUST=0.0 {% elif MATERIAL == "ABS" %} SET_GCODE_OFFSET Z_ADJUST=0.0 {% else %} {% endif %} [gcode_macro PRINT_START] gcode = {% set target_bed = params.BED|int %} {% set target_extruder = params.EXTRUDER|int %} {% set target_chamber = params.CHAMBER|default("45")|int %} {% set x_wait = printer.toolhead.axis_maximum.x|float / 2 %} {% set y_wait = printer.toolhead.axis_maximum.y|float / 2 %} STATUS_HOMING G28 G90 {% if params.BED|int > 90 %} SET_DISPLAY_TEXT MSG="Bed: {target_bed}c" STATUS_HEATING M106 S255 G1 X{x_wait} Y{y_wait} Z15 F9000 BEDFANSFAST M190 S{target_bed} SET_DISPLAY_TEXT MSG="Heatsoak: {target_chamber}c" {% else %} SET_DISPLAY_TEXT MSG="Bed: {target_bed}c" STATUS_HEATING G1 X{x_wait} Y{y_wait} Z15 F9000 M190 S{target_bed} SET_DISPLAY_TEXT MSG="Soak for 5 min" G4 P300000 {% endif %} SET_DISPLAY_TEXT MSG="Hotend: 150c" M109 S150 SET_DISPLAY_TEXT MSG="Leveling" STATUS_LEVELING QUAD_GANTRY_LEVEL G28 Z SET_DISPLAY_TEXT MSG="Bed mesh" STATUS_MESHING BED_MESH_CALIBRATE CARTOGRAPHER_TOUCH SET_DISPLAY_TEXT MSG="Hotend: {target_extruder}c" STATUS_HEATING G1 X{x_wait} Y{y_wait} Z15 F9000 M107 M109 S{target_extruder} SET_DISPLAY_TEXT MSG="Printer goes brr" STATUS_PRINTING AFC_BRUSH G0 X{x_wait - 50} Y4 F10000 G0 Z0.4 G91 G90 voron_Purge [gcode_macro PRINT_END] gcode = PRINT_END_SOUND {% set th = printer.toolhead %} {% set x_safe = th.position.x + 20 * (1 if th.axis_maximum.x - th.position.x > 20 else -1) %} {% set y_safe = th.position.y + 20 * (1 if th.axis_maximum.y - th.position.y > 20 else -1) %} {% set z_safe = [th.position.z + 20, th.axis_maximum.z]|min %} SET_SKEW CLEAR=1 SAVE_GCODE_STATE NAME=STATE_PRINT_END M117 End of Print reached M400 G92 E0 G1 E-2.0 F1800 AFC_BRUSH AFC_PARK TURN_OFF_HEATERS G90 G0 X{x_safe} Y{y_safe} Z{z_safe} F20000 G0 X{th.axis_maximum.x//2} Y{th.axis_maximum.y - 2} F3600 G1 E-5 F2000 M107 BED_MESH_CLEAR BedFansoff STATUS_PART_READY SET_PIN PIN=Daylight VALUE=1.00 SET_GCODE_OFFSET Z=0.0; (Reset the G-Code Z offset) RESTORE_GCODE_STATE NAME=STATE_PRINT_END [AFC] varfile = /home/runtpacket/printer_data/config/AFC/AFC.var long_moves_speed = 150 long_moves_accel = 250 short_moves_speed = 50 short_moves_accel = 300 short_move_dis = 10 enable_sensors_in_gui = True default_material_temps = default: 235, PLA:210, PETG:235, ABS:235, ASA:235 common_density_values = PLA:1.24, PETG:1.23, ABS:1.04, ASA:1.07 load_to_hub = True assisted_unload = True trsync_update = True trsync_timeout = 0.05 trsync_single_timeout = 0.250 z_hop = 5 resume_speed = 120 resume_z_speed = 30 error_timeout = 36000 led_name = AFC_Indicator led_fault = 1,0,0,0 led_ready = 0,0.8,0,0 led_not_ready = 1,0,0,0 led_loading = 1,1,1,0 led_tool_loaded = 0,0,1,0 led_buffer_advancing = 0,0,1,0 led_buffer_trailing = 0,1,0,0 led_buffer_disable = 0,0,0,0.25 led_spool_illuminate = 1,1,1,0 tool_cut = True tool_cut_threshold = 10000 tool_cut_cmd = AFC_CUT park = True park_cmd = AFC_PARK poop = True poop_cmd = POOP_KICK_WIPE kick = False kick_cmd = AFC_KICK wipe = False wipe_cmd = AFC_BRUSH form_tip = False form_tip_cmd = AFC [AFC_prep] enable = True [delayed_gcode welcome] initial_duration = 0.5 gcode = PREP [AFC_form_tip] ramming_volume = 0 toolchange_temp = 0 unloading_speed_start = 40 unloading_speed = 15 cooling_tube_position = 35 cooling_tube_length = 10 initial_cooling_speed = 10 final_cooling_speed = 50 cooling_moves = 4 use_skinnydip = False skinnydip_distance = 30 dip_insertion_speed = 30 dip_extraction_speed = 70 melt_zone_pause = 0 cooling_zone_pause = 0 [AFC_extruder extruder] pin_tool_end = nhk:gpio13 tool_stn = 27.23 tool_stn_unload = 96.8 tool_sensor_after_extruder = 0 tool_unload_speed = 25 tool_load_speed = 25 [filament_switch_sensor bypass] switch_pin = PG15 [AFC_buffer Turtle_1] advance_pin = ^Turtle_1:TN_ADV trailing_pin = ^Turtle_1:TN_TRL multiplier_high = 1.05 multiplier_low = 0.95 [gcode_macro BT_TOOL_UNLOAD] description = Unloads the currently loaded lane gcode = TOOL_UNLOAD [gcode_macro BT_CHANGE_TOOL] description = Switch to a new lane by ejecting the previously loaded one and then load the lane specified by LANE parameter. Lane parameter is an integer and defaults to 1. ex. `BT_CHANGE_TOOL LANE=2` gcode = {% set lane_num = params.LANE|default(1)|int %} {% set stepper = printer['gcode_macro _AFC_GLOBAL_VARS'].stepper_name|string %} CHANGE_TOOL LANE={stepper ~ lane_num} [gcode_macro BT_LANE_EJECT] description = Fully eject the filament from the lane so spool can be removed. Lane parameter is an integer and defaults to 1. ex. `BT_LANE_EJECT LANE=2` gcode = {% set lane_num = params.LANE|default(1)|int %} {% set stepper = printer['gcode_macro _AFC_GLOBAL_VARS'].stepper_name|string %} LANE_UNLOAD LANE={stepper ~ lane_num} [gcode_macro BT_LANE_MOVE] description = Move the specified lane the specified amount. Lane parameter is an integer and defaults to 1. Distance parameter is and integer and defaults to 20. Distance over 200 uses long load speeds. ex `BT_LANE_MOVE LANE=2 DISTANCE=100` gcode = {% set lane_num = params.LANE|default(1)|int %} {% set dist_str = params.DISTANCE|default('20')|string %} {% set stepper = printer['gcode_macro _AFC_GLOBAL_VARS'].stepper_name|string %} {% set valid_chars = '0123456789' %} {% set is_valid = true %} {% if dist_str|length > 0 %} {% if dist_str[-1] not in valid_chars %} {% set is_valid = false %} {% endif %} {% else %} {% set is_valid = false %} {% endif %} {% if is_valid %} {% set dist = dist_str|float %} LANE_MOVE LANE={stepper ~ lane_num} DISTANCE={dist} {% else %} { action_respond_info("Error: Invalid DISTANCE parameter: " ~ dist_str) } {% endif %} [gcode_macro BT_RESUME] description = Resume the print after an error, using normal resume will also call AFC_RESUME gcode = {% if not printer.pause_resume.is_paused %} RESPOND MSG="Print is not paused. Resume ignored" {% else %} AFC_RESUME {% endif %} [gcode_macro BT_PREP] description = Run the AFC PREP sequence gcode = PREP [gcode_macro POOP_KICK_WIPE] gcode = AFC_POOP AFC_KICK AFC_BRUSH [gcode_macro AFC_BRUSH] description = Wipe the nozzle on the brush gcode = {% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %} {% set accel = gVars['accel'] | default(2000) | float %} {% set travel_speed = gVars['travel_speed'] | default(120)*60| float %} {% set z_travel_speed = gVars['z_travel_speed'] | default(30)*60 | float %} {% set verbose = gVars['verbose'] | default(1) | int %} {% set vars = printer['gcode_macro _AFC_BRUSH_VARS'] %} {% set Bx, By, Bz = vars.brush_loc | default([-1,-1,-1])| map('float') %} {% set brush_clean_accel = vars['brush_clean_accel']| default(0) | float %} {% set y_brush = vars['y_brush'] | default(false) | lower == 'true' %} {% set brush_clean_speed = vars['brush_clean_speed']| default(150)*60 | float %} {% set brush_width = vars['brush_width'] | default(30) | float %} {% set brush_depth = vars['brush_depth'] | default(10) | float %} {% set brush_count = vars['brush_count'] | default(4) | int %} {% set z_move = vars['z_move'] | default(-1) | float %} {% if printer.dual_carriage is defined %} {% if printer.dual_carriage.carriage_0 == "INACTIVE" %} {% set x_max = printer.configfile.config.dual_carriage.position_max|float|round(3) %} {% set x_min = printer.configfile.config.dual_carriage.position_min|float|round(3) %} {% else %} {% set x_max = printer.toolhead.axis_maximum.x %} {% set x_min = printer.toolhead.axis_minimum.x %} {% endif %} {% else %} {% set x_max = printer.toolhead.axis_maximum.x %} {% set x_min = printer.toolhead.axis_minimum.x %} {% endif %} {% set y_max = printer.toolhead.axis_maximum.y %} {% set y_min = printer.toolhead.axis_minimum.y %} {% set brush_x_max = Bx + brush_width / 2 %} {% set brush_x_min = Bx - brush_width / 2 %} {% set brush_y_max = By + brush_depth / 2 %} {% set brush_y_min = By - brush_depth / 2 %} {% set saved_accel = printer.toolhead.max_accel %} {% if brush_clean_accel > 0 %} {% set selected_accel = brush_clean_accel %} {% else %} {% set selected_accel = accel %} {% endif %} SET_VELOCITY_LIMIT ACCEL={selected_accel} {% if verbose > 0 %} RESPOND TYPE=command MSG='AFC_Brush: Clean Nozzle' {% endif %} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Brush: Move to Brush.' {% endif %} G90 G1 X{Bx} Y{By} F{travel_speed} {% if Bz >= 0 %} G1 Z{Bz} F{z_travel_speed} {% endif %} {% if y_brush %} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Brush: Y Brush Moves' {% endif %} {% for wipe in range(brush_count) %} {% if brush_y_min >= y_min %} G1 Y{brush_y_min} F{brush_clean_speed} {% endif %} {% if brush_y_max <= y_max %} G1 Y{brush_y_max} F{brush_clean_speed} {% endif %} G1 Y{By} F{brush_clean_speed} {% endfor %} {% endif %} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Brush: X Brush Moves' {% endif %} {% for wipe in range(brush_count) %} {% if brush_x_min >= x_min %} G1 X{brush_x_min} F{brush_clean_speed} {% endif %} {% if brush_x_max <= x_max %} G1 X{brush_x_max} F{brush_clean_speed} {% endif %} G1 X{Bx} F{brush_clean_speed} {% endfor %} {% if z_move >= 0 %} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Brush: Finish z_move.' {% endif %} G91 G1 Z{z_move} F{z_travel_speed} G90 {% endif %} G90 SET_VELOCITY_LIMIT ACCEL={saved_accel} [gcode_macro AFC_CUT] description = Cut filament by pressing the cutter on a pin gcode = {% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %} {% set accel = gVars['accel'] |default(2000) | float %} {% set travel_speed = gVars['travel_speed'] |default(120)*60| float %} {% set verbose = gVars['verbose'] |default(1) | int %} {% set vars = printer['gcode_macro _AFC_CUT_TIP_VARS'] %} {% set pin_loc_x, pin_loc_y = vars.pin_loc_xy |default([-1, -1])| map('float') %} {% set pin_park_dist = vars['pin_park_dist'] |default(6.0) | float %} {% set retract_length = vars['retract_length'] |default(8.5) | float %} {% set quick_tip_forming = vars['quick_tip_forming'] |default(true) | lower == 'true' %} {% set rip_length = vars['rip_length'] |default(1.0) | float %} {% set cut_direction = vars['cut_direction'] |default('') | lower %} {% set cut_accel = vars['cut_accel'] |default(0) | float %} {% set pushback_length = vars['pushback_length'] |default(15) | float %} {% set pushback_dwell_time = vars['pushback_dwell_time'] |default(20) | int %} {% set extruder_move_speed = vars['extruder_move_speed'] |default(25)*60 | float %} {% set restore_position = vars['restore_position'] |default(true) | lower == 'true' %} {% set cut_count = vars['cut_count'] |default(2) | int %} {% set y_cut = vars['y_cut'] |default(false) | lower == 'true' %} {% set awd = vars['awd'] |default(false) | lower == 'true' %} {% set tool_servo_enable = vars['tool_servo_enable'] |default(false) | lower == 'true' %} {% set cut_current_x = vars['cut_current_stepper_x'] |default(0) | float %} {% set cut_current_dc = vars['cut_current_dual_carriage']|default(0) | float %} {% set cut_current_y = vars['cut_current_stepper_y'] |default(0) | float %} {% set cut_current_z = vars['cut_current_stepper_z'] |default(0) | float %} {% if verbose > 0 %} RESPOND TYPE=command MSG='AFC_Cut: Cut Filament' {% endif %} {% set location_factor = { 'left' : { 'x': 1, 'y': 0 }, 'right' : { 'x': -1, 'y': 0 }, 'front' : { 'x': 0, 'y': 1 }, 'back' : { 'x': 0, 'y': -1 } } %} {% if cut_direction == "left" or cut_direction == "right" %} {% set pin_park_x_loc = pin_loc_x + location_factor[cut_direction].x * pin_park_dist %} {% set pin_park_y_loc = pin_loc_y %} {% elif cut_direction == "front" or cut_direction == "back" %} {% set pin_park_x_loc = pin_loc_x %} {% set pin_park_y_loc = pin_loc_y + location_factor[cut_direction].y * pin_park_dist %} {% else %} { action_raise_error("Invalid cut direction. Check the cut_direction in your AFC_Macro_Vars.cfg file!") } {% endif %} {% set _extruder_moved_dist = 0 %} {% if "xy" not in printer.toolhead.homed_axes %} G28 X Y {% endif %} SAVE_GCODE_STATE NAME=_AFC_CUT {% set saved_accel = printer.toolhead.max_accel %} {% if cut_accel > 0 %} {% set selected_accel = cut_accel %} {% else %} {% set selected_accel = accel %} {% endif %} SET_VELOCITY_LIMIT ACCEL={selected_accel} {% set prev_pa = printer.extruder.pressure_advance %} SET_PRESSURE_ADVANCE ADVANCE=0 G90 M83 G92 E0 {% if retract_length > 0 %} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Cut: Retract Filament for Cut' {% endif %} G1 E-{retract_length} F{extruder_move_speed} {% if quick_tip_forming %} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Cut: Performing Quick Tip Form' {% endif %} G1 E{retract_length / 2} F{extruder_move_speed} G1 E-{retract_length / 2} F{extruder_move_speed} {% endif %} {% set _extruder_moved_dist = _extruder_moved_dist + retract_length %} {% endif %} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Cut: Move to Cut Pin Location' {% endif %} _MOVE_TO_CUTTER_PIN PIN_PARK_X_LOC={pin_park_x_loc} PIN_PARK_Y_LOC={pin_park_y_loc} {% if tool_servo_enable %} {% if verbose > 1 %} RESPOND TYPE=command MSG='Cut Servo Extended' {% endif %} _CUTTER_SERVO POS=out {% endif %} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Cut: Cut Move...' {% endif %} {% if cut_current_x > 0 or cut_current_dc > 0 %} {% if printer.dual_carriage is defined %} {% if printer.dual_carriage.carriage_0 == "INACTIVE" %} {% set conf_name = vars['conf_name_dual_carriage']|default('tmc2209 dual_carriage') %} {% set conf_current_dc = printer.configfile.settings[conf_name].run_current|float %} SET_TMC_CURRENT STEPPER=dual_carriage CURRENT={cut_current_dc} {% else %} {% set conf_name = vars['conf_name_stepper_x']|default('tmc2209 stepper_x') %} {% set conf_current_x = printer.configfile.settings[conf_name].run_current|float %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={cut_current_x} {% endif %} {% else %} {% set conf_name = vars['conf_name_stepper_x']|default('tmc2209 stepper_x') %} {% set conf_current_x = printer.configfile.settings[conf_name].run_current|float %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={cut_current_x} {% if awd %} SET_TMC_CURRENT STEPPER=stepper_x1 CURRENT={cut_current_x} {% endif %} {% endif %} {% endif %} {% if cut_current_y > 0 %} {% set conf_name = vars['conf_name_stepper_y']|default('tmc2209 stepper_y') %} {% set conf_current_y = printer.configfile.settings[conf_name].run_current|float %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={cut_current_y} {% if awd %} SET_TMC_CURRENT STEPPER=stepper_y1 CURRENT={cut_current_y} {% endif %} {% endif %} {% if cut_current_z > 0 %} {% set conf_name = vars['conf_name_stepper_z']|default('tmc2209 stepper_z') %} {% set conf_current_z = printer.configfile.settings[conf_name].run_current|float %} SET_TMC_CURRENT STEPPER=stepper_z CURRENT={cut_current_z} {% endif %} {% for cut in range(cut_count - 1) %} _DO_CUT_MOTION PIN_PARK_X_LOC={pin_park_x_loc} PIN_PARK_Y_LOC={pin_park_y_loc} RIP_LENGTH=0 {% endfor %} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Cut: Final Cut...' {% endif %} _DO_CUT_MOTION PIN_PARK_X_LOC={pin_park_x_loc} PIN_PARK_Y_LOC={pin_park_y_loc} RIP_LENGTH={rip_length} {% if cut_current_x > 0 or cut_current_dc > 0 %} {% if printer.dual_carriage is defined %} {% if printer.dual_carriage.carriage_0 == "INACTIVE" %} SET_TMC_CURRENT STEPPER=dual_carriage CURRENT={conf_current_dc} {% else %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={conf_current_x} {% endif %} {% else %} SET_TMC_CURRENT STEPPER=stepper_x CURRENT={conf_current_x} {% if awd %} SET_TMC_CURRENT STEPPER=stepper_x1 CURRENT={conf_current_x} {% endif %} {% endif %} {% endif %} {% if tool_servo_enable %} {% if verbose > 1 %} RESPOND TYPE=command MSG='Cut Servo Retracted' {% endif %} _CUTTER_SERVO POS=in {% endif %} {% if cut_current_y > 0 %} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={conf_current_y} {% if awd %} SET_TMC_CURRENT STEPPER=stepper_y1 CURRENT={conf_current_y} {% endif %} {% endif %} {% if cut_current_z > 0 %} SET_TMC_CURRENT STEPPER=stepper_z CURRENT={conf_current_z} {% endif %} {% set _extruder_moved_dist = _extruder_moved_dist + rip_length %} {% if pushback_length > 0 %} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Cut: Push cut tip back into hotend' {% endif %} G1 E{pushback_length} F{extruder_move_speed} G4 P{pushback_dwell_time} G1 E-{pushback_length} F{extruder_move_speed} {% set _extruder_moved_dist = _extruder_moved_dist - pushback_length %} {% endif %} SET_PRESSURE_ADVANCE ADVANCE={prev_pa} SET_VELOCITY_LIMIT ACCEL={saved_accel} RESTORE_GCODE_STATE NAME=_AFC_CUT MOVE={1 if restore_position else 0} MOVE_SPEED={travel_speed} [gcode_macro _MOVE_TO_CUTTER_PIN] description = Helper to move the toolhead to the target pin in either safe or faster way, depending on toolhead clearance gcode = {% set pin_park_x_loc = params.PIN_PARK_X_LOC|float %} {% set pin_park_y_loc = params.PIN_PARK_Y_LOC|float %} {% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %} {% set travel_speed = gVars['travel_speed'] * 60|float %} {% set vars = printer['gcode_macro _AFC_CUT_TIP_VARS'] %} {% set safe_margin_x, safe_margin_y = vars.safe_margin_xy|map('float') %} {% if ((printer.gcode_move.gcode_position.x - pin_park_x_loc)|abs < safe_margin_x) or ((printer.gcode_move.gcode_position.y - pin_park_y_loc)|abs < safe_margin_y) %} G1 X{pin_park_x_loc} F{travel_speed} G1 Y{pin_park_y_loc} F{travel_speed} {% else %} G1 X{pin_park_x_loc} Y{pin_park_y_loc} F{travel_speed} {% endif %} [gcode_macro _DO_CUT_MOTION] description = Helper to do a single horizontal cut movement gcode = {% set pin_park_x_loc = params.PIN_PARK_X_LOC|float %} {% set pin_park_y_loc = params.PIN_PARK_Y_LOC|float %} {% set rip_length = params.RIP_LENGTH|float %} {% set vars = printer['gcode_macro _AFC_CUT_TIP_VARS'] %} {% set cut_move_dist = vars['cut_move_dist']|float %} {% set cut_direction = vars['cut_direction']|default('')|lower %} {% set cut_fast_move_fraction = vars['cut_fast_move_fraction']|float %} {% set pin_park_dist = vars['pin_park_dist']|float %} {% set cut_fast_move_speed = vars['cut_fast_move_speed'] * 60|float %} {% set cut_slow_move_speed = vars['cut_slow_move_speed'] * 60|float %} {% set cut_dwell_time = vars['cut_dwell_time']|float %} {% set evacuate_speed = vars['evacuate_speed'] * 60|float %} {% set rip_speed = vars['rip_speed'] * 60|float %} {% if printer.dual_carriage is defined %} {% if printer.dual_carriage.carriage_0 == "INACTIVE" %} {% set x_max = printer.configfile.config.dual_carriage.position_max|float|round(3) %} {% set x_min = printer.configfile.config.dual_carriage.position_min|float|round(3) %} {% else %} {% set x_max = printer.toolhead.axis_maximum.x %} {% set x_min = printer.toolhead.axis_minimum.x %} {% endif %} {% else %} {% set x_max = printer.toolhead.axis_maximum.x %} {% set x_min = printer.toolhead.axis_minimum.x %} {% endif %} {% set y_max = printer.toolhead.axis_maximum.y %} {% set y_min = printer.toolhead.axis_minimum.y %} {% set cut_dist = cut_move_dist + pin_park_dist %} {% set location_factor = { 'left' : { 'x': -1, 'y': 0 }, 'right' : { 'x': 1, 'y': 0 }, 'front' : { 'x': 0, 'y': -1 }, 'back' : { 'x': 0, 'y': 1 } } %} {% if cut_direction == "left" or cut_direction == "right" %} {% set fast_slow_transition_loc_x = pin_park_x_loc + location_factor[cut_direction].x * (cut_dist * cut_fast_move_fraction)| float %} {% set full_cut_loc_x = pin_park_x_loc + location_factor[cut_direction].x * cut_dist| float %} {% if full_cut_loc_x > x_max or full_cut_loc_x < x_min %} { action_raise_error("X Cut move is outside your printer bounds. Check the cut_move_dist in your AFC_Macro_Vars.cfg file!") } {% else %} G1 X{fast_slow_transition_loc_x} F{cut_fast_move_speed} G1 X{full_cut_loc_x} F{cut_slow_move_speed} G4 P{cut_dwell_time} {% if rip_length > 0 %} G1 E-{rip_length} F{rip_speed} {% endif %} G4 P200 G1 X{pin_park_x_loc} F{evacuate_speed} G4 P200 {% endif %} {% elif cut_direction == "front" or cut_direction == "back" %} {% set fast_slow_transition_loc_y = pin_park_y_loc + location_factor[cut_direction].y * (cut_dist * cut_fast_move_fraction)| float %} {% set full_cut_loc_y = pin_park_y_loc + location_factor[cut_direction].y * cut_dist| float %} {% if full_cut_loc_y > y_max or full_cut_loc_y < y_min %} { action_raise_error("Y Cut move is outside your printer bounds. Check the cut_move_dist in your AFC_Macro_Vars.cfg file!") } {% else %} G1 Y{fast_slow_transition_loc_y} F{cut_fast_move_speed} G1 Y{full_cut_loc_y} F{cut_slow_move_speed} G4 P{cut_dwell_time} {% if rip_length > 0 %} G1 E-{rip_length} F{rip_speed} {% endif %} G4 P200 G1 Y{pin_park_y_loc} F{evacuate_speed} G4 P200 {% endif %} {% else %} { action_raise_error("Invalid cut direction. Check the cut_direction in your AFC_Macro_Vars.cfg file!") } {% endif %} [gcode_macro _CUTTER_SERVO] variable_dwell_time = 200 gcode = {% set c1 = printer['gcode_macro _AFC_CUT_TIP_VARS'] %} {% set pos = params.POS %} {% if pos == "in" %} SET_SERVO SERVO={c1.tool_servo_name} ANGLE={c1.tool_servo_angle_in} G4 P{dwell_time} {% elif pos == "out" %} SET_SERVO SERVO={c1.tool_servo_name} ANGLE={c1.tool_servo_angle_out} G4 P{dwell_time} {% else %} {action_respond_info("Cutter Servo: provide POS=[in|out]")} {% endif %} SET_SERVO SERVO={c1.tool_servo_name} WIDTH=0 [gcode_macro AFC_KICK] gcode = {% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %} {% set accel = gVars['accel'] | default(2000) | float %} {% set travel_speed = gVars['travel_speed'] | default(120)*60 | float %} {% set z_travel_speed = gVars['z_travel_speed'] | default(30)*60 | float %} {% set verbose = gVars['verbose'] | default(1) | int %} {% set vars = printer['gcode_macro _AFC_KICK_VARS'] %} {% set kick_start_x, kick_start_y, kick_start_z = vars.kick_start_loc|default([-1,-1,5])|map('float') %} {% set kick_z = vars['kick_z'] | default(1.5) | float %} {% set kick_direction = vars['kick_direction'] | default('') | lower %} {% set kick_move_dist = vars['kick_move_dist'] | default(45) | float %} {% set z_after_kick = vars['z_after_kick'] | default(10) | float %} {% set kick_speed = vars['kick_speed'] | default(150)*60 | float %} {% set kick_accel = vars['kick_accel'] | default(0) | float %} {% if printer.dual_carriage is defined %} {% if printer.dual_carriage.carriage_0 == "INACTIVE" %} {% set x_max = printer.configfile.config.dual_carriage.position_max|float|round(3) %} {% set x_min = printer.configfile.config.dual_carriage.position_min|float|round(3) %} {% else %} {% set x_max = printer.toolhead.axis_maximum.x %} {% set x_min = printer.toolhead.axis_minimum.x %} {% endif %} {% else %} {% set x_max = printer.toolhead.axis_maximum.x %} {% set x_min = printer.toolhead.axis_minimum.x %} {% endif %} {% set y_max = printer.toolhead.axis_maximum.y %} {% set y_min = printer.toolhead.axis_minimum.y %} {% set saved_accel = printer.toolhead.max_accel %} {% if kick_accel > 0 %} {% set selected_accel = kick_accel %} {% else %} {% set selected_accel = accel %} {% endif %} SET_VELOCITY_LIMIT ACCEL={selected_accel} {% if verbose > 0 %} RESPOND TYPE=command MSG='AFC_Kick: Starting Filament Kick' {% endif %} G90 {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Kick: Move to Start Position' {% endif %} G1 X{kick_start_x} Y{kick_start_y} F{travel_speed} G1 Z{kick_start_z} F{z_travel_speed} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Kick: Drop Z For Kick Move' {% endif %} {% if kick_z > 0 %} G1 Z{kick_z} F{z_travel_speed} {% else %} RESPOND TYPE=command MSG='AFC-KICK: kick_z value to low. Please adjust in AFC_Macro_Vars.cfg. Defaulting to 0.5mm z-height' G1 Z0.5 F{z_travel_speed} {% endif %} {% set location_factor = { 'left' : { 'x': -1, 'y': 0 }, 'right' : { 'x': 1, 'y': 0 }, 'front' : { 'x': 0, 'y': -1 }, 'back' : { 'x': 0, 'y': 1 } } %} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Kick: Kick filament' {% endif %} {% if kick_direction == "left" or kick_direction == "right" %} {% if (kick_start_x + location_factor[kick_direction].x * kick_move_dist) > x_max or (kick_start_x + location_factor[kick_direction].x * kick_move_dist) < x_min %} { action_raise_error("X Kick move is outside your printer bounds. Check the kick_move_dist in your AFC_Macro_Vars.cfg file!") } {% else %} G1 X{kick_start_x + location_factor[kick_direction].x * kick_move_dist} F{kick_speed} {% endif %} {% elif kick_direction == "front" or kick_direction == "back" %} {% if (kick_start_y + location_factor[kick_direction].y * kick_move_dist) > y_max or (kick_start_y + location_factor[kick_direction].y * kick_move_dist) < y_min %} { action_raise_error("Y Kick move is outside your printer bounds. Check the kick_move_dist in your AFC_Macro_Vars.cfg file!") } {% else %} G1 Y{kick_start_y + location_factor[kick_direction].y * kick_move_dist} F{kick_speed} {% endif %} {% else %} { action_raise_error("Error in kick movement. Check the directions in your AFC_Macro_Vars.cfg file!") } {% endif %} G1 Z{z_after_kick} F{z_travel_speed} SET_VELOCITY_LIMIT ACCEL={saved_accel} [gcode_macro AFC_PARK] gcode = {% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %} {% set travel_speed = gVars['travel_speed'] | default(120)*60 | float %} {% set verbose = gVars['verbose'] | default(1) | int %} {% set z_travel_speed = gVars['z_travel_speed'] | default(30)*60 | float %} {% set vars = printer['gcode_macro _AFC_PARK_VARS'] %} {% set Px, Py = vars.park_loc_xy | default([-1,-1]) | map('float') %} {% set Px = params.X | default(Px) | float %} {% set Py = params.Y | default(Py) | float %} {% set z_hop = vars['z_hop'] | default(0) | float %} {% set z_hop = params.Z_HOP | default(z_hop) | float %} {% set park_z = vars['park_z'] | default(0.0) | float %} {% set max_z = printer.toolhead.axis_maximum.z - printer.gcode_move.homing_origin.z |float %} {% set cur_z = printer.toolhead.position.z|float %} {% set z_safe = cur_z + z_hop %} {% if z_safe > max_z %} {% set z_safe = max_z %} {% endif %} {% if verbose > 0 %} RESPOND TYPE=command MSG='AFC_Park: Park Toolhead' {% endif %} G90 G1 Z{z_safe} F{z_travel_speed} G1 X{Px} Y{Py} F{travel_speed} {% if park_z > 0 and park_z < z_safe %} G1 Z{park_z} F{z_travel_speed} {% endif %} [gcode_macro AFC_POOP] variable_max_iteration_length = 40 variable_iteration_z_raise = 6 variable_iteration_z_change = 0.6 variable_max_iterations_per_blob = 3 variable_pressure_release_time = 1000 variable_purge_z = 0 gcode = {% set gVars = printer['gcode_macro _AFC_GLOBAL_VARS'] %} {% set travel_speed = gVars['travel_speed'] | default(120)*60 | float %} {% set z_travel_speed = gVars['z_travel_speed'] | default(30)*60 | float %} {% set verbose = gVars['verbose'] | default(1) | int %} {% set vars = printer['gcode_macro _AFC_POOP_VARS'] %} {% set purge_x, purge_y = vars.purge_loc_xy | default([-1,-1]) | map('float') %} {% set purge_spd = vars['purge_spd'] | default(6.5)*60 | float %} {% set z_poop = vars['z_purge_move'] | default(true) | lower == 'true' %} {% set fast_z = vars['fast_z'] | default(200)*60 | float %} {% set z_lift = vars['z_lift'] | default(10) | float %} {% set part_cooling_fan = vars['part_cooling_fan'] | default(true) | lower == 'true' %} {% set part_cooling_fan_speed = vars['part_cooling_fan_speed']| default(1.0) | float %} {% set purge_cool_time = vars['purge_cool_time'] | default(2)*1000 | float %} {% set purge_length = vars['purge_length'] | default(72.111) | float %} {% set purge_length_minimum = vars['purge_length_minimum']| default(60.999) | float %} {% set purge_start = vars['purge_start'] | default(0.6) | float %} {% set restore_position = vars['restore_position'] | default(true) | lower == 'true' %} {% if verbose > 0 %} RESPOND TYPE=command MSG='AFC_Poop: Starting poop' {% endif %} SAVE_GCODE_STATE NAME=_AFC_POOPING {% if part_cooling_fan %} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Poop: Set Cooling Fan to Full Speed' {% endif %} {% set backup_fan_speed = printer.fan.speed %} M106 S{(part_cooling_fan_speed * 255)|int} {% endif %} {% set backup_feedrate = printer.gcode_move.speed_factor %} M220 S100 {% if params.PURGE_LENGTH %} {% set purge_len = params.PURGE_LENGTH|float %} {% else %} {% set purge_len = purge_length %} {% endif %} {% set purge_len = [purge_len, purge_length_minimum]|max %} G90 {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Poop: Move To Purge Location' {% endif %} G1 X{purge_x} Y{purge_y} F{travel_speed} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Poop: z_poop {z_poop}' {% endif %} {% if z_poop %} G1 Z{purge_z + purge_start} F{z_travel_speed} {% endif %} {% set iterations = (purge_len / max_iteration_length)|round(0, 'ceil')|int %} {% for n in range(iterations) %} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Poop: Purge Iteration {n}' {% endif %} {% set step = n % max_iterations_per_blob %} {% if step == 0 %} {% if z_poop %} G1 Z{purge_z + purge_start} F{z_travel_speed} {% endif %} {% endif %} {% set purge_amount_left = purge_len - (max_iteration_length * n) %} {% set extrude_amount = [purge_amount_left, max_iteration_length]|min %} {% set extrude_ratio = extrude_amount / max_iteration_length %} G91 M83 {% set step_triangular = step * (step + 1) / 2 %} {% set z_raise_substract = purge_start if step == 0 else step_triangular * iteration_z_change %} {% set raise_z = (iteration_z_raise - z_raise_substract) * extrude_ratio %} {% set raise_z = [raise_z, 0]|max %} {% set duration = extrude_amount / purge_spd %} {% if z_poop %} {% set speed = raise_z / duration %} G1 Z{raise_z} E{extrude_amount} F{speed} {% else %} G1 E{extrude_amount} F{purge_spd} {% endif %} {% set max_iterations_reached = step == max_iterations_per_blob - 1 %} {% set purge_length_reached = purge_len - max_iteration_length * (n + 1) <= 0 %} {% if max_iterations_reached or purge_length_reached %} M83 G4 P{purge_cool_time} {% endif %} {% endfor %} G90 {% set final_poop_height = purge_z + purge_start + (iterations * iteration_z_raise) %} {% set new_z = final_poop_height + z_lift %} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Poop: Lifting Z to {new_z} mm' {% endif %} {% if z_poop %} G1 Z{new_z} F{fast_z} {% endif %} {% if verbose > 1 %} RESPOND TYPE=command MSG='AFC_Poop: Restore fan speed and feedrate' {% endif %} {% if part_cooling_fan %} M106 S{(backup_fan_speed * 255)|int} {% endif %} M220 S{(backup_feedrate * 100)|int} RESTORE_GCODE_STATE NAME=_AFC_POOPING MOVE={1 if restore_position else 0} [gcode_macro _AFC_GLOBAL_VARS] description = Global variables used in multiple macros gcode = variable_stepper_name = 'lane' variable_travel_speed = 120 variable_z_travel_speed = 30 variable_accel = 2000 variable_verbose = 1 [gcode_macro _AFC_CUT_TIP_VARS] description = Toolhead tip cutting macro configuration variables gcode = variable_pin_loc_xy = 10,0 variable_cut_accel = 0 variable_cut_direction = "left" variable_pin_park_dist = 6.0 variable_cut_move_dist = 10 variable_cut_fast_move_speed = 32 variable_cut_slow_move_speed = 10 variable_evacuate_speed = 150 variable_cut_dwell_time = 50 variable_cut_fast_move_fraction = 0.85 variable_extruder_move_speed = 25 variable_restore_position = False variable_retract_length = 21 variable_quick_tip_forming = False variable_cut_count = 2 variable_rip_length = 1.0 variable_rip_speed = 3 variable_pushback_length = 12.45 variable_pushback_dwell_time = 20 variable_safe_margin_xy = 30, 30 [gcode_macro _AFC_POOP_VARS] description = Poop macro configuration variables gcode = variable_purge_loc_xy = 5, 175 variable_purge_spd = 6.5 variable_z_purge_move = True variable_fast_z = 200 variable_z_lift = 15 variable_restore_position = False variable_purge_start = 0.4 variable_part_cooling_fan = True variable_part_cooling_fan_speed = 1.0 variable_purge_cool_time = 4 variable_purge_length = 72.111 variable_purge_length_minimum = 70 [gcode_macro _AFC_KICK_VARS] description = Kick macro configuration variables gcode = variable_kick_start_loc = 30, 175 ,10 variable_kick_z = 1.5 variable_kick_speed = 300 variable_kick_accel = 0 variable_kick_direction = "left" variable_kick_move_dist = 30 variable_z_after_kick = 10 [gcode_macro _AFC_BRUSH_VARS] description = Brush macro configuration variables gcode = variable_brush_loc = 108,350,1.5 variable_brush_clean_speed = 150 variable_brush_clean_accel = 0 variable_brush_width = 30 variable_brush_depth = 10 variable_y_brush = True variable_brush_count = 4 variable_z_move = -1 [gcode_macro _AFC_PARK_VARS] description = Park macro configuration variables gcode = variable_park_loc_xy = 10, 350 variable_z_hop = 0 variable_park_z = 0 [board_pins Turtle_1] mcu = Turtle_1 aliases = M1_STEP=PD4 , M1_DIR=PD3 , M1_EN=PD6 , M1_UART=PD5 , M2_STEP=PC12 , M2_DIR=PC11 , M2_EN=PD1 , M2_UART=PD0 , M3_STEP=PE2 , M3_DIR=PE3 , M3_EN=PE0 , M3_UART=PE1 , M4_STEP=PD15 , M4_DIR=PD14 , M4_EN=PC7 , M4_UART=PC6 , HUB=PC4 , TRG1=PC5 , TRG2=PB0 , TRG3=PB1 , TRG4=PB2 , EXT1=PE8 , EXT2=PE9 , EXT3=PE10 , EXT4=PE11 , TN_ADV=PE12 , TN_TRL=PE13 , SW1=PC4 , SW2=PC5 , SW3=PB0 , SW4=PB1 , SW5=PB2 , SW6=PE7 , SW7=PE8 , SW8=PE9 , SW9=PE10 , SW10=PE11 , SW11=PE12 , SW12=PE13 , MOT1_RWD=PA0 , MOT1_FWD=PA1 , MOT1_EN=PA2 , MOT2_RWD=PA6 , MOT2_FWD=PA7 , MOT2_EN=PA5 , MOT3_RWD=PB14 , MOT3_FWD=PB15 , MOT3_EN=PB13 , MOT4_RWD=PD12 , MOT4_FWD=PD13 , MOT4_EN=PD11 , RGB1=PE14 , RGB2=PE15 , RGB3=PB10 , RGB4=PB11 , [mcu Turtle_1] serial = /dev/serial/by-id/usb-Klipper_stm32h723xx_380005000951333039393136-if00 [AFC_BoxTurtle Turtle_1] type = 'Box Turtle' hub = Turtle_1 extruder = extruder buffer = Turtle_1 [temperature_sensor Turtle_1] sensor_type = temperature_mcu sensor_mcu = Turtle_1 [AFC_stepper lane1] unit = Turtle_1:1 step_pin = Turtle_1:M1_STEP dir_pin = !Turtle_1:M1_DIR enable_pin = !Turtle_1:M1_EN microsteps = 16 rotation_distance = 4.65 dist_hub = 185.0 park_dist = 10 led_index = AFC_Indicator:1 afc_motor_rwd = Turtle_1:MOT1_RWD afc_motor_fwd = Turtle_1:MOT1_FWD afc_motor_enb = Turtle_1:MOT1_EN rwd_speed_multiplier = 0.50 fwd_speed_multiplier = 0.50 pwm = True prep = ^!Turtle_1:TRG1 load = ^Turtle_1:EXT1 [tmc2209 AFC_stepper lane1] uart_pin = Turtle_1:M1_UART uart_address = 0 run_current = 0.89 sense_resistor = 0.110 [AFC_stepper lane2] unit = Turtle_1:2 step_pin = Turtle_1:M2_STEP dir_pin = !Turtle_1:M2_DIR enable_pin = !Turtle_1:M2_EN microsteps = 16 rotation_distance = 4.65 dist_hub = 110.0 park_dist = 10 led_index = AFC_Indicator:2 afc_motor_rwd = Turtle_1:MOT2_FWD afc_motor_fwd = Turtle_1:MOT2_RWD afc_motor_enb = Turtle_1:MOT2_EN rwd_speed_multiplier = 0.50 fwd_speed_multiplier = 0.50 pwm = True prep = ^!Turtle_1:TRG2 load = ^Turtle_1:EXT2 [tmc2209 AFC_stepper lane2] uart_pin = Turtle_1:M2_UART uart_address = 0 run_current = 0.89 sense_resistor = 0.110 [AFC_stepper lane3] unit = Turtle_1:3 step_pin = Turtle_1:M3_STEP dir_pin = Turtle_1:M3_DIR enable_pin = !Turtle_1:M3_EN microsteps = 16 rotation_distance = 4.65 dist_hub = 110.0 park_dist = 10 led_index = AFC_Indicator:3 afc_motor_rwd = Turtle_1:MOT3_RWD afc_motor_fwd = Turtle_1:MOT3_FWD afc_motor_enb = Turtle_1:MOT3_EN rwd_speed_multiplier = 0.50 fwd_speed_multiplier = 0.50 pwm = True prep = ^!Turtle_1:TRG3 load = ^Turtle_1:EXT3 [tmc2209 AFC_stepper lane3] uart_pin = Turtle_1:M3_UART uart_address = 0 run_current = 0.89 sense_resistor = 0.110 [AFC_stepper lane4] unit = Turtle_1:4 step_pin = Turtle_1:M4_STEP dir_pin = !Turtle_1:M4_DIR enable_pin = !Turtle_1:M4_EN microsteps = 16 rotation_distance = 4.65 dist_hub = 175.0 park_dist = 10 led_index = AFC_Indicator:4 afc_motor_rwd = Turtle_1:MOT4_RWD afc_motor_fwd = Turtle_1:MOT4_FWD afc_motor_enb = Turtle_1:MOT4_EN rwd_speed_multiplier = 0.50 fwd_speed_multiplier = 0.50 pwm = True prep = ^!Turtle_1:TRG4 load = ^Turtle_1:EXT4 [tmc2209 AFC_stepper lane4] uart_pin = Turtle_1:M4_UART uart_address = 0 run_current = 0.89 sense_resistor = 0.110 [AFC_hub Turtle_1] switch_pin = ^Turtle_1:HUB afc_bowden_length = 905.0 move_dis = 50 cut = False assisted_retract = true cut_cmd = AFC cut_dist = 50 cut_clear = 120 cut_min_length = 300.0 cut_servo_pass_angle = 10 cut_servo_clip_angle = 180 cut_servo_prep_angle = 80 afc_unload_bowden_length = 905.0 [AFC_led AFC_Indicator] pin = Turtle_1:RGB1 chain_count = 4 color_order = RGBW [probe] z_offset = -0.490 [bed_mesh default] version = 1 points = 0.069239, 0.071041, 0.099555, 0.098797, 0.066482 0.050199, 0.028278, 0.058880, 0.062793, 0.036768 -0.004339, -0.019166, 0.006389, 0.021094, 0.000248 0.038504, 0.023890, 0.047563, 0.054298, 0.046168 0.088957, 0.078098, 0.102644, 0.115570, 0.108546 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = bicubic tension = 0.2 min_x = 40.0 max_x = 310.0 min_y = 40.0 max_y = 310.0 [skew_correction CaliFlower] xy_skew = -0.00010067959874593741 xz_skew = 0.0 yz_skew = 0.0 [scanner model default] model_coef = 1.512286511422633, 1.791869793481527, 0.9046345510592209, 1.3583595966767779, 0.1772580685972824, -2.8465379899202046, -0.24869260761197, 3.477783069358929, 0.30677264198426873, -1.3286710120606207 model_domain = 3.209450383501297e-07,3.360899788852191e-07 model_range = 0.200000,5.100000 model_temp = 71.304352 model_offset = 0.00000 model_mode = touch model_fw_version = CARTOGRAPHER 5.0.0