===== Config file ===== [board_pins btt_skr_mini_e3_30] aliases = x_step_pin=PB13, x_dir_pin=PB12, x_enable_pin=PB14, x_uart_pin=PC11, x_diag_pin=PC0, x_endstop_pin=PC0, x_tx_pin=PC10, y_step_pin=PB10, y_dir_pin=PB2, y_enable_pin=PB11, y_uart_pin=PC11, y_diag_pin=PC1, y_endstop_pin=PC1, y_tx_pin=PC10, z0_step_pin=PB0, z0_dir_pin=PC5, z0_enable_pin=PB1, z0_uart_pin=PC11, z0_diag_pin=PC2, z_endstop_pin=PC2, z_tx_pin=PC10, z1_step_pin=null, z1_dir_pin=null, z1_enable_pin=null, z1_uart_pin=null, z1_diag_pin=null, z2_step_pin=null, z2_dir_pin=null, z2_enable_pin=null, z2_uart_pin=null, z2_diag_pin=null, e_step_pin=PB3, e_dir_pin=PB4, e_enable_pin=PD1, e_uart_pin=PC11, e_diag_pin=PC15, e_endstop_pin=PC15, e_tx_pin=PC10, e_heater_pin=PC8, e_sensor_pin=PA0, adxl345_cs_pin=PD0, adxl345_sclk_pin=PD2, adxl345_mosi_pin=PD3, adxl345_miso_pin=PD4, bltouch_sensor_pin=PC14, bltouch_control_pin=PA1, probe_pin=PC14, fan_part_cooling_pin=PC6, fan_toolhead_cooling_pin=PC7, fan_controller_board_pin=PB15, heater_bed_heating_pin=PC9, heater_bed_sensor_pin=PC4, EXP1_1=PB5, EXP1_3=PA9, EXP1_5=PA10, EXP1_7=PB8, EXP1_9=, EXP1_2=PA15, EXP1_4=, EXP1_6=PB9, EXP1_8=PD6, EXP1_10=<5V>, IO_5=PD5, SPI1_1=<5V>, SPI1_2=, SPI1_3=PD9, SPI1_4=PA5, SPI1_5=PA7, SPI1_6=PA6, SPI1_7=<3V3>, SPI1_8=, NEOPIXEL_1=, NEOPIXEL_2=PA8, NEOPIXEL_3=null, E0_STOP_1=PC15, E0_STOP_2=, E0_STOP_3=<5V>, PWE_DCT_1=PC12, PWE_DCT_2=, PWE_DCT_3=null, TFT_1=PF2, TFT_2=PA3, TFT_3=PA2, TFT_4=, TFT_5=<5V>, PS_ON_1=, PS_ON_2=PC13 [mcu] baud = 250000 serial = /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00 [tmc2209 stepper_x] uart_address = 0 tx_pin = PC10 interpolate = False uart_pin = PC11 run_current = 0.8 driver_tbl = 1 driver_toff = 3 driver_hend = 3 driver_hstrt = 0 [tmc2209 stepper_y] uart_address = 2 tx_pin = PC10 interpolate = False uart_pin = PC11 run_current = 0.8 driver_tbl = 1 driver_toff = 3 driver_hend = 3 driver_hstrt = 0 [tmc2209 stepper_z] uart_address = 1 tx_pin = PC10 interpolate = False uart_pin = PC11 run_current = 0.8 driver_tbl = 1 driver_toff = 3 driver_hend = 3 driver_hstrt = 0 [tmc2209 extruder] uart_address = 3 tx_pin = PC10 interpolate = False uart_pin = PC11 run_current = 0.707 stealthchop_threshold = 0 driver_tbl = 1 driver_toff = 3 driver_hend = 9 driver_hstrt = 7 [adxl345] cs_pin = adxl345_cs_pin spi_software_mosi_pin = adxl345_mosi_pin spi_software_miso_pin = adxl345_miso_pin spi_software_sclk_pin = adxl345_sclk_pin [idle_timeout] gcode = {% if printer.webhooks.state|lower == 'ready' %} {% if printer.pause_resume.is_paused|lower == 'false' %} M117 Idle timeout reached TURN_OFF_HEATERS M84 {% endif %} {% endif %} timeout = 7200 [temperature_sensor raspberry_pi] sensor_type = temperature_host [skew_correction] [input_shaper] [virtual_sdcard] path = ~/gcode_files [display_status] [pause_resume] [force_move] enable_force_move = True [respond] [heater_bed] heater_pin = heater_bed_heating_pin sensor_pin = heater_bed_sensor_pin sensor_type = EPCOS 100K B57560G104F min_temp = 0 max_temp = 130 control = pid pid_kp = 63.023 pid_ki = 2.360 pid_kd = 420.681 [fan] pin = fan_part_cooling_pin shutdown_speed = 1.0 [heater_fan toolhead_cooling_fan] pin = fan_toolhead_cooling_pin fan_speed = 1 heater = extruder heater_temp = 50.0 [controller_fan controller_fan] pin = fan_controller_board_pin idle_speed = 0.7 [printer] kinematics = cartesian max_velocity = 200 max_accel = 3000 max_accel_to_decel = 1500 max_z_velocity = 15 max_z_accel = 200 square_corner_velocity = 5 [bed_mesh] speed = 200 horizontal_move_z = 5 mesh_min = 15,15 mesh_max = 150,160 probe_count = 5,5 fade_start = 1.0 fade_end = 10.0 mesh_pps = 2,2 algorithm = bicubic bicubic_tension = .2 [screws_tilt_adjust] screw1 = 80, 108 screw1_name = Left Screw screw2 = 155, 72 screw2_name = Front Right Screw screw3 = 155, 147 screw3_name = Rear Right Screw horizontal_move_z = 10 speed = 200 screw_thread = CCW-M4 [homing_override] set_position_z = -5 axes = xyz gcode = {% set x_homed = 'x' in printer.toolhead.homed_axes %} {% set y_homed = 'y' in printer.toolhead.homed_axes %} {% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %} {% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %} {% if safe_home_x is not defined or safe_home_x|lower == 'middle' %} {% set safe_home_x = printer.toolhead.axis_maximum.x / 2 %} {% endif %} {% if safe_home_y is not defined or safe_home_y|lower == 'middle' %} {% set safe_home_y = printer.toolhead.axis_maximum.y / 2 %} {% endif %} {% set z_hop = printer["gcode_macro RatOS"].homing_z_hop|float %} {% set z_probe = printer["gcode_macro RatOS"].z_probe|lower %} {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} M400 G90 G0 Z{z_hop} F{z_speed} {% if params.X is defined or params.Y is not defined and params.Z is not defined %} {% if printer["gcode_macro RatOS"].homing_x|lower == 'endstop' or printer["gcode_macro RatOS"].homing|lower == 'endstops' %} G28 X {% elif printer["gcode_macro RatOS"].homing_x|lower == 'sensorless' or printer["gcode_macro RatOS"].homing|lower == 'sensorless' %} HOME_X_SENSORLESS {% endif %} {% set x_homed = True %} G0 X{safe_home_x} F{speed} {% endif %} {% if params.Y is defined or params.X is not defined and params.Z is not defined %} {% if printer["gcode_macro RatOS"].homing_y|lower == 'endstop' or printer["gcode_macro RatOS"].homing|lower == 'endstops' %} G28 Y {% elif printer["gcode_macro RatOS"].homing_y|lower == 'sensorless' or printer["gcode_macro RatOS"].homing|lower == 'sensorless' %} HOME_Y_SENSORLESS {% endif %} {% set y_homed = True %} G0 Y{safe_home_y} F{speed} {% endif %} {% if params.Z is defined or params.Y is not defined and params.X is not defined %} RESPOND MSG="Homing Z" {% if x_homed == False or y_homed == False %} M118 X and Y must be homed before homing Z {% else %} {% if z_probe == "stowable" %} DEPLOY_PROBE G0 X{safe_home_x} Y{safe_home_y} F{speed} G28 Z G0 Z{z_hop} F{z_speed} STOW_PROBE {% else %} G0 X{safe_home_x} Y{safe_home_y} F{speed} G28 Z G0 Z{z_hop} F{z_speed} {% endif %} {% endif %} {% endif %} [gcode_macro HOME_X_SENSORLESS] gcode = {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %} {% if safe_home_x is not defined or safe_home_x|lower == 'middle' %} {% set safe_home_x = printer.toolhead.axis_maximum.x / 2 %} {% endif %} M204 S1000 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_x_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_x_current} G28 X SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config["tmc2209 stepper_x"].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config["tmc2209 stepper_y"].run_current} M204 S{printer.configfile.config.printer.max_accel} [gcode_macro HOME_Y_SENSORLESS] gcode = {% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %} {% if safe_home_y is not defined or safe_home_y|lower == 'middle' %} {% set safe_home_y = printer.toolhead.axis_maximum.y / 2 %} {% endif %} {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} M204 S1000 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_y_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_y_current} G28 Y SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config["tmc2209 stepper_x"].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config["tmc2209 stepper_y"].run_current} M204 S{printer.configfile.config.printer.max_accel} [gcode_macro MAYBE_HOME] description = Only home unhomed axis variable_is_kinematic_position_overriden = False gcode = {% if printer["gcode_macro MAYBE_HOME"].is_kinematic_position_overriden|lower == 'true' %} RESPOND MSG="SET_CENTER_KINEMATIC_POSITION has been abused. Homing all axes. Please refrain from using SET_CENTER_KINEMATIC_POSITION outside of debugging purposes." G28 SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=False {% else %} {% set axes = '' %} {% set isHomed = true %} {% set axesToHome = '' %} {% if params.X is defined %} {% set axes = axes ~ 'X ' %} {% if 'x' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'X ' %} {% endif %} {% endif %} {% if params.Y is defined %} {% set axes = axes ~ 'Y ' %} {% if 'y' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'Y ' %} {% endif %} {% endif %} {% if params.Z is defined %} {% set axes = axes ~ 'Z ' %} {% if 'z' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'Z ' %} {% endif %} {% endif %} {% if params.X is not defined and params.Y is not defined and params.Z is not defined %} {% set axes = '' %} {% if 'x' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'X ' %} {% endif %} {% if 'y' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'Y ' %} {% endif %} {% if 'z' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'Z ' %} {% endif %} {% endif %} {% if isHomed is false %} M117 Homing {axesToHome} RESPOND MSG="Homing {axesToHome}" G28 {axesToHome} {% else %} RESPOND MSG="All requested axes already homed, skipping.." {% endif %} {% endif %} [gcode_macro ECHO_RATOS_VARS] description = Echo RatOS variables to the console. gcode = {% for var, value in printer["gcode_macro RatOS"].items() %} {action_respond_info(var ~ ": " ~ value)} {% endfor %} [gcode_macro RatOS] description = RatOS variable storage macro, will echo variables to the console when run. variable_relative_extrusion = True variable_force_absolute_position = False variable_preheat_extruder = True variable_preheat_extruder_temp = 150 variable_calibrate_bed_mesh = True variable_nozzle_priming = "primeblob" variable_nozzle_prime_start_x = "max" variable_nozzle_prime_start_y = "min" variable_nozzle_prime_direction = "auto" variable_filament_unload_length = 130 variable_filament_unload_speed = 5 variable_filament_load_length = 100 variable_filament_load_speed = 10 variable_start_print_park_in = "front" variable_start_print_park_z_height = 50 variable_start_print_heat_chamber_bed_temp = 115 variable_end_print_park_in = "back" variable_pause_print_park_in = "front" variable_macro_travel_speed = 300 variable_macro_z_speed = 10 variable_end_print_park_z_hop = 20 variable_homing = "endstops" variable_homing_z_hop = 15 variable_sensorless_x_current = 0.6 variable_sensorless_y_current = 0.9 variable_z_probe = "static" variable_safe_home_x = "middle" variable_safe_home_y = "middle" gcode = ECHO_RATOS_VARS variable_homing_x = "endstop" variable_homing_y = "endstop" [gcode_macro PAUSE] description = Pauses the printer rename_existing = PAUSE_BASE variable_extrude = 1.5 gcode = SAVE_GCODE_STATE NAME=PAUSE_state {% set E = printer["gcode_macro PAUSE"].extrude|float %} {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - 20.0) %} {% set z_safe = 20.0 %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} PAUSE_BASE G91 {% if printer.extruder.can_extrude|lower == 'true' %} G1 E-{E} F2100 {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G1 Z{z_safe} F{z_speed} _PARK LOCATION={printer["gcode_macro RatOS"].pause_print_park_in} X={printer["gcode_macro RatOS"].pause_print_park_x} {% else %} {action_respond_info("Printer not homed")} {% endif %} [gcode_macro RESUME] description = Resumes the print if the printer is paused. rename_existing = RESUME_BASE gcode = {% set E = printer["gcode_macro PAUSE"].extrude|float %} {% if printer.extruder.can_extrude|lower == 'true' %} G91 G1 E{E} F2100 G90 {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 RESUME_BASE [gcode_macro CANCEL_PRINT] description = Cancels the printer rename_existing = CANCEL_PRINT_BASE gcode = END_PRINT TURN_OFF_HEATERS CLEAR_PAUSE CANCEL_PRINT_BASE [gcode_macro PRIME_LINE] description = Prints a primeline, used internally, if configured, as part of the START_PRINT macro. gcode = SAVE_GCODE_STATE NAME=prime_line_state {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %} {% set x_start = printer.toolhead.axis_minimum.x + 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %} {% set x_start = printer.toolhead.axis_maximum.x - 5 %} {% else %} {% set x_start = printer["gcode_macro RatOS"].nozzle_prime_start_x|float %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %} {% set y_start = printer.toolhead.axis_minimum.y + 10 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 10 %} {% set y_factor = -1 %} {% else %} {% set y_start = printer["gcode_macro RatOS"].nozzle_prime_start_y|float %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|float < printer.toolhead.axis_maximum.y / 2 %} {% set y_factor = 1 %} {% else %} {% set y_factor = -1 %} {% endif %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_direction|lower == 'forwards' %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_direction|lower == 'backwards' %} {% set y_factor = -1 %} {% endif %} G90 M82 M117 Priming nozzle with prime line.. RESPOND MSG="Priming nozzle with prime line.." G1 Z5 F{z_speed} G1 X{x_start} Y{y_start} F{speed} G1 Z0.3 F{z_speed} G92 E0 G1 Y{y_start + (70 * y_factor)} E16 F1200 G1 Y{y_start + (90 * y_factor)} F{speed} RESTORE_GCODE_STATE NAME=prime_line_state [gcode_macro PRIME_BLOB] description = Prints a primeblob, used internally, if configured, as part of the START_PRINT macro. Slower than PRIME_LINE but much more effective. gcode = SAVE_GCODE_STATE NAME=prime_blob_state M117 Priming nozzle with prime blob.. RESPOND MSG="Priming nozzle with prime blob.." {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %} {% set x_start = printer.toolhead.axis_minimum.x + 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %} {% set x_start = printer.toolhead.axis_maximum.x - 5 %} {% else %} {% set x_start = printer["gcode_macro RatOS"].nozzle_prime_start_x|float %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %} {% set y_start = printer.toolhead.axis_minimum.y + 10 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 10 %} {% set y_factor = -1 %} {% else %} {% set y_start = printer["gcode_macro RatOS"].nozzle_prime_start_y|float %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|float < printer.toolhead.axis_maximum.y / 2 %} {% set y_factor = 1 %} {% else %} {% set y_factor = -1 %} {% endif %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_direction|lower == 'forwards' %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_direction|lower == 'backwards' %} {% set y_factor = -1 %} {% endif %} G90 M83 G1 Z5 F{z_speed} G1 X{x_start} Y{y_start} Z0.5 F{speed} G1 F60 E20 M106 S102 G1 Z5 F100 E5 G1 F200 Y{y_start + (25 * y_factor)} E1 G1 F200 Y{y_start + (30 * y_factor)} Z3.8 E0.5 G1 F200 Y{y_start + (35 * y_factor)} Z2.6 E0.5 G1 F200 Y{y_start + (40 * y_factor)} Z1.4 E0.5 G1 F200 Y{y_start + (45 * y_factor)} Z0.2 E0.5 M106 S0 G1 F200 Y{y_start + (50 * y_factor)} Z0.2 E0.6 G1 F{speed} Y{y_start + (100 * y_factor)} RESTORE_GCODE_STATE NAME=prime_blob_state [gcode_macro _PARK] gcode = {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% if params.X != '' %} {% if params.X|float >= printer.toolhead.axis_minimum.x + 5 and params.X|float <= printer.toolhead.axis_maximum.x - 5 %} {% set safe_x = params.X|float %} {% else %} {action_respond_info('The requested X co-ordinate is outside the defined axis bounds - using defaults')} {% set safe_x = printer.toolhead.axis_maximum.x / 2 %} {% endif %} {% else %} {% set safe_x = printer.toolhead.axis_maximum.x / 2 %} {% endif %} {% if params.LOCATION|default('back')|lower == 'back' %} {% set y = printer.toolhead.axis_maximum.y - 5 %} {% elif params.LOCATION|lower == 'front' %} {% set y = printer.toolhead.axis_minimum.y + 5 %} {% elif params.LOCATION|lower == 'center' %} {% set y = printer.toolhead.axis_maximum.y / 2 %} {% endif %} G90 G0 X{safe_x} Y{y} F{speed} [gcode_macro M600] description = Executes a color change by pausing the printer an unloading the filament. gcode = PAUSE UNLOAD_FILAMENT M117 Please load new filament and resume RESPOND MSG="Please load new filament and resume" [gcode_macro UNLOAD_FILAMENT] description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams. gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M104 S{params.TEMP|default(220, true)} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={params.TEMP|default(220, true)} {% endif %} {% set unload_speed = printer["gcode_macro RatOS"].filament_unload_speed|float * 60 %} {% set unload_length = printer["gcode_macro RatOS"].filament_unload_length|float %} M117 Unloading filament... G0 E10 F300 G0 E-5 F3600 G4 P3000 G0 E5 F3600 G0 E-15 F3600 G0 E-{unload_length} F{unload_speed} M117 Filament unloaded! RESPOND MSG="Filament unloaded! Please inspect the tip of the filament before reloading." RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] description = Loads new filament. Note: be careful with PETG, make sure you inspect the tip of your filament before loading to avoid jams. gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M104 S{params.TEMP|default(220, true)} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={params.TEMP|default(220, true)} {% endif %} {% set load_speed = printer["gcode_macro RatOS"].filament_load_speed|float * 60 %} {% set load_length = printer["gcode_macro RatOS"].filament_load_length|float %} M117 Loading filament... G0 E{load_length} F{load_speed} G4 P1000 G0 E40 F100 M400 M117 Filament loaded! RESPOND MSG="Filament loaded!" RESTORE_GCODE_STATE NAME=load_state [gcode_macro SET_CENTER_KINEMATIC_POSITION] description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position. gcode = RESPOND MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE." SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True SET_KINEMATIC_POSITION X={printer.toolhead.axis_maximum.x / 2} Y={printer.toolhead.axis_maximum.y / 2} Z={printer.toolhead.axis_maximum.z / 2} [gcode_macro START_PRINT] description = Start print procedure, use this in your Slicer. gcode = CLEAR_PAUSE {% if printer["gcode_macro RatOS"].force_absolute_position|lower == 'true' %} G90 {% endif %} SAVE_GCODE_STATE NAME=start_print_state G21 G90 M82 {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOWABLE_PROBE_BEGIN_BATCH {% endif %} MAYBE_HOME {% if params.CHAMBER_TEMP is defined %} _START_PRINT_HEAT_CHAMBER CHAMBER_TEMP={params.CHAMBER_TEMP} BED_TEMP={printer["gcode_macro RatOS"].start_print_heat_chamber_bed_temp} {% endif %} M117 Heating bed... RESPOND MSG="Heating bed..." M190 S{params.BED_TEMP|default(printer.heater_bed.target, true) } _START_PRINT_AFTER_HEATING_BED _START_PRINT_BED_MESH {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOWABLE_PROBE_END_BATCH {% endif %} M104 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _START_PRINT_PARK M117 Heating Extruder... RESPOND MSG="Heating Extruder..." M109 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _START_PRINT_AFTER_HEATING_EXTRUDER M117 Printing... RESPOND MSG="Printing..." RESTORE_GCODE_STATE NAME=start_print_state {% if printer["gcode_macro RatOS"].relative_extrusion|lower == 'true' %} M83 {% else %} M82 {% endif %} G92 E0 [gcode_macro _START_PRINT_AFTER_HEATING_BED] gcode = {% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %} {% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %} {% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %} M117 Pre-heating extruder... RESPOND MSG="Pre-heating extruder..." M104 S150 TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp} {% endif %} [gcode_macro _START_PRINT_BED_MESH] gcode = {% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %} BED_MESH_CALIBRATE PROFILE=ratos {% endif %} BED_MESH_PROFILE LOAD=ratos [gcode_macro _START_PRINT_PARK] gcode = {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} _PARK LOCATION={printer["gcode_macro RatOS"].start_print_park_in} X={printer["gcode_macro RatOS"].start_print_park_x} G0 Z{z} F6000 [gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER] gcode = {% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %} PRIME_LINE {% endif %} {% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' %} PRIME_BLOB {% endif %} {% if printer["gcode_macro RatOS"].skew_profile is defined %} SKEW_PROFILE LOAD={printer["gcode_macro RatOS"].skew_profile} {% endif %} [gcode_macro _START_PRINT_HEAT_CHAMBER] description = Uses the extruder sensor to wait for chamber temp. Override the _START_PRINT_HEAT_CHAMBER macro to implement heated chamber handling. gcode = {% if params.CHAMBER_TEMP is defined and params.BED_TEMP is defined %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} {% set zSpeed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} G0 Z{z} F{zSpeed} M84 M117 Heating chamber... RESPOND MSG="Heating chamber..." M140 S{params.BED_TEMP} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={params.CHAMBER_TEMP} MAYBE_HOME {% endif %} [gcode_macro END_PRINT] description = End print procedure, use this in your Slicer. gcode = SAVE_GCODE_STATE NAME=end_print_state _END_PRINT_BEFORE_HEATERS_OFF TURN_OFF_HEATERS _END_PRINT_AFTER_HEATERS_OFF _END_PRINT_PARK {% if printer["gcode_macro RatOS"].skew_profile is defined %} SET_SKEW CLEAR=1 {% endif %} M84 M107 M117 Done :) RESPOND MSG="Done :)" RESTORE_GCODE_STATE NAME=end_print_state [gcode_macro _END_PRINT_BEFORE_HEATERS_OFF] gcode = RESPOND MSG="Cleaning up..." [gcode_macro _END_PRINT_AFTER_HEATERS_OFF] gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - 20.0) %} {% set z_safe = 20.0 %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} G91 G1 E-2 F3600 G0 Z{z_safe} F3600 G1 E-2 F3600 [gcode_macro _END_PRINT_PARK] gcode = _PARK LOCATION={printer["gcode_macro RatOS"].end_print_park_in} X={printer["gcode_macro RatOS"].end_print_park_x} [gcode_shell_command generate_shaper_graph_x] command = /home/pi/klipper_config/config/scripts/generate-shaper-graph-x.sh timeout = 60. verbose = True [gcode_shell_command generate_shaper_graph_y] command = /home/pi/klipper_config/config/scripts/generate-shaper-graph-y.sh timeout = 60. verbose = True [gcode_shell_command generate_belt_tension_graph] command = /home/pi/klipper_config/config/scripts/generate-belt-tension-graph.sh timeout = 90. verbose = True [gcode_shell_command compile_binaries] command = /home/pi/klipper_config/config/scripts/compile-binaries.sh timeout = 600. [gcode_shell_command change_hostname] command = /home/pi/klipper_config/config/scripts/change-hostname.sh timeout = 10. [gcode_shell_command delete_and_restore_printer_data_dirs] command = /home/pi/klipper_config/config/scripts/delete-and-restore-printer-data.sh timeout = 10. [gcode_macro DELETE_AND_RESTORE_PRINTER_DATA_DIRS] gcode = RUN_SHELL_COMMAND CMD=delete_and_restore_printer_data_dirs [gcode_macro GENERATE_SHAPER_GRAPHS] description = Genarates input shaper resonances graphs for analysis. Uses the AXIS parameter for if you only want to do one axis at a time, (eg. GENERATE_SHAPER_GRAPHS AXIS=X) gcode = {% if params.AXIS is defined %} {% if params.AXIS|lower == 'x' %} MAYBE_HOME TEST_RESONANCES AXIS=X RUN_SHELL_COMMAND CMD=generate_shaper_graph_x RESPOND MSG="Input shaper graph generated for the X axis. You'll find it in the input_shaper folder in the machine tab!" {% elif params.AXIS|lower == 'y' %} MAYBE_HOME TEST_RESONANCES AXIS=Y RUN_SHELL_COMMAND CMD=generate_shaper_graph_y RESPOND MSG="Input shaper graph generated for the Y axis. You'll find it in the input_shaper folder in the machine tab!" {% else %} {action_raise_error("Unknown axis specified. Expected X or Y.")} {% endif %} {% else %} MAYBE_HOME TEST_RESONANCES AXIS=X TEST_RESONANCES AXIS=Y RUN_SHELL_COMMAND CMD=generate_shaper_graph_x RUN_SHELL_COMMAND CMD=generate_shaper_graph_y RESPOND MSG="Input shaper graphs generated for X and Y. You'll find them in the input_shaper folder in the machine tab!" {% endif %} [gcode_macro MEASURE_COREXY_BELT_TENSION] description = Generates resonance graph used to ensure belts are equally tensioned. gcode = TEST_RESONANCES AXIS=1,1 OUTPUT=raw_data NAME=belt-tension-upper TEST_RESONANCES AXIS=1,-1 OUTPUT=raw_data NAME=belt-tension-lower RUN_SHELL_COMMAND CMD=generate_belt_tension_graph [gcode_macro COMPILE_FIRMWARE] description = Compiles firmware with currently installed klipper version for all supported RatOS boards. Note: this may take up to 10 minutes. gcode = RESPOND MSG="Compiling binaries.. This can take up to 10 minutes. Please do not turn off your Raspberry Pi!" RUN_SHELL_COMMAND CMD=compile_binaries RESPOND MSG="Firmware binaries compiled successfully! You can find them in the firmware_binaries folder in the machine tab!" [gcode_macro CHANGE_HOSTNAME] description = Change the hostname of your Raspberry Pi. gcode = {% if params.HOSTNAME is not defined %} RESPOND MSG='You have to specify a new hostname with the HOSTNAME parameter. Ex: CHANGE_HOSTNAME HOSTNAME="MY_NEW_HOSTNAME"' RESPOND MSG="Please note: RFCs mandate that a hostname's labels may contain only the ASCII letters 'a' through 'z' (case-insensitive), the digits '0' through '9', and the hyphen. Hostname labels cannot begin or end with a hyphen. No other symbols, punctuation characters, or blank spaces are permitted." {% else %} RUN_SHELL_COMMAND CMD=change_hostname PARAMS={params.HOSTNAME} {% endif %} [gcode_macro SCREWS_TILT_CALCULATE] rename_existing = SCREWS_TILT_CALCULATE_ORIG gcode = MAYBE_HOME SAVE_GCODE_STATE NAME=screws_tilt_state {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} DEPLOY_PROBE {% endif %} SCREWS_TILT_CALCULATE_ORIG {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} STOW_PROBE {% endif %} G90 G0 Z120 F{printer["gcode_macro RatOS"].macro_z_speed|float * 60} G0 Y{printer.toolhead.axis_maximum.y} X{printer.toolhead.axis_maximum.x / 2} F{printer["gcode_macro RatOS"].macro_travel_speed|float * 60} RESTORE_GCODE_STATE NAME=screws_tilt_state M84 [stepper_x] step_pin = x_step_pin dir_pin = !x_dir_pin enable_pin = !x_enable_pin rotation_distance = 40 microsteps = 64 position_max = 180 position_min = 0 position_endstop = 0 endstop_pin = ^!x_endstop_pin homing_retract_dist = 5.0 homing_speed = 60 [stepper_y] step_pin = y_step_pin dir_pin = !y_dir_pin enable_pin = !y_enable_pin rotation_distance = 40 microsteps = 64 position_max = 180 position_min = 0 position_endstop = 0 endstop_pin = ^!y_endstop_pin homing_retract_dist = 5.0 homing_speed = 60 [stepper_z] step_pin = z0_step_pin dir_pin = z0_dir_pin enable_pin = !z0_enable_pin rotation_distance = 4 position_min = -5 microsteps = 16 endstop_pin = probe:z_virtual_endstop position_max = 180 homing_speed = 20 [extruder] step_pin = e_step_pin dir_pin = e_dir_pin enable_pin = !e_enable_pin microsteps = 64 rotation_distance = 5.57 full_steps_per_rotation = 200 filament_diameter = 1.750 max_extrude_only_velocity = 120 max_extrude_only_accel = 800 pressure_advance_smooth_time = 0.02 max_extrude_only_distance = 200 nozzle_diameter = 0.4 heater_pin = e_heater_pin sensor_type = Generic 3950 sensor_pin = e_sensor_pin min_extrude_temp = 170 min_temp = 0 max_temp = 290 pressure_advance = 0.03 control = pid pid_kp = 23.118 pid_ki = 1.233 pid_kd = 108.366 [resonance_tester] accel_chip = adxl345 max_smoothing = 0.08 probe_points = 90,90,20 [firmware_retraction] retract_speed = 120 unretract_extra_length = 0 unretract_speed = 120 retract_length = 0.5 [probe] pin = probe_pin x_offset = -28 y_offset = -10 speed = 5 samples = 3 sample_retract_dist = 2 lift_speed = 5.0 samples_result = median samples_tolerance = 0.02 samples_tolerance_retries = 5 z_offset = 1.360 [bed_mesh default] version = 1 points = -0.149219, -0.146250, -0.119688, -0.079219, -0.031250 -0.014844, -0.036250, -0.029063, -0.000781, 0.021719 0.095625, 0.066250, 0.035312, 0.037969, 0.031250 0.262031, 0.205000, 0.160781, 0.146406, 0.102812 0.397812, 0.297187, 0.226250, 0.186562, 0.135781 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = bicubic tension = 0.2 min_x = 15.0 max_x = 150.0 min_y = 15.0 max_y = 160.0 [bed_mesh ratos] version = 1 points = -0.173750, -0.165000, -0.147500, -0.102500, -0.058750 -0.035000, -0.053750, -0.051250, -0.015000, -0.011250 0.081250, 0.061250, 0.020000, 0.022500, 0.008750 0.242500, 0.186250, 0.141250, 0.138750, 0.077500 0.372500, 0.285000, 0.213750, 0.167500, 0.111250 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = bicubic tension = 0.2 min_x = 15.0 max_x = 150.0 min_y = 15.0 max_y = 160.0 ======================= Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/klipper_config/printer.cfg', '-l', '/home/pi/klipper_logs/klippy.log', '-a', '/tmp/klippy_uds'] Git version: 'v0.10.0-623-g5b1a6676' CPU: 4 core ARMv7 Processor rev 3 (v7l) Python: '3.7.3 (default, Oct 31 2022, 14:04:00) \n[GCC 8.3.0]' webhooks client 3038952496: {'program': 'Moonraker', 'version': 'v0.7.1-758-g5a3b1b6'} =============== Log rollover at Wed Nov 16 15:06:19 2022 =============== mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 777, 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 782, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/pi/klipper/klippy/../.config(1389): Tue Nov 15 17:16:08 2022 ========= 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_RP2040=y # CONFIG_MACH_PRU 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_START=0x10000100 CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x10000100 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x42000 CONFIG_STACK_SIZE=512 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_CANBUS_FREQUENCY=500000 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_GPIO_BITBANGING=y CONFIG_HAVE_STRICT_TIMING=y CONFIG_HAVE_CHIPID=y CONFIG_HAVE_STEPPER_BOTH_EDGE=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(8108): Tue Nov 15 17:16:34 2022 Last MCU build version: v0.10.0-623-g5b1a6676 Last MCU build tools: gcc: (15:7-2018-q2-6) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907] binutils: (2.31.1-11+rpi1+11) 2.31.1 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(368780): Tue Nov 15 17:16:40 2022 Starting Klippy... Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/klipper_config/printer.cfg', '-l', '/home/pi/klipper_logs/klippy.log', '-a', '/tmp/klippy_uds'] Git version: 'v0.10.0-623-g5b1a6676' CPU: 4 core ARMv7 Processor rev 3 (v7l) Python: '3.7.3 (default, Oct 31 2022, 14:04:00) \n[GCC 8.3.0]' Start printer at Wed Nov 16 16:53:47 2022 (1668617627.3 6490.6) ===== Config file ===== [board_pins btt_skr_mini_e3_30] aliases = x_step_pin=PB13, x_dir_pin=PB12, x_enable_pin=PB14, x_uart_pin=PC11, x_diag_pin=PC0, x_endstop_pin=PC0, x_tx_pin=PC10, y_step_pin=PB10, y_dir_pin=PB2, y_enable_pin=PB11, y_uart_pin=PC11, y_diag_pin=PC1, y_endstop_pin=PC1, y_tx_pin=PC10, z0_step_pin=PB0, z0_dir_pin=PC5, z0_enable_pin=PB1, z0_uart_pin=PC11, z0_diag_pin=PC2, z_endstop_pin=PC2, z_tx_pin=PC10, z1_step_pin=null, z1_dir_pin=null, z1_enable_pin=null, z1_uart_pin=null, z1_diag_pin=null, z2_step_pin=null, z2_dir_pin=null, z2_enable_pin=null, z2_uart_pin=null, z2_diag_pin=null, e_step_pin=PB3, e_dir_pin=PB4, e_enable_pin=PD1, e_uart_pin=PC11, e_diag_pin=PC15, e_endstop_pin=PC15, e_tx_pin=PC10, e_heater_pin=PC8, e_sensor_pin=PA0, adxl345_cs_pin=PD0, adxl345_sclk_pin=PD2, adxl345_mosi_pin=PD3, adxl345_miso_pin=PD4, bltouch_sensor_pin=PC14, bltouch_control_pin=PA1, probe_pin=PC14, fan_part_cooling_pin=PC6, fan_toolhead_cooling_pin=PC7, fan_controller_board_pin=PB15, heater_bed_heating_pin=PC9, heater_bed_sensor_pin=PC4, EXP1_1=PB5, EXP1_3=PA9, EXP1_5=PA10, EXP1_7=PB8, EXP1_9=, EXP1_2=PA15, EXP1_4=, EXP1_6=PB9, EXP1_8=PD6, EXP1_10=<5V>, IO_5=PD5, SPI1_1=<5V>, SPI1_2=, SPI1_3=PD9, SPI1_4=PA5, SPI1_5=PA7, SPI1_6=PA6, SPI1_7=<3V3>, SPI1_8=, NEOPIXEL_1=, NEOPIXEL_2=PA8, NEOPIXEL_3=null, E0_STOP_1=PC15, E0_STOP_2=, E0_STOP_3=<5V>, PWE_DCT_1=PC12, PWE_DCT_2=, PWE_DCT_3=null, TFT_1=PF2, TFT_2=PA3, TFT_3=PA2, TFT_4=, TFT_5=<5V>, PS_ON_1=, PS_ON_2=PC13 [mcu] baud = 250000 serial = /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00 [tmc2209 stepper_x] uart_address = 0 tx_pin = PC10 interpolate = False uart_pin = PC11 run_current = 0.8 driver_tbl = 1 driver_toff = 3 driver_hend = 3 driver_hstrt = 0 [tmc2209 stepper_y] uart_address = 2 tx_pin = PC10 interpolate = False uart_pin = PC11 run_current = 0.8 driver_tbl = 1 driver_toff = 3 driver_hend = 3 driver_hstrt = 0 [tmc2209 stepper_z] uart_address = 1 tx_pin = PC10 interpolate = False uart_pin = PC11 run_current = 0.8 driver_tbl = 1 driver_toff = 3 driver_hend = 3 driver_hstrt = 0 [tmc2209 extruder] uart_address = 3 tx_pin = PC10 interpolate = False uart_pin = PC11 run_current = 0.707 stealthchop_threshold = 0 driver_tbl = 1 driver_toff = 3 driver_hend = 9 driver_hstrt = 7 [adxl345] cs_pin = adxl345_cs_pin spi_software_mosi_pin = adxl345_mosi_pin spi_software_miso_pin = adxl345_miso_pin spi_software_sclk_pin = adxl345_sclk_pin [idle_timeout] gcode = {% if printer.webhooks.state|lower == 'ready' %} {% if printer.pause_resume.is_paused|lower == 'false' %} M117 Idle timeout reached TURN_OFF_HEATERS M84 {% endif %} {% endif %} timeout = 7200 [temperature_sensor raspberry_pi] sensor_type = temperature_host [skew_correction] [input_shaper] [virtual_sdcard] path = ~/gcode_files [display_status] [pause_resume] [force_move] enable_force_move = True [respond] [heater_bed] heater_pin = heater_bed_heating_pin sensor_pin = heater_bed_sensor_pin sensor_type = EPCOS 100K B57560G104F min_temp = 0 max_temp = 130 control = pid pid_kp = 63.023 pid_ki = 2.360 pid_kd = 420.681 [fan] pin = fan_part_cooling_pin shutdown_speed = 1.0 [heater_fan toolhead_cooling_fan] pin = fan_toolhead_cooling_pin fan_speed = 1 heater = extruder heater_temp = 50.0 [controller_fan controller_fan] pin = fan_controller_board_pin idle_speed = 0.7 [printer] kinematics = cartesian max_velocity = 200 max_accel = 3000 max_accel_to_decel = 1500 max_z_velocity = 15 max_z_accel = 200 square_corner_velocity = 5 [bed_mesh] speed = 200 horizontal_move_z = 5 mesh_min = 15,15 mesh_max = 150,160 probe_count = 5,5 fade_start = 1.0 fade_end = 10.0 mesh_pps = 2,2 algorithm = bicubic bicubic_tension = .2 [screws_tilt_adjust] screw1 = 80, 108 screw1_name = Left Screw screw2 = 155, 72 screw2_name = Front Right Screw screw3 = 155, 147 screw3_name = Rear Right Screw horizontal_move_z = 10 speed = 200 screw_thread = CCW-M4 [homing_override] set_position_z = -5 axes = xyz gcode = {% set x_homed = 'x' in printer.toolhead.homed_axes %} {% set y_homed = 'y' in printer.toolhead.homed_axes %} {% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %} {% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %} {% if safe_home_x is not defined or safe_home_x|lower == 'middle' %} {% set safe_home_x = printer.toolhead.axis_maximum.x / 2 %} {% endif %} {% if safe_home_y is not defined or safe_home_y|lower == 'middle' %} {% set safe_home_y = printer.toolhead.axis_maximum.y / 2 %} {% endif %} {% set z_hop = printer["gcode_macro RatOS"].homing_z_hop|float %} {% set z_probe = printer["gcode_macro RatOS"].z_probe|lower %} {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} M400 G90 G0 Z{z_hop} F{z_speed} {% if params.X is defined or params.Y is not defined and params.Z is not defined %} {% if printer["gcode_macro RatOS"].homing_x|lower == 'endstop' or printer["gcode_macro RatOS"].homing|lower == 'endstops' %} G28 X {% elif printer["gcode_macro RatOS"].homing_x|lower == 'sensorless' or printer["gcode_macro RatOS"].homing|lower == 'sensorless' %} HOME_X_SENSORLESS {% endif %} {% set x_homed = True %} G0 X{safe_home_x} F{speed} {% endif %} {% if params.Y is defined or params.X is not defined and params.Z is not defined %} {% if printer["gcode_macro RatOS"].homing_y|lower == 'endstop' or printer["gcode_macro RatOS"].homing|lower == 'endstops' %} G28 Y {% elif printer["gcode_macro RatOS"].homing_y|lower == 'sensorless' or printer["gcode_macro RatOS"].homing|lower == 'sensorless' %} HOME_Y_SENSORLESS {% endif %} {% set y_homed = True %} G0 Y{safe_home_y} F{speed} {% endif %} {% if params.Z is defined or params.Y is not defined and params.X is not defined %} RESPOND MSG="Homing Z" {% if x_homed == False or y_homed == False %} M118 X and Y must be homed before homing Z {% else %} {% if z_probe == "stowable" %} DEPLOY_PROBE G0 X{safe_home_x} Y{safe_home_y} F{speed} G28 Z G0 Z{z_hop} F{z_speed} STOW_PROBE {% else %} G0 X{safe_home_x} Y{safe_home_y} F{speed} G28 Z G0 Z{z_hop} F{z_speed} {% endif %} {% endif %} {% endif %} [gcode_macro HOME_X_SENSORLESS] gcode = {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %} {% if safe_home_x is not defined or safe_home_x|lower == 'middle' %} {% set safe_home_x = printer.toolhead.axis_maximum.x / 2 %} {% endif %} M204 S1000 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_x_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_x_current} G28 X SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config["tmc2209 stepper_x"].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config["tmc2209 stepper_y"].run_current} M204 S{printer.configfile.config.printer.max_accel} [gcode_macro HOME_Y_SENSORLESS] gcode = {% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %} {% if safe_home_y is not defined or safe_home_y|lower == 'middle' %} {% set safe_home_y = printer.toolhead.axis_maximum.y / 2 %} {% endif %} {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} M204 S1000 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_y_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_y_current} G28 Y SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config["tmc2209 stepper_x"].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config["tmc2209 stepper_y"].run_current} M204 S{printer.configfile.config.printer.max_accel} [gcode_macro MAYBE_HOME] description = Only home unhomed axis variable_is_kinematic_position_overriden = False gcode = {% if printer["gcode_macro MAYBE_HOME"].is_kinematic_position_overriden|lower == 'true' %} RESPOND MSG="SET_CENTER_KINEMATIC_POSITION has been abused. Homing all axes. Please refrain from using SET_CENTER_KINEMATIC_POSITION outside of debugging purposes." G28 SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=False {% else %} {% set axes = '' %} {% set isHomed = true %} {% set axesToHome = '' %} {% if params.X is defined %} {% set axes = axes ~ 'X ' %} {% if 'x' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'X ' %} {% endif %} {% endif %} {% if params.Y is defined %} {% set axes = axes ~ 'Y ' %} {% if 'y' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'Y ' %} {% endif %} {% endif %} {% if params.Z is defined %} {% set axes = axes ~ 'Z ' %} {% if 'z' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'Z ' %} {% endif %} {% endif %} {% if params.X is not defined and params.Y is not defined and params.Z is not defined %} {% set axes = '' %} {% if 'x' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'X ' %} {% endif %} {% if 'y' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'Y ' %} {% endif %} {% if 'z' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'Z ' %} {% endif %} {% endif %} {% if isHomed is false %} M117 Homing {axesToHome} RESPOND MSG="Homing {axesToHome}" G28 {axesToHome} {% else %} RESPOND MSG="All requested axes already homed, skipping.." {% endif %} {% endif %} [gcode_macro ECHO_RATOS_VARS] description = Echo RatOS variables to the console. gcode = {% for var, value in printer["gcode_macro RatOS"].items() %} {action_respond_info(var ~ ": " ~ value)} {% endfor %} [gcode_macro RatOS] description = RatOS variable storage macro, will echo variables to the console when run. variable_relative_extrusion = True variable_force_absolute_position = False variable_preheat_extruder = True variable_preheat_extruder_temp = 150 variable_calibrate_bed_mesh = True variable_nozzle_priming = "primeblob" variable_nozzle_prime_start_x = "max" variable_nozzle_prime_start_y = "min" variable_nozzle_prime_direction = "auto" variable_filament_unload_length = 130 variable_filament_unload_speed = 5 variable_filament_load_length = 100 variable_filament_load_speed = 10 variable_start_print_park_in = "front" variable_start_print_park_z_height = 50 variable_start_print_heat_chamber_bed_temp = 115 variable_end_print_park_in = "back" variable_pause_print_park_in = "front" variable_macro_travel_speed = 300 variable_macro_z_speed = 10 variable_end_print_park_z_hop = 20 variable_homing = "endstops" variable_homing_z_hop = 15 variable_sensorless_x_current = 0.6 variable_sensorless_y_current = 0.9 variable_z_probe = "static" variable_safe_home_x = "middle" variable_safe_home_y = "middle" gcode = ECHO_RATOS_VARS variable_homing_x = "endstop" variable_homing_y = "endstop" [gcode_macro PAUSE] description = Pauses the printer rename_existing = PAUSE_BASE variable_extrude = 1.5 gcode = SAVE_GCODE_STATE NAME=PAUSE_state {% set E = printer["gcode_macro PAUSE"].extrude|float %} {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - 20.0) %} {% set z_safe = 20.0 %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} PAUSE_BASE G91 {% if printer.extruder.can_extrude|lower == 'true' %} G1 E-{E} F2100 {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G1 Z{z_safe} F{z_speed} _PARK LOCATION={printer["gcode_macro RatOS"].pause_print_park_in} X={printer["gcode_macro RatOS"].pause_print_park_x} {% else %} {action_respond_info("Printer not homed")} {% endif %} [gcode_macro RESUME] description = Resumes the print if the printer is paused. rename_existing = RESUME_BASE gcode = {% set E = printer["gcode_macro PAUSE"].extrude|float %} {% if printer.extruder.can_extrude|lower == 'true' %} G91 G1 E{E} F2100 G90 {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 RESUME_BASE [gcode_macro CANCEL_PRINT] description = Cancels the printer rename_existing = CANCEL_PRINT_BASE gcode = END_PRINT TURN_OFF_HEATERS CLEAR_PAUSE CANCEL_PRINT_BASE [gcode_macro PRIME_LINE] description = Prints a primeline, used internally, if configured, as part of the START_PRINT macro. gcode = SAVE_GCODE_STATE NAME=prime_line_state {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %} {% set x_start = printer.toolhead.axis_minimum.x + 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %} {% set x_start = printer.toolhead.axis_maximum.x - 5 %} {% else %} {% set x_start = printer["gcode_macro RatOS"].nozzle_prime_start_x|float %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %} {% set y_start = printer.toolhead.axis_minimum.y + 10 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 10 %} {% set y_factor = -1 %} {% else %} {% set y_start = printer["gcode_macro RatOS"].nozzle_prime_start_y|float %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|float < printer.toolhead.axis_maximum.y / 2 %} {% set y_factor = 1 %} {% else %} {% set y_factor = -1 %} {% endif %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_direction|lower == 'forwards' %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_direction|lower == 'backwards' %} {% set y_factor = -1 %} {% endif %} G90 M82 M117 Priming nozzle with prime line.. RESPOND MSG="Priming nozzle with prime line.." G1 Z5 F{z_speed} G1 X{x_start} Y{y_start} F{speed} G1 Z0.3 F{z_speed} G92 E0 G1 Y{y_start + (70 * y_factor)} E16 F1200 G1 Y{y_start + (90 * y_factor)} F{speed} RESTORE_GCODE_STATE NAME=prime_line_state [gcode_macro PRIME_BLOB] description = Prints a primeblob, used internally, if configured, as part of the START_PRINT macro. Slower than PRIME_LINE but much more effective. gcode = SAVE_GCODE_STATE NAME=prime_blob_state M117 Priming nozzle with prime blob.. RESPOND MSG="Priming nozzle with prime blob.." {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %} {% set x_start = printer.toolhead.axis_minimum.x + 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %} {% set x_start = printer.toolhead.axis_maximum.x - 5 %} {% else %} {% set x_start = printer["gcode_macro RatOS"].nozzle_prime_start_x|float %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %} {% set y_start = printer.toolhead.axis_minimum.y + 10 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 10 %} {% set y_factor = -1 %} {% else %} {% set y_start = printer["gcode_macro RatOS"].nozzle_prime_start_y|float %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|float < printer.toolhead.axis_maximum.y / 2 %} {% set y_factor = 1 %} {% else %} {% set y_factor = -1 %} {% endif %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_direction|lower == 'forwards' %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_direction|lower == 'backwards' %} {% set y_factor = -1 %} {% endif %} G90 M83 G1 Z5 F{z_speed} G1 X{x_start} Y{y_start} Z0.5 F{speed} G1 F60 E20 M106 S102 G1 Z5 F100 E5 G1 F200 Y{y_start + (25 * y_factor)} E1 G1 F200 Y{y_start + (30 * y_factor)} Z3.8 E0.5 G1 F200 Y{y_start + (35 * y_factor)} Z2.6 E0.5 G1 F200 Y{y_start + (40 * y_factor)} Z1.4 E0.5 G1 F200 Y{y_start + (45 * y_factor)} Z0.2 E0.5 M106 S0 G1 F200 Y{y_start + (50 * y_factor)} Z0.2 E0.6 G1 F{speed} Y{y_start + (100 * y_factor)} RESTORE_GCODE_STATE NAME=prime_blob_state [gcode_macro _PARK] gcode = {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% if params.X != '' %} {% if params.X|float >= printer.toolhead.axis_minimum.x + 5 and params.X|float <= printer.toolhead.axis_maximum.x - 5 %} {% set safe_x = params.X|float %} {% else %} {action_respond_info('The requested X co-ordinate is outside the defined axis bounds - using defaults')} {% set safe_x = printer.toolhead.axis_maximum.x / 2 %} {% endif %} {% else %} {% set safe_x = printer.toolhead.axis_maximum.x / 2 %} {% endif %} {% if params.LOCATION|default('back')|lower == 'back' %} {% set y = printer.toolhead.axis_maximum.y - 5 %} {% elif params.LOCATION|lower == 'front' %} {% set y = printer.toolhead.axis_minimum.y + 5 %} {% elif params.LOCATION|lower == 'center' %} {% set y = printer.toolhead.axis_maximum.y / 2 %} {% endif %} G90 G0 X{safe_x} Y{y} F{speed} [gcode_macro M600] description = Executes a color change by pausing the printer an unloading the filament. gcode = PAUSE UNLOAD_FILAMENT M117 Please load new filament and resume RESPOND MSG="Please load new filament and resume" [gcode_macro UNLOAD_FILAMENT] description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams. gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M104 S{params.TEMP|default(220, true)} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={params.TEMP|default(220, true)} {% endif %} {% set unload_speed = printer["gcode_macro RatOS"].filament_unload_speed|float * 60 %} {% set unload_length = printer["gcode_macro RatOS"].filament_unload_length|float %} M117 Unloading filament... G0 E10 F300 G0 E-5 F3600 G4 P3000 G0 E5 F3600 G0 E-15 F3600 G0 E-{unload_length} F{unload_speed} M117 Filament unloaded! RESPOND MSG="Filament unloaded! Please inspect the tip of the filament before reloading." RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] description = Loads new filament. Note: be careful with PETG, make sure you inspect the tip of your filament before loading to avoid jams. gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M104 S{params.TEMP|default(220, true)} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={params.TEMP|default(220, true)} {% endif %} {% set load_speed = printer["gcode_macro RatOS"].filament_load_speed|float * 60 %} {% set load_length = printer["gcode_macro RatOS"].filament_load_length|float %} M117 Loading filament... G0 E{load_length} F{load_speed} G4 P1000 G0 E40 F100 M400 M117 Filament loaded! RESPOND MSG="Filament loaded!" RESTORE_GCODE_STATE NAME=load_state [gcode_macro SET_CENTER_KINEMATIC_POSITION] description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position. gcode = RESPOND MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE." SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True SET_KINEMATIC_POSITION X={printer.toolhead.axis_maximum.x / 2} Y={printer.toolhead.axis_maximum.y / 2} Z={printer.toolhead.axis_maximum.z / 2} [gcode_macro START_PRINT] description = Start print procedure, use this in your Slicer. gcode = CLEAR_PAUSE {% if printer["gcode_macro RatOS"].force_absolute_position|lower == 'true' %} G90 {% endif %} SAVE_GCODE_STATE NAME=start_print_state G21 G90 M82 {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOWABLE_PROBE_BEGIN_BATCH {% endif %} MAYBE_HOME {% if params.CHAMBER_TEMP is defined %} _START_PRINT_HEAT_CHAMBER CHAMBER_TEMP={params.CHAMBER_TEMP} BED_TEMP={printer["gcode_macro RatOS"].start_print_heat_chamber_bed_temp} {% endif %} M117 Heating bed... RESPOND MSG="Heating bed..." M190 S{params.BED_TEMP|default(printer.heater_bed.target, true) } _START_PRINT_AFTER_HEATING_BED _START_PRINT_BED_MESH {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOWABLE_PROBE_END_BATCH {% endif %} M104 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _START_PRINT_PARK M117 Heating Extruder... RESPOND MSG="Heating Extruder..." M109 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _START_PRINT_AFTER_HEATING_EXTRUDER M117 Printing... RESPOND MSG="Printing..." RESTORE_GCODE_STATE NAME=start_print_state {% if printer["gcode_macro RatOS"].relative_extrusion|lower == 'true' %} M83 {% else %} M82 {% endif %} G92 E0 [gcode_macro _START_PRINT_AFTER_HEATING_BED] gcode = {% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %} {% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %} {% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %} M117 Pre-heating extruder... RESPOND MSG="Pre-heating extruder..." M104 S150 TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp} {% endif %} [gcode_macro _START_PRINT_BED_MESH] gcode = {% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %} BED_MESH_CALIBRATE PROFILE=ratos {% endif %} BED_MESH_PROFILE LOAD=ratos [gcode_macro _START_PRINT_PARK] gcode = {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} _PARK LOCATION={printer["gcode_macro RatOS"].start_print_park_in} X={printer["gcode_macro RatOS"].start_print_park_x} G0 Z{z} F6000 [gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER] gcode = {% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %} PRIME_LINE {% endif %} {% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' %} PRIME_BLOB {% endif %} {% if printer["gcode_macro RatOS"].skew_profile is defined %} SKEW_PROFILE LOAD={printer["gcode_macro RatOS"].skew_profile} {% endif %} [gcode_macro _START_PRINT_HEAT_CHAMBER] description = Uses the extruder sensor to wait for chamber temp. Override the _START_PRINT_HEAT_CHAMBER macro to implement heated chamber handling. gcode = {% if params.CHAMBER_TEMP is defined and params.BED_TEMP is defined %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} {% set zSpeed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} G0 Z{z} F{zSpeed} M84 M117 Heating chamber... RESPOND MSG="Heating chamber..." M140 S{params.BED_TEMP} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={params.CHAMBER_TEMP} MAYBE_HOME {% endif %} [gcode_macro END_PRINT] description = End print procedure, use this in your Slicer. gcode = SAVE_GCODE_STATE NAME=end_print_state _END_PRINT_BEFORE_HEATERS_OFF TURN_OFF_HEATERS _END_PRINT_AFTER_HEATERS_OFF _END_PRINT_PARK {% if printer["gcode_macro RatOS"].skew_profile is defined %} SET_SKEW CLEAR=1 {% endif %} M84 M107 M117 Done :) RESPOND MSG="Done :)" RESTORE_GCODE_STATE NAME=end_print_state [gcode_macro _END_PRINT_BEFORE_HEATERS_OFF] gcode = RESPOND MSG="Cleaning up..." [gcode_macro _END_PRINT_AFTER_HEATERS_OFF] gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - 20.0) %} {% set z_safe = 20.0 %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} G91 G1 E-2 F3600 G0 Z{z_safe} F3600 G1 E-2 F3600 [gcode_macro _END_PRINT_PARK] gcode = _PARK LOCATION={printer["gcode_macro RatOS"].end_print_park_in} X={printer["gcode_macro RatOS"].end_print_park_x} [gcode_shell_command generate_shaper_graph_x] command = /home/pi/klipper_config/config/scripts/generate-shaper-graph-x.sh timeout = 60. verbose = True [gcode_shell_command generate_shaper_graph_y] command = /home/pi/klipper_config/config/scripts/generate-shaper-graph-y.sh timeout = 60. verbose = True [gcode_shell_command generate_belt_tension_graph] command = /home/pi/klipper_config/config/scripts/generate-belt-tension-graph.sh timeout = 90. verbose = True [gcode_shell_command compile_binaries] command = /home/pi/klipper_config/config/scripts/compile-binaries.sh timeout = 600. [gcode_shell_command change_hostname] command = /home/pi/klipper_config/config/scripts/change-hostname.sh timeout = 10. [gcode_shell_command delete_and_restore_printer_data_dirs] command = /home/pi/klipper_config/config/scripts/delete-and-restore-printer-data.sh timeout = 10. [gcode_macro DELETE_AND_RESTORE_PRINTER_DATA_DIRS] gcode = RUN_SHELL_COMMAND CMD=delete_and_restore_printer_data_dirs [gcode_macro GENERATE_SHAPER_GRAPHS] description = Genarates input shaper resonances graphs for analysis. Uses the AXIS parameter for if you only want to do one axis at a time, (eg. GENERATE_SHAPER_GRAPHS AXIS=X) gcode = {% if params.AXIS is defined %} {% if params.AXIS|lower == 'x' %} MAYBE_HOME TEST_RESONANCES AXIS=X RUN_SHELL_COMMAND CMD=generate_shaper_graph_x RESPOND MSG="Input shaper graph generated for the X axis. You'll find it in the input_shaper folder in the machine tab!" {% elif params.AXIS|lower == 'y' %} MAYBE_HOME TEST_RESONANCES AXIS=Y RUN_SHELL_COMMAND CMD=generate_shaper_graph_y RESPOND MSG="Input shaper graph generated for the Y axis. You'll find it in the input_shaper folder in the machine tab!" {% else %} {action_raise_error("Unknown axis specified. Expected X or Y.")} {% endif %} {% else %} MAYBE_HOME TEST_RESONANCES AXIS=X TEST_RESONANCES AXIS=Y RUN_SHELL_COMMAND CMD=generate_shaper_graph_x RUN_SHELL_COMMAND CMD=generate_shaper_graph_y RESPOND MSG="Input shaper graphs generated for X and Y. You'll find them in the input_shaper folder in the machine tab!" {% endif %} [gcode_macro MEASURE_COREXY_BELT_TENSION] description = Generates resonance graph used to ensure belts are equally tensioned. gcode = TEST_RESONANCES AXIS=1,1 OUTPUT=raw_data NAME=belt-tension-upper TEST_RESONANCES AXIS=1,-1 OUTPUT=raw_data NAME=belt-tension-lower RUN_SHELL_COMMAND CMD=generate_belt_tension_graph [gcode_macro COMPILE_FIRMWARE] description = Compiles firmware with currently installed klipper version for all supported RatOS boards. Note: this may take up to 10 minutes. gcode = RESPOND MSG="Compiling binaries.. This can take up to 10 minutes. Please do not turn off your Raspberry Pi!" RUN_SHELL_COMMAND CMD=compile_binaries RESPOND MSG="Firmware binaries compiled successfully! You can find them in the firmware_binaries folder in the machine tab!" [gcode_macro CHANGE_HOSTNAME] description = Change the hostname of your Raspberry Pi. gcode = {% if params.HOSTNAME is not defined %} RESPOND MSG='You have to specify a new hostname with the HOSTNAME parameter. Ex: CHANGE_HOSTNAME HOSTNAME="MY_NEW_HOSTNAME"' RESPOND MSG="Please note: RFCs mandate that a hostname's labels may contain only the ASCII letters 'a' through 'z' (case-insensitive), the digits '0' through '9', and the hyphen. Hostname labels cannot begin or end with a hyphen. No other symbols, punctuation characters, or blank spaces are permitted." {% else %} RUN_SHELL_COMMAND CMD=change_hostname PARAMS={params.HOSTNAME} {% endif %} [gcode_macro SCREWS_TILT_CALCULATE] rename_existing = SCREWS_TILT_CALCULATE_ORIG gcode = MAYBE_HOME SAVE_GCODE_STATE NAME=screws_tilt_state {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} DEPLOY_PROBE {% endif %} SCREWS_TILT_CALCULATE_ORIG {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} STOW_PROBE {% endif %} G90 G0 Z120 F{printer["gcode_macro RatOS"].macro_z_speed|float * 60} G0 Y{printer.toolhead.axis_maximum.y} X{printer.toolhead.axis_maximum.x / 2} F{printer["gcode_macro RatOS"].macro_travel_speed|float * 60} RESTORE_GCODE_STATE NAME=screws_tilt_state M84 [stepper_x] step_pin = x_step_pin dir_pin = !x_dir_pin enable_pin = !x_enable_pin rotation_distance = 40 microsteps = 64 position_max = 180 position_min = 0 position_endstop = 0 endstop_pin = ^!x_endstop_pin homing_retract_dist = 5.0 homing_speed = 60 [stepper_y] step_pin = y_step_pin dir_pin = !y_dir_pin enable_pin = !y_enable_pin rotation_distance = 40 microsteps = 64 position_max = 180 position_min = 0 position_endstop = 0 endstop_pin = ^!y_endstop_pin homing_retract_dist = 5.0 homing_speed = 60 [stepper_z] step_pin = z0_step_pin dir_pin = z0_dir_pin enable_pin = !z0_enable_pin rotation_distance = 4 position_min = -5 microsteps = 16 endstop_pin = probe:z_virtual_endstop position_max = 180 homing_speed = 20 [extruder] step_pin = e_step_pin dir_pin = e_dir_pin enable_pin = !e_enable_pin microsteps = 64 rotation_distance = 5.57 full_steps_per_rotation = 200 filament_diameter = 1.750 max_extrude_only_velocity = 120 max_extrude_only_accel = 800 pressure_advance_smooth_time = 0.02 max_extrude_only_distance = 200 nozzle_diameter = 0.4 heater_pin = e_heater_pin sensor_type = Generic 3950 sensor_pin = e_sensor_pin min_extrude_temp = 170 min_temp = 0 max_temp = 290 pressure_advance = 0.03 control = pid pid_kp = 23.118 pid_ki = 1.233 pid_kd = 108.366 [resonance_tester] accel_chip = adxl345 max_smoothing = 0.08 probe_points = 90,90,20 [firmware_retraction] retract_speed = 120 unretract_extra_length = 0 unretract_speed = 120 retract_length = 0.5 [probe] pin = probe_pin x_offset = -28 y_offset = -10 speed = 5 samples = 3 sample_retract_dist = 2 lift_speed = 5.0 samples_result = median samples_tolerance = 0.02 samples_tolerance_retries = 5 z_offset = 1.360 [bed_mesh default] version = 1 points = -0.149219, -0.146250, -0.119688, -0.079219, -0.031250 -0.014844, -0.036250, -0.029063, -0.000781, 0.021719 0.095625, 0.066250, 0.035312, 0.037969, 0.031250 0.262031, 0.205000, 0.160781, 0.146406, 0.102812 0.397812, 0.297187, 0.226250, 0.186562, 0.135781 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = bicubic tension = 0.2 min_x = 15.0 max_x = 150.0 min_y = 15.0 max_y = 160.0 [bed_mesh ratos] version = 1 points = -0.173750, -0.165000, -0.147500, -0.102500, -0.058750 -0.035000, -0.053750, -0.051250, -0.015000, -0.011250 0.081250, 0.061250, 0.020000, 0.022500, 0.008750 0.242500, 0.186250, 0.141250, 0.138750, 0.077500 0.372500, 0.285000, 0.213750, 0.167500, 0.111250 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = bicubic tension = 0.2 min_x = 15.0 max_x = 150.0 min_y = 15.0 max_y = 160.0 ======================= Extruder max_extrude_ratio=0.266081 mcu 'mcu': Starting serial connect mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' webhooks client 3039661392: New connection webhooks client 3039661392: Client info {'program': 'Moonraker', 'version': 'v0.7.1-758-g5a3b1b6'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 777, 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 782, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/pi/klipper/klippy/../.config(1389): Tue Nov 15 17:16:08 2022 ========= 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_RP2040=y # CONFIG_MACH_PRU 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_START=0x10000100 CONFIG_FLASH_SIZE=0x200000 CONFIG_FLASH_BOOT_ADDRESS=0x10000100 CONFIG_RAM_START=0x20000000 CONFIG_RAM_SIZE=0x42000 CONFIG_STACK_SIZE=512 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_CANBUS_FREQUENCY=500000 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_GPIO_BITBANGING=y CONFIG_HAVE_STRICT_TIMING=y CONFIG_HAVE_CHIPID=y CONFIG_HAVE_STEPPER_BOTH_EDGE=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(8108): Tue Nov 15 17:16:34 2022 Last MCU build version: v0.10.0-623-g5b1a6676 Last MCU build tools: gcc: (15:7-2018-q2-6) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907] binutils: (2.31.1-11+rpi1+11) 2.31.1 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(368780): Tue Nov 15 17:16:40 2022 Attempting MCU 'mcu' reset Unhandled exception during post run Traceback (most recent call last): File "/home/pi/klippy-env/lib/python3.7/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/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' 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 931, in _firmware_restart self._restart_arduino() File "/home/pi/klipper/klippy/mcu.py", line 891, in _restart_arduino serialhdl.arduino_reset(self._serialport, self._reactor) File "/home/pi/klipper/klippy/serialhdl.py", line 377, in arduino_reset ser = serial.Serial(serialport, 2400, timeout=0, exclusive=True) File "/home/pi/klippy-env/lib/python3.7/site-packages/serial/serialutil.py", line 240, in __init__ self.open() File "/home/pi/klippy-env/lib/python3.7/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/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00: [Errno 2] No such file or directory: '/dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00' Restarting printer Start printer at Wed Nov 16 17:05:10 2022 (1668618310.3 7173.5) ===== Config file ===== [board_pins btt_skr_mini_e3_30] aliases = x_step_pin=PB13, x_dir_pin=PB12, x_enable_pin=PB14, x_uart_pin=PC11, x_diag_pin=PC0, x_endstop_pin=PC0, x_tx_pin=PC10, y_step_pin=PB10, y_dir_pin=PB2, y_enable_pin=PB11, y_uart_pin=PC11, y_diag_pin=PC1, y_endstop_pin=PC1, y_tx_pin=PC10, z0_step_pin=PB0, z0_dir_pin=PC5, z0_enable_pin=PB1, z0_uart_pin=PC11, z0_diag_pin=PC2, z_endstop_pin=PC2, z_tx_pin=PC10, z1_step_pin=null, z1_dir_pin=null, z1_enable_pin=null, z1_uart_pin=null, z1_diag_pin=null, z2_step_pin=null, z2_dir_pin=null, z2_enable_pin=null, z2_uart_pin=null, z2_diag_pin=null, e_step_pin=PB3, e_dir_pin=PB4, e_enable_pin=PD1, e_uart_pin=PC11, e_diag_pin=PC15, e_endstop_pin=PC15, e_tx_pin=PC10, e_heater_pin=PC8, e_sensor_pin=PA0, adxl345_cs_pin=PD0, adxl345_sclk_pin=PD2, adxl345_mosi_pin=PD3, adxl345_miso_pin=PD4, bltouch_sensor_pin=PC14, bltouch_control_pin=PA1, probe_pin=PC14, fan_part_cooling_pin=PC6, fan_toolhead_cooling_pin=PC7, fan_controller_board_pin=PB15, heater_bed_heating_pin=PC9, heater_bed_sensor_pin=PC4, EXP1_1=PB5, EXP1_3=PA9, EXP1_5=PA10, EXP1_7=PB8, EXP1_9=, EXP1_2=PA15, EXP1_4=, EXP1_6=PB9, EXP1_8=PD6, EXP1_10=<5V>, IO_5=PD5, SPI1_1=<5V>, SPI1_2=, SPI1_3=PD9, SPI1_4=PA5, SPI1_5=PA7, SPI1_6=PA6, SPI1_7=<3V3>, SPI1_8=, NEOPIXEL_1=, NEOPIXEL_2=PA8, NEOPIXEL_3=null, E0_STOP_1=PC15, E0_STOP_2=, E0_STOP_3=<5V>, PWE_DCT_1=PC12, PWE_DCT_2=, PWE_DCT_3=null, TFT_1=PF2, TFT_2=PA3, TFT_3=PA2, TFT_4=, TFT_5=<5V>, PS_ON_1=, PS_ON_2=PC13 [mcu] baud = 250000 serial = /dev/serial/by-id/usb-Klipper_stm32g0b1xx_btt-skr-mini-e3-30-if00 [tmc2209 stepper_x] uart_address = 0 tx_pin = PC10 interpolate = False uart_pin = PC11 run_current = 0.8 driver_tbl = 1 driver_toff = 3 driver_hend = 3 driver_hstrt = 0 [tmc2209 stepper_y] uart_address = 2 tx_pin = PC10 interpolate = False uart_pin = PC11 run_current = 0.8 driver_tbl = 1 driver_toff = 3 driver_hend = 3 driver_hstrt = 0 [tmc2209 stepper_z] uart_address = 1 tx_pin = PC10 interpolate = False uart_pin = PC11 run_current = 0.8 driver_tbl = 1 driver_toff = 3 driver_hend = 3 driver_hstrt = 0 [tmc2209 extruder] uart_address = 3 tx_pin = PC10 interpolate = False uart_pin = PC11 run_current = 0.707 stealthchop_threshold = 0 driver_tbl = 1 driver_toff = 3 driver_hend = 9 driver_hstrt = 7 [adxl345] cs_pin = pico:gpio1 spi_software_mosi_pin = adxl345_mosi_pin spi_software_miso_pin = adxl345_miso_pin spi_software_sclk_pin = adxl345_sclk_pin spi_bus = spi0a [idle_timeout] gcode = {% if printer.webhooks.state|lower == 'ready' %} {% if printer.pause_resume.is_paused|lower == 'false' %} M117 Idle timeout reached TURN_OFF_HEATERS M84 {% endif %} {% endif %} timeout = 7200 [temperature_sensor raspberry_pi] sensor_type = temperature_host [skew_correction] [input_shaper] [virtual_sdcard] path = ~/gcode_files [display_status] [pause_resume] [force_move] enable_force_move = True [respond] [heater_bed] heater_pin = heater_bed_heating_pin sensor_pin = heater_bed_sensor_pin sensor_type = EPCOS 100K B57560G104F min_temp = 0 max_temp = 130 control = pid pid_kp = 63.023 pid_ki = 2.360 pid_kd = 420.681 [fan] pin = fan_part_cooling_pin shutdown_speed = 1.0 [heater_fan toolhead_cooling_fan] pin = fan_toolhead_cooling_pin fan_speed = 1 heater = extruder heater_temp = 50.0 [controller_fan controller_fan] pin = fan_controller_board_pin idle_speed = 0.7 [printer] kinematics = cartesian max_velocity = 200 max_accel = 3000 max_accel_to_decel = 1500 max_z_velocity = 15 max_z_accel = 200 square_corner_velocity = 5 [bed_mesh] speed = 200 horizontal_move_z = 5 mesh_min = 15,15 mesh_max = 150,160 probe_count = 5,5 fade_start = 1.0 fade_end = 10.0 mesh_pps = 2,2 algorithm = bicubic bicubic_tension = .2 [screws_tilt_adjust] screw1 = 80, 108 screw1_name = Left Screw screw2 = 155, 72 screw2_name = Front Right Screw screw3 = 155, 147 screw3_name = Rear Right Screw horizontal_move_z = 10 speed = 200 screw_thread = CCW-M4 [homing_override] set_position_z = -5 axes = xyz gcode = {% set x_homed = 'x' in printer.toolhead.homed_axes %} {% set y_homed = 'y' in printer.toolhead.homed_axes %} {% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %} {% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %} {% if safe_home_x is not defined or safe_home_x|lower == 'middle' %} {% set safe_home_x = printer.toolhead.axis_maximum.x / 2 %} {% endif %} {% if safe_home_y is not defined or safe_home_y|lower == 'middle' %} {% set safe_home_y = printer.toolhead.axis_maximum.y / 2 %} {% endif %} {% set z_hop = printer["gcode_macro RatOS"].homing_z_hop|float %} {% set z_probe = printer["gcode_macro RatOS"].z_probe|lower %} {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} M400 G90 G0 Z{z_hop} F{z_speed} {% if params.X is defined or params.Y is not defined and params.Z is not defined %} {% if printer["gcode_macro RatOS"].homing_x|lower == 'endstop' or printer["gcode_macro RatOS"].homing|lower == 'endstops' %} G28 X {% elif printer["gcode_macro RatOS"].homing_x|lower == 'sensorless' or printer["gcode_macro RatOS"].homing|lower == 'sensorless' %} HOME_X_SENSORLESS {% endif %} {% set x_homed = True %} G0 X{safe_home_x} F{speed} {% endif %} {% if params.Y is defined or params.X is not defined and params.Z is not defined %} {% if printer["gcode_macro RatOS"].homing_y|lower == 'endstop' or printer["gcode_macro RatOS"].homing|lower == 'endstops' %} G28 Y {% elif printer["gcode_macro RatOS"].homing_y|lower == 'sensorless' or printer["gcode_macro RatOS"].homing|lower == 'sensorless' %} HOME_Y_SENSORLESS {% endif %} {% set y_homed = True %} G0 Y{safe_home_y} F{speed} {% endif %} {% if params.Z is defined or params.Y is not defined and params.X is not defined %} RESPOND MSG="Homing Z" {% if x_homed == False or y_homed == False %} M118 X and Y must be homed before homing Z {% else %} {% if z_probe == "stowable" %} DEPLOY_PROBE G0 X{safe_home_x} Y{safe_home_y} F{speed} G28 Z G0 Z{z_hop} F{z_speed} STOW_PROBE {% else %} G0 X{safe_home_x} Y{safe_home_y} F{speed} G28 Z G0 Z{z_hop} F{z_speed} {% endif %} {% endif %} {% endif %} [gcode_macro HOME_X_SENSORLESS] gcode = {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set safe_home_x = printer["gcode_macro RatOS"].safe_home_x %} {% if safe_home_x is not defined or safe_home_x|lower == 'middle' %} {% set safe_home_x = printer.toolhead.axis_maximum.x / 2 %} {% endif %} M204 S1000 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_x_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_x_current} G28 X SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config["tmc2209 stepper_x"].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config["tmc2209 stepper_y"].run_current} M204 S{printer.configfile.config.printer.max_accel} [gcode_macro HOME_Y_SENSORLESS] gcode = {% set safe_home_y = printer["gcode_macro RatOS"].safe_home_y %} {% if safe_home_y is not defined or safe_home_y|lower == 'middle' %} {% set safe_home_y = printer.toolhead.axis_maximum.y / 2 %} {% endif %} {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} M204 S1000 SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer["gcode_macro RatOS"].sensorless_y_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer["gcode_macro RatOS"].sensorless_y_current} G28 Y SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config["tmc2209 stepper_x"].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config["tmc2209 stepper_y"].run_current} M204 S{printer.configfile.config.printer.max_accel} [gcode_macro MAYBE_HOME] description = Only home unhomed axis variable_is_kinematic_position_overriden = False gcode = {% if printer["gcode_macro MAYBE_HOME"].is_kinematic_position_overriden|lower == 'true' %} RESPOND MSG="SET_CENTER_KINEMATIC_POSITION has been abused. Homing all axes. Please refrain from using SET_CENTER_KINEMATIC_POSITION outside of debugging purposes." G28 SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=False {% else %} {% set axes = '' %} {% set isHomed = true %} {% set axesToHome = '' %} {% if params.X is defined %} {% set axes = axes ~ 'X ' %} {% if 'x' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'X ' %} {% endif %} {% endif %} {% if params.Y is defined %} {% set axes = axes ~ 'Y ' %} {% if 'y' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'Y ' %} {% endif %} {% endif %} {% if params.Z is defined %} {% set axes = axes ~ 'Z ' %} {% if 'z' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'Z ' %} {% endif %} {% endif %} {% if params.X is not defined and params.Y is not defined and params.Z is not defined %} {% set axes = '' %} {% if 'x' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'X ' %} {% endif %} {% if 'y' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'Y ' %} {% endif %} {% if 'z' not in printer.toolhead.homed_axes %} {% set isHomed = false %} {% set axesToHome = axesToHome ~ 'Z ' %} {% endif %} {% endif %} {% if isHomed is false %} M117 Homing {axesToHome} RESPOND MSG="Homing {axesToHome}" G28 {axesToHome} {% else %} RESPOND MSG="All requested axes already homed, skipping.." {% endif %} {% endif %} [gcode_macro ECHO_RATOS_VARS] description = Echo RatOS variables to the console. gcode = {% for var, value in printer["gcode_macro RatOS"].items() %} {action_respond_info(var ~ ": " ~ value)} {% endfor %} [gcode_macro RatOS] description = RatOS variable storage macro, will echo variables to the console when run. variable_relative_extrusion = True variable_force_absolute_position = False variable_preheat_extruder = True variable_preheat_extruder_temp = 150 variable_calibrate_bed_mesh = True variable_nozzle_priming = "primeblob" variable_nozzle_prime_start_x = "max" variable_nozzle_prime_start_y = "min" variable_nozzle_prime_direction = "auto" variable_filament_unload_length = 130 variable_filament_unload_speed = 5 variable_filament_load_length = 100 variable_filament_load_speed = 10 variable_start_print_park_in = "front" variable_start_print_park_z_height = 50 variable_start_print_heat_chamber_bed_temp = 115 variable_end_print_park_in = "back" variable_pause_print_park_in = "front" variable_macro_travel_speed = 300 variable_macro_z_speed = 10 variable_end_print_park_z_hop = 20 variable_homing = "endstops" variable_homing_z_hop = 15 variable_sensorless_x_current = 0.6 variable_sensorless_y_current = 0.9 variable_z_probe = "static" variable_safe_home_x = "middle" variable_safe_home_y = "middle" gcode = ECHO_RATOS_VARS variable_homing_x = "endstop" variable_homing_y = "endstop" [gcode_macro PAUSE] description = Pauses the printer rename_existing = PAUSE_BASE variable_extrude = 1.5 gcode = SAVE_GCODE_STATE NAME=PAUSE_state {% set E = printer["gcode_macro PAUSE"].extrude|float %} {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - 20.0) %} {% set z_safe = 20.0 %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} PAUSE_BASE G91 {% if printer.extruder.can_extrude|lower == 'true' %} G1 E-{E} F2100 {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} {% if "xyz" in printer.toolhead.homed_axes %} G1 Z{z_safe} F{z_speed} _PARK LOCATION={printer["gcode_macro RatOS"].pause_print_park_in} X={printer["gcode_macro RatOS"].pause_print_park_x} {% else %} {action_respond_info("Printer not homed")} {% endif %} [gcode_macro RESUME] description = Resumes the print if the printer is paused. rename_existing = RESUME_BASE gcode = {% set E = printer["gcode_macro PAUSE"].extrude|float %} {% if printer.extruder.can_extrude|lower == 'true' %} G91 G1 E{E} F2100 G90 {% else %} {action_respond_info("Extruder not hot enough")} {% endif %} RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1 RESUME_BASE [gcode_macro CANCEL_PRINT] description = Cancels the printer rename_existing = CANCEL_PRINT_BASE gcode = END_PRINT TURN_OFF_HEATERS CLEAR_PAUSE CANCEL_PRINT_BASE [gcode_macro PRIME_LINE] description = Prints a primeline, used internally, if configured, as part of the START_PRINT macro. gcode = SAVE_GCODE_STATE NAME=prime_line_state {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %} {% set x_start = printer.toolhead.axis_minimum.x + 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %} {% set x_start = printer.toolhead.axis_maximum.x - 5 %} {% else %} {% set x_start = printer["gcode_macro RatOS"].nozzle_prime_start_x|float %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %} {% set y_start = printer.toolhead.axis_minimum.y + 10 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 10 %} {% set y_factor = -1 %} {% else %} {% set y_start = printer["gcode_macro RatOS"].nozzle_prime_start_y|float %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|float < printer.toolhead.axis_maximum.y / 2 %} {% set y_factor = 1 %} {% else %} {% set y_factor = -1 %} {% endif %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_direction|lower == 'forwards' %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_direction|lower == 'backwards' %} {% set y_factor = -1 %} {% endif %} G90 M82 M117 Priming nozzle with prime line.. RESPOND MSG="Priming nozzle with prime line.." G1 Z5 F{z_speed} G1 X{x_start} Y{y_start} F{speed} G1 Z0.3 F{z_speed} G92 E0 G1 Y{y_start + (70 * y_factor)} E16 F1200 G1 Y{y_start + (90 * y_factor)} F{speed} RESTORE_GCODE_STATE NAME=prime_line_state [gcode_macro PRIME_BLOB] description = Prints a primeblob, used internally, if configured, as part of the START_PRINT macro. Slower than PRIME_LINE but much more effective. gcode = SAVE_GCODE_STATE NAME=prime_blob_state M117 Priming nozzle with prime blob.. RESPOND MSG="Priming nozzle with prime blob.." {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set z_speed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'min' %} {% set x_start = printer.toolhead.axis_minimum.x + 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_x|lower == 'max' %} {% set x_start = printer.toolhead.axis_maximum.x - 5 %} {% else %} {% set x_start = printer["gcode_macro RatOS"].nozzle_prime_start_x|float %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'min' %} {% set y_start = printer.toolhead.axis_minimum.y + 10 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 10 %} {% set y_factor = -1 %} {% else %} {% set y_start = printer["gcode_macro RatOS"].nozzle_prime_start_y|float %} {% if printer["gcode_macro RatOS"].nozzle_prime_start_y|float < printer.toolhead.axis_maximum.y / 2 %} {% set y_factor = 1 %} {% else %} {% set y_factor = -1 %} {% endif %} {% endif %} {% if printer["gcode_macro RatOS"].nozzle_prime_direction|lower == 'forwards' %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_direction|lower == 'backwards' %} {% set y_factor = -1 %} {% endif %} G90 M83 G1 Z5 F{z_speed} G1 X{x_start} Y{y_start} Z0.5 F{speed} G1 F60 E20 M106 S102 G1 Z5 F100 E5 G1 F200 Y{y_start + (25 * y_factor)} E1 G1 F200 Y{y_start + (30 * y_factor)} Z3.8 E0.5 G1 F200 Y{y_start + (35 * y_factor)} Z2.6 E0.5 G1 F200 Y{y_start + (40 * y_factor)} Z1.4 E0.5 G1 F200 Y{y_start + (45 * y_factor)} Z0.2 E0.5 M106 S0 G1 F200 Y{y_start + (50 * y_factor)} Z0.2 E0.6 G1 F{speed} Y{y_start + (100 * y_factor)} RESTORE_GCODE_STATE NAME=prime_blob_state [gcode_macro _PARK] gcode = {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% if params.X != '' %} {% if params.X|float >= printer.toolhead.axis_minimum.x + 5 and params.X|float <= printer.toolhead.axis_maximum.x - 5 %} {% set safe_x = params.X|float %} {% else %} {action_respond_info('The requested X co-ordinate is outside the defined axis bounds - using defaults')} {% set safe_x = printer.toolhead.axis_maximum.x / 2 %} {% endif %} {% else %} {% set safe_x = printer.toolhead.axis_maximum.x / 2 %} {% endif %} {% if params.LOCATION|default('back')|lower == 'back' %} {% set y = printer.toolhead.axis_maximum.y - 5 %} {% elif params.LOCATION|lower == 'front' %} {% set y = printer.toolhead.axis_minimum.y + 5 %} {% elif params.LOCATION|lower == 'center' %} {% set y = printer.toolhead.axis_maximum.y / 2 %} {% endif %} G90 G0 X{safe_x} Y{y} F{speed} [gcode_macro M600] description = Executes a color change by pausing the printer an unloading the filament. gcode = PAUSE UNLOAD_FILAMENT M117 Please load new filament and resume RESPOND MSG="Please load new filament and resume" [gcode_macro UNLOAD_FILAMENT] description = Unloads the filament. Note: be careful with PETG, make sure you inspect the tip of your filament before reloading to avoid jams. gcode = SAVE_GCODE_STATE NAME=unload_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M104 S{params.TEMP|default(220, true)} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={params.TEMP|default(220, true)} {% endif %} {% set unload_speed = printer["gcode_macro RatOS"].filament_unload_speed|float * 60 %} {% set unload_length = printer["gcode_macro RatOS"].filament_unload_length|float %} M117 Unloading filament... G0 E10 F300 G0 E-5 F3600 G4 P3000 G0 E5 F3600 G0 E-15 F3600 G0 E-{unload_length} F{unload_speed} M117 Filament unloaded! RESPOND MSG="Filament unloaded! Please inspect the tip of the filament before reloading." RESTORE_GCODE_STATE NAME=unload_state [gcode_macro LOAD_FILAMENT] description = Loads new filament. Note: be careful with PETG, make sure you inspect the tip of your filament before loading to avoid jams. gcode = SAVE_GCODE_STATE NAME=load_state G91 {% if params.TEMP is defined or printer.extruder.can_extrude|lower == 'false' %} M117 Heating... M104 S{params.TEMP|default(220, true)} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={params.TEMP|default(220, true)} {% endif %} {% set load_speed = printer["gcode_macro RatOS"].filament_load_speed|float * 60 %} {% set load_length = printer["gcode_macro RatOS"].filament_load_length|float %} M117 Loading filament... G0 E{load_length} F{load_speed} G4 P1000 G0 E40 F100 M400 M117 Filament loaded! RESPOND MSG="Filament loaded!" RESTORE_GCODE_STATE NAME=load_state [gcode_macro SET_CENTER_KINEMATIC_POSITION] description = FOR DEBUGGING PURPOSES ONLY. Sets the internal printer kinematic state to the center of all axes regardless of actual physical position. gcode = RESPOND MSG="WARNING: ONLY USE SET_CENTER_KINEMATIC_POSITION FOR DEBUGGING PURPOSES. YOU'RE OVERRIDING THE INTERNAL POSITIONING STATE OF THE PRINTER. PROCEED WITH CAUTION AND DO A PROPER G28 WHEN DONE." SET_GCODE_VARIABLE MACRO=MAYBE_HOME VARIABLE=is_kinematic_position_overriden VALUE=True SET_KINEMATIC_POSITION X={printer.toolhead.axis_maximum.x / 2} Y={printer.toolhead.axis_maximum.y / 2} Z={printer.toolhead.axis_maximum.z / 2} [gcode_macro START_PRINT] description = Start print procedure, use this in your Slicer. gcode = CLEAR_PAUSE {% if printer["gcode_macro RatOS"].force_absolute_position|lower == 'true' %} G90 {% endif %} SAVE_GCODE_STATE NAME=start_print_state G21 G90 M82 {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOWABLE_PROBE_BEGIN_BATCH {% endif %} MAYBE_HOME {% if params.CHAMBER_TEMP is defined %} _START_PRINT_HEAT_CHAMBER CHAMBER_TEMP={params.CHAMBER_TEMP} BED_TEMP={printer["gcode_macro RatOS"].start_print_heat_chamber_bed_temp} {% endif %} M117 Heating bed... RESPOND MSG="Heating bed..." M190 S{params.BED_TEMP|default(printer.heater_bed.target, true) } _START_PRINT_AFTER_HEATING_BED _START_PRINT_BED_MESH {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOWABLE_PROBE_END_BATCH {% endif %} M104 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _START_PRINT_PARK M117 Heating Extruder... RESPOND MSG="Heating Extruder..." M109 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _START_PRINT_AFTER_HEATING_EXTRUDER M117 Printing... RESPOND MSG="Printing..." RESTORE_GCODE_STATE NAME=start_print_state {% if printer["gcode_macro RatOS"].relative_extrusion|lower == 'true' %} M83 {% else %} M82 {% endif %} G92 E0 [gcode_macro _START_PRINT_AFTER_HEATING_BED] gcode = {% if printer["gcode_macro RatOS"].preheat_extruder|lower == 'true' %} {% set min_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float %} {% set max_temp = printer["gcode_macro RatOS"].preheat_extruder_temp|float + 5 %} M117 Pre-heating extruder... RESPOND MSG="Pre-heating extruder..." M104 S150 TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp} {% endif %} [gcode_macro _START_PRINT_BED_MESH] gcode = {% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %} BED_MESH_CALIBRATE PROFILE=ratos {% endif %} BED_MESH_PROFILE LOAD=ratos [gcode_macro _START_PRINT_PARK] gcode = {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} _PARK LOCATION={printer["gcode_macro RatOS"].start_print_park_in} X={printer["gcode_macro RatOS"].start_print_park_x} G0 Z{z} F6000 [gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER] gcode = {% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeline' %} PRIME_LINE {% endif %} {% if printer["gcode_macro RatOS"].nozzle_priming|lower == 'primeblob' %} PRIME_BLOB {% endif %} {% if printer["gcode_macro RatOS"].skew_profile is defined %} SKEW_PROFILE LOAD={printer["gcode_macro RatOS"].skew_profile} {% endif %} [gcode_macro _START_PRINT_HEAT_CHAMBER] description = Uses the extruder sensor to wait for chamber temp. Override the _START_PRINT_HEAT_CHAMBER macro to implement heated chamber handling. gcode = {% if params.CHAMBER_TEMP is defined and params.BED_TEMP is defined %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} {% set zSpeed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} G0 Z{z} F{zSpeed} M84 M117 Heating chamber... RESPOND MSG="Heating chamber..." M140 S{params.BED_TEMP} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={params.CHAMBER_TEMP} MAYBE_HOME {% endif %} [gcode_macro END_PRINT] description = End print procedure, use this in your Slicer. gcode = SAVE_GCODE_STATE NAME=end_print_state _END_PRINT_BEFORE_HEATERS_OFF TURN_OFF_HEATERS _END_PRINT_AFTER_HEATERS_OFF _END_PRINT_PARK {% if printer["gcode_macro RatOS"].skew_profile is defined %} SET_SKEW CLEAR=1 {% endif %} M84 M107 M117 Done :) RESPOND MSG="Done :)" RESTORE_GCODE_STATE NAME=end_print_state [gcode_macro _END_PRINT_BEFORE_HEATERS_OFF] gcode = RESPOND MSG="Cleaning up..." [gcode_macro _END_PRINT_AFTER_HEATERS_OFF] gcode = {% set max_z = printer.toolhead.axis_maximum.z|float %} {% set act_z = printer.toolhead.position.z|float %} {% if act_z < (max_z - 20.0) %} {% set z_safe = 20.0 %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} G91 G1 E-2 F3600 G0 Z{z_safe} F3600 G1 E-2 F3600 [gcode_macro _END_PRINT_PARK] gcode = _PARK LOCATION={printer["gcode_macro RatOS"].end_print_park_in} X={printer["gcode_macro RatOS"].end_print_park_x} [gcode_shell_command generate_shaper_graph_x] command = /home/pi/klipper_config/config/scripts/generate-shaper-graph-x.sh timeout = 60. verbose = True [gcode_shell_command generate_shaper_graph_y] command = /home/pi/klipper_config/config/scripts/generate-shaper-graph-y.sh timeout = 60. verbose = True [gcode_shell_command generate_belt_tension_graph] command = /home/pi/klipper_config/config/scripts/generate-belt-tension-graph.sh timeout = 90. verbose = True [gcode_shell_command compile_binaries] command = /home/pi/klipper_config/config/scripts/compile-binaries.sh timeout = 600. [gcode_shell_command change_hostname] command = /home/pi/klipper_config/config/scripts/change-hostname.sh timeout = 10. [gcode_shell_command delete_and_restore_printer_data_dirs] command = /home/pi/klipper_config/config/scripts/delete-and-restore-printer-data.sh timeout = 10. [gcode_macro DELETE_AND_RESTORE_PRINTER_DATA_DIRS] gcode = RUN_SHELL_COMMAND CMD=delete_and_restore_printer_data_dirs [gcode_macro GENERATE_SHAPER_GRAPHS] description = Genarates input shaper resonances graphs for analysis. Uses the AXIS parameter for if you only want to do one axis at a time, (eg. GENERATE_SHAPER_GRAPHS AXIS=X) gcode = {% if params.AXIS is defined %} {% if params.AXIS|lower == 'x' %} MAYBE_HOME TEST_RESONANCES AXIS=X RUN_SHELL_COMMAND CMD=generate_shaper_graph_x RESPOND MSG="Input shaper graph generated for the X axis. You'll find it in the input_shaper folder in the machine tab!" {% elif params.AXIS|lower == 'y' %} MAYBE_HOME TEST_RESONANCES AXIS=Y RUN_SHELL_COMMAND CMD=generate_shaper_graph_y RESPOND MSG="Input shaper graph generated for the Y axis. You'll find it in the input_shaper folder in the machine tab!" {% else %} {action_raise_error("Unknown axis specified. Expected X or Y.")} {% endif %} {% else %} MAYBE_HOME TEST_RESONANCES AXIS=X TEST_RESONANCES AXIS=Y RUN_SHELL_COMMAND CMD=generate_shaper_graph_x RUN_SHELL_COMMAND CMD=generate_shaper_graph_y RESPOND MSG="Input shaper graphs generated for X and Y. You'll find them in the input_shaper folder in the machine tab!" {% endif %} [gcode_macro MEASURE_COREXY_BELT_TENSION] description = Generates resonance graph used to ensure belts are equally tensioned. gcode = TEST_RESONANCES AXIS=1,1 OUTPUT=raw_data NAME=belt-tension-upper TEST_RESONANCES AXIS=1,-1 OUTPUT=raw_data NAME=belt-tension-lower RUN_SHELL_COMMAND CMD=generate_belt_tension_graph [gcode_macro COMPILE_FIRMWARE] description = Compiles firmware with currently installed klipper version for all supported RatOS boards. Note: this may take up to 10 minutes. gcode = RESPOND MSG="Compiling binaries.. This can take up to 10 minutes. Please do not turn off your Raspberry Pi!" RUN_SHELL_COMMAND CMD=compile_binaries RESPOND MSG="Firmware binaries compiled successfully! You can find them in the firmware_binaries folder in the machine tab!" [gcode_macro CHANGE_HOSTNAME] description = Change the hostname of your Raspberry Pi. gcode = {% if params.HOSTNAME is not defined %} RESPOND MSG='You have to specify a new hostname with the HOSTNAME parameter. Ex: CHANGE_HOSTNAME HOSTNAME="MY_NEW_HOSTNAME"' RESPOND MSG="Please note: RFCs mandate that a hostname's labels may contain only the ASCII letters 'a' through 'z' (case-insensitive), the digits '0' through '9', and the hyphen. Hostname labels cannot begin or end with a hyphen. No other symbols, punctuation characters, or blank spaces are permitted." {% else %} RUN_SHELL_COMMAND CMD=change_hostname PARAMS={params.HOSTNAME} {% endif %} [gcode_macro SCREWS_TILT_CALCULATE] rename_existing = SCREWS_TILT_CALCULATE_ORIG gcode = MAYBE_HOME SAVE_GCODE_STATE NAME=screws_tilt_state {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} DEPLOY_PROBE {% endif %} SCREWS_TILT_CALCULATE_ORIG {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} STOW_PROBE {% endif %} G90 G0 Z120 F{printer["gcode_macro RatOS"].macro_z_speed|float * 60} G0 Y{printer.toolhead.axis_maximum.y} X{printer.toolhead.axis_maximum.x / 2} F{printer["gcode_macro RatOS"].macro_travel_speed|float * 60} RESTORE_GCODE_STATE NAME=screws_tilt_state M84 [stepper_x] step_pin = x_step_pin dir_pin = !x_dir_pin enable_pin = !x_enable_pin rotation_distance = 40 microsteps = 64 position_max = 180 position_min = 0 position_endstop = 0 endstop_pin = ^!x_endstop_pin homing_retract_dist = 5.0 homing_speed = 60 [stepper_y] step_pin = y_step_pin dir_pin = !y_dir_pin enable_pin = !y_enable_pin rotation_distance = 40 microsteps = 64 position_max = 180 position_min = 0 position_endstop = 0 endstop_pin = ^!y_endstop_pin homing_retract_dist = 5.0 homing_speed = 60 [stepper_z] step_pin = z0_step_pin dir_pin = z0_dir_pin enable_pin = !z0_enable_pin rotation_distance = 4 position_min = -5 microsteps = 16 endstop_pin = probe:z_virtual_endstop position_max = 180 homing_speed = 20 [extruder] step_pin = e_step_pin dir_pin = e_dir_pin enable_pin = !e_enable_pin microsteps = 64 rotation_distance = 5.57 full_steps_per_rotation = 200 filament_diameter = 1.750 max_extrude_only_velocity = 120 max_extrude_only_accel = 800 pressure_advance_smooth_time = 0.02 max_extrude_only_distance = 200 nozzle_diameter = 0.4 heater_pin = e_heater_pin sensor_type = Generic 3950 sensor_pin = e_sensor_pin min_extrude_temp = 170 min_temp = 0 max_temp = 290 pressure_advance = 0.03 control = pid pid_kp = 23.118 pid_ki = 1.233 pid_kd = 108.366 [resonance_tester] accel_chip = adxl345 max_smoothing = 0.08 probe_points = 90,90,20 [firmware_retraction] retract_speed = 120 unretract_extra_length = 0 unretract_speed = 120 retract_length = 0.5 [probe] pin = probe_pin x_offset = -28 y_offset = -10 speed = 5 samples = 3 sample_retract_dist = 2 lift_speed = 5.0 samples_result = median samples_tolerance = 0.02 samples_tolerance_retries = 5 z_offset = 1.360 [mcu pico] serial = /dev/serial/by-id/usb-Klipper_rp2040_E6614864D35B3638-if00 [bed_mesh default] version = 1 points = -0.149219, -0.146250, -0.119688, -0.079219, -0.031250 -0.014844, -0.036250, -0.029063, -0.000781, 0.021719 0.095625, 0.066250, 0.035312, 0.037969, 0.031250 0.262031, 0.205000, 0.160781, 0.146406, 0.102812 0.397812, 0.297187, 0.226250, 0.186562, 0.135781 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = bicubic tension = 0.2 min_x = 15.0 max_x = 150.0 min_y = 15.0 max_y = 160.0 [bed_mesh ratos] version = 1 points = -0.173750, -0.165000, -0.147500, -0.102500, -0.058750 -0.035000, -0.053750, -0.051250, -0.015000, -0.011250 0.081250, 0.061250, 0.020000, 0.022500, 0.008750 0.242500, 0.186250, 0.141250, 0.138750, 0.077500 0.372500, 0.285000, 0.213750, 0.167500, 0.111250 x_count = 5 y_count = 5 mesh_x_pps = 2 mesh_y_pps = 2 algo = bicubic tension = 0.2 min_x = 15.0 max_x = 150.0 min_y = 15.0 max_y = 160.0 ======================= Config error Traceback (most recent call last): File "/home/pi/klipper/klippy/klippy.py", line 175, in _connect self._read_config() File "/home/pi/klipper/klippy/klippy.py", line 141, in _read_config self.load_object(config, section_config.get_name(), None) File "/home/pi/klipper/klippy/klippy.py", line 130, in load_object self.objects[section] = init_func(config.getsection(section)) File "/home/pi/klipper/klippy/extras/adxl345.py", line 442, in load_config return ADXL345(config) File "/home/pi/klipper/klippy/extras/adxl345.py", line 248, in __init__ self.spi = bus.MCU_SPI_from_config(config, 3, default_speed=5000000) File "/home/pi/klipper/klippy/extras/bus.py", line 129, in MCU_SPI_from_config config.get_name(),)) pins.error: adxl345: spi pins must be on same mcu webhooks client 3040199792: New connection webhooks client 3040199792: Client info {'program': 'Moonraker', 'version': 'v0.7.1-758-g5a3b1b6'}