===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-I', '/home/pi/printer_data/comms/klippy.serial', '-l', '/home/pi/printer_data/logs/klippy.log', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.12.0-10-gea2f6bc0-dirty' Untracked files: klippy/extras/gcode_shell_command.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper CPU: 4 core ARMv7 Processor rev 3 (v7l) Python: '3.9.2 (default, Mar 12 2021, 04:06:34) \n[GCC 10.2.1 20210110]' webhooks client 3044175824: {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} =============== Log rollover at Wed Dec 6 01:42:14 2023 =============== b'Got EOF when reading from device' Unable to issue reset command on MCU 'mcu' Attempting MCU 'PIS' reset webhooks client 3044175824: Disconnected Restarting printer Start printer at Wed Dec 6 01:44:36 2023 (1701827076.4 7670.6) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' webhooks client 3020256304: New connection webhooks client 3020256304: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 800, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/pi/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/pi/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/pi/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 805, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/pi/klipper/klippy/../.config(1622): Wed Nov 29 21:12:11 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # 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 is not set # CONFIG_MACH_HC32F460 is not set CONFIG_MACH_RP2040=y # 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="rp2040" CONFIG_MCU="rp2040" CONFIG_CLOCK_FREQ=12000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x10000100 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x42000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x10000100 CONFIG_RP2040_SELECT=y CONFIG_RP2040_HAVE_STAGE2=y CONFIG_RP2040_FLASH_START_0100=y # CONFIG_RP2040_FLASH_START_4000 is not set CONFIG_RP2040_STAGE2_FILE="boot2_w25q080.S" CONFIG_RP2040_STAGE2_CLKDIV=2 CONFIG_RP2040_USB=y # CONFIG_RP2040_SERIAL_UART0 is not set # CONFIG_RP2040_CANBUS is not set # CONFIG_RP2040_USBCANBUS is not set CONFIG_RP2040_CANBUS_GPIO_RX=4 CONFIG_RP2040_CANBUS_GPIO_TX=5 CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_LIS2DW=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=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 ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(8487): Fri Dec 1 21:22:20 2023 Last MCU build version: v0.12.0-10-gea2f6bc0 Last MCU build tools: gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/pi/klipper/klippy/../out/klipper.elf(1763224): Fri Dec 1 21:22:26 2023 webhooks client 3020256304: Disconnected Restarting printer Start printer at Wed Dec 6 01:46:10 2023 (1701827170.9 7765.0) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' webhooks client 3020102336: New connection webhooks client 3020102336: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0' Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-I', '/home/pi/printer_data/comms/klippy.serial', '-l', '/home/pi/printer_data/logs/klippy.log', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.12.0-10-gea2f6bc0-dirty' Untracked files: klippy/extras/gcode_shell_command.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper CPU: 4 core ARMv7 Processor rev 3 (v7l) Python: '3.9.2 (default, Mar 12 2021, 04:06:34) \n[GCC 10.2.1 20210110]' Start printer at Wed Dec 6 01:46:42 2023 (1701827202.5 24.3) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable webhooks client 3037226488: New connection webhooks client 3037226488: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable Printer is not ready The klippy host software is attempting to connect. Please retry in a few moments. mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable Printer is not ready The klippy host software is attempting to connect. Please retry in a few moments. mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 800, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/pi/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'PIS': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 805, in _mcu_identify raise error(str(e)) mcu.error: mcu 'PIS': Unable to connect Build file /home/pi/klipper/klippy/../.config(1622): Wed Nov 29 21:12:11 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # 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 is not set # CONFIG_MACH_HC32F460 is not set CONFIG_MACH_RP2040=y # 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="rp2040" CONFIG_MCU="rp2040" CONFIG_CLOCK_FREQ=12000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x10000100 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x42000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x10000100 CONFIG_RP2040_SELECT=y CONFIG_RP2040_HAVE_STAGE2=y CONFIG_RP2040_FLASH_START_0100=y # CONFIG_RP2040_FLASH_START_4000 is not set CONFIG_RP2040_STAGE2_FILE="boot2_w25q080.S" CONFIG_RP2040_STAGE2_CLKDIV=2 CONFIG_RP2040_USB=y # CONFIG_RP2040_SERIAL_UART0 is not set # CONFIG_RP2040_CANBUS is not set # CONFIG_RP2040_USBCANBUS is not set CONFIG_RP2040_CANBUS_GPIO_RX=4 CONFIG_RP2040_CANBUS_GPIO_TX=5 CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_LIS2DW=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=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 ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(8487): Fri Dec 1 21:22:20 2023 Last MCU build version: v0.12.0-10-gea2f6bc0 Last MCU build tools: gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/pi/klipper/klippy/../out/klipper.elf(1763224): Fri Dec 1 21:22:26 2023 webhooks client 3037226488: Disconnected Restarting printer Start printer at Wed Dec 6 01:50:34 2023 (1701827434.3 241.4) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect webhooks client 3037635200: New connection webhooks client 3037635200: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-I', '/home/pi/printer_data/comms/klippy.serial', '-l', '/home/pi/printer_data/logs/klippy.log', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.12.0-10-gea2f6bc0-dirty' Untracked files: klippy/extras/gcode_shell_command.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper CPU: 4 core ARMv7 Processor rev 3 (v7l) Python: '3.9.2 (default, Mar 12 2021, 04:06:34) \n[GCC 10.2.1 20210110]' Start printer at Wed Dec 6 01:51:03 2023 (1701827463.8 23.6) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable webhooks client 3037896512: New connection webhooks client 3037896512: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 800, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/pi/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'PIS': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 805, in _mcu_identify raise error(str(e)) mcu.error: mcu 'PIS': Unable to connect Build file /home/pi/klipper/klippy/../.config(1622): Wed Nov 29 21:12:11 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # 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 is not set # CONFIG_MACH_HC32F460 is not set CONFIG_MACH_RP2040=y # 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="rp2040" CONFIG_MCU="rp2040" CONFIG_CLOCK_FREQ=12000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x10000100 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x42000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x10000100 CONFIG_RP2040_SELECT=y CONFIG_RP2040_HAVE_STAGE2=y CONFIG_RP2040_FLASH_START_0100=y # CONFIG_RP2040_FLASH_START_4000 is not set CONFIG_RP2040_STAGE2_FILE="boot2_w25q080.S" CONFIG_RP2040_STAGE2_CLKDIV=2 CONFIG_RP2040_USB=y # CONFIG_RP2040_SERIAL_UART0 is not set # CONFIG_RP2040_CANBUS is not set # CONFIG_RP2040_USBCANBUS is not set CONFIG_RP2040_CANBUS_GPIO_RX=4 CONFIG_RP2040_CANBUS_GPIO_TX=5 CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_LIS2DW=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=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 ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(8487): Fri Dec 1 21:22:20 2023 Last MCU build version: v0.12.0-10-gea2f6bc0 Last MCU build tools: gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/pi/klipper/klippy/../out/klipper.elf(1763224): Fri Dec 1 21:22:26 2023 Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-I', '/home/pi/printer_data/comms/klippy.serial', '-l', '/home/pi/printer_data/logs/klippy.log', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.12.0-10-gea2f6bc0-dirty' Untracked files: klippy/extras/gcode_shell_command.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper CPU: 4 core ARMv7 Processor rev 3 (v7l) Python: '3.9.2 (default, Mar 12 2021, 04:06:34) \n[GCC 10.2.1 20210110]' Start printer at Wed Dec 6 11:25:07 2023 (1701861907.9 34453.9) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect webhooks client 3037577760: New connection webhooks client 3037577760: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable Attempting MCU 'mcu' reset command Attempting MCU 'PIS' reset Unhandled exception during post run Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 234, in run self.send_event("klippy:firmware_restart") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 951, in _firmware_restart self._restart_arduino() File "/home/pi/klipper/klippy/mcu.py", line 911, in _restart_arduino serialhdl.arduino_reset(self._serialport, self._reactor) File "/home/pi/klipper/klippy/serialhdl.py", line 385, in arduino_reset ser.dtr = False File "/home/pi/klippy-env/lib/python3.9/site-packages/serial/serialutil.py", line 469, in dtr self._update_dtr_state() File "/home/pi/klippy-env/lib/python3.9/site-packages/serial/serialposix.py", line 636, in _update_dtr_state fcntl.ioctl(self.fd, TIOCMBIC, TIOCM_DTR_str) BrokenPipeError: [Errno 32] Broken pipe Restarting printer Start printer at Wed Dec 6 11:25:33 2023 (1701861933.8 34479.8) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect webhooks client 3037995672: New connection webhooks client 3037995672: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/serial/by-id/usb-Klipper_rp2040_E6611CB6973C5C24-if00: [Errno 11] Resource temporarily unavailable Attempting MCU 'mcu' reset command Attempting MCU 'PIS' reset Unhandled exception during post run Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 234, in run self.send_event("klippy:firmware_restart") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 951, in _firmware_restart self._restart_arduino() File "/home/pi/klipper/klippy/mcu.py", line 911, in _restart_arduino serialhdl.arduino_reset(self._serialport, self._reactor) File "/home/pi/klipper/klippy/serialhdl.py", line 383, in arduino_reset ser.dtr = True File "/home/pi/klippy-env/lib/python3.9/site-packages/serial/serialutil.py", line 469, in dtr self._update_dtr_state() File "/home/pi/klippy-env/lib/python3.9/site-packages/serial/serialposix.py", line 634, in _update_dtr_state fcntl.ioctl(self.fd, TIOCMBIS, TIOCM_DTR_str) OSError: [Errno 5] Input/output error Restarting printer Start printer at Wed Dec 6 11:26:10 2023 (1701861970.5 34516.5) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/ACM0 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect webhooks client 3037990192: New connection webhooks client 3037990192: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 2] could not open port /dev/ACM0: [Errno 2] No such file or directory: '/dev/ACM0' mcu 'PIS': Unable to open serial port: [Errno 2] could not open port /dev/ACM0: [Errno 2] No such file or directory: '/dev/ACM0' mcu 'PIS': Unable to open serial port: [Errno 2] could not open port /dev/ACM0: [Errno 2] No such file or directory: '/dev/ACM0' mcu 'PIS': Unable to open serial port: [Errno 2] could not open port /dev/ACM0: [Errno 2] No such file or directory: '/dev/ACM0' mcu 'PIS': Unable to open serial port: [Errno 2] could not open port /dev/ACM0: [Errno 2] No such file or directory: '/dev/ACM0' mcu 'PIS': Unable to open serial port: [Errno 2] could not open port /dev/ACM0: [Errno 2] No such file or directory: '/dev/ACM0' mcu 'PIS': Unable to open serial port: [Errno 2] could not open port /dev/ACM0: [Errno 2] No such file or directory: '/dev/ACM0' mcu 'PIS': Unable to open serial port: [Errno 2] could not open port /dev/ACM0: [Errno 2] No such file or directory: '/dev/ACM0' webhooks client 3037990192: Disconnected Restarting printer Start printer at Wed Dec 6 11:26:49 2023 (1701862009.2 34555.2) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/ACM0 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect webhooks client 3038838688: New connection webhooks client 3038838688: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 2] could not open port /dev/ACM0: [Errno 2] No such file or directory: '/dev/ACM0' mcu 'PIS': Unable to open serial port: [Errno 2] could not open port /dev/ACM0: [Errno 2] No such file or directory: '/dev/ACM0' mcu 'PIS': Unable to open serial port: [Errno 2] could not open port /dev/ACM0: [Errno 2] No such file or directory: '/dev/ACM0' mcu 'PIS': Unable to open serial port: [Errno 2] could not open port /dev/ACM0: [Errno 2] No such file or directory: '/dev/ACM0' mcu 'PIS': Unable to open serial port: [Errno 2] could not open port /dev/ACM0: [Errno 2] No such file or directory: '/dev/ACM0' Attempting MCU 'mcu' reset command Attempting MCU 'PIS' reset Unhandled exception during post run Traceback (most recent call last): File "/home/pi/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: '/dev/ACM0' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 234, in run self.send_event("klippy:firmware_restart") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 951, in _firmware_restart self._restart_arduino() File "/home/pi/klipper/klippy/mcu.py", line 911, in _restart_arduino serialhdl.arduino_reset(self._serialport, self._reactor) File "/home/pi/klipper/klippy/serialhdl.py", line 379, in arduino_reset ser = serial.Serial(serialport, 2400, timeout=0, exclusive=True) File "/home/pi/klippy-env/lib/python3.9/site-packages/serial/serialutil.py", line 240, in __init__ self.open() File "/home/pi/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 /dev/ACM0: [Errno 2] No such file or directory: '/dev/ACM0' Restarting printer Start printer at Wed Dec 6 11:27:12 2023 (1701862032.6 34578.6) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/ttyACM0 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect webhooks client 3038909920: New connection webhooks client 3038909920: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-I', '/home/pi/printer_data/comms/klippy.serial', '-l', '/home/pi/printer_data/logs/klippy.log', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.12.0-10-gea2f6bc0-dirty' Untracked files: klippy/extras/gcode_shell_command.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper CPU: 4 core ARMv7 Processor rev 3 (v7l) Python: '3.9.2 (default, Mar 12 2021, 04:06:34) \n[GCC 10.2.1 20210110]' Start printer at Wed Dec 6 11:28:53 2023 (1701862133.4 23.3) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/ttyACM0 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable webhooks client 3037713024: New connection webhooks client 3037713024: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 800, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/pi/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'PIS': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 805, in _mcu_identify raise error(str(e)) mcu.error: mcu 'PIS': Unable to connect Build file /home/pi/klipper/klippy/../.config(1622): Wed Nov 29 21:12:11 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # 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 is not set # CONFIG_MACH_HC32F460 is not set CONFIG_MACH_RP2040=y # 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="rp2040" CONFIG_MCU="rp2040" CONFIG_CLOCK_FREQ=12000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x10000100 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x42000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x10000100 CONFIG_RP2040_SELECT=y CONFIG_RP2040_HAVE_STAGE2=y CONFIG_RP2040_FLASH_START_0100=y # CONFIG_RP2040_FLASH_START_4000 is not set CONFIG_RP2040_STAGE2_FILE="boot2_w25q080.S" CONFIG_RP2040_STAGE2_CLKDIV=2 CONFIG_RP2040_USB=y # CONFIG_RP2040_SERIAL_UART0 is not set # CONFIG_RP2040_CANBUS is not set # CONFIG_RP2040_USBCANBUS is not set CONFIG_RP2040_CANBUS_GPIO_RX=4 CONFIG_RP2040_CANBUS_GPIO_TX=5 CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_LIS2DW=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=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 ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(8487): Fri Dec 1 21:22:20 2023 Last MCU build version: v0.12.0-10-gea2f6bc0 Last MCU build tools: gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/pi/klipper/klippy/../out/klipper.elf(1763224): Fri Dec 1 21:22:26 2023 Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-I', '/home/pi/printer_data/comms/klippy.serial', '-l', '/home/pi/printer_data/logs/klippy.log', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.12.0-10-gea2f6bc0-dirty' Untracked files: klippy/extras/gcode_shell_command.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper CPU: 4 core ARMv7 Processor rev 3 (v7l) Python: '3.9.2 (default, Mar 12 2021, 04:06:34) \n[GCC 10.2.1 20210110]' Start printer at Wed Dec 6 21:13:21 2023 (1701897201.7 23.5) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/ttyACM0 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable webhooks client 3038155728: New connection webhooks client 3038155728: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 800, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/pi/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'PIS': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 805, in _mcu_identify raise error(str(e)) mcu.error: mcu 'PIS': Unable to connect Build file /home/pi/klipper/klippy/../.config(1622): Wed Nov 29 21:12:11 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # 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 is not set # CONFIG_MACH_HC32F460 is not set CONFIG_MACH_RP2040=y # 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="rp2040" CONFIG_MCU="rp2040" CONFIG_CLOCK_FREQ=12000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x10000100 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x42000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x10000100 CONFIG_RP2040_SELECT=y CONFIG_RP2040_HAVE_STAGE2=y CONFIG_RP2040_FLASH_START_0100=y # CONFIG_RP2040_FLASH_START_4000 is not set CONFIG_RP2040_STAGE2_FILE="boot2_w25q080.S" CONFIG_RP2040_STAGE2_CLKDIV=2 CONFIG_RP2040_USB=y # CONFIG_RP2040_SERIAL_UART0 is not set # CONFIG_RP2040_CANBUS is not set # CONFIG_RP2040_USBCANBUS is not set CONFIG_RP2040_CANBUS_GPIO_RX=4 CONFIG_RP2040_CANBUS_GPIO_TX=5 CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_LIS2DW=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=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 ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(8487): Fri Dec 1 21:22:20 2023 Last MCU build version: v0.12.0-10-gea2f6bc0 Last MCU build tools: gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/pi/klipper/klippy/../out/klipper.elf(1763224): Fri Dec 1 21:22:26 2023 Attempting MCU 'mcu' reset command Attempting MCU 'PIS' reset Unhandled exception during post run Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 234, in run self.send_event("klippy:firmware_restart") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 951, in _firmware_restart self._restart_arduino() File "/home/pi/klipper/klippy/mcu.py", line 911, in _restart_arduino serialhdl.arduino_reset(self._serialport, self._reactor) File "/home/pi/klipper/klippy/serialhdl.py", line 385, in arduino_reset ser.dtr = False File "/home/pi/klippy-env/lib/python3.9/site-packages/serial/serialutil.py", line 469, in dtr self._update_dtr_state() File "/home/pi/klippy-env/lib/python3.9/site-packages/serial/serialposix.py", line 636, in _update_dtr_state fcntl.ioctl(self.fd, TIOCMBIC, TIOCM_DTR_str) OSError: [Errno 5] Input/output error Restarting printer Start printer at Wed Dec 6 21:43:17 2023 (1701898997.6 1805.4) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/ttyACM0 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect webhooks client 3019659680: New connection webhooks client 3019659680: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 800, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/pi/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'PIS': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 805, in _mcu_identify raise error(str(e)) mcu.error: mcu 'PIS': Unable to connect Build file /home/pi/klipper/klippy/../.config(1622): Wed Nov 29 21:12:11 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # 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 is not set # CONFIG_MACH_HC32F460 is not set CONFIG_MACH_RP2040=y # 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="rp2040" CONFIG_MCU="rp2040" CONFIG_CLOCK_FREQ=12000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x10000100 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x42000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x10000100 CONFIG_RP2040_SELECT=y CONFIG_RP2040_HAVE_STAGE2=y CONFIG_RP2040_FLASH_START_0100=y # CONFIG_RP2040_FLASH_START_4000 is not set CONFIG_RP2040_STAGE2_FILE="boot2_w25q080.S" CONFIG_RP2040_STAGE2_CLKDIV=2 CONFIG_RP2040_USB=y # CONFIG_RP2040_SERIAL_UART0 is not set # CONFIG_RP2040_CANBUS is not set # CONFIG_RP2040_USBCANBUS is not set CONFIG_RP2040_CANBUS_GPIO_RX=4 CONFIG_RP2040_CANBUS_GPIO_TX=5 CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_LIS2DW=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=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 ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(8487): Fri Dec 1 21:22:20 2023 Last MCU build version: v0.12.0-10-gea2f6bc0 Last MCU build tools: gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/pi/klipper/klippy/../out/klipper.elf(1763224): Fri Dec 1 21:22:26 2023 Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-I', '/home/pi/printer_data/comms/klippy.serial', '-l', '/home/pi/printer_data/logs/klippy.log', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.12.0-10-gea2f6bc0-dirty' Untracked files: klippy/extras/gcode_shell_command.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper CPU: 4 core ARMv7 Processor rev 3 (v7l) Python: '3.9.2 (default, Mar 12 2021, 04:06:34) \n[GCC 10.2.1 20210110]' Start printer at Wed Dec 6 22:00:33 2023 (1701900033.5 24.9) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/ttyACM0 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable webhooks client 3037328600: New connection webhooks client 3037328600: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 800, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/pi/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'PIS': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 805, in _mcu_identify raise error(str(e)) mcu.error: mcu 'PIS': Unable to connect Build file /home/pi/klipper/klippy/../.config(1622): Wed Nov 29 21:12:11 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # 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 is not set # CONFIG_MACH_HC32F460 is not set CONFIG_MACH_RP2040=y # 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="rp2040" CONFIG_MCU="rp2040" CONFIG_CLOCK_FREQ=12000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x10000100 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x42000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x10000100 CONFIG_RP2040_SELECT=y CONFIG_RP2040_HAVE_STAGE2=y CONFIG_RP2040_FLASH_START_0100=y # CONFIG_RP2040_FLASH_START_4000 is not set CONFIG_RP2040_STAGE2_FILE="boot2_w25q080.S" CONFIG_RP2040_STAGE2_CLKDIV=2 CONFIG_RP2040_USB=y # CONFIG_RP2040_SERIAL_UART0 is not set # CONFIG_RP2040_CANBUS is not set # CONFIG_RP2040_USBCANBUS is not set CONFIG_RP2040_CANBUS_GPIO_RX=4 CONFIG_RP2040_CANBUS_GPIO_TX=5 CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_LIS2DW=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=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 ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(8487): Fri Dec 1 21:22:20 2023 Last MCU build version: v0.12.0-10-gea2f6bc0 Last MCU build tools: gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/pi/klipper/klippy/../out/klipper.elf(1763224): Fri Dec 1 21:22:26 2023 Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-I', '/home/pi/printer_data/comms/klippy.serial', '-l', '/home/pi/printer_data/logs/klippy.log', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.12.0-10-gea2f6bc0-dirty' Untracked files: klippy/extras/gcode_shell_command.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper CPU: 4 core ARMv7 Processor rev 3 (v7l) Python: '3.9.2 (default, Mar 12 2021, 04:06:34) \n[GCC 10.2.1 20210110]' Start printer at Wed Dec 6 22:03:43 2023 (1701900223.2 23.8) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/ttyACM0 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable webhooks client 3038194200: New connection webhooks client 3038194200: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 800, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/pi/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'PIS': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 805, in _mcu_identify raise error(str(e)) mcu.error: mcu 'PIS': Unable to connect Build file /home/pi/klipper/klippy/../.config(1622): Wed Nov 29 21:12:11 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # 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 is not set # CONFIG_MACH_HC32F460 is not set CONFIG_MACH_RP2040=y # 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="rp2040" CONFIG_MCU="rp2040" CONFIG_CLOCK_FREQ=12000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x10000100 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x42000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x10000100 CONFIG_RP2040_SELECT=y CONFIG_RP2040_HAVE_STAGE2=y CONFIG_RP2040_FLASH_START_0100=y # CONFIG_RP2040_FLASH_START_4000 is not set CONFIG_RP2040_STAGE2_FILE="boot2_w25q080.S" CONFIG_RP2040_STAGE2_CLKDIV=2 CONFIG_RP2040_USB=y # CONFIG_RP2040_SERIAL_UART0 is not set # CONFIG_RP2040_CANBUS is not set # CONFIG_RP2040_USBCANBUS is not set CONFIG_RP2040_CANBUS_GPIO_RX=4 CONFIG_RP2040_CANBUS_GPIO_TX=5 CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_LIS2DW=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=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 ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(8487): Fri Dec 1 21:22:20 2023 Last MCU build version: v0.12.0-10-gea2f6bc0 Last MCU build tools: gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/pi/klipper/klippy/../out/klipper.elf(1763224): Fri Dec 1 21:22:26 2023 Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-I', '/home/pi/printer_data/comms/klippy.serial', '-l', '/home/pi/printer_data/logs/klippy.log', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.12.0-10-gea2f6bc0-dirty' Untracked files: klippy/extras/gcode_shell_command.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper CPU: 4 core ARMv7 Processor rev 3 (v7l) Python: '3.9.2 (default, Mar 12 2021, 04:06:34) \n[GCC 10.2.1 20210110]' Start printer at Wed Dec 6 22:09:57 2023 (1701900597.5 24.2) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/ttyACM0 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable webhooks client 3038812672: New connection webhooks client 3038812672: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 800, in _mcu_identify self._serial.connect_uart(self._serialport, self._baud, rts) File "/home/pi/klipper/klippy/serialhdl.py", line 182, in connect_uart self._error("Unable to connect") File "/home/pi/klipper/klippy/serialhdl.py", line 61, in _error raise error(self.warn_prefix + (msg % params)) serialhdl.error: mcu 'PIS': Unable to connect During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 176, in _connect self.send_event("klippy:mcu_identify") File "/home/pi/klipper/klippy/klippy.py", line 263, in send_event return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/klippy.py", line 263, in return [cb(*params) for cb in self.event_handlers.get(event, [])] File "/home/pi/klipper/klippy/mcu.py", line 805, in _mcu_identify raise error(str(e)) mcu.error: mcu 'PIS': Unable to connect Build file /home/pi/klipper/klippy/../.config(1622): Wed Nov 29 21:12:11 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # 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 is not set # CONFIG_MACH_HC32F460 is not set CONFIG_MACH_RP2040=y # 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="rp2040" CONFIG_MCU="rp2040" CONFIG_CLOCK_FREQ=12000000 CONFIG_USBSERIAL=y CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x10000100 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x42000 CONFIG_STACK_SIZE=512 CONFIG_FLASH_APPLICATION_ADDRESS=0x10000100 CONFIG_RP2040_SELECT=y CONFIG_RP2040_HAVE_STAGE2=y CONFIG_RP2040_FLASH_START_0100=y # CONFIG_RP2040_FLASH_START_4000 is not set CONFIG_RP2040_STAGE2_FILE="boot2_w25q080.S" CONFIG_RP2040_STAGE2_CLKDIV=2 CONFIG_RP2040_USB=y # CONFIG_RP2040_SERIAL_UART0 is not set # CONFIG_RP2040_CANBUS is not set # CONFIG_RP2040_USBCANBUS is not set CONFIG_RP2040_CANBUS_GPIO_RX=4 CONFIG_RP2040_CANBUS_GPIO_TX=5 CONFIG_USB=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER_CHIPID=y CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_WANT_GPIO_BITBANGING=y CONFIG_WANT_DISPLAYS=y CONFIG_WANT_SENSORS=y CONFIG_WANT_LIS2DW=y CONFIG_WANT_SOFTWARE_I2C=y CONFIG_WANT_SOFTWARE_SPI=y CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=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 ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(8487): Fri Dec 1 21:22:20 2023 Last MCU build version: v0.12.0-10-gea2f6bc0 Last MCU build tools: gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34 Last MCU build config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 Build file /home/pi/klipper/klippy/../out/klipper.elf(1763224): Fri Dec 1 21:22:26 2023 webhooks client 3038812672: Disconnected Restarting printer Start printer at Wed Dec 6 22:13:11 2023 (1701900791.4 204.3) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/ttyACM0 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect webhooks client 3037697576: New connection webhooks client 3037697576: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-I', '/home/pi/printer_data/comms/klippy.serial', '-l', '/home/pi/printer_data/logs/klippy.log', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.12.0-10-gea2f6bc0-dirty' Untracked files: klippy/extras/gcode_shell_command.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper CPU: 4 core ARMv7 Processor rev 3 (v7l) Python: '3.9.2 (default, Mar 12 2021, 04:06:34) \n[GCC 10.2.1 20210110]' Start printer at Wed Dec 6 22:14:46 2023 (1701900886.2 299.1) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/ttyACM0 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect webhooks client 3037461976: New connection webhooks client 3037461976: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-I', '/home/pi/printer_data/comms/klippy.serial', '-l', '/home/pi/printer_data/logs/klippy.log', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.12.0-10-gea2f6bc0-dirty' Untracked files: klippy/extras/gcode_shell_command.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper CPU: 4 core ARMv7 Processor rev 3 (v7l) Python: '3.9.2 (default, Mar 12 2021, 04:06:34) \n[GCC 10.2.1 20210110]' Start printer at Wed Dec 6 22:15:39 2023 (1701900939.3 352.2) ===== Config file ===== [virtual_sdcard] path = ~/printer_data/gcodes on_error_gcode = CANCEL_PRINT [pause_resume] [display_status] [respond] default_type = command [gcode_macro CANCEL_PRINT] description = Cancel the actual running print rename_existing = CANCEL_PRINT_BASE gcode = {% if printer.pause_resume.is_paused|lower == 'false' and park|lower == 'true'%} _TOOLHEAD_PARK_PAUSE_CANCEL {% endif %} TURN_OFF_HEATERS CANCEL_PRINT_BASE SDCARD_RESET_FILE G1 Z60 F3000 G90 M84 variable_park = True [gcode_macro PAUSE] description = Pause the actual running print rename_existing = PAUSE_BASE gcode = PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL [gcode_macro RESUME] description = Resume the actual running print rename_existing = RESUME_BASE variable_last_extruder_temp = {'restore': False, 'temp': 0} variable_restore_idle_timeout = 0 variable_idle_state = False gcode = {% set extrude = printer['gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL'].extrude %} {% if 'VELOCITY' in params|upper %} {% set get_params = ('VELOCITY=' + params.VELOCITY) %} {%else %} {% set get_params = "" %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESUME_BASE {get_params} CLEAR_PAUSE [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 x_park = printer.toolhead.axis_maximum.x|float - 5.0 %} {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %} {% set z_park_delta = 2.0 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - z_park_delta) %} {% set z_safe = z_park_delta %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} {% if printer.extruder.can_extrude|lower == 'true' %} M83 G1 E-{extrude} F2100 {% if printer.gcode_move.absolute_extrude |lower == 'true' %} M82 {% endif %} {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G91 G1 Z{z_safe} F900 G90 G1 X{x_park} Y{y_park} F6000 {% if printer.gcode_move.absolute_coordinates|lower == 'false' %} G91 {% endif %} {% else %} {action_respond_info("Printer not homed")} {% endif %} variable_extrude = 1.0 [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 _OBICO_LAYER_CHANGE] description = Run a scan across the current print area variable_current_layer = -1 variable_first_layer_scan_enabled = True variable_first_layer_scan_stepover = 10 variable_first_layer_scan_feedrate = 600 variable_first_layer_scan_zhop = 4 variable_first_layer_scan_retract = 6.5 variable_first_layer_scanning = False gcode = SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=current_layer VALUE={params.CURRENT_LAYER|int} {% if first_layer_scan_enabled and params.CURRENT_LAYER|int == 2 %} SAVE_GCODE_STATE NAME=current_print_state {% set current_x = printer.toolhead.position.x %} {% set current_y = printer.toolhead.position.y %} {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} M83 G0 E-{first_layer_scan_retract} F900 {% endif %} SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=True G91 G0 Z{first_layer_scan_zhop} F1000 G90 {% if 'MINX' in params and 'MAXX' in params and 'MINY' in params and 'MAXY' in params %} {% set stepoverCount = ((params.MAXY|float - params.MINY|float) / first_layer_scan_stepover) | round(method='ceil') | int %} G0 X{params.MINX} Y{params.MINY} F{first_layer_scan_feedrate} {% for ystep in range(stepoverCount) %} G0 Y{params.MINY|float + first_layer_scan_stepover * ystep} {% if ystep % 2 == 0 %} G0 X{params.MAXX} F{first_layer_scan_feedrate} {% else %} G0 X{params.MINX} F{first_layer_scan_feedrate} {% endif %} {% endfor %} {% endif %} G0 X{current_x} Y{current_y} F{first_layer_scan_feedrate} G91 G0 Z-{first_layer_scan_zhop} F1000 {% if first_layer_scan_retract > 0 and printer[printer.toolhead.extruder].can_extrude %} G0 E{first_layer_scan_retract} F900 {% endif %} RESTORE_GCODE_STATE NAME=current_print_state SET_GCODE_VARIABLE MACRO=_OBICO_LAYER_CHANGE VARIABLE=first_layer_scanning VALUE=False {% endif %} [gcode_shell_command mmms_toolchange] command = python3 /home/pi/klipper-mmms/toolchange.py timeout = 5 [gcode_shell_command mmms_unload] command = python3 /home/pi/klipper-mmms/unload.py timeout = 5 [gcode_shell_command mmms_load] command = python3 /home/pi/klipper-mmms/load.py timeout = 5 [gcode_shell_command mmms_settool] command = python3 /home/pi/klipper-mmms/settool.py timeout = 5 [gcode_shell_command mmms_current] command = python3 /home/pi/klipper-mmms/current.py timeout = 5 [gcode_shell_command mmms_refresh_current] command = python3 /home/pi/klipper-mmms/refresh-current.py timeout = 5 [gcode_macro MMMS_TOOLCHANGE] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_toolchange PARAMS={tool} [gcode_macro MMMS_UNLOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_unload PARAMS={tool} [gcode_macro MMMS_LOAD] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_load PARAMS={tool} [gcode_macro MMMS_SETTOOL] gcode = {% set tool = params.TOOL %} RUN_SHELL_COMMAND CMD=mmms_settool PARAMS={tool} [gcode_macro MMMS_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_current [gcode_macro MMMS_REFRESH_CURRENT] gcode = RUN_SHELL_COMMAND CMD=mmms_refresh_current [mcu] serial = /dev/ttyACM0 restart_method = command [mcu PIS] serial = /dev/ttyACM0 [adxl345] cs_pin = PIS:gpio13 spi_software_sclk_pin = PIS:gpio10 spi_software_mosi_pin = PIS:gpio11 spi_software_miso_pin = PIS:gpio12 axes_map = x,-z,y [resonance_tester] accel_chip = adxl345 usbadxl probe_points = 100,100,20 [temperature_sensor einsy_board] sensor_pin = PF6 sensor_type = TDK NTCG104LH104JT1 min_temp = -10 max_temp = 70 [probe] pin = PB4 x_offset = 23 y_offset = 5 speed = 20.0 samples = 3 samples_result = average sample_retract_dist = 1.0 z_offset = 1.135 [gcode_arcs] resolution = 0.25 [bed_screws] screw1 = 13,6 screw1_name = Front Left screw2 = 13,115 screw2_name = Front Center screw3 = 13,210 screw3_name = Front Right screw4 = 123,6 screw4_name = Center Left screw5 = 123,210 screw5_name = Center Right screw6 = 228,6 screw6_name = Back Left screw7 = 228,115 screw7_name = Back Center screw8 = 228,210 screw8_name = Back Right [extruder] nozzle_diameter = 0.6 filament_diameter = 1.750 heater_pin = PE5 sensor_type = ATC Semitec 104GT-2 sensor_pin = PF0 min_temp = 0 max_temp = 285 step_pin = PC3 dir_pin = PL6 enable_pin = !PA4 microsteps = 16 full_steps_per_rotation = 200 rotation_distance = 22.85696 max_extrude_cross_section = 50.0 max_extrude_only_distance = 200 max_extrude_only_velocity = 120.0 max_extrude_only_accel = 1250.0 pressure_advance = 0.06 pressure_advance_smooth_time = 0.040 control = pid min_extrude_temp = 170 pid_kp = 25.472 pid_ki = 1.306 pid_kd = 124.175 [heater_bed] heater_pin = PG5 sensor_type = EPCOS 100K B57560G104F sensor_pin = PF2 control = pid pid_kp = 52.924 pid_ki = 0.661 pid_kd = 1059.794 min_temp = 0 max_temp = 125 [heater_fan nozzle_cooling_fan] pin = PH5 heater = extruder heater_temp = 50.0 fan_speed = 1.0 [fan] pin = PH3 [printer] kinematics = cartesian max_velocity = 300 max_accel = 2500 max_z_velocity = 20 max_z_accel = 300 max_accel_to_decel = 2000 [temperature_sensor raspberry_pi] sensor_type = temperature_host min_temp = 10 max_temp = 80 [bed_mesh] algorithm = bicubic fade_end = 10 faulty_region_1_min = 100.583, 187.376 faulty_region_1_max = 122.083, 229.376 faulty_region_2_min = 125.672, -18.124 faulty_region_2_max = 147.172, 23.876 faulty_region_3_min = 192.261, 5.126 faulty_region_3_max = 234.261, 26.626 faulty_region_4_min = 114.422, 39.876 faulty_region_4_max = 135.922, 81.876 faulty_region_5_min = 21.422, 87.126 faulty_region_5_max = 42.922, 129.126 faulty_region_6_min = 54.172, 97.376 faulty_region_6_max = 96.172, 118.876 faulty_region_7_min = 154.172, 97.376 faulty_region_7_max = 196.172, 118.876 faulty_region_8_min = 205.136, 87.126 faulty_region_8_max = 226.636, 129.126 faulty_region_9_min = 114.422, 134.376 faulty_region_9_max = 135.922, 176.376 faulty_region_10_min = 176.177, 191.394 faulty_region_10_max = 218.177, 212.894 horizontal_move_z = 2 mesh_max = 228,210 mesh_min = 24, 6 mesh_pps = 3 probe_count = 5,5 speed = 200 [safe_z_home] home_xy_position = 153,132 speed = 50.0 z_hop = 15 z_hop_speed = 15.0 move_to_previous = False [static_digital_output debug_led] pins = !PB7 [output_pin BEEPER_pin] pin = PH2 pwm = True value = 0 shutdown_value = 0 cycle_time = 0.001 scale = 1000 [filament_switch_sensor fsensor] pause_on_runout = True runout_gcode = M118 Filament Runout Detected M600 insert_gcode = M118 Filament Load Detected LOAD_FILAMENT event_delay = 3.0 pause_delay = 0.01 switch_pin = !PK0 [skew_correction] [input_shaper] shaper_freq_x = 50 shaper_freq_y = 57 shaper_type_x = mzv shaper_type_y = mzv [force_move] enable_force_move = True [output_pin LCD_backlight_pin] pin = PE3 pwm = True hardware_pwm = True value = 0.8 shutdown_value = 1 cycle_time = 0.001 [display] lcd_type = hd44780 rs_pin = PD5 e_pin = PF7 d4_pin = PF5 d5_pin = PG4 d6_pin = PH7 d7_pin = PG3 encoder_pins = ^PJ1,^PJ2 click_pin = ^!PH6 [stepper_x] step_pin = PC0 dir_pin = !PL0 enable_pin = !PA7 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_x:virtual_endstop position_endstop = 0 position_max = 255 homing_speed = 50 homing_retract_dist = 0 [stepper_y] step_pin = PC1 dir_pin = PL1 enable_pin = !PA6 microsteps = 16 rotation_distance = 32 endstop_pin = tmc2130_stepper_y:virtual_endstop position_endstop = -4 position_max = 212.5 position_min = -4 homing_speed = 50 homing_retract_dist = 0 [stepper_z] step_pin = PC2 dir_pin = !PL2 enable_pin = !PA5 microsteps = 16 rotation_distance = 8 endstop_pin = probe:z_virtual_endstop position_max = 200 position_min = -2 homing_speed = 13.333 [tmc2130 stepper_x] cs_pin = PG0 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK2 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_y] cs_pin = PG2 interpolate = True stealthchop_threshold = 80 run_current = .281738 hold_current = .281738 sense_resistor = 0.220 diag1_pin = !PK7 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 2 driver_pwm_ampl = 230 driver_pwm_autoscale = True driver_sgt = 3 [tmc2130 stepper_z] cs_pin = PK5 run_current = .53033 hold_current = .53033 sense_resistor = 0.220 diag1_pin = !PK6 interpolate = True driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 200 driver_pwm_autoscale = True driver_sgt = 4 stealthchop_threshold = 80 [tmc2130 extruder] cs_pin = PK4 interpolate = True run_current = .513757 hold_current = .513757 sense_resistor = 0.220 diag1_pin = !PK3 driver_iholddelay = 8 driver_tpowerdown = 0 driver_tbl = 2 driver_toff = 3 driver_hend = 1 driver_hstrt = 5 driver_pwm_freq = 2 driver_pwm_grad = 4 driver_pwm_ampl = 240 driver_pwm_autoscale = True driver_sgt = 3 driver_start_sin = 0 driver_start_sin90 = 247 driver_mslut0 = 2863314262 driver_mslut1 = 1251300522 driver_mslut2 = 608774441 driver_mslut3 = 269500962 driver_mslut4 = 4160749568 driver_mslut5 = 3048961917 driver_mslut6 = 1227445590 driver_mslut7 = 4211234 driver_x1 = 2 driver_x2 = 154 driver_x3 = 255 driver_w0 = 1 driver_w1 = 2 driver_w2 = 1 driver_w3 = 1 [firmware_retraction] retract_length = 0.5 [verify_heater extruder] check_gain_time = 30 [verify_heater heater_bed] check_gain_time = 80 [gcode_macro M486] gcode = CLEAR_PAUSE [gcode_macro G80] gcode = M117 Bed leveling BED_MESH_CALIBRATE G1 X0 Y0 Z0.4 F4000 M117 M400 [gcode_macro G81] gcode = BED_MESH_OUTPUT [gcode_macro M300] gcode = {% set S = params.S|default(1000)|int %} {% set P = params.P|default(100)|int %} SET_PIN PIN=BEEPER_pin VALUE=0.5 CYCLE_TIME={ 1.0/S if S > 0 else 1 } G4 P{P} SET_PIN PIN=BEEPER_pin VALUE=0 [gcode_macro UNLOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Unloading filament... G92 E0.0 G91 G1 E-45 F5000 G1 E-15 F1000 G1 E-20 F1000 G90 G92 E0.0 M400 M117 Remove Filament Now! M300 S300 P1000 M117 Filament unloaded! RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M109 S{params.TEMP|default(220, true)} {% endif %} M117 Loading filament... G92 E0.0 G91 G1 E70 F400 G1 E40 F100 G90 G92 E0.0 M400 M117 Filament loaded! RESTORE_GCODE_STATE NAME=load_state [delayed_gcode clear_display] initial_duration = 0. gcode = M117 [gcode_macro Calibrate_Z] description = Calibrate Z axis gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% if printer.toolhead.homed_axes != "xyz" %} G28 {% endif %} G1 X20 Y0 G1 Z{max_z-10} F2000 FORCE_MOVE STEPPER=stepper_z Distance=20 Velocity=10 G1 Z{max_z-50} F2000 G28 [gcode_macro PREHEAT_PLA] gcode = M140 S60 M104 S200 [gcode_macro PREHEAT_PETG] gcode = M140 S90 M104 S240 [gcode_macro PREHEAT_TPU] gcode = M140 S50 M104 S190 [gcode_macro M600] description = Color change gcode = {% set X = params.X|default(0)|float %} {% set Y = params.Y|default(0)|float %} {% set Z = params.Z|default(10)|float %} SAVE_GCODE_STATE NAME=M600_state PAUSE G91 G1 E-.8 F2700 G1 Z{Z} G90 G1 X{X} Y{Y} F3000 G91 G1 E-50 F1000 RESTORE_GCODE_STATE NAME=M600_state [gcode_macro GET_TIMELAPSE_SETUP] description = Print the Timelapse setup gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set output_txt = ["Timelapse Setup:"] %} {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} {% if tl.park.enable %} {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} {% endif %} {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} {% if not tl.extruder.fw_retract %} {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} {% endif %} {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} {action_respond_info(output_txt|join("\n"))} [gcode_macro _SET_TIMELAPSE_SETUP] description = Set user parameters for timelapse gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] else False %} {% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), 'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, 'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), 'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, 'center': {'x': (max.x-(max.x-min.x)/2)|round(3), 'y': (max.y-(max.y-min.y)/2)|round(3)}} %} {% if params.ENABLE %} {% if params.ENABLE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} {% else %} {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} {% endif %} {% endif %} {% if params.VERBOSE %} {% if params.VERBOSE|lower is in ['true', 'false'] %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} {% else %} {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} {% endif %} {% endif %} {% if params.CUSTOM_POS_X %} {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} {% endif %} {% endif %} {% if params.CUSTOM_POS_Y %} {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} {% endif %} {% endif %} {% if params.CUSTOM_POS_DZ %} {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} {% else %} {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} {% endif %} {% endif %} {% if params.PARK_ENABLE %} {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} {% else %} {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} {% endif %} {% endif %} {% if params.PARK_POS %} {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} {% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 }, 'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 }, 'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 }, 'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 }, 'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 }, 'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, 'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz}, 'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} {% else %} {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" % params.PARK_POS|upper)} {% endif %} {% endif %} {% if params.PARK_TIME %} {% if params.PARK_TIME|float >= 0.0 %} {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} {% else %} {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" {% if params.TRAVEL_SPEED %} {% if params.TRAVEL_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} {% else %} {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} {% endif %} {% endif %} {% if params.RETRACT_SPEED %} {% if params.RETRACT_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} {% endif %} {% endif %} {% if params.EXTRUDE_SPEED %} {% if params.EXTRUDE_SPEED|float > 0.0 %} {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" {% if params.EXTRUDE_DISTANCE %} {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} {% endif %} {% endif %} {% if params.RETRACT_DISTANCE %} {% if params.RETRACT_DISTANCE|float >= 0.0 %} {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} {% else %} {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} {% endif %} {% endif %} {% if params.FW_RETRACT %} {% if params.FW_RETRACT|lower is in ['true', 'false'] %} {% if 'firmware_retraction' in printer.configfile.settings %} {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} {% else %} {% set _dummy = tl.extruder.update({'fw_retract':False}) %} {% if params.FW_RETRACT|capitalize == 'True' %} {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} {% endif %} {% endif %} {% else %} {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" {% if printer.configfile.settings['gcode_macro pause'] is defined %} {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} {% endif %} {% if printer.configfile.settings['gcode_macro resume'] is defined %} {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" [gcode_macro TIMELAPSE_TAKE_FRAME] description = Take Timelapse shoot variable_enable = False variable_takingframe = False variable_park = {'enable': False, 'pos' : 'center', 'time' : 0.1, 'custom': {'x': 0, 'y': 0, 'dz': 0}, 'coord' : {'x': 0, 'y': 0, 'dz': 0}} variable_extruder = {'fw_retract': False, 'retract': 1.0, 'extrude': 1.0} variable_speed = {'travel': 100, 'retract': 15, 'extrude': 15} variable_verbose = True variable_restore = {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} variable_macro = {'pause': 'PAUSE', 'resume': 'RESUME'} variable_is_paused = False gcode = {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} {% if enable %} {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} {% if park.enable %} {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '', 'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '', 'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, 'extrude' : printer.gcode_move.absolute_extrude}, 'speed' : printer.gcode_move.speed, 'e' : printer.gcode_move.gcode_position.e, 'factor' : {'speed' : printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor}} %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" {% if not printer[printer.toolhead.extruder].can_extrude %} {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} {% else %} {% if extruder.fw_retract %} G10 {% else %} M83 G0 E-{extruder.retract} F{speed.retract * 60} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True {macro.pause} SET_GCODE_OFFSET X=0 Y=0 G90 {% if "xyz" not in printer.toolhead.homed_axes %} {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} {% else %} G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} {% endif %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 M400 {% endif %} _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} {% endif %} {% else %} {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} {% endif %} [gcode_macro _TIMELAPSE_NEW_FRAME] description = action call for timelapse shoot. must be a seperate macro gcode = {action_call_remote_method("timelapse_newframe", macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park, hyperlapse=params.HYPERLAPSE)} [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] gcode = {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} {% if tl.takingframe %} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION=0.5 {% else %} {tl.macro.resume} VELOCITY={tl.speed.travel} SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False {% if not printer[printer.toolhead.extruder].can_extrude %} {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} {% else %} {% if tl.extruder.fw_retract %} G11 {% else %} G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} G0 F{tl.restore.speed} {% if tl.restore.absolute.extrude %} M82 G92 E{tl.restore.e} {% endif %} {% endif %} {% endif %} {% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %} {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} {% if not tl.restore.absolute.coordinates %} G91 {% endif %} {% endif %} [gcode_macro HYPERLAPSE] description = Start/Stop a hyperlapse recording variable_cycle = 0 variable_run = False gcode = {% set cycle = params.CYCLE|default(30)|int %} {% if params.ACTION and params.ACTION|lower == 'start' %} {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True {% elif params.ACTION and params.ACTION|lower == 'stop' %} {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 {% else %} {action_raise_error("Hyperlapse: No valid input parameter Use: - HYPERLAPSE ACTION=START [CYCLE=time] - HYPERLAPSE ACTION=STOP")} {% endif %} [delayed_gcode _HYPERLAPSE_LOOP] gcode = UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} TIMELAPSE_TAKE_FRAME HYPERLAPSE=True [gcode_macro TIMELAPSE_RENDER] description = Render Timelapse video and wait for the result variable_render = False variable_run_identifier = 0 gcode = {action_respond_info("Timelapse: Rendering started")} {action_call_remote_method("timelapse_render", byrendermacro="True")} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True {printer.configfile.settings['gcode_macro pause'].rename_existing} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 [delayed_gcode _WAIT_TIMELAPSE_RENDER] gcode = {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} M117 Rendering {['-','\\','|','/'][ri]} UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 {% else %} {action_respond_info("Timelapse: Rendering finished")} M117 {printer.configfile.settings['gcode_macro resume'].rename_existing} {% endif %} [gcode_macro TEST_STREAM_DELAY] description = Helper macro to find stream and park delay gcode = {% set min = printer.toolhead.axis_minimum %} {% set max = printer.toolhead.axis_maximum %} {% set act = printer.toolhead.position %} {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} {% if act.z > 5.0 %} G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} G0 X{(max.x-min.x)/2} G4 P{tl.park.time|float * 1000} _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE G0 X{max.x - 5.0} {% else %} {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} {% endif %} [bed_mesh satin] version = 1 points = -0.101667, -0.090833, -0.152500, -0.216667, -0.267083 -0.069167, -0.023333, -0.006875, -0.082500, -0.201667 -0.077500, -0.034167, 0.087500, -0.004167, -0.062500 -0.046667, 0.030000, 0.003958, 0.055000, -0.004167 -0.156667, -0.085000, 0.037500, 0.055556, 0.023333 x_count = 5 y_count = 5 mesh_x_pps = 3 mesh_y_pps = 3 algo = bicubic tension = 0.2 min_x = 24.0 max_x = 228.0 min_y = 6.0 max_y = 210.0 ======================= Extruder max_extrude_ratio=20.787584 mcu 'mcu': Starting serial connect webhooks client 3037792408: New connection webhooks client 3037792408: Client info {'program': 'Moonraker', 'version': 'v0.8.0-204-gfb15b2a'} Loaded MCU 'mcu' 112 commands (v0.12.0-10-gea2f6bc0 / gcc: (15:8-2019-q3-1+b1) 8.3.1 20190703 (release) [gcc-8-branch revision 273027] binutils: (2.34-4+rpi1+14) 2.34) MCU 'mcu' config: ADC_MAX=4095 BUS_PINS_i2c0a=gpio0,gpio1 BUS_PINS_i2c0b=gpio4,gpio5 BUS_PINS_i2c0c=gpio8,gpio9 BUS_PINS_i2c0d=gpio12,gpio13 BUS_PINS_i2c0e=gpio16,gpio17 BUS_PINS_i2c0f=gpio20,gpio21 BUS_PINS_i2c0g=gpio24,gpio25 BUS_PINS_i2c0h=gpio28,gpio29 BUS_PINS_i2c1a=gpio2,gpio3 BUS_PINS_i2c1b=gpio6,gpio7 BUS_PINS_i2c1c=gpio10,gpio11 BUS_PINS_i2c1d=gpio14,gpio15 BUS_PINS_i2c1e=gpio18,gpio19 BUS_PINS_i2c1f=gpio22,gpio23 BUS_PINS_i2c1g=gpio26,gpio27 BUS_PINS_spi0a=gpio0,gpio3,gpio2 BUS_PINS_spi0b=gpio4,gpio7,gpio6 BUS_PINS_spi0c=gpio16,gpio19,gpio18 BUS_PINS_spi0d=gpio20,gpio23,gpio22 BUS_PINS_spi1a=gpio8,gpio11,gpio10 BUS_PINS_spi1b=gpio12,gpio15,gpio14 BUS_PINS_spi1c=gpio24,gpio27,gpio26 CLOCK_FREQ=12000000 MCU=rp2040 PWM_MAX=255 STATS_SUMSQ_BASE=256 STEPPER_BOTH_EDGE=1 mcu 'PIS': Starting serial connect mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable mcu 'PIS': Unable to open serial port: [Errno 11] Could not exclusively lock port /dev/ttyACM0: [Errno 11] Resource temporarily unavailable