Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-219-g645a1b83-dirty' Untracked files: klippy/extras/beacon.py, klippy/extras/gcode_shell_command.py, klippy/extras/linear_movement_vibrations.py, klippy/extras/ratos_homing.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ? Python: '3.9.2 (default, Feb 28 2021, 17:03:44) \n[GCC 10.2.1 20210110]' =============== Log rollover at Tue Jul 25 10:39:57 2023 =============== Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-219-g645a1b83-dirty' Untracked files: klippy/extras/beacon.py, klippy/extras/gcode_shell_command.py, klippy/extras/linear_movement_vibrations.py, klippy/extras/ratos_homing.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ? Python: '3.9.2 (default, Feb 28 2021, 17:03:44) \n[GCC 10.2.1 20210110]' Building C code module c_helper.so Start printer at Tue Jul 25 10:40:06 2023 (1690278006.8 73.7) ===== Config file ===== [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 = ~/printer_data/gcodes [display_status] [pause_resume] [force_move] enable_force_move = True [respond] [mcu] serial = /tmp/klipper_host_mcu [printer] kinematics = none max_velocity = 1 max_accel = 1 [gcode_macro PAUSE] rename_existing = PAUSE_BASE gcode = M118 Please install a config first! [gcode_macro RESUME] rename_existing = RESUME_BASE gcode = M118 Please install a config first! [gcode_macro CANCEL_PRINT] rename_existing = CANCEL_BASE gcode = M118 Please install a config first! [gcode_shell_command copy_minion] command = /home/pi/printer_data/config/RatOS/scripts/install-v-minion-config.sh timeout = 2 verbose = False [gcode_shell_command copy_corethree] command = /home/pi/printer_data/config/RatOS/scripts/install-v-core-3-config.sh timeout = 2 verbose = False [gcode_shell_command copy_corepro] command = /home/pi/printer_data/config/RatOS/scripts/install-v-core-pro-config.sh timeout = 2 verbose = False [gcode_shell_command copy_voron_v01] command = /home/pi/printer_data/config/RatOS/scripts/install-voron-v01-config.sh timeout = 2 verbose = False [gcode_shell_command copy_voron_v24] command = /home/pi/printer_data/config/RatOS/scripts/install-voron-v24-config.sh timeout = 2 verbose = False [gcode_shell_command copy_prusa_mini] command = /home/pi/printer_data/config/RatOS/scripts/install-prusa-mini-config.sh timeout = 2 verbose = False [gcode_shell_command copy_prusa_mk3s] command = /home/pi/printer_data/config/RatOS/scripts/install-prusa-mk3s-config.sh timeout = 2 verbose = False [gcode_macro INSTALL_VCORE_THREE_CONFIG] gcode = RUN_SHELL_COMMAND CMD=copy_corethree M118 V-Core 3 config installed. Please open printer.cfg! RESTART [gcode_macro INSTALL_VCORE_PRO_CONFIG] gcode = RUN_SHELL_COMMAND CMD=copy_corepro M118 V-Core Pro config installed. Please open printer.cfg! RESTART [gcode_macro INSTALL_VMINION_CONFIG] gcode = RUN_SHELL_COMMAND CMD=copy_minion M118 V-Minion config installed. Please open printer.cfg! RESTART [gcode_macro INSTALL_VORON_V0] gcode = RUN_SHELL_COMMAND CMD=copy_voron_v01 M118 Voron V0.1 config installed. Please open printer.cfg! RESTART [gcode_macro INSTALL_VORON_V2] gcode = RUN_SHELL_COMMAND CMD=copy_voron_v24 M118 Voron V2.4 config installed. Please open printer.cfg! RESTART [gcode_macro INSTALL_PRUSA_MINI] gcode = RUN_SHELL_COMMAND CMD=copy_prusa_mini M118 Prusa MINI config installed. Please open printer.cfg! RESTART [gcode_macro INSTALL_PRUSA_MK3] gcode = RUN_SHELL_COMMAND CMD=copy_prusa_mk3s M118 Prusa MK3S config installed. Please open printer.cfg! RESTART [gcode_shell_command generate_shaper_graph_x] command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-x.sh timeout = 60. verbose = True [gcode_shell_command generate_shaper_graph_y] command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-y.sh timeout = 60. verbose = True [gcode_shell_command generate_belt_tension_graph] command = /home/pi/printer_data/config/RatOS/scripts/generate-belt-tension-graph.sh timeout = 90. verbose = True [gcode_shell_command compile_binaries] command = /home/pi/printer_data/config/RatOS/scripts/compile-binaries.sh timeout = 600. [gcode_shell_command change_hostname] command = /home/pi/printer_data/config/RatOS/scripts/change-hostname.sh timeout = 10. [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 RESPOND MSG="Belt tension graphs generated. You'll find them in the input_shaper folder in the machine tab!" [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 %} ======================= mcu 'mcu': Starting connect webhooks client 548099440944: New connection webhooks client 548099440944: Client info {'program': 'Moonraker', 'version': 'v0.8.0-48-gaa0f89c'} mcu 'mcu': got {'count': 139, 'sum': 112754, 'sumsq': 525211, '#name': 'stats', '#sent_time': 74.535533159, '#receive_time': 74.535636326} Loaded MCU 'mcu' 113 commands (?-20230609_032728-fv-az592-720 / gcc: (Debian 10.2.1-6) 10.2.1 20210110 binutils: (GNU Binutils for Debian) 2.35.2) MCU 'mcu' config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256 Sending MCU 'mcu' printer configuration... Configured MCU 'mcu' (1024 moves) webhooks: registering remote method 'shutdown_machine' for connection id: 548099440944 webhooks: registering remote method 'reboot_machine' for connection id: 548099440944 webhooks: registering remote method 'pause_job_queue' for connection id: 548099440944 webhooks: registering remote method 'start_job_queue' for connection id: 548099440944 Stats 595.9: gcodein=0 mcu: mcu_awake=0.000 mcu_task_avg=0.000008 mcu_task_stddev=0.000018 bytes_write=3981 bytes_read=14388 bytes_retransmit=0 bytes_invalid=0 send_seq=639 receive_seq=639 retransmit_seq=0 srtt=0.000 rttvar=0.000 rto=0.025 ready_bytes=0 upcoming_bytes=0 freq=49999507 raspberry_pi: temp=51.6 sysload=0.18 cputime=4.237 memavail=7447752 print_time=587.570 buffer_time=0.673 print_stall=0 webhooks client 548099440944: Disconnected Restarting printer Start printer at Tue Jul 25 10:48:50 2023 (1690278530.8 597.7) ===== Config file ===== [board_pins octopus_11_tmc2209] aliases = x_step_pin=PF13, x_dir_pin=PF12, x_enable_pin=PF14, x_uart_pin=PC4, x_diag_pin=PG6, x_endstop_pin=PG6, y_step_pin=PG0, y_dir_pin=PG1, y_enable_pin=PF15, y_uart_pin=PD11, y_diag_pin=PG9, y_endstop_pin=PG9, z0_step_pin=PC13, z0_dir_pin=PF0, z0_enable_pin=PF1, z0_uart_pin=PE4, z0_diag_pin=null, z_endstop_pin=PG10, z1_step_pin=PE2, z1_dir_pin=PE3, z1_enable_pin=PD4, z1_uart_pin=PE1, z1_diag_pin=null, z2_step_pin=PE6, z2_dir_pin=PA14, z2_enable_pin=PE0, z2_uart_pin=PD3, z2_diag_pin=null, z3_step_pin=PF9, z3_dir_pin=PF10, z3_enable_pin=PG2, z3_uart_pin=PF2, z3_diag_pin=null, e_step_pin=PF11, e_dir_pin=PG3, e_enable_pin=PG5, e_uart_pin=PC6, e_diag_pin=null, e_heater_pin=PA2, e_sensor_pin=PF4, stepper_spi_mosi_pin=PA7, stepper_spi_miso_pin=PA6, stepper_spi_sclk_pin=PA5, adxl345_cs_pin=PA15, bltouch_sensor_pin=PB7, bltouch_control_pin=PB6, probe_pin=PB7, fan_part_cooling_pin=PA8, fan_toolhead_cooling_pin=PE5, fan_controller_board_pin=PD12, heater_bed_heating_pin=PA1, heater_bed_sensor_pin=PF3, EXP1_1=PE8, EXP1_3=PE9, EXP1_5=PE12, EXP1_7=PE14, EXP1_9=, EXP1_2=PE7, EXP1_4=PE10, EXP1_6=PE13, EXP1_8=PE15, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PB1, EXP2_5=PB2, EXP2_7=PC15, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10=PC5, [mcu] serial = /dev/btt-octopus-11 [temperature_sensor Octopus] sensor_type = temperature_mcu min_temp = 0 max_temp = 100 [adxl345] spi_bus = spi3 cs_pin = adxl345_cs_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 = ~/printer_data/gcodes [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 = Generic 3950 min_temp = 0 max_temp = 120 pwm_cycle_time = 0.02 control = pid pid_kp = 22.2 pid_ki = 1.08 pid_kd = 114 [fan] pin = fan_part_cooling_pin shutdown_speed = 1.0 [heater_fan toolhead_cooling_fan] pin = fan_toolhead_cooling_pin fan_speed = 1 [controller_fan controller_fan] pin = fan_controller_board_pin [printer] kinematics = corexy max_velocity = 200 max_accel = 1500 max_accel_to_decel = 750 max_z_velocity = 15 max_z_accel = 30 square_corner_velocity = 5 [ratos_homing] axes = xyz z_hop = 15 z_hop_speed = 15 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_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 %} {% set z_hop = printer.configfile.config.ratos_homing.z_hop|float %} {% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %} {% set homing_x = printer["gcode_macro RatOS"].homing_x|lower %} {% set homing_y = printer["gcode_macro RatOS"].homing_y|lower %} {% set homing = printer["gcode_macro RatOS"].homing|lower %} {% set prev_stop_on_error = printer["gcode_macro RatOS"].stowable_probe_stop_on_error %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE=True M400 G90 {% if params.X is defined or params.Y is not defined and params.Z is not defined %} {% if homing_x == 'endstop' or homing == 'endstops' %} G28 X {% elif homing_x == 'sensorless' or homing == 'sensorless' %} HOME_X_SENSORLESS {% else %} { action_emergency_stop("expected RatOS variable_homing_x to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_x, homing)) } {% 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 homing_y == 'endstop' or homing == 'endstops' %} G28 Y {% elif homing_y == 'sensorless' or homing == 'sensorless' %} HOME_Y_SENSORLESS {% else %} { action_emergency_stop("expected RatOS variable_homing_y to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_y, homing)) } {% 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 { action_emergency_stop("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_hop_speed} STOW_PROBE {% else %} G0 X{safe_home_x} Y{safe_home_y} F{speed} G28 Z G0 Z{z_hop} F{z_hop_speed} {% endif %} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE={prev_stop_on_error} [gcode_macro HOME_X_SENSORLESS] gcode = {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %} {% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %} {% 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} G4 P300 G28 X SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current} G4 P300 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 %} {% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %} {% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_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} G4 P300 G28 Y SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current} G4 P300 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 = False 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 = "back" 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 = "back" variable_macro_travel_speed = 300 variable_macro_z_speed = 15 variable_end_print_park_z_hop = 20 variable_homing = "endstops" 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" variable_stowable_probe_stop_on_error = False variable_driver_type_x = "tmc2209" variable_driver_type_y = "tmc2209" variable_adaptive_mesh = False variable_probe_for_priming_result = None variable_adaptive_prime_offset_threshold = -1.0 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 MOVE_SPEED={printer["gcode_macro RatOS"].macro_travel_speed|float} 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 = 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 = 5 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% 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 %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} G90 M82 M117 Priming nozzle with prime line.. RESPOND MSG="Priming nozzle with prime line.." G0 Z{z} F{z_speed} G1 X{x_start} F{speed} G1 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 = 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 = 5 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% 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 %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} G90 M83 G0 Z{z} F{z_speed} G1 X{x_start} F{speed} G1 Y{y_start + (15 * y_factor)} F{speed} G1 Z0.5 F{z_speed} G1 Y{y_start} 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 _USER_START_PRINT_BEFORE_HOMING {% 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} _USER_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) } _USER_START_PRINT_AFTER_HEATING_BED _START_PRINT_AFTER_HEATING_BED _USER_START_PRINT_BED_MESH _START_PRINT_BED_MESH X0={params.X0} X1={params.X1} Y0={params.Y0} Y1={params.Y1} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOWABLE_PROBE_END_BATCH {% endif %} M104 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _USER_START_PRINT_PARK _START_PRINT_PARK M117 Heating Extruder... RESPOND MSG="Heating Extruder..." M109 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _USER_START_PRINT_AFTER_HEATING_EXTRUDER _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 _USER_START_PRINT_BEFORE_HOMING] gcode = [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 S{min_temp} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp} {% endif %} M117 Adjusting Z tilt... RESPOND MSG="Adjusting Z tilt..." Z_TILT_ADJUST M117 Rehoming Z after Z tilt adjustment... RESPOND MSG="Rehoming Z after Z tilt adjustment..." G28 Z [gcode_macro _USER_START_PRINT_AFTER_HEATING_BED] gcode = [gcode_macro _START_PRINT_BED_MESH] gcode = {% set default_profile = printer["gcode_macro RatOS"].bed_mesh_profile|default('ratos') %} {% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %} BED_MESH_CLEAR {% if printer["gcode_macro RatOS"].adaptive_mesh|lower == 'true' %} CALIBRATE_ADAPTIVE_MESH PROFILE={default_profile} X0={params.X0} X1={params.X1} Y0={params.Y0} Y1={params.Y1} {% else %} BED_MESH_CALIBRATE PROFILE={default_profile} {% endif %} BED_MESH_PROFILE LOAD={default_profile} {% elif printer["gcode_macro RatOS"].bed_mesh_profile is defined %} BED_MESH_CLEAR BED_MESH_PROFILE LOAD={printer["gcode_macro RatOS"].bed_mesh_profile} {% endif %} [gcode_macro _USER_START_PRINT_BED_MESH] gcode = [gcode_macro _START_PRINT_PARK] gcode = {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} {% set zSpeed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} _PARK LOCATION={printer["gcode_macro RatOS"].start_print_park_in} X={printer["gcode_macro RatOS"].start_print_park_x} G0 Z{z} F{zSpeed} [gcode_macro _USER_START_PRINT_PARK] gcode = [gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER] gcode = {% set has_offset = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) != 9999.9 %} {% if has_offset %} ADD_PRIME_PROBE_TO_OFFSET {% endif %} {% 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 has_offset %} SUBTRACT_PRIME_PROBE_FROM_OFFSET {% endif %} {% if printer["gcode_macro RatOS"].skew_profile is defined %} SKEW_PROFILE LOAD={printer["gcode_macro RatOS"].skew_profile} {% endif %} [gcode_macro _USER_START_PRINT_AFTER_HEATING_EXTRUDER] gcode = [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 and params.CHAMBER_TEMP|int > 0 %} {% 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 _USER_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 = [gcode_macro END_PRINT] description = End print procedure, use this in your Slicer. gcode = SAVE_GCODE_STATE NAME=end_print_state _USER_END_PRINT_BEFORE_HEATERS_OFF _END_PRINT_BEFORE_HEATERS_OFF TURN_OFF_HEATERS _USER_END_PRINT_AFTER_HEATERS_OFF _END_PRINT_AFTER_HEATERS_OFF _USER_END_PRINT_PARK _END_PRINT_PARK {% if printer["gcode_macro RatOS"].skew_profile is defined %} SET_SKEW CLEAR=1 {% endif %} M84 M107 BED_MESH_CLEAR 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 _USER_END_PRINT_BEFORE_HEATERS_OFF] gcode = [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 %} {% set z_hop = printer["gcode_macro RatOS"].end_print_park_z_hop|float %} {% if act_z < (max_z - z_hop) %} {% set z_safe = z_hop %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} G91 G1 E-2 F3600 G0 Z{z_safe} F3600 G1 E-2 F3600 G90 [gcode_macro _USER_END_PRINT_AFTER_HEATERS_OFF] gcode = [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_macro _USER_END_PRINT_PARK] gcode = [gcode_macro SAVE_PROBE_RESULT] gcode = {% set last_z = printer.probe.last_z_result %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE={params.VARIABLE|default('last_z')} VALUE={last_z} [gcode_macro PROBE_FOR_PRIMING] gcode = {% if printer["gcode_macro RatOS"].nozzle_priming|lower != 'false' %} SAVE_GCODE_STATE NAME=probe_for_priming_state RESPOND MSG="Probing the prime location.." {% 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 = 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 = 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% else %} {% set y_start = printer["gcode_macro RatOS"].nozzle_prime_start_y|float %} {% endif %} {% set z = printer.configfile.settings.bed_mesh.horizontal_move_z|float %} {% set mesh_config = printer.configfile.config.bed_mesh %} {% if printer.configfile.settings.bltouch is defined %} {% set x_offset = printer.configfile.settings.bltouch.x_offset|float %} {% set y_offset = printer.configfile.settings.bltouch.y_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set x_offset = printer.configfile.settings.probe.x_offset|float %} {% set y_offset = printer.configfile.settings.probe.y_offset|float %} {% elif printer.configfile.settings.beacon is defined %} {% set x_offset = printer.configfile.settings.beacon.x_offset|float %} {% set y_offset = printer.configfile.settings.beacon.y_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% set min_x = mesh_config.mesh_min.split(",")[0]|float - x_offset %} {% set min_y = mesh_config.mesh_min.split(",")[1]|float - y_offset %} {% set max_x = mesh_config.mesh_max.split(",")[0]|float - x_offset %} {% set max_y = mesh_config.mesh_max.split(",")[1]|float - y_offset %} {% set x_start = [[x_start, max_x]|min, min_x]|max %} {% set y_start = [[y_start, max_y]|min, min_y]|max %} RESPOND MSG="PROBE_FOR_PRIMING: Probing the prime location at X: {x_start} Y: {y_start}" G90 M83 G0 Z{z} F{z_speed} G1 X{x_start} Y{y_start} F{speed} PROBE_CURRENT_POSITION SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result RESTORE_GCODE_STATE NAME=probe_for_priming_state {% endif %} [gcode_macro RESET_PRIME_PROBE_STATE] gcode = SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result VALUE=None [gcode_macro PROBE_CURRENT_POSITION] gcode = SAVE_GCODE_STATE NAME=probe_current_position_state {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} ASSERT_PROBE_DEPLOYED {% endif %} PROBE RESTORE_GCODE_STATE NAME=probe_current_position_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_z_speed|float} [gcode_macro ADD_PRIME_PROBE_TO_OFFSET] gcode = {% set last_z = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %} {% if printer.configfile.settings.bltouch is defined %} {% set z_offset = printer.configfile.settings.bltouch.z_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set z_offset = printer.configfile.settings.probe.z_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% if last_z == 9999.9 %} { action_raise_error("No probe result found for prime area. This is likely a bug.") } {% endif %} {% set adjustment = last_z - z_offset %} {% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %} {% if adjustment < adjustment_threshold %} { action_raise_error("Abnormal probe offset detected. Needed offset of {adjustment} is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area.") } {% endif %} RESPOND MSG="ADD_PRIME_PROBE_TO_OFFSET: adjusting z offset by {adjustment}" SET_GCODE_OFFSET Z_ADJUST={adjustment} MOVE=1 [gcode_macro SUBTRACT_PRIME_PROBE_FROM_OFFSET] gcode = {% set last_z = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %} {% if printer.configfile.settings.bltouch is defined %} {% set z_offset = printer.configfile.settings.bltouch.z_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set z_offset = printer.configfile.settings.probe.z_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% if last_z == 9999.9 %} { action_raise_error("No probe result found for prime area. This is likely a bug.") } {% endif %} RESPOND MSG="SUBTRACT_PRIME_PROBE_FROM_OFFSET: adjusting z offset by {z_offset - last_z}" SET_GCODE_OFFSET Z_ADJUST={z_offset - last_z} MOVE=1 [gcode_macro CALIBRATE_ADAPTIVE_MESH] gcode = {% set default_profile = params.PROFILE %} {% set x0 = params.X0|default(-1)|float %} {% set y0 = params.Y0|default(-1)|float %} {% set x1 = params.X1|default(-1)|float %} {% set y1 = params.Y1|default(-1)|float %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Recieved coordinates X0={x0} Y0={y0} X1={x1} Y1={y1}" {% if x0 >= x1 or y0 >= y1 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Invalid coordinates received. Please check your slicer settings. Falling back to full bed mesh." BED_MESH_CALIBRATE PROFILE={default_profile} {% else %} {% set mesh_config = printer.configfile.config.bed_mesh %} {% set min_x = mesh_config.mesh_min.split(",")[0]|float %} {% set min_y = mesh_config.mesh_min.split(",")[1]|float %} {% set max_x = mesh_config.mesh_max.split(",")[0]|float %} {% set max_y = mesh_config.mesh_max.split(",")[1]|float %} {% set mesh_x0 = [[x0, max_x]|min, min_x]|max %} {% set mesh_y0 = [[y0, max_y]|min, min_y]|max %} {% set mesh_x1 = [[x1, max_x]|min, min_x]|max %} {% set mesh_y1 = [[y1, max_y]|min, min_y]|max %} {% if mesh_x0 == min_x and mesh_y0 == min_y and mesh_x1 == max_x and mesh_y1 == max_y %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Print is using the full bed, falling back to full bed mesh." BED_MESH_CALIBRATE PROFILE={default_profile} {% else %} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} DEPLOY_PROBE {% endif %} {% set probe_count_x = mesh_config.probe_count.split(",")[0]|int %} {% if mesh_config.probe_count.split(",")|length == 2 %} {% set probe_count_y = mesh_config.probe_count.split(",")[1]|int %} {% else %} {% set probe_count_y = mesh_config.probe_count.split(",")[0]|int %} {% endif %} {% set probe_x_step = (max_x - min_x) / probe_count_x %} {% set probe_y_step = (max_y - min_y) / probe_count_y %} {% set mesh_count_x = ([(mesh_x1 - mesh_x0) / probe_x_step, 3]|max)|int %} {% set mesh_count_y = ([(mesh_y1 - mesh_y0) / probe_y_step, 3]|max)|int %} {% set min_mesh_count = [mesh_count_x, mesh_count_y]|min %} {% set max_mesh_count = [mesh_count_x, mesh_count_y]|max %} {% set algorithm = mesh_config.algorithm %} {% if algorithm|lower == 'lagrange' and max_mesh_count > 6 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: cannot exceed a probe_count of 6 when using lagrange interpolation. Falling back to bicubic interpolation." {% set algorithm = 'bicubic' %} {% endif %} {% if algorithm|lower == 'bicubic' and min_mesh_count < 4 %} {% if max_mesh_count > 6 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: invalid probe_count option when using bicubic interpolation. Combination of 3 points on one axis with more than 6 on another is not permitted. Forcing minimum mesh count to be 4." {% set min_mesh_count = 4 %} {% else %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: bicubic interpolation with a probe_count of less than 4 points detected. Forcing lagrange interpolation." {% set algorithm = 'lagrange' %} {% endif %} {% endif %} {% set mesh_count_x = ([min_mesh_count, mesh_count_x]|max)|int %} {% set mesh_count_x = ([max_mesh_count, mesh_count_x]|min)|int %} {% set mesh_count_y = ([min_mesh_count, mesh_count_y]|max)|int %} {% set mesh_count_y = ([max_mesh_count, mesh_count_y]|min)|int %} {% set should_prime = printer["gcode_macro RatOS"].nozzle_priming == 'primeline' or printer["gcode_macro RatOS"].nozzle_priming == 'primeblob' %} {% if printer.configfile.settings.beacon is defined %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: adaptive priming is currently not supported for Beacon. Disabling priming.." SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=nozzle_priming VALUE=False {% set should_prime = False %} {% endif %} {% set prime_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printer.toolhead.axis_maximum.y) < printer.toolhead.axis_maximum.y / 2 %} {% if should_prime and prime_first %} PROBE_FOR_PRIMING {% endif %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: mesh coordinates X0={mesh_x0} Y0={mesh_y0} X1={mesh_x1} Y1={mesh_y1}" BED_MESH_CALIBRATE PROFILE={default_profile} algorithm={algorithm} mesh_min={mesh_x0},{mesh_y0} mesh_max={mesh_x1},{mesh_y1} probe_count={mesh_count_x},{mesh_count_y} relative_reference_index=-1 {% if should_prime and not prime_first %} PROBE_FOR_PRIMING {% endif %} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOW_PROBE {% endif %} {% endif %} {% endif %} [gcode_shell_command generate_shaper_graph_x] command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-x.sh timeout = 60. verbose = True [gcode_shell_command generate_shaper_graph_y] command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-y.sh timeout = 60. verbose = True [gcode_shell_command generate_belt_tension_graph] command = /home/pi/printer_data/config/RatOS/scripts/generate-belt-tension-graph.sh timeout = 90. verbose = True [gcode_shell_command compile_binaries] command = /home/pi/printer_data/config/RatOS/scripts/compile-binaries.sh timeout = 600. [gcode_shell_command change_hostname] command = /home/pi/printer_data/config/RatOS/scripts/change-hostname.sh timeout = 10. [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 RESPOND MSG="Belt tension graphs generated. You'll find them in the input_shaper folder in the machine tab!" [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 Z_TILT_ADJUST] rename_existing = Z_TILT_ADJUST_ORIG gcode = {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} DEPLOY_PROBE {% endif %} Z_TILT_ADJUST_ORIG {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} STOW_PROBE {% endif %} [stepper_x] step_pin = x_step_pin dir_pin = x_dir_pin enable_pin = !x_enable_pin rotation_distance = 40 microsteps = 64 homing_speed = 50 homing_retract_dist = 5.0 position_max = 300 position_endstop = 0 endstop_pin = ^x_endstop_pin [stepper_y] step_pin = y_step_pin dir_pin = y_dir_pin enable_pin = !y_enable_pin rotation_distance = 40 microsteps = 64 homing_speed = 50 homing_retract_dist = 5.0 position_max = 300 position_endstop = 300 endstop_pin = ^y_endstop_pin homing_positive_dir = true [stepper_z] endstop_pin = probe:z_virtual_endstop step_pin = z0_step_pin dir_pin = !z0_dir_pin enable_pin = !z0_enable_pin rotation_distance = 4 microsteps = 64 position_min = -5 homing_speed = 10 position_max = 300 [stepper_z1] step_pin = z1_step_pin dir_pin = !z1_dir_pin enable_pin = !z1_enable_pin rotation_distance = 4 microsteps = 64 [stepper_z2] step_pin = z2_step_pin dir_pin = !z2_dir_pin enable_pin = !z2_enable_pin rotation_distance = 4 microsteps = 64 [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 = ATC Semitec 104GT-2 sensor_pin = e_sensor_pin min_extrude_temp = 170 min_temp = 0 max_temp = 285 pressure_advance = 0.03 control = pid pid_kp = 28.413 pid_ki = 1.334 pid_kd = 151.300 [tmc2209 stepper_x] stealthchop_threshold = 1 uart_pin = x_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_y] stealthchop_threshold = 1 uart_pin = y_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 extruder] uart_pin = e_uart_pin run_current = 0.707 stealthchop_threshold = 0 interpolate = False driver_tbl = 1 driver_toff = 3 driver_hend = 9 driver_hstrt = 7 [tmc2209 stepper_z] stealthchop_threshold = 1 uart_pin = z0_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_z1] stealthchop_threshold = 1 uart_pin = z1_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_z2] stealthchop_threshold = 1 uart_pin = z2_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [bed_mesh] speed = 200 horizontal_move_z = 5 mesh_min = 20,20 mesh_max = 265,260 probe_count = 7,7 fade_start = 1.0 fade_end = 10.0 mesh_pps = 2,2 algorithm = bicubic bicubic_tension = .2 [z_tilt] speed = 200 z_positions = 0,0 150,300 300,0 points = 60,60 185,270 260,60 horizontal_move_z = 20 retries = 10 retry_tolerance = 0.02 [probe] pin = ^probe_pin x_offset = -27.8 y_offset = -12 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 = 0.0 [firmware_retraction] retract_speed = 120 unretract_extra_length = 0 unretract_speed = 120 retract_length = 0.5 ======================= 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/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' webhooks client 548100220672: New connection webhooks client 548100220672: Client info {'program': 'Moonraker', 'version': 'v0.8.0-48-gaa0f89c'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 798, 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 803, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/pi/klipper/klippy/../.config(746): Fri Jun 9 03:26:03 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set # CONFIG_MACH_STM32 is not set # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set CONFIG_MACH_LINUX=y # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="linux" CONFIG_CLOCK_FREQ=50000000 CONFIG_LINUX_SELECT=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_GPIO_BITBANGING=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(9343): Fri Jun 9 03:27:28 2023 Last MCU build version: ?-20230609_032728-fv-az592-720 Last MCU build tools: gcc: (Debian 10.2.1-6) 10.2.1 20210110 binutils: (GNU Binutils for Debian) 2.35.2 Last MCU build config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256 Build file /home/pi/klipper/klippy/../out/klipper.elf(855112): Fri Jun 9 03:27:58 2023 Attempting MCU 'mcu' reset Unhandled exception during post run Traceback (most recent call last): File "/home/pi/klippy-env/lib/python3.9/site-packages/serial/serialposix.py", line 265, in open self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK) FileNotFoundError: [Errno 2] No such file or directory: '/dev/btt-octopus-11' 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 949, in _firmware_restart self._restart_arduino() File "/home/pi/klipper/klippy/mcu.py", line 909, in _restart_arduino serialhdl.arduino_reset(self._serialport, self._reactor) File "/home/pi/klipper/klippy/serialhdl.py", line 379, in arduino_reset ser = serial.Serial(serialport, 2400, timeout=0, exclusive=True) File "/home/pi/klippy-env/lib/python3.9/site-packages/serial/serialutil.py", line 240, in __init__ self.open() File "/home/pi/klippy-env/lib/python3.9/site-packages/serial/serialposix.py", line 268, in open raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg)) serial.serialutil.SerialException: [Errno 2] could not open port /dev/btt-octopus-11: [Errno 2] No such file or directory: '/dev/btt-octopus-11' Restarting printer Start printer at Tue Jul 25 11:04:30 2023 (1690279470.8 1537.7) ===== Config file ===== [board_pins octopus_pro_429_tmc2209] aliases = x_step_pin=PF13, x_dir_pin=PF12, x_enable_pin=PF14, x_uart_pin=PC4, x_diag_pin=PG6, x_endstop_pin=PG6, y_step_pin=PG0, y_dir_pin=PG1, y_enable_pin=PF15, y_uart_pin=PD11, y_diag_pin=PG9, y_endstop_pin=PG9, z0_step_pin=PC13, z0_dir_pin=PF0, z0_enable_pin=PF1, z0_uart_pin=PE4, z0_diag_pin=null, z1_step_pin=PE2, z1_dir_pin=PE3, z1_enable_pin=PD4, z1_uart_pin=PE1, z1_diag_pin=null, z2_step_pin=PE6, z2_dir_pin=PA14, z2_enable_pin=PE0, z2_uart_pin=PD3, z2_diag_pin=null, z3_step_pin=PF9, z3_dir_pin=PF10, z3_enable_pin=PG2, z3_uart_pin=PF2, z3_diag_pin=null, e_step_pin=PF11, e_dir_pin=PG3, e_enable_pin=PG5, e_uart_pin=PC6, e_diag_pin=null, e_heater_pin=PA2, e_sensor_pin=PF4, stepper_spi_mosi_pin=PA7, stepper_spi_miso_pin=PA6, stepper_spi_sclk_pin=PA5, adxl345_cs_pin=PA15, bltouch_sensor_pin=PB7, bltouch_control_pin=PB6, probe_pin=PB7, fan_part_cooling_pin=PA8, fan_toolhead_cooling_pin=PE5, fan_controller_board_pin=PD12, heater_bed_heating_pin=PA1, heater_bed_sensor_pin=PF3, EXP1_1=PE8, EXP1_3=PE9, EXP1_5=PE12, EXP1_7=PE14, EXP1_9=, EXP1_2=PE7, EXP1_4=PE10, EXP1_6=PE13, EXP1_8=PE15, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PB1, EXP2_5=PB2, EXP2_7=PC15, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10=PC5, [mcu] serial = /dev/btt-octopus-pro-429 [temperature_sensor Octopus_Pro_429] sensor_type = temperature_mcu min_temp = 0 max_temp = 100 [adxl345] spi_bus = spi3 cs_pin = adxl345_cs_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 = ~/printer_data/gcodes [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 = Generic 3950 min_temp = 0 max_temp = 120 pwm_cycle_time = 0.02 control = pid pid_kp = 22.2 pid_ki = 1.08 pid_kd = 114 [fan] pin = fan_part_cooling_pin shutdown_speed = 1.0 [heater_fan toolhead_cooling_fan] pin = fan_toolhead_cooling_pin fan_speed = 1 [controller_fan controller_fan] pin = fan_controller_board_pin [printer] kinematics = corexy max_velocity = 200 max_accel = 1500 max_accel_to_decel = 750 max_z_velocity = 15 max_z_accel = 30 square_corner_velocity = 5 [ratos_homing] axes = xyz z_hop = 15 z_hop_speed = 15 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_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 %} {% set z_hop = printer.configfile.config.ratos_homing.z_hop|float %} {% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %} {% set homing_x = printer["gcode_macro RatOS"].homing_x|lower %} {% set homing_y = printer["gcode_macro RatOS"].homing_y|lower %} {% set homing = printer["gcode_macro RatOS"].homing|lower %} {% set prev_stop_on_error = printer["gcode_macro RatOS"].stowable_probe_stop_on_error %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE=True M400 G90 {% if params.X is defined or params.Y is not defined and params.Z is not defined %} {% if homing_x == 'endstop' or homing == 'endstops' %} G28 X {% elif homing_x == 'sensorless' or homing == 'sensorless' %} HOME_X_SENSORLESS {% else %} { action_emergency_stop("expected RatOS variable_homing_x to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_x, homing)) } {% 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 homing_y == 'endstop' or homing == 'endstops' %} G28 Y {% elif homing_y == 'sensorless' or homing == 'sensorless' %} HOME_Y_SENSORLESS {% else %} { action_emergency_stop("expected RatOS variable_homing_y to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_y, homing)) } {% 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 { action_emergency_stop("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_hop_speed} STOW_PROBE {% else %} G0 X{safe_home_x} Y{safe_home_y} F{speed} G28 Z G0 Z{z_hop} F{z_hop_speed} {% endif %} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE={prev_stop_on_error} [gcode_macro HOME_X_SENSORLESS] gcode = {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %} {% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %} {% 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} G4 P300 G28 X SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current} G4 P300 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 %} {% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %} {% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_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} G4 P300 G28 Y SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current} G4 P300 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 = False 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 = "back" 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 = "back" variable_macro_travel_speed = 300 variable_macro_z_speed = 15 variable_end_print_park_z_hop = 20 variable_homing = "endstops" 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" variable_stowable_probe_stop_on_error = False variable_driver_type_x = "tmc2209" variable_driver_type_y = "tmc2209" variable_adaptive_mesh = False variable_probe_for_priming_result = None variable_adaptive_prime_offset_threshold = -1.0 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 MOVE_SPEED={printer["gcode_macro RatOS"].macro_travel_speed|float} 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 = 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 = 5 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% 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 %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} G90 M82 M117 Priming nozzle with prime line.. RESPOND MSG="Priming nozzle with prime line.." G0 Z{z} F{z_speed} G1 X{x_start} F{speed} G1 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 = 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 = 5 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% 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 %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} G90 M83 G0 Z{z} F{z_speed} G1 X{x_start} F{speed} G1 Y{y_start + (15 * y_factor)} F{speed} G1 Z0.5 F{z_speed} G1 Y{y_start} 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 _USER_START_PRINT_BEFORE_HOMING {% 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} _USER_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) } _USER_START_PRINT_AFTER_HEATING_BED _START_PRINT_AFTER_HEATING_BED _USER_START_PRINT_BED_MESH _START_PRINT_BED_MESH X0={params.X0} X1={params.X1} Y0={params.Y0} Y1={params.Y1} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOWABLE_PROBE_END_BATCH {% endif %} M104 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _USER_START_PRINT_PARK _START_PRINT_PARK M117 Heating Extruder... RESPOND MSG="Heating Extruder..." M109 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _USER_START_PRINT_AFTER_HEATING_EXTRUDER _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 _USER_START_PRINT_BEFORE_HOMING] gcode = [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 S{min_temp} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp} {% endif %} M117 Adjusting Z tilt... RESPOND MSG="Adjusting Z tilt..." Z_TILT_ADJUST M117 Rehoming Z after Z tilt adjustment... RESPOND MSG="Rehoming Z after Z tilt adjustment..." G28 Z [gcode_macro _USER_START_PRINT_AFTER_HEATING_BED] gcode = [gcode_macro _START_PRINT_BED_MESH] gcode = {% set default_profile = printer["gcode_macro RatOS"].bed_mesh_profile|default('ratos') %} {% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %} BED_MESH_CLEAR {% if printer["gcode_macro RatOS"].adaptive_mesh|lower == 'true' %} CALIBRATE_ADAPTIVE_MESH PROFILE={default_profile} X0={params.X0} X1={params.X1} Y0={params.Y0} Y1={params.Y1} {% else %} BED_MESH_CALIBRATE PROFILE={default_profile} {% endif %} BED_MESH_PROFILE LOAD={default_profile} {% elif printer["gcode_macro RatOS"].bed_mesh_profile is defined %} BED_MESH_CLEAR BED_MESH_PROFILE LOAD={printer["gcode_macro RatOS"].bed_mesh_profile} {% endif %} [gcode_macro _USER_START_PRINT_BED_MESH] gcode = [gcode_macro _START_PRINT_PARK] gcode = {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} {% set zSpeed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} _PARK LOCATION={printer["gcode_macro RatOS"].start_print_park_in} X={printer["gcode_macro RatOS"].start_print_park_x} G0 Z{z} F{zSpeed} [gcode_macro _USER_START_PRINT_PARK] gcode = [gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER] gcode = {% set has_offset = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) != 9999.9 %} {% if has_offset %} ADD_PRIME_PROBE_TO_OFFSET {% endif %} {% 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 has_offset %} SUBTRACT_PRIME_PROBE_FROM_OFFSET {% endif %} {% if printer["gcode_macro RatOS"].skew_profile is defined %} SKEW_PROFILE LOAD={printer["gcode_macro RatOS"].skew_profile} {% endif %} [gcode_macro _USER_START_PRINT_AFTER_HEATING_EXTRUDER] gcode = [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 and params.CHAMBER_TEMP|int > 0 %} {% 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 _USER_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 = [gcode_macro END_PRINT] description = End print procedure, use this in your Slicer. gcode = SAVE_GCODE_STATE NAME=end_print_state _USER_END_PRINT_BEFORE_HEATERS_OFF _END_PRINT_BEFORE_HEATERS_OFF TURN_OFF_HEATERS _USER_END_PRINT_AFTER_HEATERS_OFF _END_PRINT_AFTER_HEATERS_OFF _USER_END_PRINT_PARK _END_PRINT_PARK {% if printer["gcode_macro RatOS"].skew_profile is defined %} SET_SKEW CLEAR=1 {% endif %} M84 M107 BED_MESH_CLEAR 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 _USER_END_PRINT_BEFORE_HEATERS_OFF] gcode = [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 %} {% set z_hop = printer["gcode_macro RatOS"].end_print_park_z_hop|float %} {% if act_z < (max_z - z_hop) %} {% set z_safe = z_hop %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} G91 G1 E-2 F3600 G0 Z{z_safe} F3600 G1 E-2 F3600 G90 [gcode_macro _USER_END_PRINT_AFTER_HEATERS_OFF] gcode = [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_macro _USER_END_PRINT_PARK] gcode = [gcode_macro SAVE_PROBE_RESULT] gcode = {% set last_z = printer.probe.last_z_result %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE={params.VARIABLE|default('last_z')} VALUE={last_z} [gcode_macro PROBE_FOR_PRIMING] gcode = {% if printer["gcode_macro RatOS"].nozzle_priming|lower != 'false' %} SAVE_GCODE_STATE NAME=probe_for_priming_state RESPOND MSG="Probing the prime location.." {% 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 = 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 = 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% else %} {% set y_start = printer["gcode_macro RatOS"].nozzle_prime_start_y|float %} {% endif %} {% set z = printer.configfile.settings.bed_mesh.horizontal_move_z|float %} {% set mesh_config = printer.configfile.config.bed_mesh %} {% if printer.configfile.settings.bltouch is defined %} {% set x_offset = printer.configfile.settings.bltouch.x_offset|float %} {% set y_offset = printer.configfile.settings.bltouch.y_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set x_offset = printer.configfile.settings.probe.x_offset|float %} {% set y_offset = printer.configfile.settings.probe.y_offset|float %} {% elif printer.configfile.settings.beacon is defined %} {% set x_offset = printer.configfile.settings.beacon.x_offset|float %} {% set y_offset = printer.configfile.settings.beacon.y_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% set min_x = mesh_config.mesh_min.split(",")[0]|float - x_offset %} {% set min_y = mesh_config.mesh_min.split(",")[1]|float - y_offset %} {% set max_x = mesh_config.mesh_max.split(",")[0]|float - x_offset %} {% set max_y = mesh_config.mesh_max.split(",")[1]|float - y_offset %} {% set x_start = [[x_start, max_x]|min, min_x]|max %} {% set y_start = [[y_start, max_y]|min, min_y]|max %} RESPOND MSG="PROBE_FOR_PRIMING: Probing the prime location at X: {x_start} Y: {y_start}" G90 M83 G0 Z{z} F{z_speed} G1 X{x_start} Y{y_start} F{speed} PROBE_CURRENT_POSITION SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result RESTORE_GCODE_STATE NAME=probe_for_priming_state {% endif %} [gcode_macro RESET_PRIME_PROBE_STATE] gcode = SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result VALUE=None [gcode_macro PROBE_CURRENT_POSITION] gcode = SAVE_GCODE_STATE NAME=probe_current_position_state {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} ASSERT_PROBE_DEPLOYED {% endif %} PROBE RESTORE_GCODE_STATE NAME=probe_current_position_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_z_speed|float} [gcode_macro ADD_PRIME_PROBE_TO_OFFSET] gcode = {% set last_z = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %} {% if printer.configfile.settings.bltouch is defined %} {% set z_offset = printer.configfile.settings.bltouch.z_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set z_offset = printer.configfile.settings.probe.z_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% if last_z == 9999.9 %} { action_raise_error("No probe result found for prime area. This is likely a bug.") } {% endif %} {% set adjustment = last_z - z_offset %} {% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %} {% if adjustment < adjustment_threshold %} { action_raise_error("Abnormal probe offset detected. Needed offset of {adjustment} is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area.") } {% endif %} RESPOND MSG="ADD_PRIME_PROBE_TO_OFFSET: adjusting z offset by {adjustment}" SET_GCODE_OFFSET Z_ADJUST={adjustment} MOVE=1 [gcode_macro SUBTRACT_PRIME_PROBE_FROM_OFFSET] gcode = {% set last_z = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %} {% if printer.configfile.settings.bltouch is defined %} {% set z_offset = printer.configfile.settings.bltouch.z_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set z_offset = printer.configfile.settings.probe.z_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% if last_z == 9999.9 %} { action_raise_error("No probe result found for prime area. This is likely a bug.") } {% endif %} RESPOND MSG="SUBTRACT_PRIME_PROBE_FROM_OFFSET: adjusting z offset by {z_offset - last_z}" SET_GCODE_OFFSET Z_ADJUST={z_offset - last_z} MOVE=1 [gcode_macro CALIBRATE_ADAPTIVE_MESH] gcode = {% set default_profile = params.PROFILE %} {% set x0 = params.X0|default(-1)|float %} {% set y0 = params.Y0|default(-1)|float %} {% set x1 = params.X1|default(-1)|float %} {% set y1 = params.Y1|default(-1)|float %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Recieved coordinates X0={x0} Y0={y0} X1={x1} Y1={y1}" {% if x0 >= x1 or y0 >= y1 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Invalid coordinates received. Please check your slicer settings. Falling back to full bed mesh." BED_MESH_CALIBRATE PROFILE={default_profile} {% else %} {% set mesh_config = printer.configfile.config.bed_mesh %} {% set min_x = mesh_config.mesh_min.split(",")[0]|float %} {% set min_y = mesh_config.mesh_min.split(",")[1]|float %} {% set max_x = mesh_config.mesh_max.split(",")[0]|float %} {% set max_y = mesh_config.mesh_max.split(",")[1]|float %} {% set mesh_x0 = [[x0, max_x]|min, min_x]|max %} {% set mesh_y0 = [[y0, max_y]|min, min_y]|max %} {% set mesh_x1 = [[x1, max_x]|min, min_x]|max %} {% set mesh_y1 = [[y1, max_y]|min, min_y]|max %} {% if mesh_x0 == min_x and mesh_y0 == min_y and mesh_x1 == max_x and mesh_y1 == max_y %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Print is using the full bed, falling back to full bed mesh." BED_MESH_CALIBRATE PROFILE={default_profile} {% else %} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} DEPLOY_PROBE {% endif %} {% set probe_count_x = mesh_config.probe_count.split(",")[0]|int %} {% if mesh_config.probe_count.split(",")|length == 2 %} {% set probe_count_y = mesh_config.probe_count.split(",")[1]|int %} {% else %} {% set probe_count_y = mesh_config.probe_count.split(",")[0]|int %} {% endif %} {% set probe_x_step = (max_x - min_x) / probe_count_x %} {% set probe_y_step = (max_y - min_y) / probe_count_y %} {% set mesh_count_x = ([(mesh_x1 - mesh_x0) / probe_x_step, 3]|max)|int %} {% set mesh_count_y = ([(mesh_y1 - mesh_y0) / probe_y_step, 3]|max)|int %} {% set min_mesh_count = [mesh_count_x, mesh_count_y]|min %} {% set max_mesh_count = [mesh_count_x, mesh_count_y]|max %} {% set algorithm = mesh_config.algorithm %} {% if algorithm|lower == 'lagrange' and max_mesh_count > 6 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: cannot exceed a probe_count of 6 when using lagrange interpolation. Falling back to bicubic interpolation." {% set algorithm = 'bicubic' %} {% endif %} {% if algorithm|lower == 'bicubic' and min_mesh_count < 4 %} {% if max_mesh_count > 6 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: invalid probe_count option when using bicubic interpolation. Combination of 3 points on one axis with more than 6 on another is not permitted. Forcing minimum mesh count to be 4." {% set min_mesh_count = 4 %} {% else %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: bicubic interpolation with a probe_count of less than 4 points detected. Forcing lagrange interpolation." {% set algorithm = 'lagrange' %} {% endif %} {% endif %} {% set mesh_count_x = ([min_mesh_count, mesh_count_x]|max)|int %} {% set mesh_count_x = ([max_mesh_count, mesh_count_x]|min)|int %} {% set mesh_count_y = ([min_mesh_count, mesh_count_y]|max)|int %} {% set mesh_count_y = ([max_mesh_count, mesh_count_y]|min)|int %} {% set should_prime = printer["gcode_macro RatOS"].nozzle_priming == 'primeline' or printer["gcode_macro RatOS"].nozzle_priming == 'primeblob' %} {% if printer.configfile.settings.beacon is defined %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: adaptive priming is currently not supported for Beacon. Disabling priming.." SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=nozzle_priming VALUE=False {% set should_prime = False %} {% endif %} {% set prime_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printer.toolhead.axis_maximum.y) < printer.toolhead.axis_maximum.y / 2 %} {% if should_prime and prime_first %} PROBE_FOR_PRIMING {% endif %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: mesh coordinates X0={mesh_x0} Y0={mesh_y0} X1={mesh_x1} Y1={mesh_y1}" BED_MESH_CALIBRATE PROFILE={default_profile} algorithm={algorithm} mesh_min={mesh_x0},{mesh_y0} mesh_max={mesh_x1},{mesh_y1} probe_count={mesh_count_x},{mesh_count_y} relative_reference_index=-1 {% if should_prime and not prime_first %} PROBE_FOR_PRIMING {% endif %} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOW_PROBE {% endif %} {% endif %} {% endif %} [gcode_shell_command generate_shaper_graph_x] command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-x.sh timeout = 60. verbose = True [gcode_shell_command generate_shaper_graph_y] command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-y.sh timeout = 60. verbose = True [gcode_shell_command generate_belt_tension_graph] command = /home/pi/printer_data/config/RatOS/scripts/generate-belt-tension-graph.sh timeout = 90. verbose = True [gcode_shell_command compile_binaries] command = /home/pi/printer_data/config/RatOS/scripts/compile-binaries.sh timeout = 600. [gcode_shell_command change_hostname] command = /home/pi/printer_data/config/RatOS/scripts/change-hostname.sh timeout = 10. [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 RESPOND MSG="Belt tension graphs generated. You'll find them in the input_shaper folder in the machine tab!" [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 Z_TILT_ADJUST] rename_existing = Z_TILT_ADJUST_ORIG gcode = {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} DEPLOY_PROBE {% endif %} Z_TILT_ADJUST_ORIG {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} STOW_PROBE {% endif %} [stepper_x] step_pin = x_step_pin dir_pin = x_dir_pin enable_pin = !x_enable_pin rotation_distance = 40 microsteps = 64 homing_speed = 50 homing_retract_dist = 5.0 position_max = 300 position_endstop = 0 endstop_pin = ^x_endstop_pin [stepper_y] step_pin = y_step_pin dir_pin = y_dir_pin enable_pin = !y_enable_pin rotation_distance = 40 microsteps = 64 homing_speed = 50 homing_retract_dist = 5.0 position_max = 300 position_endstop = 300 endstop_pin = ^y_endstop_pin homing_positive_dir = true [stepper_z] endstop_pin = probe:z_virtual_endstop step_pin = z0_step_pin dir_pin = !z0_dir_pin enable_pin = !z0_enable_pin rotation_distance = 4 microsteps = 64 position_min = -5 homing_speed = 10 position_max = 300 [stepper_z1] step_pin = z1_step_pin dir_pin = !z1_dir_pin enable_pin = !z1_enable_pin rotation_distance = 4 microsteps = 64 [stepper_z2] step_pin = z2_step_pin dir_pin = !z2_dir_pin enable_pin = !z2_enable_pin rotation_distance = 4 microsteps = 64 [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 = ATC Semitec 104GT-2 sensor_pin = e_sensor_pin min_extrude_temp = 170 min_temp = 0 max_temp = 285 pressure_advance = 0.03 control = pid pid_kp = 28.413 pid_ki = 1.334 pid_kd = 151.300 [tmc2209 stepper_x] stealthchop_threshold = 1 uart_pin = x_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_y] stealthchop_threshold = 1 uart_pin = y_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 extruder] uart_pin = e_uart_pin run_current = 0.707 stealthchop_threshold = 0 interpolate = False driver_tbl = 1 driver_toff = 3 driver_hend = 9 driver_hstrt = 7 [tmc2209 stepper_z] stealthchop_threshold = 1 uart_pin = z0_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_z1] stealthchop_threshold = 1 uart_pin = z1_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_z2] stealthchop_threshold = 1 uart_pin = z2_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [bed_mesh] speed = 200 horizontal_move_z = 5 mesh_min = 20,20 mesh_max = 265,260 probe_count = 7,7 fade_start = 1.0 fade_end = 10.0 mesh_pps = 2,2 algorithm = bicubic bicubic_tension = .2 [z_tilt] speed = 200 z_positions = 0,0 150,300 300,0 points = 60,60 185,270 260,60 horizontal_move_z = 20 retries = 10 retry_tolerance = 0.02 [probe] pin = ^probe_pin x_offset = -27.8 y_offset = -12 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 = 0.0 [firmware_retraction] retract_speed = 120 unretract_extra_length = 0 unretract_speed = 120 retract_length = 0.5 ======================= 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/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' webhooks client 548100081360: New connection webhooks client 548100081360: Client info {'program': 'Moonraker', 'version': 'v0.8.0-48-gaa0f89c'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 798, 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 803, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/pi/klipper/klippy/../.config(746): Fri Jun 9 03:26:03 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set # CONFIG_MACH_STM32 is not set # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set CONFIG_MACH_LINUX=y # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="linux" CONFIG_CLOCK_FREQ=50000000 CONFIG_LINUX_SELECT=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_GPIO_BITBANGING=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(9343): Fri Jun 9 03:27:28 2023 Last MCU build version: ?-20230609_032728-fv-az592-720 Last MCU build tools: gcc: (Debian 10.2.1-6) 10.2.1 20210110 binutils: (GNU Binutils for Debian) 2.35.2 Last MCU build config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256 Build file /home/pi/klipper/klippy/../out/klipper.elf(855112): Fri Jun 9 03:27:58 2023 webhooks client 548100081360: Disconnected Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-219-g645a1b83-dirty' Untracked files: klippy/extras/beacon.py, klippy/extras/gcode_shell_command.py, klippy/extras/linear_movement_vibrations.py, klippy/extras/ratos_homing.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ? Python: '3.9.2 (default, Feb 28 2021, 17:03:44) \n[GCC 10.2.1 20210110]' Start printer at Tue Jul 25 11:20:57 2023 (1690280457.5 22.0) ===== Config file ===== [board_pins octopus_pro_429_tmc2209] aliases = x_step_pin=PF13, x_dir_pin=PF12, x_enable_pin=PF14, x_uart_pin=PC4, x_diag_pin=PG6, x_endstop_pin=PG6, y_step_pin=PG0, y_dir_pin=PG1, y_enable_pin=PF15, y_uart_pin=PD11, y_diag_pin=PG9, y_endstop_pin=PG9, z0_step_pin=PC13, z0_dir_pin=PF0, z0_enable_pin=PF1, z0_uart_pin=PE4, z0_diag_pin=null, z1_step_pin=PE2, z1_dir_pin=PE3, z1_enable_pin=PD4, z1_uart_pin=PE1, z1_diag_pin=null, z2_step_pin=PE6, z2_dir_pin=PA14, z2_enable_pin=PE0, z2_uart_pin=PD3, z2_diag_pin=null, z3_step_pin=PF9, z3_dir_pin=PF10, z3_enable_pin=PG2, z3_uart_pin=PF2, z3_diag_pin=null, e_step_pin=PF11, e_dir_pin=PG3, e_enable_pin=PG5, e_uart_pin=PC6, e_diag_pin=null, e_heater_pin=PA2, e_sensor_pin=PF4, stepper_spi_mosi_pin=PA7, stepper_spi_miso_pin=PA6, stepper_spi_sclk_pin=PA5, adxl345_cs_pin=PA15, bltouch_sensor_pin=PB7, bltouch_control_pin=PB6, probe_pin=PB7, fan_part_cooling_pin=PA8, fan_toolhead_cooling_pin=PE5, fan_controller_board_pin=PD12, heater_bed_heating_pin=PA1, heater_bed_sensor_pin=PF3, EXP1_1=PE8, EXP1_3=PE9, EXP1_5=PE12, EXP1_7=PE14, EXP1_9=, EXP1_2=PE7, EXP1_4=PE10, EXP1_6=PE13, EXP1_8=PE15, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PB1, EXP2_5=PB2, EXP2_7=PC15, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10=PC5, [mcu] serial = /dev/btt-octopus-pro-429 [temperature_sensor Octopus_Pro_429] sensor_type = temperature_mcu min_temp = 0 max_temp = 100 [adxl345] spi_bus = spi3 cs_pin = adxl345_cs_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 = ~/printer_data/gcodes [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 = Generic 3950 min_temp = 0 max_temp = 120 pwm_cycle_time = 0.02 control = pid pid_kp = 22.2 pid_ki = 1.08 pid_kd = 114 [fan] pin = fan_part_cooling_pin shutdown_speed = 1.0 [heater_fan toolhead_cooling_fan] pin = fan_toolhead_cooling_pin fan_speed = 1 [controller_fan controller_fan] pin = fan_controller_board_pin [printer] kinematics = corexy max_velocity = 200 max_accel = 1500 max_accel_to_decel = 750 max_z_velocity = 15 max_z_accel = 30 square_corner_velocity = 5 [ratos_homing] axes = xyz z_hop = 15 z_hop_speed = 15 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_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 %} {% set z_hop = printer.configfile.config.ratos_homing.z_hop|float %} {% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %} {% set homing_x = printer["gcode_macro RatOS"].homing_x|lower %} {% set homing_y = printer["gcode_macro RatOS"].homing_y|lower %} {% set homing = printer["gcode_macro RatOS"].homing|lower %} {% set prev_stop_on_error = printer["gcode_macro RatOS"].stowable_probe_stop_on_error %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE=True M400 G90 {% if params.X is defined or params.Y is not defined and params.Z is not defined %} {% if homing_x == 'endstop' or homing == 'endstops' %} G28 X {% elif homing_x == 'sensorless' or homing == 'sensorless' %} HOME_X_SENSORLESS {% else %} { action_emergency_stop("expected RatOS variable_homing_x to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_x, homing)) } {% 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 homing_y == 'endstop' or homing == 'endstops' %} G28 Y {% elif homing_y == 'sensorless' or homing == 'sensorless' %} HOME_Y_SENSORLESS {% else %} { action_emergency_stop("expected RatOS variable_homing_y to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_y, homing)) } {% 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 { action_emergency_stop("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_hop_speed} STOW_PROBE {% else %} G0 X{safe_home_x} Y{safe_home_y} F{speed} G28 Z G0 Z{z_hop} F{z_hop_speed} {% endif %} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE={prev_stop_on_error} [gcode_macro HOME_X_SENSORLESS] gcode = {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %} {% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %} {% 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} G4 P300 G28 X SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current} G4 P300 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 %} {% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %} {% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_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} G4 P300 G28 Y SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current} G4 P300 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 = False 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 = "back" 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 = "back" variable_macro_travel_speed = 300 variable_macro_z_speed = 15 variable_end_print_park_z_hop = 20 variable_homing = "endstops" 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" variable_stowable_probe_stop_on_error = False variable_driver_type_x = "tmc2209" variable_driver_type_y = "tmc2209" variable_adaptive_mesh = False variable_probe_for_priming_result = None variable_adaptive_prime_offset_threshold = -1.0 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 MOVE_SPEED={printer["gcode_macro RatOS"].macro_travel_speed|float} 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 = 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 = 5 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% 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 %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} G90 M82 M117 Priming nozzle with prime line.. RESPOND MSG="Priming nozzle with prime line.." G0 Z{z} F{z_speed} G1 X{x_start} F{speed} G1 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 = 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 = 5 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% 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 %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} G90 M83 G0 Z{z} F{z_speed} G1 X{x_start} F{speed} G1 Y{y_start + (15 * y_factor)} F{speed} G1 Z0.5 F{z_speed} G1 Y{y_start} 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 _USER_START_PRINT_BEFORE_HOMING {% 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} _USER_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) } _USER_START_PRINT_AFTER_HEATING_BED _START_PRINT_AFTER_HEATING_BED _USER_START_PRINT_BED_MESH _START_PRINT_BED_MESH X0={params.X0} X1={params.X1} Y0={params.Y0} Y1={params.Y1} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOWABLE_PROBE_END_BATCH {% endif %} M104 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _USER_START_PRINT_PARK _START_PRINT_PARK M117 Heating Extruder... RESPOND MSG="Heating Extruder..." M109 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _USER_START_PRINT_AFTER_HEATING_EXTRUDER _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 _USER_START_PRINT_BEFORE_HOMING] gcode = [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 S{min_temp} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp} {% endif %} M117 Adjusting Z tilt... RESPOND MSG="Adjusting Z tilt..." Z_TILT_ADJUST M117 Rehoming Z after Z tilt adjustment... RESPOND MSG="Rehoming Z after Z tilt adjustment..." G28 Z [gcode_macro _USER_START_PRINT_AFTER_HEATING_BED] gcode = [gcode_macro _START_PRINT_BED_MESH] gcode = {% set default_profile = printer["gcode_macro RatOS"].bed_mesh_profile|default('ratos') %} {% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %} BED_MESH_CLEAR {% if printer["gcode_macro RatOS"].adaptive_mesh|lower == 'true' %} CALIBRATE_ADAPTIVE_MESH PROFILE={default_profile} X0={params.X0} X1={params.X1} Y0={params.Y0} Y1={params.Y1} {% else %} BED_MESH_CALIBRATE PROFILE={default_profile} {% endif %} BED_MESH_PROFILE LOAD={default_profile} {% elif printer["gcode_macro RatOS"].bed_mesh_profile is defined %} BED_MESH_CLEAR BED_MESH_PROFILE LOAD={printer["gcode_macro RatOS"].bed_mesh_profile} {% endif %} [gcode_macro _USER_START_PRINT_BED_MESH] gcode = [gcode_macro _START_PRINT_PARK] gcode = {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} {% set zSpeed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} _PARK LOCATION={printer["gcode_macro RatOS"].start_print_park_in} X={printer["gcode_macro RatOS"].start_print_park_x} G0 Z{z} F{zSpeed} [gcode_macro _USER_START_PRINT_PARK] gcode = [gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER] gcode = {% set has_offset = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) != 9999.9 %} {% if has_offset %} ADD_PRIME_PROBE_TO_OFFSET {% endif %} {% 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 has_offset %} SUBTRACT_PRIME_PROBE_FROM_OFFSET {% endif %} {% if printer["gcode_macro RatOS"].skew_profile is defined %} SKEW_PROFILE LOAD={printer["gcode_macro RatOS"].skew_profile} {% endif %} [gcode_macro _USER_START_PRINT_AFTER_HEATING_EXTRUDER] gcode = [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 and params.CHAMBER_TEMP|int > 0 %} {% 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 _USER_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 = [gcode_macro END_PRINT] description = End print procedure, use this in your Slicer. gcode = SAVE_GCODE_STATE NAME=end_print_state _USER_END_PRINT_BEFORE_HEATERS_OFF _END_PRINT_BEFORE_HEATERS_OFF TURN_OFF_HEATERS _USER_END_PRINT_AFTER_HEATERS_OFF _END_PRINT_AFTER_HEATERS_OFF _USER_END_PRINT_PARK _END_PRINT_PARK {% if printer["gcode_macro RatOS"].skew_profile is defined %} SET_SKEW CLEAR=1 {% endif %} M84 M107 BED_MESH_CLEAR 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 _USER_END_PRINT_BEFORE_HEATERS_OFF] gcode = [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 %} {% set z_hop = printer["gcode_macro RatOS"].end_print_park_z_hop|float %} {% if act_z < (max_z - z_hop) %} {% set z_safe = z_hop %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} G91 G1 E-2 F3600 G0 Z{z_safe} F3600 G1 E-2 F3600 G90 [gcode_macro _USER_END_PRINT_AFTER_HEATERS_OFF] gcode = [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_macro _USER_END_PRINT_PARK] gcode = [gcode_macro SAVE_PROBE_RESULT] gcode = {% set last_z = printer.probe.last_z_result %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE={params.VARIABLE|default('last_z')} VALUE={last_z} [gcode_macro PROBE_FOR_PRIMING] gcode = {% if printer["gcode_macro RatOS"].nozzle_priming|lower != 'false' %} SAVE_GCODE_STATE NAME=probe_for_priming_state RESPOND MSG="Probing the prime location.." {% 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 = 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 = 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% else %} {% set y_start = printer["gcode_macro RatOS"].nozzle_prime_start_y|float %} {% endif %} {% set z = printer.configfile.settings.bed_mesh.horizontal_move_z|float %} {% set mesh_config = printer.configfile.config.bed_mesh %} {% if printer.configfile.settings.bltouch is defined %} {% set x_offset = printer.configfile.settings.bltouch.x_offset|float %} {% set y_offset = printer.configfile.settings.bltouch.y_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set x_offset = printer.configfile.settings.probe.x_offset|float %} {% set y_offset = printer.configfile.settings.probe.y_offset|float %} {% elif printer.configfile.settings.beacon is defined %} {% set x_offset = printer.configfile.settings.beacon.x_offset|float %} {% set y_offset = printer.configfile.settings.beacon.y_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% set min_x = mesh_config.mesh_min.split(",")[0]|float - x_offset %} {% set min_y = mesh_config.mesh_min.split(",")[1]|float - y_offset %} {% set max_x = mesh_config.mesh_max.split(",")[0]|float - x_offset %} {% set max_y = mesh_config.mesh_max.split(",")[1]|float - y_offset %} {% set x_start = [[x_start, max_x]|min, min_x]|max %} {% set y_start = [[y_start, max_y]|min, min_y]|max %} RESPOND MSG="PROBE_FOR_PRIMING: Probing the prime location at X: {x_start} Y: {y_start}" G90 M83 G0 Z{z} F{z_speed} G1 X{x_start} Y{y_start} F{speed} PROBE_CURRENT_POSITION SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result RESTORE_GCODE_STATE NAME=probe_for_priming_state {% endif %} [gcode_macro RESET_PRIME_PROBE_STATE] gcode = SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result VALUE=None [gcode_macro PROBE_CURRENT_POSITION] gcode = SAVE_GCODE_STATE NAME=probe_current_position_state {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} ASSERT_PROBE_DEPLOYED {% endif %} PROBE RESTORE_GCODE_STATE NAME=probe_current_position_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_z_speed|float} [gcode_macro ADD_PRIME_PROBE_TO_OFFSET] gcode = {% set last_z = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %} {% if printer.configfile.settings.bltouch is defined %} {% set z_offset = printer.configfile.settings.bltouch.z_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set z_offset = printer.configfile.settings.probe.z_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% if last_z == 9999.9 %} { action_raise_error("No probe result found for prime area. This is likely a bug.") } {% endif %} {% set adjustment = last_z - z_offset %} {% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %} {% if adjustment < adjustment_threshold %} { action_raise_error("Abnormal probe offset detected. Needed offset of {adjustment} is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area.") } {% endif %} RESPOND MSG="ADD_PRIME_PROBE_TO_OFFSET: adjusting z offset by {adjustment}" SET_GCODE_OFFSET Z_ADJUST={adjustment} MOVE=1 [gcode_macro SUBTRACT_PRIME_PROBE_FROM_OFFSET] gcode = {% set last_z = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %} {% if printer.configfile.settings.bltouch is defined %} {% set z_offset = printer.configfile.settings.bltouch.z_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set z_offset = printer.configfile.settings.probe.z_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% if last_z == 9999.9 %} { action_raise_error("No probe result found for prime area. This is likely a bug.") } {% endif %} RESPOND MSG="SUBTRACT_PRIME_PROBE_FROM_OFFSET: adjusting z offset by {z_offset - last_z}" SET_GCODE_OFFSET Z_ADJUST={z_offset - last_z} MOVE=1 [gcode_macro CALIBRATE_ADAPTIVE_MESH] gcode = {% set default_profile = params.PROFILE %} {% set x0 = params.X0|default(-1)|float %} {% set y0 = params.Y0|default(-1)|float %} {% set x1 = params.X1|default(-1)|float %} {% set y1 = params.Y1|default(-1)|float %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Recieved coordinates X0={x0} Y0={y0} X1={x1} Y1={y1}" {% if x0 >= x1 or y0 >= y1 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Invalid coordinates received. Please check your slicer settings. Falling back to full bed mesh." BED_MESH_CALIBRATE PROFILE={default_profile} {% else %} {% set mesh_config = printer.configfile.config.bed_mesh %} {% set min_x = mesh_config.mesh_min.split(",")[0]|float %} {% set min_y = mesh_config.mesh_min.split(",")[1]|float %} {% set max_x = mesh_config.mesh_max.split(",")[0]|float %} {% set max_y = mesh_config.mesh_max.split(",")[1]|float %} {% set mesh_x0 = [[x0, max_x]|min, min_x]|max %} {% set mesh_y0 = [[y0, max_y]|min, min_y]|max %} {% set mesh_x1 = [[x1, max_x]|min, min_x]|max %} {% set mesh_y1 = [[y1, max_y]|min, min_y]|max %} {% if mesh_x0 == min_x and mesh_y0 == min_y and mesh_x1 == max_x and mesh_y1 == max_y %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Print is using the full bed, falling back to full bed mesh." BED_MESH_CALIBRATE PROFILE={default_profile} {% else %} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} DEPLOY_PROBE {% endif %} {% set probe_count_x = mesh_config.probe_count.split(",")[0]|int %} {% if mesh_config.probe_count.split(",")|length == 2 %} {% set probe_count_y = mesh_config.probe_count.split(",")[1]|int %} {% else %} {% set probe_count_y = mesh_config.probe_count.split(",")[0]|int %} {% endif %} {% set probe_x_step = (max_x - min_x) / probe_count_x %} {% set probe_y_step = (max_y - min_y) / probe_count_y %} {% set mesh_count_x = ([(mesh_x1 - mesh_x0) / probe_x_step, 3]|max)|int %} {% set mesh_count_y = ([(mesh_y1 - mesh_y0) / probe_y_step, 3]|max)|int %} {% set min_mesh_count = [mesh_count_x, mesh_count_y]|min %} {% set max_mesh_count = [mesh_count_x, mesh_count_y]|max %} {% set algorithm = mesh_config.algorithm %} {% if algorithm|lower == 'lagrange' and max_mesh_count > 6 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: cannot exceed a probe_count of 6 when using lagrange interpolation. Falling back to bicubic interpolation." {% set algorithm = 'bicubic' %} {% endif %} {% if algorithm|lower == 'bicubic' and min_mesh_count < 4 %} {% if max_mesh_count > 6 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: invalid probe_count option when using bicubic interpolation. Combination of 3 points on one axis with more than 6 on another is not permitted. Forcing minimum mesh count to be 4." {% set min_mesh_count = 4 %} {% else %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: bicubic interpolation with a probe_count of less than 4 points detected. Forcing lagrange interpolation." {% set algorithm = 'lagrange' %} {% endif %} {% endif %} {% set mesh_count_x = ([min_mesh_count, mesh_count_x]|max)|int %} {% set mesh_count_x = ([max_mesh_count, mesh_count_x]|min)|int %} {% set mesh_count_y = ([min_mesh_count, mesh_count_y]|max)|int %} {% set mesh_count_y = ([max_mesh_count, mesh_count_y]|min)|int %} {% set should_prime = printer["gcode_macro RatOS"].nozzle_priming == 'primeline' or printer["gcode_macro RatOS"].nozzle_priming == 'primeblob' %} {% if printer.configfile.settings.beacon is defined %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: adaptive priming is currently not supported for Beacon. Disabling priming.." SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=nozzle_priming VALUE=False {% set should_prime = False %} {% endif %} {% set prime_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printer.toolhead.axis_maximum.y) < printer.toolhead.axis_maximum.y / 2 %} {% if should_prime and prime_first %} PROBE_FOR_PRIMING {% endif %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: mesh coordinates X0={mesh_x0} Y0={mesh_y0} X1={mesh_x1} Y1={mesh_y1}" BED_MESH_CALIBRATE PROFILE={default_profile} algorithm={algorithm} mesh_min={mesh_x0},{mesh_y0} mesh_max={mesh_x1},{mesh_y1} probe_count={mesh_count_x},{mesh_count_y} relative_reference_index=-1 {% if should_prime and not prime_first %} PROBE_FOR_PRIMING {% endif %} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOW_PROBE {% endif %} {% endif %} {% endif %} [gcode_shell_command generate_shaper_graph_x] command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-x.sh timeout = 60. verbose = True [gcode_shell_command generate_shaper_graph_y] command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-y.sh timeout = 60. verbose = True [gcode_shell_command generate_belt_tension_graph] command = /home/pi/printer_data/config/RatOS/scripts/generate-belt-tension-graph.sh timeout = 90. verbose = True [gcode_shell_command compile_binaries] command = /home/pi/printer_data/config/RatOS/scripts/compile-binaries.sh timeout = 600. [gcode_shell_command change_hostname] command = /home/pi/printer_data/config/RatOS/scripts/change-hostname.sh timeout = 10. [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 RESPOND MSG="Belt tension graphs generated. You'll find them in the input_shaper folder in the machine tab!" [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 Z_TILT_ADJUST] rename_existing = Z_TILT_ADJUST_ORIG gcode = {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} DEPLOY_PROBE {% endif %} Z_TILT_ADJUST_ORIG {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} STOW_PROBE {% endif %} [stepper_x] step_pin = x_step_pin dir_pin = x_dir_pin enable_pin = !x_enable_pin rotation_distance = 40 microsteps = 64 homing_speed = 50 homing_retract_dist = 5.0 position_max = 300 position_endstop = 0 endstop_pin = ^x_endstop_pin [stepper_y] step_pin = y_step_pin dir_pin = y_dir_pin enable_pin = !y_enable_pin rotation_distance = 40 microsteps = 64 homing_speed = 50 homing_retract_dist = 5.0 position_max = 300 position_endstop = 300 endstop_pin = ^y_endstop_pin homing_positive_dir = true [stepper_z] endstop_pin = probe:z_virtual_endstop step_pin = z0_step_pin dir_pin = !z0_dir_pin enable_pin = !z0_enable_pin rotation_distance = 4 microsteps = 64 position_min = -5 homing_speed = 10 position_max = 300 [stepper_z1] step_pin = z1_step_pin dir_pin = !z1_dir_pin enable_pin = !z1_enable_pin rotation_distance = 4 microsteps = 64 [stepper_z2] step_pin = z2_step_pin dir_pin = !z2_dir_pin enable_pin = !z2_enable_pin rotation_distance = 4 microsteps = 64 [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 = ATC Semitec 104GT-2 sensor_pin = e_sensor_pin min_extrude_temp = 170 min_temp = 0 max_temp = 285 pressure_advance = 0.03 control = pid pid_kp = 28.413 pid_ki = 1.334 pid_kd = 151.300 [tmc2209 stepper_x] stealthchop_threshold = 1 uart_pin = x_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_y] stealthchop_threshold = 1 uart_pin = y_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 extruder] uart_pin = e_uart_pin run_current = 0.707 stealthchop_threshold = 0 interpolate = False driver_tbl = 1 driver_toff = 3 driver_hend = 9 driver_hstrt = 7 [tmc2209 stepper_z] stealthchop_threshold = 1 uart_pin = z0_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_z1] stealthchop_threshold = 1 uart_pin = z1_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_z2] stealthchop_threshold = 1 uart_pin = z2_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [bed_mesh] speed = 200 horizontal_move_z = 5 mesh_min = 20,20 mesh_max = 265,260 probe_count = 7,7 fade_start = 1.0 fade_end = 10.0 mesh_pps = 2,2 algorithm = bicubic bicubic_tension = .2 [z_tilt] speed = 200 z_positions = 0,0 150,300 300,0 points = 60,60 185,270 260,60 horizontal_move_z = 20 retries = 10 retry_tolerance = 0.02 [probe] pin = ^probe_pin x_offset = -27.8 y_offset = -12 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 = 0.0 [firmware_retraction] retract_speed = 120 unretract_extra_length = 0 unretract_speed = 120 retract_length = 0.5 ======================= 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/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' webhooks client 548241546016: New connection webhooks client 548241546016: Client info {'program': 'Moonraker', 'version': 'v0.8.0-48-gaa0f89c'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 798, 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 803, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/pi/klipper/klippy/../.config(746): Fri Jun 9 03:26:03 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set # CONFIG_MACH_STM32 is not set # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set CONFIG_MACH_LINUX=y # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="linux" CONFIG_CLOCK_FREQ=50000000 CONFIG_LINUX_SELECT=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_GPIO_BITBANGING=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(9343): Fri Jun 9 03:27:28 2023 Last MCU build version: ?-20230609_032728-fv-az592-720 Last MCU build tools: gcc: (Debian 10.2.1-6) 10.2.1 20210110 binutils: (GNU Binutils for Debian) 2.35.2 Last MCU build config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256 Build file /home/pi/klipper/klippy/../out/klipper.elf(855112): Fri Jun 9 03:27:58 2023 Attempting MCU 'mcu' reset Unhandled exception during post run Traceback (most recent call last): File "/home/pi/klippy-env/lib/python3.9/site-packages/serial/serialposix.py", line 265, in open self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK) FileNotFoundError: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' 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 949, in _firmware_restart self._restart_arduino() File "/home/pi/klipper/klippy/mcu.py", line 909, in _restart_arduino serialhdl.arduino_reset(self._serialport, self._reactor) File "/home/pi/klipper/klippy/serialhdl.py", line 379, in arduino_reset ser = serial.Serial(serialport, 2400, timeout=0, exclusive=True) File "/home/pi/klippy-env/lib/python3.9/site-packages/serial/serialutil.py", line 240, in __init__ self.open() File "/home/pi/klippy-env/lib/python3.9/site-packages/serial/serialposix.py", line 268, in open raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg)) serial.serialutil.SerialException: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' Restarting printer Start printer at Tue Jul 25 11:24:16 2023 (1690280656.6 207.2) ===== Config file ===== [board_pins octopus_pro_429_tmc2209] aliases = x_step_pin=PF13, x_dir_pin=PF12, x_enable_pin=PF14, x_uart_pin=PC4, x_diag_pin=PG6, x_endstop_pin=PG6, y_step_pin=PG0, y_dir_pin=PG1, y_enable_pin=PF15, y_uart_pin=PD11, y_diag_pin=PG9, y_endstop_pin=PG9, z0_step_pin=PC13, z0_dir_pin=PF0, z0_enable_pin=PF1, z0_uart_pin=PE4, z0_diag_pin=null, z1_step_pin=PE2, z1_dir_pin=PE3, z1_enable_pin=PD4, z1_uart_pin=PE1, z1_diag_pin=null, z2_step_pin=PE6, z2_dir_pin=PA14, z2_enable_pin=PE0, z2_uart_pin=PD3, z2_diag_pin=null, z3_step_pin=PF9, z3_dir_pin=PF10, z3_enable_pin=PG2, z3_uart_pin=PF2, z3_diag_pin=null, e_step_pin=PF11, e_dir_pin=PG3, e_enable_pin=PG5, e_uart_pin=PC6, e_diag_pin=null, e_heater_pin=PA2, e_sensor_pin=PF4, stepper_spi_mosi_pin=PA7, stepper_spi_miso_pin=PA6, stepper_spi_sclk_pin=PA5, adxl345_cs_pin=PA15, bltouch_sensor_pin=PB7, bltouch_control_pin=PB6, probe_pin=PB7, fan_part_cooling_pin=PA8, fan_toolhead_cooling_pin=PE5, fan_controller_board_pin=PD12, heater_bed_heating_pin=PA1, heater_bed_sensor_pin=PF3, EXP1_1=PE8, EXP1_3=PE9, EXP1_5=PE12, EXP1_7=PE14, EXP1_9=, EXP1_2=PE7, EXP1_4=PE10, EXP1_6=PE13, EXP1_8=PE15, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PB1, EXP2_5=PB2, EXP2_7=PC15, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10=PC5, [mcu] serial = /dev/btt-octopus-pro-429 [temperature_sensor Octopus_Pro_429] sensor_type = temperature_mcu min_temp = 0 max_temp = 100 [adxl345] spi_bus = spi3 cs_pin = adxl345_cs_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 = ~/printer_data/gcodes [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 = Generic 3950 min_temp = 0 max_temp = 120 pwm_cycle_time = 0.02 control = pid pid_kp = 22.2 pid_ki = 1.08 pid_kd = 114 [fan] pin = fan_part_cooling_pin shutdown_speed = 1.0 [heater_fan toolhead_cooling_fan] pin = fan_toolhead_cooling_pin fan_speed = 1 [controller_fan controller_fan] pin = fan_controller_board_pin [printer] kinematics = corexy max_velocity = 200 max_accel = 1500 max_accel_to_decel = 750 max_z_velocity = 15 max_z_accel = 30 square_corner_velocity = 5 [ratos_homing] axes = xyz z_hop = 15 z_hop_speed = 15 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_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 %} {% set z_hop = printer.configfile.config.ratos_homing.z_hop|float %} {% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %} {% set homing_x = printer["gcode_macro RatOS"].homing_x|lower %} {% set homing_y = printer["gcode_macro RatOS"].homing_y|lower %} {% set homing = printer["gcode_macro RatOS"].homing|lower %} {% set prev_stop_on_error = printer["gcode_macro RatOS"].stowable_probe_stop_on_error %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE=True M400 G90 {% if params.X is defined or params.Y is not defined and params.Z is not defined %} {% if homing_x == 'endstop' or homing == 'endstops' %} G28 X {% elif homing_x == 'sensorless' or homing == 'sensorless' %} HOME_X_SENSORLESS {% else %} { action_emergency_stop("expected RatOS variable_homing_x to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_x, homing)) } {% 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 homing_y == 'endstop' or homing == 'endstops' %} G28 Y {% elif homing_y == 'sensorless' or homing == 'sensorless' %} HOME_Y_SENSORLESS {% else %} { action_emergency_stop("expected RatOS variable_homing_y to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_y, homing)) } {% 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 { action_emergency_stop("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_hop_speed} STOW_PROBE {% else %} G0 X{safe_home_x} Y{safe_home_y} F{speed} G28 Z G0 Z{z_hop} F{z_hop_speed} {% endif %} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE={prev_stop_on_error} [gcode_macro HOME_X_SENSORLESS] gcode = {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %} {% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %} {% 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} G4 P300 G28 X SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current} G4 P300 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 %} {% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %} {% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_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} G4 P300 G28 Y SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current} G4 P300 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 = False 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 = "back" 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 = "back" variable_macro_travel_speed = 300 variable_macro_z_speed = 15 variable_end_print_park_z_hop = 20 variable_homing = "endstops" 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" variable_stowable_probe_stop_on_error = False variable_driver_type_x = "tmc2209" variable_driver_type_y = "tmc2209" variable_adaptive_mesh = False variable_probe_for_priming_result = None variable_adaptive_prime_offset_threshold = -1.0 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 MOVE_SPEED={printer["gcode_macro RatOS"].macro_travel_speed|float} 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 = 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 = 5 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% 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 %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} G90 M82 M117 Priming nozzle with prime line.. RESPOND MSG="Priming nozzle with prime line.." G0 Z{z} F{z_speed} G1 X{x_start} F{speed} G1 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 = 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 = 5 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% 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 %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} G90 M83 G0 Z{z} F{z_speed} G1 X{x_start} F{speed} G1 Y{y_start + (15 * y_factor)} F{speed} G1 Z0.5 F{z_speed} G1 Y{y_start} 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 _USER_START_PRINT_BEFORE_HOMING {% 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} _USER_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) } _USER_START_PRINT_AFTER_HEATING_BED _START_PRINT_AFTER_HEATING_BED _USER_START_PRINT_BED_MESH _START_PRINT_BED_MESH X0={params.X0} X1={params.X1} Y0={params.Y0} Y1={params.Y1} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOWABLE_PROBE_END_BATCH {% endif %} M104 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _USER_START_PRINT_PARK _START_PRINT_PARK M117 Heating Extruder... RESPOND MSG="Heating Extruder..." M109 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _USER_START_PRINT_AFTER_HEATING_EXTRUDER _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 _USER_START_PRINT_BEFORE_HOMING] gcode = [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 S{min_temp} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp} {% endif %} M117 Adjusting Z tilt... RESPOND MSG="Adjusting Z tilt..." Z_TILT_ADJUST M117 Rehoming Z after Z tilt adjustment... RESPOND MSG="Rehoming Z after Z tilt adjustment..." G28 Z [gcode_macro _USER_START_PRINT_AFTER_HEATING_BED] gcode = [gcode_macro _START_PRINT_BED_MESH] gcode = {% set default_profile = printer["gcode_macro RatOS"].bed_mesh_profile|default('ratos') %} {% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %} BED_MESH_CLEAR {% if printer["gcode_macro RatOS"].adaptive_mesh|lower == 'true' %} CALIBRATE_ADAPTIVE_MESH PROFILE={default_profile} X0={params.X0} X1={params.X1} Y0={params.Y0} Y1={params.Y1} {% else %} BED_MESH_CALIBRATE PROFILE={default_profile} {% endif %} BED_MESH_PROFILE LOAD={default_profile} {% elif printer["gcode_macro RatOS"].bed_mesh_profile is defined %} BED_MESH_CLEAR BED_MESH_PROFILE LOAD={printer["gcode_macro RatOS"].bed_mesh_profile} {% endif %} [gcode_macro _USER_START_PRINT_BED_MESH] gcode = [gcode_macro _START_PRINT_PARK] gcode = {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} {% set zSpeed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} _PARK LOCATION={printer["gcode_macro RatOS"].start_print_park_in} X={printer["gcode_macro RatOS"].start_print_park_x} G0 Z{z} F{zSpeed} [gcode_macro _USER_START_PRINT_PARK] gcode = [gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER] gcode = {% set has_offset = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) != 9999.9 %} {% if has_offset %} ADD_PRIME_PROBE_TO_OFFSET {% endif %} {% 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 has_offset %} SUBTRACT_PRIME_PROBE_FROM_OFFSET {% endif %} {% if printer["gcode_macro RatOS"].skew_profile is defined %} SKEW_PROFILE LOAD={printer["gcode_macro RatOS"].skew_profile} {% endif %} [gcode_macro _USER_START_PRINT_AFTER_HEATING_EXTRUDER] gcode = [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 and params.CHAMBER_TEMP|int > 0 %} {% 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 _USER_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 = [gcode_macro END_PRINT] description = End print procedure, use this in your Slicer. gcode = SAVE_GCODE_STATE NAME=end_print_state _USER_END_PRINT_BEFORE_HEATERS_OFF _END_PRINT_BEFORE_HEATERS_OFF TURN_OFF_HEATERS _USER_END_PRINT_AFTER_HEATERS_OFF _END_PRINT_AFTER_HEATERS_OFF _USER_END_PRINT_PARK _END_PRINT_PARK {% if printer["gcode_macro RatOS"].skew_profile is defined %} SET_SKEW CLEAR=1 {% endif %} M84 M107 BED_MESH_CLEAR 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 _USER_END_PRINT_BEFORE_HEATERS_OFF] gcode = [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 %} {% set z_hop = printer["gcode_macro RatOS"].end_print_park_z_hop|float %} {% if act_z < (max_z - z_hop) %} {% set z_safe = z_hop %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} G91 G1 E-2 F3600 G0 Z{z_safe} F3600 G1 E-2 F3600 G90 [gcode_macro _USER_END_PRINT_AFTER_HEATERS_OFF] gcode = [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_macro _USER_END_PRINT_PARK] gcode = [gcode_macro SAVE_PROBE_RESULT] gcode = {% set last_z = printer.probe.last_z_result %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE={params.VARIABLE|default('last_z')} VALUE={last_z} [gcode_macro PROBE_FOR_PRIMING] gcode = {% if printer["gcode_macro RatOS"].nozzle_priming|lower != 'false' %} SAVE_GCODE_STATE NAME=probe_for_priming_state RESPOND MSG="Probing the prime location.." {% 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 = 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 = 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% else %} {% set y_start = printer["gcode_macro RatOS"].nozzle_prime_start_y|float %} {% endif %} {% set z = printer.configfile.settings.bed_mesh.horizontal_move_z|float %} {% set mesh_config = printer.configfile.config.bed_mesh %} {% if printer.configfile.settings.bltouch is defined %} {% set x_offset = printer.configfile.settings.bltouch.x_offset|float %} {% set y_offset = printer.configfile.settings.bltouch.y_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set x_offset = printer.configfile.settings.probe.x_offset|float %} {% set y_offset = printer.configfile.settings.probe.y_offset|float %} {% elif printer.configfile.settings.beacon is defined %} {% set x_offset = printer.configfile.settings.beacon.x_offset|float %} {% set y_offset = printer.configfile.settings.beacon.y_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% set min_x = mesh_config.mesh_min.split(",")[0]|float - x_offset %} {% set min_y = mesh_config.mesh_min.split(",")[1]|float - y_offset %} {% set max_x = mesh_config.mesh_max.split(",")[0]|float - x_offset %} {% set max_y = mesh_config.mesh_max.split(",")[1]|float - y_offset %} {% set x_start = [[x_start, max_x]|min, min_x]|max %} {% set y_start = [[y_start, max_y]|min, min_y]|max %} RESPOND MSG="PROBE_FOR_PRIMING: Probing the prime location at X: {x_start} Y: {y_start}" G90 M83 G0 Z{z} F{z_speed} G1 X{x_start} Y{y_start} F{speed} PROBE_CURRENT_POSITION SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result RESTORE_GCODE_STATE NAME=probe_for_priming_state {% endif %} [gcode_macro RESET_PRIME_PROBE_STATE] gcode = SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result VALUE=None [gcode_macro PROBE_CURRENT_POSITION] gcode = SAVE_GCODE_STATE NAME=probe_current_position_state {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} ASSERT_PROBE_DEPLOYED {% endif %} PROBE RESTORE_GCODE_STATE NAME=probe_current_position_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_z_speed|float} [gcode_macro ADD_PRIME_PROBE_TO_OFFSET] gcode = {% set last_z = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %} {% if printer.configfile.settings.bltouch is defined %} {% set z_offset = printer.configfile.settings.bltouch.z_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set z_offset = printer.configfile.settings.probe.z_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% if last_z == 9999.9 %} { action_raise_error("No probe result found for prime area. This is likely a bug.") } {% endif %} {% set adjustment = last_z - z_offset %} {% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %} {% if adjustment < adjustment_threshold %} { action_raise_error("Abnormal probe offset detected. Needed offset of {adjustment} is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area.") } {% endif %} RESPOND MSG="ADD_PRIME_PROBE_TO_OFFSET: adjusting z offset by {adjustment}" SET_GCODE_OFFSET Z_ADJUST={adjustment} MOVE=1 [gcode_macro SUBTRACT_PRIME_PROBE_FROM_OFFSET] gcode = {% set last_z = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %} {% if printer.configfile.settings.bltouch is defined %} {% set z_offset = printer.configfile.settings.bltouch.z_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set z_offset = printer.configfile.settings.probe.z_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% if last_z == 9999.9 %} { action_raise_error("No probe result found for prime area. This is likely a bug.") } {% endif %} RESPOND MSG="SUBTRACT_PRIME_PROBE_FROM_OFFSET: adjusting z offset by {z_offset - last_z}" SET_GCODE_OFFSET Z_ADJUST={z_offset - last_z} MOVE=1 [gcode_macro CALIBRATE_ADAPTIVE_MESH] gcode = {% set default_profile = params.PROFILE %} {% set x0 = params.X0|default(-1)|float %} {% set y0 = params.Y0|default(-1)|float %} {% set x1 = params.X1|default(-1)|float %} {% set y1 = params.Y1|default(-1)|float %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Recieved coordinates X0={x0} Y0={y0} X1={x1} Y1={y1}" {% if x0 >= x1 or y0 >= y1 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Invalid coordinates received. Please check your slicer settings. Falling back to full bed mesh." BED_MESH_CALIBRATE PROFILE={default_profile} {% else %} {% set mesh_config = printer.configfile.config.bed_mesh %} {% set min_x = mesh_config.mesh_min.split(",")[0]|float %} {% set min_y = mesh_config.mesh_min.split(",")[1]|float %} {% set max_x = mesh_config.mesh_max.split(",")[0]|float %} {% set max_y = mesh_config.mesh_max.split(",")[1]|float %} {% set mesh_x0 = [[x0, max_x]|min, min_x]|max %} {% set mesh_y0 = [[y0, max_y]|min, min_y]|max %} {% set mesh_x1 = [[x1, max_x]|min, min_x]|max %} {% set mesh_y1 = [[y1, max_y]|min, min_y]|max %} {% if mesh_x0 == min_x and mesh_y0 == min_y and mesh_x1 == max_x and mesh_y1 == max_y %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Print is using the full bed, falling back to full bed mesh." BED_MESH_CALIBRATE PROFILE={default_profile} {% else %} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} DEPLOY_PROBE {% endif %} {% set probe_count_x = mesh_config.probe_count.split(",")[0]|int %} {% if mesh_config.probe_count.split(",")|length == 2 %} {% set probe_count_y = mesh_config.probe_count.split(",")[1]|int %} {% else %} {% set probe_count_y = mesh_config.probe_count.split(",")[0]|int %} {% endif %} {% set probe_x_step = (max_x - min_x) / probe_count_x %} {% set probe_y_step = (max_y - min_y) / probe_count_y %} {% set mesh_count_x = ([(mesh_x1 - mesh_x0) / probe_x_step, 3]|max)|int %} {% set mesh_count_y = ([(mesh_y1 - mesh_y0) / probe_y_step, 3]|max)|int %} {% set min_mesh_count = [mesh_count_x, mesh_count_y]|min %} {% set max_mesh_count = [mesh_count_x, mesh_count_y]|max %} {% set algorithm = mesh_config.algorithm %} {% if algorithm|lower == 'lagrange' and max_mesh_count > 6 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: cannot exceed a probe_count of 6 when using lagrange interpolation. Falling back to bicubic interpolation." {% set algorithm = 'bicubic' %} {% endif %} {% if algorithm|lower == 'bicubic' and min_mesh_count < 4 %} {% if max_mesh_count > 6 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: invalid probe_count option when using bicubic interpolation. Combination of 3 points on one axis with more than 6 on another is not permitted. Forcing minimum mesh count to be 4." {% set min_mesh_count = 4 %} {% else %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: bicubic interpolation with a probe_count of less than 4 points detected. Forcing lagrange interpolation." {% set algorithm = 'lagrange' %} {% endif %} {% endif %} {% set mesh_count_x = ([min_mesh_count, mesh_count_x]|max)|int %} {% set mesh_count_x = ([max_mesh_count, mesh_count_x]|min)|int %} {% set mesh_count_y = ([min_mesh_count, mesh_count_y]|max)|int %} {% set mesh_count_y = ([max_mesh_count, mesh_count_y]|min)|int %} {% set should_prime = printer["gcode_macro RatOS"].nozzle_priming == 'primeline' or printer["gcode_macro RatOS"].nozzle_priming == 'primeblob' %} {% if printer.configfile.settings.beacon is defined %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: adaptive priming is currently not supported for Beacon. Disabling priming.." SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=nozzle_priming VALUE=False {% set should_prime = False %} {% endif %} {% set prime_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printer.toolhead.axis_maximum.y) < printer.toolhead.axis_maximum.y / 2 %} {% if should_prime and prime_first %} PROBE_FOR_PRIMING {% endif %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: mesh coordinates X0={mesh_x0} Y0={mesh_y0} X1={mesh_x1} Y1={mesh_y1}" BED_MESH_CALIBRATE PROFILE={default_profile} algorithm={algorithm} mesh_min={mesh_x0},{mesh_y0} mesh_max={mesh_x1},{mesh_y1} probe_count={mesh_count_x},{mesh_count_y} relative_reference_index=-1 {% if should_prime and not prime_first %} PROBE_FOR_PRIMING {% endif %} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOW_PROBE {% endif %} {% endif %} {% endif %} [gcode_shell_command generate_shaper_graph_x] command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-x.sh timeout = 60. verbose = True [gcode_shell_command generate_shaper_graph_y] command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-y.sh timeout = 60. verbose = True [gcode_shell_command generate_belt_tension_graph] command = /home/pi/printer_data/config/RatOS/scripts/generate-belt-tension-graph.sh timeout = 90. verbose = True [gcode_shell_command compile_binaries] command = /home/pi/printer_data/config/RatOS/scripts/compile-binaries.sh timeout = 600. [gcode_shell_command change_hostname] command = /home/pi/printer_data/config/RatOS/scripts/change-hostname.sh timeout = 10. [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 RESPOND MSG="Belt tension graphs generated. You'll find them in the input_shaper folder in the machine tab!" [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 Z_TILT_ADJUST] rename_existing = Z_TILT_ADJUST_ORIG gcode = {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} DEPLOY_PROBE {% endif %} Z_TILT_ADJUST_ORIG {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} STOW_PROBE {% endif %} [stepper_x] step_pin = x_step_pin dir_pin = x_dir_pin enable_pin = !x_enable_pin rotation_distance = 40 microsteps = 64 homing_speed = 50 homing_retract_dist = 5.0 position_max = 300 position_endstop = 0 endstop_pin = ^x_endstop_pin [stepper_y] step_pin = y_step_pin dir_pin = y_dir_pin enable_pin = !y_enable_pin rotation_distance = 40 microsteps = 64 homing_speed = 50 homing_retract_dist = 5.0 position_max = 300 position_endstop = 300 endstop_pin = ^y_endstop_pin homing_positive_dir = true [stepper_z] endstop_pin = probe:z_virtual_endstop step_pin = z0_step_pin dir_pin = !z0_dir_pin enable_pin = !z0_enable_pin rotation_distance = 4 microsteps = 64 position_min = -5 homing_speed = 10 position_max = 300 [stepper_z1] step_pin = z1_step_pin dir_pin = !z1_dir_pin enable_pin = !z1_enable_pin rotation_distance = 4 microsteps = 64 [stepper_z2] step_pin = z2_step_pin dir_pin = !z2_dir_pin enable_pin = !z2_enable_pin rotation_distance = 4 microsteps = 64 [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 = ATC Semitec 104GT-2 sensor_pin = e_sensor_pin min_extrude_temp = 170 min_temp = 0 max_temp = 285 pressure_advance = 0.03 control = pid pid_kp = 28.413 pid_ki = 1.334 pid_kd = 151.300 [tmc2209 stepper_x] stealthchop_threshold = 1 uart_pin = x_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_y] stealthchop_threshold = 1 uart_pin = y_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 extruder] uart_pin = e_uart_pin run_current = 0.707 stealthchop_threshold = 0 interpolate = False driver_tbl = 1 driver_toff = 3 driver_hend = 9 driver_hstrt = 7 [tmc2209 stepper_z] stealthchop_threshold = 1 uart_pin = z0_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_z1] stealthchop_threshold = 1 uart_pin = z1_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_z2] stealthchop_threshold = 1 uart_pin = z2_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [bed_mesh] speed = 200 horizontal_move_z = 5 mesh_min = 20,20 mesh_max = 265,260 probe_count = 7,7 fade_start = 1.0 fade_end = 10.0 mesh_pps = 2,2 algorithm = bicubic bicubic_tension = .2 [z_tilt] speed = 200 z_positions = 0,0 150,300 300,0 points = 60,60 185,270 260,60 horizontal_move_z = 20 retries = 10 retry_tolerance = 0.02 [probe] pin = ^probe_pin x_offset = -27.8 y_offset = -12 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 = 0.0 [firmware_retraction] retract_speed = 120 unretract_extra_length = 0 unretract_speed = 120 retract_length = 0.5 ======================= 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/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' webhooks client 548240801744: New connection webhooks client 548240801744: Client info {'program': 'Moonraker', 'version': 'v0.8.0-48-gaa0f89c'} webhooks client 548240801744: Disconnected Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-219-g645a1b83-dirty' Untracked files: klippy/extras/beacon.py, klippy/extras/gcode_shell_command.py, klippy/extras/linear_movement_vibrations.py, klippy/extras/ratos_homing.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ? Python: '3.9.2 (default, Feb 28 2021, 17:03:44) \n[GCC 10.2.1 20210110]' Start printer at Tue Jul 25 11:24:39 2023 (1690280679.4 21.9) ===== Config file ===== [board_pins octopus_pro_429_tmc2209] aliases = x_step_pin=PF13, x_dir_pin=PF12, x_enable_pin=PF14, x_uart_pin=PC4, x_diag_pin=PG6, x_endstop_pin=PG6, y_step_pin=PG0, y_dir_pin=PG1, y_enable_pin=PF15, y_uart_pin=PD11, y_diag_pin=PG9, y_endstop_pin=PG9, z0_step_pin=PC13, z0_dir_pin=PF0, z0_enable_pin=PF1, z0_uart_pin=PE4, z0_diag_pin=null, z1_step_pin=PE2, z1_dir_pin=PE3, z1_enable_pin=PD4, z1_uart_pin=PE1, z1_diag_pin=null, z2_step_pin=PE6, z2_dir_pin=PA14, z2_enable_pin=PE0, z2_uart_pin=PD3, z2_diag_pin=null, z3_step_pin=PF9, z3_dir_pin=PF10, z3_enable_pin=PG2, z3_uart_pin=PF2, z3_diag_pin=null, e_step_pin=PF11, e_dir_pin=PG3, e_enable_pin=PG5, e_uart_pin=PC6, e_diag_pin=null, e_heater_pin=PA2, e_sensor_pin=PF4, stepper_spi_mosi_pin=PA7, stepper_spi_miso_pin=PA6, stepper_spi_sclk_pin=PA5, adxl345_cs_pin=PA15, bltouch_sensor_pin=PB7, bltouch_control_pin=PB6, probe_pin=PB7, fan_part_cooling_pin=PA8, fan_toolhead_cooling_pin=PE5, fan_controller_board_pin=PD12, heater_bed_heating_pin=PA1, heater_bed_sensor_pin=PF3, EXP1_1=PE8, EXP1_3=PE9, EXP1_5=PE12, EXP1_7=PE14, EXP1_9=, EXP1_2=PE7, EXP1_4=PE10, EXP1_6=PE13, EXP1_8=PE15, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PB1, EXP2_5=PB2, EXP2_7=PC15, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10=PC5, [mcu] serial = /dev/btt-octopus-pro-429 [temperature_sensor Octopus_Pro_429] sensor_type = temperature_mcu min_temp = 0 max_temp = 100 [adxl345] spi_bus = spi3 cs_pin = adxl345_cs_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 = ~/printer_data/gcodes [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 = Generic 3950 min_temp = 0 max_temp = 120 pwm_cycle_time = 0.02 control = pid pid_kp = 22.2 pid_ki = 1.08 pid_kd = 114 [fan] pin = fan_part_cooling_pin shutdown_speed = 1.0 [heater_fan toolhead_cooling_fan] pin = fan_toolhead_cooling_pin fan_speed = 1 [controller_fan controller_fan] pin = fan_controller_board_pin [printer] kinematics = corexy max_velocity = 200 max_accel = 1500 max_accel_to_decel = 750 max_z_velocity = 15 max_z_accel = 30 square_corner_velocity = 5 [ratos_homing] axes = xyz z_hop = 15 z_hop_speed = 15 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_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 %} {% set z_hop = printer.configfile.config.ratos_homing.z_hop|float %} {% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %} {% set homing_x = printer["gcode_macro RatOS"].homing_x|lower %} {% set homing_y = printer["gcode_macro RatOS"].homing_y|lower %} {% set homing = printer["gcode_macro RatOS"].homing|lower %} {% set prev_stop_on_error = printer["gcode_macro RatOS"].stowable_probe_stop_on_error %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE=True M400 G90 {% if params.X is defined or params.Y is not defined and params.Z is not defined %} {% if homing_x == 'endstop' or homing == 'endstops' %} G28 X {% elif homing_x == 'sensorless' or homing == 'sensorless' %} HOME_X_SENSORLESS {% else %} { action_emergency_stop("expected RatOS variable_homing_x to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_x, homing)) } {% 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 homing_y == 'endstop' or homing == 'endstops' %} G28 Y {% elif homing_y == 'sensorless' or homing == 'sensorless' %} HOME_Y_SENSORLESS {% else %} { action_emergency_stop("expected RatOS variable_homing_y to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_y, homing)) } {% 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 { action_emergency_stop("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_hop_speed} STOW_PROBE {% else %} G0 X{safe_home_x} Y{safe_home_y} F{speed} G28 Z G0 Z{z_hop} F{z_hop_speed} {% endif %} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE={prev_stop_on_error} [gcode_macro HOME_X_SENSORLESS] gcode = {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %} {% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %} {% 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} G4 P300 G28 X SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current} G4 P300 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 %} {% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %} {% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_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} G4 P300 G28 Y SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current} G4 P300 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 = False 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 = "back" 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 = "back" variable_macro_travel_speed = 300 variable_macro_z_speed = 15 variable_end_print_park_z_hop = 20 variable_homing = "endstops" 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" variable_stowable_probe_stop_on_error = False variable_driver_type_x = "tmc2209" variable_driver_type_y = "tmc2209" variable_adaptive_mesh = False variable_probe_for_priming_result = None variable_adaptive_prime_offset_threshold = -1.0 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 MOVE_SPEED={printer["gcode_macro RatOS"].macro_travel_speed|float} 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 = 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 = 5 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% 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 %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} G90 M82 M117 Priming nozzle with prime line.. RESPOND MSG="Priming nozzle with prime line.." G0 Z{z} F{z_speed} G1 X{x_start} F{speed} G1 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 = 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 = 5 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% 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 %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} G90 M83 G0 Z{z} F{z_speed} G1 X{x_start} F{speed} G1 Y{y_start + (15 * y_factor)} F{speed} G1 Z0.5 F{z_speed} G1 Y{y_start} 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 _USER_START_PRINT_BEFORE_HOMING {% 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} _USER_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) } _USER_START_PRINT_AFTER_HEATING_BED _START_PRINT_AFTER_HEATING_BED _USER_START_PRINT_BED_MESH _START_PRINT_BED_MESH X0={params.X0} X1={params.X1} Y0={params.Y0} Y1={params.Y1} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOWABLE_PROBE_END_BATCH {% endif %} M104 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _USER_START_PRINT_PARK _START_PRINT_PARK M117 Heating Extruder... RESPOND MSG="Heating Extruder..." M109 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _USER_START_PRINT_AFTER_HEATING_EXTRUDER _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 _USER_START_PRINT_BEFORE_HOMING] gcode = [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 S{min_temp} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp} {% endif %} M117 Adjusting Z tilt... RESPOND MSG="Adjusting Z tilt..." Z_TILT_ADJUST M117 Rehoming Z after Z tilt adjustment... RESPOND MSG="Rehoming Z after Z tilt adjustment..." G28 Z [gcode_macro _USER_START_PRINT_AFTER_HEATING_BED] gcode = [gcode_macro _START_PRINT_BED_MESH] gcode = {% set default_profile = printer["gcode_macro RatOS"].bed_mesh_profile|default('ratos') %} {% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %} BED_MESH_CLEAR {% if printer["gcode_macro RatOS"].adaptive_mesh|lower == 'true' %} CALIBRATE_ADAPTIVE_MESH PROFILE={default_profile} X0={params.X0} X1={params.X1} Y0={params.Y0} Y1={params.Y1} {% else %} BED_MESH_CALIBRATE PROFILE={default_profile} {% endif %} BED_MESH_PROFILE LOAD={default_profile} {% elif printer["gcode_macro RatOS"].bed_mesh_profile is defined %} BED_MESH_CLEAR BED_MESH_PROFILE LOAD={printer["gcode_macro RatOS"].bed_mesh_profile} {% endif %} [gcode_macro _USER_START_PRINT_BED_MESH] gcode = [gcode_macro _START_PRINT_PARK] gcode = {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} {% set zSpeed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} _PARK LOCATION={printer["gcode_macro RatOS"].start_print_park_in} X={printer["gcode_macro RatOS"].start_print_park_x} G0 Z{z} F{zSpeed} [gcode_macro _USER_START_PRINT_PARK] gcode = [gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER] gcode = {% set has_offset = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) != 9999.9 %} {% if has_offset %} ADD_PRIME_PROBE_TO_OFFSET {% endif %} {% 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 has_offset %} SUBTRACT_PRIME_PROBE_FROM_OFFSET {% endif %} {% if printer["gcode_macro RatOS"].skew_profile is defined %} SKEW_PROFILE LOAD={printer["gcode_macro RatOS"].skew_profile} {% endif %} [gcode_macro _USER_START_PRINT_AFTER_HEATING_EXTRUDER] gcode = [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 and params.CHAMBER_TEMP|int > 0 %} {% 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 _USER_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 = [gcode_macro END_PRINT] description = End print procedure, use this in your Slicer. gcode = SAVE_GCODE_STATE NAME=end_print_state _USER_END_PRINT_BEFORE_HEATERS_OFF _END_PRINT_BEFORE_HEATERS_OFF TURN_OFF_HEATERS _USER_END_PRINT_AFTER_HEATERS_OFF _END_PRINT_AFTER_HEATERS_OFF _USER_END_PRINT_PARK _END_PRINT_PARK {% if printer["gcode_macro RatOS"].skew_profile is defined %} SET_SKEW CLEAR=1 {% endif %} M84 M107 BED_MESH_CLEAR 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 _USER_END_PRINT_BEFORE_HEATERS_OFF] gcode = [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 %} {% set z_hop = printer["gcode_macro RatOS"].end_print_park_z_hop|float %} {% if act_z < (max_z - z_hop) %} {% set z_safe = z_hop %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} G91 G1 E-2 F3600 G0 Z{z_safe} F3600 G1 E-2 F3600 G90 [gcode_macro _USER_END_PRINT_AFTER_HEATERS_OFF] gcode = [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_macro _USER_END_PRINT_PARK] gcode = [gcode_macro SAVE_PROBE_RESULT] gcode = {% set last_z = printer.probe.last_z_result %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE={params.VARIABLE|default('last_z')} VALUE={last_z} [gcode_macro PROBE_FOR_PRIMING] gcode = {% if printer["gcode_macro RatOS"].nozzle_priming|lower != 'false' %} SAVE_GCODE_STATE NAME=probe_for_priming_state RESPOND MSG="Probing the prime location.." {% 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 = 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 = 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% else %} {% set y_start = printer["gcode_macro RatOS"].nozzle_prime_start_y|float %} {% endif %} {% set z = printer.configfile.settings.bed_mesh.horizontal_move_z|float %} {% set mesh_config = printer.configfile.config.bed_mesh %} {% if printer.configfile.settings.bltouch is defined %} {% set x_offset = printer.configfile.settings.bltouch.x_offset|float %} {% set y_offset = printer.configfile.settings.bltouch.y_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set x_offset = printer.configfile.settings.probe.x_offset|float %} {% set y_offset = printer.configfile.settings.probe.y_offset|float %} {% elif printer.configfile.settings.beacon is defined %} {% set x_offset = printer.configfile.settings.beacon.x_offset|float %} {% set y_offset = printer.configfile.settings.beacon.y_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% set min_x = mesh_config.mesh_min.split(",")[0]|float - x_offset %} {% set min_y = mesh_config.mesh_min.split(",")[1]|float - y_offset %} {% set max_x = mesh_config.mesh_max.split(",")[0]|float - x_offset %} {% set max_y = mesh_config.mesh_max.split(",")[1]|float - y_offset %} {% set x_start = [[x_start, max_x]|min, min_x]|max %} {% set y_start = [[y_start, max_y]|min, min_y]|max %} RESPOND MSG="PROBE_FOR_PRIMING: Probing the prime location at X: {x_start} Y: {y_start}" G90 M83 G0 Z{z} F{z_speed} G1 X{x_start} Y{y_start} F{speed} PROBE_CURRENT_POSITION SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result RESTORE_GCODE_STATE NAME=probe_for_priming_state {% endif %} [gcode_macro RESET_PRIME_PROBE_STATE] gcode = SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result VALUE=None [gcode_macro PROBE_CURRENT_POSITION] gcode = SAVE_GCODE_STATE NAME=probe_current_position_state {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} ASSERT_PROBE_DEPLOYED {% endif %} PROBE RESTORE_GCODE_STATE NAME=probe_current_position_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_z_speed|float} [gcode_macro ADD_PRIME_PROBE_TO_OFFSET] gcode = {% set last_z = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %} {% if printer.configfile.settings.bltouch is defined %} {% set z_offset = printer.configfile.settings.bltouch.z_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set z_offset = printer.configfile.settings.probe.z_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% if last_z == 9999.9 %} { action_raise_error("No probe result found for prime area. This is likely a bug.") } {% endif %} {% set adjustment = last_z - z_offset %} {% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %} {% if adjustment < adjustment_threshold %} { action_raise_error("Abnormal probe offset detected. Needed offset of {adjustment} is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area.") } {% endif %} RESPOND MSG="ADD_PRIME_PROBE_TO_OFFSET: adjusting z offset by {adjustment}" SET_GCODE_OFFSET Z_ADJUST={adjustment} MOVE=1 [gcode_macro SUBTRACT_PRIME_PROBE_FROM_OFFSET] gcode = {% set last_z = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %} {% if printer.configfile.settings.bltouch is defined %} {% set z_offset = printer.configfile.settings.bltouch.z_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set z_offset = printer.configfile.settings.probe.z_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% if last_z == 9999.9 %} { action_raise_error("No probe result found for prime area. This is likely a bug.") } {% endif %} RESPOND MSG="SUBTRACT_PRIME_PROBE_FROM_OFFSET: adjusting z offset by {z_offset - last_z}" SET_GCODE_OFFSET Z_ADJUST={z_offset - last_z} MOVE=1 [gcode_macro CALIBRATE_ADAPTIVE_MESH] gcode = {% set default_profile = params.PROFILE %} {% set x0 = params.X0|default(-1)|float %} {% set y0 = params.Y0|default(-1)|float %} {% set x1 = params.X1|default(-1)|float %} {% set y1 = params.Y1|default(-1)|float %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Recieved coordinates X0={x0} Y0={y0} X1={x1} Y1={y1}" {% if x0 >= x1 or y0 >= y1 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Invalid coordinates received. Please check your slicer settings. Falling back to full bed mesh." BED_MESH_CALIBRATE PROFILE={default_profile} {% else %} {% set mesh_config = printer.configfile.config.bed_mesh %} {% set min_x = mesh_config.mesh_min.split(",")[0]|float %} {% set min_y = mesh_config.mesh_min.split(",")[1]|float %} {% set max_x = mesh_config.mesh_max.split(",")[0]|float %} {% set max_y = mesh_config.mesh_max.split(",")[1]|float %} {% set mesh_x0 = [[x0, max_x]|min, min_x]|max %} {% set mesh_y0 = [[y0, max_y]|min, min_y]|max %} {% set mesh_x1 = [[x1, max_x]|min, min_x]|max %} {% set mesh_y1 = [[y1, max_y]|min, min_y]|max %} {% if mesh_x0 == min_x and mesh_y0 == min_y and mesh_x1 == max_x and mesh_y1 == max_y %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Print is using the full bed, falling back to full bed mesh." BED_MESH_CALIBRATE PROFILE={default_profile} {% else %} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} DEPLOY_PROBE {% endif %} {% set probe_count_x = mesh_config.probe_count.split(",")[0]|int %} {% if mesh_config.probe_count.split(",")|length == 2 %} {% set probe_count_y = mesh_config.probe_count.split(",")[1]|int %} {% else %} {% set probe_count_y = mesh_config.probe_count.split(",")[0]|int %} {% endif %} {% set probe_x_step = (max_x - min_x) / probe_count_x %} {% set probe_y_step = (max_y - min_y) / probe_count_y %} {% set mesh_count_x = ([(mesh_x1 - mesh_x0) / probe_x_step, 3]|max)|int %} {% set mesh_count_y = ([(mesh_y1 - mesh_y0) / probe_y_step, 3]|max)|int %} {% set min_mesh_count = [mesh_count_x, mesh_count_y]|min %} {% set max_mesh_count = [mesh_count_x, mesh_count_y]|max %} {% set algorithm = mesh_config.algorithm %} {% if algorithm|lower == 'lagrange' and max_mesh_count > 6 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: cannot exceed a probe_count of 6 when using lagrange interpolation. Falling back to bicubic interpolation." {% set algorithm = 'bicubic' %} {% endif %} {% if algorithm|lower == 'bicubic' and min_mesh_count < 4 %} {% if max_mesh_count > 6 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: invalid probe_count option when using bicubic interpolation. Combination of 3 points on one axis with more than 6 on another is not permitted. Forcing minimum mesh count to be 4." {% set min_mesh_count = 4 %} {% else %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: bicubic interpolation with a probe_count of less than 4 points detected. Forcing lagrange interpolation." {% set algorithm = 'lagrange' %} {% endif %} {% endif %} {% set mesh_count_x = ([min_mesh_count, mesh_count_x]|max)|int %} {% set mesh_count_x = ([max_mesh_count, mesh_count_x]|min)|int %} {% set mesh_count_y = ([min_mesh_count, mesh_count_y]|max)|int %} {% set mesh_count_y = ([max_mesh_count, mesh_count_y]|min)|int %} {% set should_prime = printer["gcode_macro RatOS"].nozzle_priming == 'primeline' or printer["gcode_macro RatOS"].nozzle_priming == 'primeblob' %} {% if printer.configfile.settings.beacon is defined %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: adaptive priming is currently not supported for Beacon. Disabling priming.." SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=nozzle_priming VALUE=False {% set should_prime = False %} {% endif %} {% set prime_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printer.toolhead.axis_maximum.y) < printer.toolhead.axis_maximum.y / 2 %} {% if should_prime and prime_first %} PROBE_FOR_PRIMING {% endif %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: mesh coordinates X0={mesh_x0} Y0={mesh_y0} X1={mesh_x1} Y1={mesh_y1}" BED_MESH_CALIBRATE PROFILE={default_profile} algorithm={algorithm} mesh_min={mesh_x0},{mesh_y0} mesh_max={mesh_x1},{mesh_y1} probe_count={mesh_count_x},{mesh_count_y} relative_reference_index=-1 {% if should_prime and not prime_first %} PROBE_FOR_PRIMING {% endif %} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOW_PROBE {% endif %} {% endif %} {% endif %} [gcode_shell_command generate_shaper_graph_x] command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-x.sh timeout = 60. verbose = True [gcode_shell_command generate_shaper_graph_y] command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-y.sh timeout = 60. verbose = True [gcode_shell_command generate_belt_tension_graph] command = /home/pi/printer_data/config/RatOS/scripts/generate-belt-tension-graph.sh timeout = 90. verbose = True [gcode_shell_command compile_binaries] command = /home/pi/printer_data/config/RatOS/scripts/compile-binaries.sh timeout = 600. [gcode_shell_command change_hostname] command = /home/pi/printer_data/config/RatOS/scripts/change-hostname.sh timeout = 10. [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 RESPOND MSG="Belt tension graphs generated. You'll find them in the input_shaper folder in the machine tab!" [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 Z_TILT_ADJUST] rename_existing = Z_TILT_ADJUST_ORIG gcode = {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} DEPLOY_PROBE {% endif %} Z_TILT_ADJUST_ORIG {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} STOW_PROBE {% endif %} [stepper_x] step_pin = x_step_pin dir_pin = x_dir_pin enable_pin = !x_enable_pin rotation_distance = 40 microsteps = 64 homing_speed = 50 homing_retract_dist = 5.0 position_max = 300 position_endstop = 0 endstop_pin = ^x_endstop_pin [stepper_y] step_pin = y_step_pin dir_pin = y_dir_pin enable_pin = !y_enable_pin rotation_distance = 40 microsteps = 64 homing_speed = 50 homing_retract_dist = 5.0 position_max = 300 position_endstop = 300 endstop_pin = ^y_endstop_pin homing_positive_dir = true [stepper_z] endstop_pin = probe:z_virtual_endstop step_pin = z0_step_pin dir_pin = !z0_dir_pin enable_pin = !z0_enable_pin rotation_distance = 4 microsteps = 64 position_min = -5 homing_speed = 10 position_max = 300 [stepper_z1] step_pin = z1_step_pin dir_pin = !z1_dir_pin enable_pin = !z1_enable_pin rotation_distance = 4 microsteps = 64 [stepper_z2] step_pin = z2_step_pin dir_pin = !z2_dir_pin enable_pin = !z2_enable_pin rotation_distance = 4 microsteps = 64 [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 = ATC Semitec 104GT-2 sensor_pin = e_sensor_pin min_extrude_temp = 170 min_temp = 0 max_temp = 285 pressure_advance = 0.03 control = pid pid_kp = 28.413 pid_ki = 1.334 pid_kd = 151.300 [tmc2209 stepper_x] stealthchop_threshold = 1 uart_pin = x_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_y] stealthchop_threshold = 1 uart_pin = y_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 extruder] uart_pin = e_uart_pin run_current = 0.707 stealthchop_threshold = 0 interpolate = False driver_tbl = 1 driver_toff = 3 driver_hend = 9 driver_hstrt = 7 [tmc2209 stepper_z] stealthchop_threshold = 1 uart_pin = z0_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_z1] stealthchop_threshold = 1 uart_pin = z1_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_z2] stealthchop_threshold = 1 uart_pin = z2_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [bed_mesh] speed = 200 horizontal_move_z = 5 mesh_min = 20,20 mesh_max = 265,260 probe_count = 7,7 fade_start = 1.0 fade_end = 10.0 mesh_pps = 2,2 algorithm = bicubic bicubic_tension = .2 [z_tilt] speed = 200 z_positions = 0,0 150,300 300,0 points = 60,60 185,270 260,60 horizontal_move_z = 20 retries = 10 retry_tolerance = 0.02 [probe] pin = ^probe_pin x_offset = -27.8 y_offset = -12 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 = 0.0 [firmware_retraction] retract_speed = 120 unretract_extra_length = 0 unretract_speed = 120 retract_length = 0.5 ======================= 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/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' webhooks client 548562582448: New connection webhooks client 548562582448: Client info {'program': 'Moonraker', 'version': 'v0.8.0-48-gaa0f89c'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 798, 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 803, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/pi/klipper/klippy/../.config(746): Fri Jun 9 03:26:03 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set # CONFIG_MACH_STM32 is not set # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set CONFIG_MACH_LINUX=y # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="linux" CONFIG_CLOCK_FREQ=50000000 CONFIG_LINUX_SELECT=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_GPIO_BITBANGING=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(9343): Fri Jun 9 03:27:28 2023 Last MCU build version: ?-20230609_032728-fv-az592-720 Last MCU build tools: gcc: (Debian 10.2.1-6) 10.2.1 20210110 binutils: (GNU Binutils for Debian) 2.35.2 Last MCU build config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256 Build file /home/pi/klipper/klippy/../out/klipper.elf(855112): Fri Jun 9 03:27:58 2023 Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-219-g645a1b83-dirty' Untracked files: klippy/extras/beacon.py, klippy/extras/gcode_shell_command.py, klippy/extras/linear_movement_vibrations.py, klippy/extras/ratos_homing.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ? Python: '3.9.2 (default, Feb 28 2021, 17:03:44) \n[GCC 10.2.1 20210110]' Start printer at Tue Jul 25 13:07:17 2023 (1690286837.9 22.3) ===== Config file ===== [board_pins octopus_pro_429_tmc2209] aliases = x_step_pin=PF13, x_dir_pin=PF12, x_enable_pin=PF14, x_uart_pin=PC4, x_diag_pin=PG6, x_endstop_pin=PG6, y_step_pin=PG0, y_dir_pin=PG1, y_enable_pin=PF15, y_uart_pin=PD11, y_diag_pin=PG9, y_endstop_pin=PG9, z0_step_pin=PC13, z0_dir_pin=PF0, z0_enable_pin=PF1, z0_uart_pin=PE4, z0_diag_pin=null, z1_step_pin=PE2, z1_dir_pin=PE3, z1_enable_pin=PD4, z1_uart_pin=PE1, z1_diag_pin=null, z2_step_pin=PE6, z2_dir_pin=PA14, z2_enable_pin=PE0, z2_uart_pin=PD3, z2_diag_pin=null, z3_step_pin=PF9, z3_dir_pin=PF10, z3_enable_pin=PG2, z3_uart_pin=PF2, z3_diag_pin=null, e_step_pin=PF11, e_dir_pin=PG3, e_enable_pin=PG5, e_uart_pin=PC6, e_diag_pin=null, e_heater_pin=PA2, e_sensor_pin=PF4, stepper_spi_mosi_pin=PA7, stepper_spi_miso_pin=PA6, stepper_spi_sclk_pin=PA5, adxl345_cs_pin=PA15, bltouch_sensor_pin=PB7, bltouch_control_pin=PB6, probe_pin=PB7, fan_part_cooling_pin=PA8, fan_toolhead_cooling_pin=PE5, fan_controller_board_pin=PD12, heater_bed_heating_pin=PA1, heater_bed_sensor_pin=PF3, EXP1_1=PE8, EXP1_3=PE9, EXP1_5=PE12, EXP1_7=PE14, EXP1_9=, EXP1_2=PE7, EXP1_4=PE10, EXP1_6=PE13, EXP1_8=PE15, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PB1, EXP2_5=PB2, EXP2_7=PC15, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10=PC5, [mcu] serial = /dev/btt-octopus-pro-429 [temperature_sensor Octopus_Pro_429] sensor_type = temperature_mcu min_temp = 0 max_temp = 100 [adxl345] spi_bus = spi3 cs_pin = adxl345_cs_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 = ~/printer_data/gcodes [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 = Generic 3950 min_temp = 0 max_temp = 120 pwm_cycle_time = 0.02 control = pid pid_kp = 22.2 pid_ki = 1.08 pid_kd = 114 [fan] pin = fan_part_cooling_pin shutdown_speed = 1.0 [heater_fan toolhead_cooling_fan] pin = fan_toolhead_cooling_pin fan_speed = 1 [controller_fan controller_fan] pin = fan_controller_board_pin [printer] kinematics = corexy max_velocity = 200 max_accel = 1500 max_accel_to_decel = 750 max_z_velocity = 15 max_z_accel = 30 square_corner_velocity = 5 [ratos_homing] axes = xyz z_hop = 15 z_hop_speed = 15 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_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 %} {% set z_hop = printer.configfile.config.ratos_homing.z_hop|float %} {% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %} {% set homing_x = printer["gcode_macro RatOS"].homing_x|lower %} {% set homing_y = printer["gcode_macro RatOS"].homing_y|lower %} {% set homing = printer["gcode_macro RatOS"].homing|lower %} {% set prev_stop_on_error = printer["gcode_macro RatOS"].stowable_probe_stop_on_error %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE=True M400 G90 {% if params.X is defined or params.Y is not defined and params.Z is not defined %} {% if homing_x == 'endstop' or homing == 'endstops' %} G28 X {% elif homing_x == 'sensorless' or homing == 'sensorless' %} HOME_X_SENSORLESS {% else %} { action_emergency_stop("expected RatOS variable_homing_x to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_x, homing)) } {% 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 homing_y == 'endstop' or homing == 'endstops' %} G28 Y {% elif homing_y == 'sensorless' or homing == 'sensorless' %} HOME_Y_SENSORLESS {% else %} { action_emergency_stop("expected RatOS variable_homing_y to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_y, homing)) } {% 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 { action_emergency_stop("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_hop_speed} STOW_PROBE {% else %} G0 X{safe_home_x} Y{safe_home_y} F{speed} G28 Z G0 Z{z_hop} F{z_hop_speed} {% endif %} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE={prev_stop_on_error} [gcode_macro HOME_X_SENSORLESS] gcode = {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %} {% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %} {% 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} G4 P300 G28 X SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current} G4 P300 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 %} {% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %} {% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_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} G4 P300 G28 Y SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current} G4 P300 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 = False 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 = "back" 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 = "back" variable_macro_travel_speed = 300 variable_macro_z_speed = 15 variable_end_print_park_z_hop = 20 variable_homing = "endstops" 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" variable_stowable_probe_stop_on_error = False variable_driver_type_x = "tmc2209" variable_driver_type_y = "tmc2209" variable_adaptive_mesh = False variable_probe_for_priming_result = None variable_adaptive_prime_offset_threshold = -1.0 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 MOVE_SPEED={printer["gcode_macro RatOS"].macro_travel_speed|float} 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 = 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 = 5 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% 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 %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} G90 M82 M117 Priming nozzle with prime line.. RESPOND MSG="Priming nozzle with prime line.." G0 Z{z} F{z_speed} G1 X{x_start} F{speed} G1 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 = 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 = 5 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% 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 %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} G90 M83 G0 Z{z} F{z_speed} G1 X{x_start} F{speed} G1 Y{y_start + (15 * y_factor)} F{speed} G1 Z0.5 F{z_speed} G1 Y{y_start} 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 _USER_START_PRINT_BEFORE_HOMING {% 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} _USER_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) } _USER_START_PRINT_AFTER_HEATING_BED _START_PRINT_AFTER_HEATING_BED _USER_START_PRINT_BED_MESH _START_PRINT_BED_MESH X0={params.X0} X1={params.X1} Y0={params.Y0} Y1={params.Y1} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOWABLE_PROBE_END_BATCH {% endif %} M104 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _USER_START_PRINT_PARK _START_PRINT_PARK M117 Heating Extruder... RESPOND MSG="Heating Extruder..." M109 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _USER_START_PRINT_AFTER_HEATING_EXTRUDER _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 _USER_START_PRINT_BEFORE_HOMING] gcode = [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 S{min_temp} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp} {% endif %} M117 Adjusting Z tilt... RESPOND MSG="Adjusting Z tilt..." Z_TILT_ADJUST M117 Rehoming Z after Z tilt adjustment... RESPOND MSG="Rehoming Z after Z tilt adjustment..." G28 Z [gcode_macro _USER_START_PRINT_AFTER_HEATING_BED] gcode = [gcode_macro _START_PRINT_BED_MESH] gcode = {% set default_profile = printer["gcode_macro RatOS"].bed_mesh_profile|default('ratos') %} {% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %} BED_MESH_CLEAR {% if printer["gcode_macro RatOS"].adaptive_mesh|lower == 'true' %} CALIBRATE_ADAPTIVE_MESH PROFILE={default_profile} X0={params.X0} X1={params.X1} Y0={params.Y0} Y1={params.Y1} {% else %} BED_MESH_CALIBRATE PROFILE={default_profile} {% endif %} BED_MESH_PROFILE LOAD={default_profile} {% elif printer["gcode_macro RatOS"].bed_mesh_profile is defined %} BED_MESH_CLEAR BED_MESH_PROFILE LOAD={printer["gcode_macro RatOS"].bed_mesh_profile} {% endif %} [gcode_macro _USER_START_PRINT_BED_MESH] gcode = [gcode_macro _START_PRINT_PARK] gcode = {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} {% set zSpeed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} _PARK LOCATION={printer["gcode_macro RatOS"].start_print_park_in} X={printer["gcode_macro RatOS"].start_print_park_x} G0 Z{z} F{zSpeed} [gcode_macro _USER_START_PRINT_PARK] gcode = [gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER] gcode = {% set has_offset = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) != 9999.9 %} {% if has_offset %} ADD_PRIME_PROBE_TO_OFFSET {% endif %} {% 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 has_offset %} SUBTRACT_PRIME_PROBE_FROM_OFFSET {% endif %} {% if printer["gcode_macro RatOS"].skew_profile is defined %} SKEW_PROFILE LOAD={printer["gcode_macro RatOS"].skew_profile} {% endif %} [gcode_macro _USER_START_PRINT_AFTER_HEATING_EXTRUDER] gcode = [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 and params.CHAMBER_TEMP|int > 0 %} {% 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 _USER_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 = [gcode_macro END_PRINT] description = End print procedure, use this in your Slicer. gcode = SAVE_GCODE_STATE NAME=end_print_state _USER_END_PRINT_BEFORE_HEATERS_OFF _END_PRINT_BEFORE_HEATERS_OFF TURN_OFF_HEATERS _USER_END_PRINT_AFTER_HEATERS_OFF _END_PRINT_AFTER_HEATERS_OFF _USER_END_PRINT_PARK _END_PRINT_PARK {% if printer["gcode_macro RatOS"].skew_profile is defined %} SET_SKEW CLEAR=1 {% endif %} M84 M107 BED_MESH_CLEAR 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 _USER_END_PRINT_BEFORE_HEATERS_OFF] gcode = [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 %} {% set z_hop = printer["gcode_macro RatOS"].end_print_park_z_hop|float %} {% if act_z < (max_z - z_hop) %} {% set z_safe = z_hop %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} G91 G1 E-2 F3600 G0 Z{z_safe} F3600 G1 E-2 F3600 G90 [gcode_macro _USER_END_PRINT_AFTER_HEATERS_OFF] gcode = [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_macro _USER_END_PRINT_PARK] gcode = [gcode_macro SAVE_PROBE_RESULT] gcode = {% set last_z = printer.probe.last_z_result %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE={params.VARIABLE|default('last_z')} VALUE={last_z} [gcode_macro PROBE_FOR_PRIMING] gcode = {% if printer["gcode_macro RatOS"].nozzle_priming|lower != 'false' %} SAVE_GCODE_STATE NAME=probe_for_priming_state RESPOND MSG="Probing the prime location.." {% 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 = 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 = 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% else %} {% set y_start = printer["gcode_macro RatOS"].nozzle_prime_start_y|float %} {% endif %} {% set z = printer.configfile.settings.bed_mesh.horizontal_move_z|float %} {% set mesh_config = printer.configfile.config.bed_mesh %} {% if printer.configfile.settings.bltouch is defined %} {% set x_offset = printer.configfile.settings.bltouch.x_offset|float %} {% set y_offset = printer.configfile.settings.bltouch.y_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set x_offset = printer.configfile.settings.probe.x_offset|float %} {% set y_offset = printer.configfile.settings.probe.y_offset|float %} {% elif printer.configfile.settings.beacon is defined %} {% set x_offset = printer.configfile.settings.beacon.x_offset|float %} {% set y_offset = printer.configfile.settings.beacon.y_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% set min_x = mesh_config.mesh_min.split(",")[0]|float - x_offset %} {% set min_y = mesh_config.mesh_min.split(",")[1]|float - y_offset %} {% set max_x = mesh_config.mesh_max.split(",")[0]|float - x_offset %} {% set max_y = mesh_config.mesh_max.split(",")[1]|float - y_offset %} {% set x_start = [[x_start, max_x]|min, min_x]|max %} {% set y_start = [[y_start, max_y]|min, min_y]|max %} RESPOND MSG="PROBE_FOR_PRIMING: Probing the prime location at X: {x_start} Y: {y_start}" G90 M83 G0 Z{z} F{z_speed} G1 X{x_start} Y{y_start} F{speed} PROBE_CURRENT_POSITION SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result RESTORE_GCODE_STATE NAME=probe_for_priming_state {% endif %} [gcode_macro RESET_PRIME_PROBE_STATE] gcode = SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result VALUE=None [gcode_macro PROBE_CURRENT_POSITION] gcode = SAVE_GCODE_STATE NAME=probe_current_position_state {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} ASSERT_PROBE_DEPLOYED {% endif %} PROBE RESTORE_GCODE_STATE NAME=probe_current_position_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_z_speed|float} [gcode_macro ADD_PRIME_PROBE_TO_OFFSET] gcode = {% set last_z = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %} {% if printer.configfile.settings.bltouch is defined %} {% set z_offset = printer.configfile.settings.bltouch.z_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set z_offset = printer.configfile.settings.probe.z_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% if last_z == 9999.9 %} { action_raise_error("No probe result found for prime area. This is likely a bug.") } {% endif %} {% set adjustment = last_z - z_offset %} {% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %} {% if adjustment < adjustment_threshold %} { action_raise_error("Abnormal probe offset detected. Needed offset of {adjustment} is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area.") } {% endif %} RESPOND MSG="ADD_PRIME_PROBE_TO_OFFSET: adjusting z offset by {adjustment}" SET_GCODE_OFFSET Z_ADJUST={adjustment} MOVE=1 [gcode_macro SUBTRACT_PRIME_PROBE_FROM_OFFSET] gcode = {% set last_z = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %} {% if printer.configfile.settings.bltouch is defined %} {% set z_offset = printer.configfile.settings.bltouch.z_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set z_offset = printer.configfile.settings.probe.z_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% if last_z == 9999.9 %} { action_raise_error("No probe result found for prime area. This is likely a bug.") } {% endif %} RESPOND MSG="SUBTRACT_PRIME_PROBE_FROM_OFFSET: adjusting z offset by {z_offset - last_z}" SET_GCODE_OFFSET Z_ADJUST={z_offset - last_z} MOVE=1 [gcode_macro CALIBRATE_ADAPTIVE_MESH] gcode = {% set default_profile = params.PROFILE %} {% set x0 = params.X0|default(-1)|float %} {% set y0 = params.Y0|default(-1)|float %} {% set x1 = params.X1|default(-1)|float %} {% set y1 = params.Y1|default(-1)|float %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Recieved coordinates X0={x0} Y0={y0} X1={x1} Y1={y1}" {% if x0 >= x1 or y0 >= y1 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Invalid coordinates received. Please check your slicer settings. Falling back to full bed mesh." BED_MESH_CALIBRATE PROFILE={default_profile} {% else %} {% set mesh_config = printer.configfile.config.bed_mesh %} {% set min_x = mesh_config.mesh_min.split(",")[0]|float %} {% set min_y = mesh_config.mesh_min.split(",")[1]|float %} {% set max_x = mesh_config.mesh_max.split(",")[0]|float %} {% set max_y = mesh_config.mesh_max.split(",")[1]|float %} {% set mesh_x0 = [[x0, max_x]|min, min_x]|max %} {% set mesh_y0 = [[y0, max_y]|min, min_y]|max %} {% set mesh_x1 = [[x1, max_x]|min, min_x]|max %} {% set mesh_y1 = [[y1, max_y]|min, min_y]|max %} {% if mesh_x0 == min_x and mesh_y0 == min_y and mesh_x1 == max_x and mesh_y1 == max_y %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Print is using the full bed, falling back to full bed mesh." BED_MESH_CALIBRATE PROFILE={default_profile} {% else %} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} DEPLOY_PROBE {% endif %} {% set probe_count_x = mesh_config.probe_count.split(",")[0]|int %} {% if mesh_config.probe_count.split(",")|length == 2 %} {% set probe_count_y = mesh_config.probe_count.split(",")[1]|int %} {% else %} {% set probe_count_y = mesh_config.probe_count.split(",")[0]|int %} {% endif %} {% set probe_x_step = (max_x - min_x) / probe_count_x %} {% set probe_y_step = (max_y - min_y) / probe_count_y %} {% set mesh_count_x = ([(mesh_x1 - mesh_x0) / probe_x_step, 3]|max)|int %} {% set mesh_count_y = ([(mesh_y1 - mesh_y0) / probe_y_step, 3]|max)|int %} {% set min_mesh_count = [mesh_count_x, mesh_count_y]|min %} {% set max_mesh_count = [mesh_count_x, mesh_count_y]|max %} {% set algorithm = mesh_config.algorithm %} {% if algorithm|lower == 'lagrange' and max_mesh_count > 6 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: cannot exceed a probe_count of 6 when using lagrange interpolation. Falling back to bicubic interpolation." {% set algorithm = 'bicubic' %} {% endif %} {% if algorithm|lower == 'bicubic' and min_mesh_count < 4 %} {% if max_mesh_count > 6 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: invalid probe_count option when using bicubic interpolation. Combination of 3 points on one axis with more than 6 on another is not permitted. Forcing minimum mesh count to be 4." {% set min_mesh_count = 4 %} {% else %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: bicubic interpolation with a probe_count of less than 4 points detected. Forcing lagrange interpolation." {% set algorithm = 'lagrange' %} {% endif %} {% endif %} {% set mesh_count_x = ([min_mesh_count, mesh_count_x]|max)|int %} {% set mesh_count_x = ([max_mesh_count, mesh_count_x]|min)|int %} {% set mesh_count_y = ([min_mesh_count, mesh_count_y]|max)|int %} {% set mesh_count_y = ([max_mesh_count, mesh_count_y]|min)|int %} {% set should_prime = printer["gcode_macro RatOS"].nozzle_priming == 'primeline' or printer["gcode_macro RatOS"].nozzle_priming == 'primeblob' %} {% if printer.configfile.settings.beacon is defined %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: adaptive priming is currently not supported for Beacon. Disabling priming.." SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=nozzle_priming VALUE=False {% set should_prime = False %} {% endif %} {% set prime_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printer.toolhead.axis_maximum.y) < printer.toolhead.axis_maximum.y / 2 %} {% if should_prime and prime_first %} PROBE_FOR_PRIMING {% endif %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: mesh coordinates X0={mesh_x0} Y0={mesh_y0} X1={mesh_x1} Y1={mesh_y1}" BED_MESH_CALIBRATE PROFILE={default_profile} algorithm={algorithm} mesh_min={mesh_x0},{mesh_y0} mesh_max={mesh_x1},{mesh_y1} probe_count={mesh_count_x},{mesh_count_y} relative_reference_index=-1 {% if should_prime and not prime_first %} PROBE_FOR_PRIMING {% endif %} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOW_PROBE {% endif %} {% endif %} {% endif %} [gcode_shell_command generate_shaper_graph_x] command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-x.sh timeout = 60. verbose = True [gcode_shell_command generate_shaper_graph_y] command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-y.sh timeout = 60. verbose = True [gcode_shell_command generate_belt_tension_graph] command = /home/pi/printer_data/config/RatOS/scripts/generate-belt-tension-graph.sh timeout = 90. verbose = True [gcode_shell_command compile_binaries] command = /home/pi/printer_data/config/RatOS/scripts/compile-binaries.sh timeout = 600. [gcode_shell_command change_hostname] command = /home/pi/printer_data/config/RatOS/scripts/change-hostname.sh timeout = 10. [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 RESPOND MSG="Belt tension graphs generated. You'll find them in the input_shaper folder in the machine tab!" [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 Z_TILT_ADJUST] rename_existing = Z_TILT_ADJUST_ORIG gcode = {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} DEPLOY_PROBE {% endif %} Z_TILT_ADJUST_ORIG {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} STOW_PROBE {% endif %} [stepper_x] step_pin = x_step_pin dir_pin = x_dir_pin enable_pin = !x_enable_pin rotation_distance = 40 microsteps = 64 homing_speed = 50 homing_retract_dist = 5.0 position_max = 300 position_endstop = 0 endstop_pin = ^x_endstop_pin [stepper_y] step_pin = y_step_pin dir_pin = y_dir_pin enable_pin = !y_enable_pin rotation_distance = 40 microsteps = 64 homing_speed = 50 homing_retract_dist = 5.0 position_max = 300 position_endstop = 300 endstop_pin = ^y_endstop_pin homing_positive_dir = true [stepper_z] endstop_pin = probe:z_virtual_endstop step_pin = z0_step_pin dir_pin = !z0_dir_pin enable_pin = !z0_enable_pin rotation_distance = 4 microsteps = 64 position_min = -5 homing_speed = 10 position_max = 300 [stepper_z1] step_pin = z1_step_pin dir_pin = !z1_dir_pin enable_pin = !z1_enable_pin rotation_distance = 4 microsteps = 64 [stepper_z2] step_pin = z2_step_pin dir_pin = !z2_dir_pin enable_pin = !z2_enable_pin rotation_distance = 4 microsteps = 64 [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 = ATC Semitec 104GT-2 sensor_pin = e_sensor_pin min_extrude_temp = 170 min_temp = 0 max_temp = 285 pressure_advance = 0.03 control = pid pid_kp = 28.413 pid_ki = 1.334 pid_kd = 151.300 [tmc2209 stepper_x] stealthchop_threshold = 1 uart_pin = x_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_y] stealthchop_threshold = 1 uart_pin = y_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 extruder] uart_pin = e_uart_pin run_current = 0.707 stealthchop_threshold = 0 interpolate = False driver_tbl = 1 driver_toff = 3 driver_hend = 9 driver_hstrt = 7 [tmc2209 stepper_z] stealthchop_threshold = 1 uart_pin = z0_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_z1] stealthchop_threshold = 1 uart_pin = z1_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_z2] stealthchop_threshold = 1 uart_pin = z2_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [bed_mesh] speed = 200 horizontal_move_z = 5 mesh_min = 20,20 mesh_max = 265,260 probe_count = 7,7 fade_start = 1.0 fade_end = 10.0 mesh_pps = 2,2 algorithm = bicubic bicubic_tension = .2 [z_tilt] speed = 200 z_positions = 0,0 150,300 300,0 points = 60,60 185,270 260,60 horizontal_move_z = 20 retries = 10 retry_tolerance = 0.02 [probe] pin = ^probe_pin x_offset = -27.8 y_offset = -12 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 = 0.0 [firmware_retraction] retract_speed = 120 unretract_extra_length = 0 unretract_speed = 120 retract_length = 0.5 ======================= 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/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' webhooks client 548394847008: New connection webhooks client 548394847008: Client info {'program': 'Moonraker', 'version': 'v0.8.0-48-gaa0f89c'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 798, 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 803, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/pi/klipper/klippy/../.config(746): Fri Jun 9 03:26:03 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set # CONFIG_MACH_STM32 is not set # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set CONFIG_MACH_LINUX=y # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="linux" CONFIG_CLOCK_FREQ=50000000 CONFIG_LINUX_SELECT=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_GPIO_BITBANGING=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(9343): Fri Jun 9 03:27:28 2023 Last MCU build version: ?-20230609_032728-fv-az592-720 Last MCU build tools: gcc: (Debian 10.2.1-6) 10.2.1 20210110 binutils: (GNU Binutils for Debian) 2.35.2 Last MCU build config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256 Build file /home/pi/klipper/klippy/../out/klipper.elf(855112): Fri Jun 9 03:27:58 2023 webhooks client 548394847008: Disconnected Starting Klippy... Args: ['/home/pi/klipper/klippy/klippy.py', '/home/pi/printer_data/config/printer.cfg', '-l', '/home/pi/printer_data/logs/klippy.log', '-I', '/home/pi/printer_data/comms/klippy.serial', '-a', '/home/pi/printer_data/comms/klippy.sock'] Git version: 'v0.11.0-219-g645a1b83-dirty' Untracked files: klippy/extras/beacon.py, klippy/extras/gcode_shell_command.py, klippy/extras/linear_movement_vibrations.py, klippy/extras/ratos_homing.py Branch: master Remote: origin Tracked URL: https://github.com/Klipper3d/klipper.git CPU: 4 core ? Python: '3.9.2 (default, Feb 28 2021, 17:03:44) \n[GCC 10.2.1 20210110]' Start printer at Tue Jul 25 14:54:52 2023 (1690293292.2 21.7) ===== Config file ===== [board_pins octopus_pro_429_tmc2209] aliases = x_step_pin=PF13, x_dir_pin=PF12, x_enable_pin=PF14, x_uart_pin=PC4, x_diag_pin=PG6, x_endstop_pin=PG6, y_step_pin=PG0, y_dir_pin=PG1, y_enable_pin=PF15, y_uart_pin=PD11, y_diag_pin=PG9, y_endstop_pin=PG9, z0_step_pin=PC13, z0_dir_pin=PF0, z0_enable_pin=PF1, z0_uart_pin=PE4, z0_diag_pin=null, z1_step_pin=PE2, z1_dir_pin=PE3, z1_enable_pin=PD4, z1_uart_pin=PE1, z1_diag_pin=null, z2_step_pin=PE6, z2_dir_pin=PA14, z2_enable_pin=PE0, z2_uart_pin=PD3, z2_diag_pin=null, z3_step_pin=PF9, z3_dir_pin=PF10, z3_enable_pin=PG2, z3_uart_pin=PF2, z3_diag_pin=null, e_step_pin=PF11, e_dir_pin=PG3, e_enable_pin=PG5, e_uart_pin=PC6, e_diag_pin=null, e_heater_pin=PA2, e_sensor_pin=PF4, stepper_spi_mosi_pin=PA7, stepper_spi_miso_pin=PA6, stepper_spi_sclk_pin=PA5, adxl345_cs_pin=PA15, bltouch_sensor_pin=PB7, bltouch_control_pin=PB6, probe_pin=PB7, fan_part_cooling_pin=PA8, fan_toolhead_cooling_pin=PE5, fan_controller_board_pin=PD12, heater_bed_heating_pin=PA1, heater_bed_sensor_pin=PF3, EXP1_1=PE8, EXP1_3=PE9, EXP1_5=PE12, EXP1_7=PE14, EXP1_9=, EXP1_2=PE7, EXP1_4=PE10, EXP1_6=PE13, EXP1_8=PE15, EXP1_10=<5V>, EXP2_1=PA6, EXP2_3=PB1, EXP2_5=PB2, EXP2_7=PC15, EXP2_9=, EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10=PC5, [mcu] serial = /dev/btt-octopus-pro-429 [temperature_sensor Octopus_Pro_429] sensor_type = temperature_mcu min_temp = 0 max_temp = 100 [adxl345] spi_bus = spi3 cs_pin = adxl345_cs_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 = ~/printer_data/gcodes [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 = Generic 3950 min_temp = 0 max_temp = 120 pwm_cycle_time = 0.02 control = pid pid_kp = 22.2 pid_ki = 1.08 pid_kd = 114 [fan] pin = fan_part_cooling_pin shutdown_speed = 1.0 [heater_fan toolhead_cooling_fan] pin = fan_toolhead_cooling_pin fan_speed = 1 [controller_fan controller_fan] pin = fan_controller_board_pin [printer] kinematics = corexy max_velocity = 200 max_accel = 1500 max_accel_to_decel = 750 max_z_velocity = 15 max_z_accel = 30 square_corner_velocity = 5 [ratos_homing] axes = xyz z_hop = 15 z_hop_speed = 15 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_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 %} {% set z_hop = printer.configfile.config.ratos_homing.z_hop|float %} {% set z_hop_speed = printer.configfile.config.ratos_homing.z_hop_speed|float * 60 %} {% set homing_x = printer["gcode_macro RatOS"].homing_x|lower %} {% set homing_y = printer["gcode_macro RatOS"].homing_y|lower %} {% set homing = printer["gcode_macro RatOS"].homing|lower %} {% set prev_stop_on_error = printer["gcode_macro RatOS"].stowable_probe_stop_on_error %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE=True M400 G90 {% if params.X is defined or params.Y is not defined and params.Z is not defined %} {% if homing_x == 'endstop' or homing == 'endstops' %} G28 X {% elif homing_x == 'sensorless' or homing == 'sensorless' %} HOME_X_SENSORLESS {% else %} { action_emergency_stop("expected RatOS variable_homing_x to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_x, homing)) } {% 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 homing_y == 'endstop' or homing == 'endstops' %} G28 Y {% elif homing_y == 'sensorless' or homing == 'sensorless' %} HOME_Y_SENSORLESS {% else %} { action_emergency_stop("expected RatOS variable_homing_y to be 'sensorless' 'endstop' or variable_homing to be 'sensorless' or 'endstops' but found {} and {}".format(homing_y, homing)) } {% 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 { action_emergency_stop("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_hop_speed} STOW_PROBE {% else %} G0 X{safe_home_x} Y{safe_home_y} F{speed} G28 Z G0 Z{z_hop} F{z_hop_speed} {% endif %} {% endif %} {% endif %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=stowable_probe_stop_on_error VALUE={prev_stop_on_error} [gcode_macro HOME_X_SENSORLESS] gcode = {% set speed = printer["gcode_macro RatOS"].macro_travel_speed|float * 60 %} {% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %} {% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_y" %} {% 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} G4 P300 G28 X SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current} G4 P300 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 %} {% set x_driver = printer["gcode_macro RatOS"].driver_type_x|lower ~ " stepper_x" %} {% set y_driver = printer["gcode_macro RatOS"].driver_type_y|lower ~ " stepper_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} G4 P300 G28 Y SET_TMC_CURRENT STEPPER=stepper_x CURRENT={printer.configfile.config[x_driver].run_current} SET_TMC_CURRENT STEPPER=stepper_y CURRENT={printer.configfile.config[y_driver].run_current} G4 P300 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 = False 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 = "back" 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 = "back" variable_macro_travel_speed = 300 variable_macro_z_speed = 15 variable_end_print_park_z_hop = 20 variable_homing = "endstops" 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" variable_stowable_probe_stop_on_error = False variable_driver_type_x = "tmc2209" variable_driver_type_y = "tmc2209" variable_adaptive_mesh = False variable_probe_for_priming_result = None variable_adaptive_prime_offset_threshold = -1.0 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 MOVE_SPEED={printer["gcode_macro RatOS"].macro_travel_speed|float} 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 = 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 = 5 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% 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 %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} G90 M82 M117 Priming nozzle with prime line.. RESPOND MSG="Priming nozzle with prime line.." G0 Z{z} F{z_speed} G1 X{x_start} F{speed} G1 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 = 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 = 5 %} {% set y_factor = 1 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% 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 %} {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} G90 M83 G0 Z{z} F{z_speed} G1 X{x_start} F{speed} G1 Y{y_start + (15 * y_factor)} F{speed} G1 Z0.5 F{z_speed} G1 Y{y_start} 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 _USER_START_PRINT_BEFORE_HOMING {% 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} _USER_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) } _USER_START_PRINT_AFTER_HEATING_BED _START_PRINT_AFTER_HEATING_BED _USER_START_PRINT_BED_MESH _START_PRINT_BED_MESH X0={params.X0} X1={params.X1} Y0={params.Y0} Y1={params.Y1} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOWABLE_PROBE_END_BATCH {% endif %} M104 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _USER_START_PRINT_PARK _START_PRINT_PARK M117 Heating Extruder... RESPOND MSG="Heating Extruder..." M109 S{params.EXTRUDER_TEMP|default(printer.extruder.target, true) } _USER_START_PRINT_AFTER_HEATING_EXTRUDER _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 _USER_START_PRINT_BEFORE_HOMING] gcode = [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 S{min_temp} TEMPERATURE_WAIT SENSOR=extruder MINIMUM={min_temp} MAXIMUM={max_temp} {% endif %} M117 Adjusting Z tilt... RESPOND MSG="Adjusting Z tilt..." Z_TILT_ADJUST M117 Rehoming Z after Z tilt adjustment... RESPOND MSG="Rehoming Z after Z tilt adjustment..." G28 Z [gcode_macro _USER_START_PRINT_AFTER_HEATING_BED] gcode = [gcode_macro _START_PRINT_BED_MESH] gcode = {% set default_profile = printer["gcode_macro RatOS"].bed_mesh_profile|default('ratos') %} {% if printer["gcode_macro RatOS"].calibrate_bed_mesh|lower == 'true' %} BED_MESH_CLEAR {% if printer["gcode_macro RatOS"].adaptive_mesh|lower == 'true' %} CALIBRATE_ADAPTIVE_MESH PROFILE={default_profile} X0={params.X0} X1={params.X1} Y0={params.Y0} Y1={params.Y1} {% else %} BED_MESH_CALIBRATE PROFILE={default_profile} {% endif %} BED_MESH_PROFILE LOAD={default_profile} {% elif printer["gcode_macro RatOS"].bed_mesh_profile is defined %} BED_MESH_CLEAR BED_MESH_PROFILE LOAD={printer["gcode_macro RatOS"].bed_mesh_profile} {% endif %} [gcode_macro _USER_START_PRINT_BED_MESH] gcode = [gcode_macro _START_PRINT_PARK] gcode = {% set z = printer["gcode_macro RatOS"].start_print_park_z_height|float %} {% set zSpeed = printer["gcode_macro RatOS"].macro_z_speed|float * 60 %} _PARK LOCATION={printer["gcode_macro RatOS"].start_print_park_in} X={printer["gcode_macro RatOS"].start_print_park_x} G0 Z{z} F{zSpeed} [gcode_macro _USER_START_PRINT_PARK] gcode = [gcode_macro _START_PRINT_AFTER_HEATING_EXTRUDER] gcode = {% set has_offset = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) != 9999.9 %} {% if has_offset %} ADD_PRIME_PROBE_TO_OFFSET {% endif %} {% 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 has_offset %} SUBTRACT_PRIME_PROBE_FROM_OFFSET {% endif %} {% if printer["gcode_macro RatOS"].skew_profile is defined %} SKEW_PROFILE LOAD={printer["gcode_macro RatOS"].skew_profile} {% endif %} [gcode_macro _USER_START_PRINT_AFTER_HEATING_EXTRUDER] gcode = [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 and params.CHAMBER_TEMP|int > 0 %} {% 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 _USER_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 = [gcode_macro END_PRINT] description = End print procedure, use this in your Slicer. gcode = SAVE_GCODE_STATE NAME=end_print_state _USER_END_PRINT_BEFORE_HEATERS_OFF _END_PRINT_BEFORE_HEATERS_OFF TURN_OFF_HEATERS _USER_END_PRINT_AFTER_HEATERS_OFF _END_PRINT_AFTER_HEATERS_OFF _USER_END_PRINT_PARK _END_PRINT_PARK {% if printer["gcode_macro RatOS"].skew_profile is defined %} SET_SKEW CLEAR=1 {% endif %} M84 M107 BED_MESH_CLEAR 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 _USER_END_PRINT_BEFORE_HEATERS_OFF] gcode = [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 %} {% set z_hop = printer["gcode_macro RatOS"].end_print_park_z_hop|float %} {% if act_z < (max_z - z_hop) %} {% set z_safe = z_hop %} {% else %} {% set z_safe = max_z - act_z %} {% endif %} G91 G1 E-2 F3600 G0 Z{z_safe} F3600 G1 E-2 F3600 G90 [gcode_macro _USER_END_PRINT_AFTER_HEATERS_OFF] gcode = [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_macro _USER_END_PRINT_PARK] gcode = [gcode_macro SAVE_PROBE_RESULT] gcode = {% set last_z = printer.probe.last_z_result %} SET_GCODE_VARIABLE MACRO=RatOS VARIABLE={params.VARIABLE|default('last_z')} VALUE={last_z} [gcode_macro PROBE_FOR_PRIMING] gcode = {% if printer["gcode_macro RatOS"].nozzle_priming|lower != 'false' %} SAVE_GCODE_STATE NAME=probe_for_priming_state RESPOND MSG="Probing the prime location.." {% 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 = 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 = 5 %} {% elif printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == 'max' %} {% set y_start = printer.toolhead.axis_maximum.y - 5 %} {% else %} {% set y_start = printer["gcode_macro RatOS"].nozzle_prime_start_y|float %} {% endif %} {% set z = printer.configfile.settings.bed_mesh.horizontal_move_z|float %} {% set mesh_config = printer.configfile.config.bed_mesh %} {% if printer.configfile.settings.bltouch is defined %} {% set x_offset = printer.configfile.settings.bltouch.x_offset|float %} {% set y_offset = printer.configfile.settings.bltouch.y_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set x_offset = printer.configfile.settings.probe.x_offset|float %} {% set y_offset = printer.configfile.settings.probe.y_offset|float %} {% elif printer.configfile.settings.beacon is defined %} {% set x_offset = printer.configfile.settings.beacon.x_offset|float %} {% set y_offset = printer.configfile.settings.beacon.y_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% set min_x = mesh_config.mesh_min.split(",")[0]|float - x_offset %} {% set min_y = mesh_config.mesh_min.split(",")[1]|float - y_offset %} {% set max_x = mesh_config.mesh_max.split(",")[0]|float - x_offset %} {% set max_y = mesh_config.mesh_max.split(",")[1]|float - y_offset %} {% set x_start = [[x_start, max_x]|min, min_x]|max %} {% set y_start = [[y_start, max_y]|min, min_y]|max %} RESPOND MSG="PROBE_FOR_PRIMING: Probing the prime location at X: {x_start} Y: {y_start}" G90 M83 G0 Z{z} F{z_speed} G1 X{x_start} Y{y_start} F{speed} PROBE_CURRENT_POSITION SAVE_PROBE_RESULT VARIABLE=probe_for_priming_result RESTORE_GCODE_STATE NAME=probe_for_priming_state {% endif %} [gcode_macro RESET_PRIME_PROBE_STATE] gcode = SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=probe_for_priming_result VALUE=None [gcode_macro PROBE_CURRENT_POSITION] gcode = SAVE_GCODE_STATE NAME=probe_current_position_state {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} ASSERT_PROBE_DEPLOYED {% endif %} PROBE RESTORE_GCODE_STATE NAME=probe_current_position_state MOVE=1 MOVE_SPEED={printer["gcode_macro RatOS"].macro_z_speed|float} [gcode_macro ADD_PRIME_PROBE_TO_OFFSET] gcode = {% set last_z = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %} {% if printer.configfile.settings.bltouch is defined %} {% set z_offset = printer.configfile.settings.bltouch.z_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set z_offset = printer.configfile.settings.probe.z_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% if last_z == 9999.9 %} { action_raise_error("No probe result found for prime area. This is likely a bug.") } {% endif %} {% set adjustment = last_z - z_offset %} {% set adjustment_threshold = printer["gcode_macro RatOS"].adaptive_prime_offset_threshold|float %} {% if adjustment < adjustment_threshold %} { action_raise_error("Abnormal probe offset detected. Needed offset of {adjustment} is below the offset threshold of -1mm. Please verify the probe is over the bed when probing for priming. If it isn't, you should adjust you min/max bed_mesh settings so the probe is always over the print area.") } {% endif %} RESPOND MSG="ADD_PRIME_PROBE_TO_OFFSET: adjusting z offset by {adjustment}" SET_GCODE_OFFSET Z_ADJUST={adjustment} MOVE=1 [gcode_macro SUBTRACT_PRIME_PROBE_FROM_OFFSET] gcode = {% set last_z = printer["gcode_macro RatOS"].probe_for_priming_result|float(9999.9) %} {% if printer.configfile.settings.bltouch is defined %} {% set z_offset = printer.configfile.settings.bltouch.z_offset|float %} {% elif printer.configfile.settings.probe is defined %} {% set z_offset = printer.configfile.settings.probe.z_offset|float %} {% else %} { action_raise_error("No probe or bltouch section found. Adaptive priming only works with [probe] or [bltouch].") } {% endif %} {% if last_z == 9999.9 %} { action_raise_error("No probe result found for prime area. This is likely a bug.") } {% endif %} RESPOND MSG="SUBTRACT_PRIME_PROBE_FROM_OFFSET: adjusting z offset by {z_offset - last_z}" SET_GCODE_OFFSET Z_ADJUST={z_offset - last_z} MOVE=1 [gcode_macro CALIBRATE_ADAPTIVE_MESH] gcode = {% set default_profile = params.PROFILE %} {% set x0 = params.X0|default(-1)|float %} {% set y0 = params.Y0|default(-1)|float %} {% set x1 = params.X1|default(-1)|float %} {% set y1 = params.Y1|default(-1)|float %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Recieved coordinates X0={x0} Y0={y0} X1={x1} Y1={y1}" {% if x0 >= x1 or y0 >= y1 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Invalid coordinates received. Please check your slicer settings. Falling back to full bed mesh." BED_MESH_CALIBRATE PROFILE={default_profile} {% else %} {% set mesh_config = printer.configfile.config.bed_mesh %} {% set min_x = mesh_config.mesh_min.split(",")[0]|float %} {% set min_y = mesh_config.mesh_min.split(",")[1]|float %} {% set max_x = mesh_config.mesh_max.split(",")[0]|float %} {% set max_y = mesh_config.mesh_max.split(",")[1]|float %} {% set mesh_x0 = [[x0, max_x]|min, min_x]|max %} {% set mesh_y0 = [[y0, max_y]|min, min_y]|max %} {% set mesh_x1 = [[x1, max_x]|min, min_x]|max %} {% set mesh_y1 = [[y1, max_y]|min, min_y]|max %} {% if mesh_x0 == min_x and mesh_y0 == min_y and mesh_x1 == max_x and mesh_y1 == max_y %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: Print is using the full bed, falling back to full bed mesh." BED_MESH_CALIBRATE PROFILE={default_profile} {% else %} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} DEPLOY_PROBE {% endif %} {% set probe_count_x = mesh_config.probe_count.split(",")[0]|int %} {% if mesh_config.probe_count.split(",")|length == 2 %} {% set probe_count_y = mesh_config.probe_count.split(",")[1]|int %} {% else %} {% set probe_count_y = mesh_config.probe_count.split(",")[0]|int %} {% endif %} {% set probe_x_step = (max_x - min_x) / probe_count_x %} {% set probe_y_step = (max_y - min_y) / probe_count_y %} {% set mesh_count_x = ([(mesh_x1 - mesh_x0) / probe_x_step, 3]|max)|int %} {% set mesh_count_y = ([(mesh_y1 - mesh_y0) / probe_y_step, 3]|max)|int %} {% set min_mesh_count = [mesh_count_x, mesh_count_y]|min %} {% set max_mesh_count = [mesh_count_x, mesh_count_y]|max %} {% set algorithm = mesh_config.algorithm %} {% if algorithm|lower == 'lagrange' and max_mesh_count > 6 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: cannot exceed a probe_count of 6 when using lagrange interpolation. Falling back to bicubic interpolation." {% set algorithm = 'bicubic' %} {% endif %} {% if algorithm|lower == 'bicubic' and min_mesh_count < 4 %} {% if max_mesh_count > 6 %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: invalid probe_count option when using bicubic interpolation. Combination of 3 points on one axis with more than 6 on another is not permitted. Forcing minimum mesh count to be 4." {% set min_mesh_count = 4 %} {% else %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: bicubic interpolation with a probe_count of less than 4 points detected. Forcing lagrange interpolation." {% set algorithm = 'lagrange' %} {% endif %} {% endif %} {% set mesh_count_x = ([min_mesh_count, mesh_count_x]|max)|int %} {% set mesh_count_x = ([max_mesh_count, mesh_count_x]|min)|int %} {% set mesh_count_y = ([min_mesh_count, mesh_count_y]|max)|int %} {% set mesh_count_y = ([max_mesh_count, mesh_count_y]|min)|int %} {% set should_prime = printer["gcode_macro RatOS"].nozzle_priming == 'primeline' or printer["gcode_macro RatOS"].nozzle_priming == 'primeblob' %} {% if printer.configfile.settings.beacon is defined %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: adaptive priming is currently not supported for Beacon. Disabling priming.." SET_GCODE_VARIABLE MACRO=RatOS VARIABLE=nozzle_priming VALUE=False {% set should_prime = False %} {% endif %} {% set prime_first = printer["gcode_macro RatOS"].nozzle_prime_start_y|lower == "min" or printer["gcode_macro RatOS"].nozzle_prime_start_y|float(printer.toolhead.axis_maximum.y) < printer.toolhead.axis_maximum.y / 2 %} {% if should_prime and prime_first %} PROBE_FOR_PRIMING {% endif %} RESPOND MSG="CALIBRATE_ADAPTIVE_MESH: mesh coordinates X0={mesh_x0} Y0={mesh_y0} X1={mesh_x1} Y1={mesh_y1}" BED_MESH_CALIBRATE PROFILE={default_profile} algorithm={algorithm} mesh_min={mesh_x0},{mesh_y0} mesh_max={mesh_x1},{mesh_y1} probe_count={mesh_count_x},{mesh_count_y} relative_reference_index=-1 {% if should_prime and not prime_first %} PROBE_FOR_PRIMING {% endif %} {% if printer["gcode_macro RatOS"].z_probe|lower == 'stowable' %} STOW_PROBE {% endif %} {% endif %} {% endif %} [gcode_shell_command generate_shaper_graph_x] command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-x.sh timeout = 60. verbose = True [gcode_shell_command generate_shaper_graph_y] command = /home/pi/printer_data/config/RatOS/scripts/generate-shaper-graph-y.sh timeout = 60. verbose = True [gcode_shell_command generate_belt_tension_graph] command = /home/pi/printer_data/config/RatOS/scripts/generate-belt-tension-graph.sh timeout = 90. verbose = True [gcode_shell_command compile_binaries] command = /home/pi/printer_data/config/RatOS/scripts/compile-binaries.sh timeout = 600. [gcode_shell_command change_hostname] command = /home/pi/printer_data/config/RatOS/scripts/change-hostname.sh timeout = 10. [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 RESPOND MSG="Belt tension graphs generated. You'll find them in the input_shaper folder in the machine tab!" [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 Z_TILT_ADJUST] rename_existing = Z_TILT_ADJUST_ORIG gcode = {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} DEPLOY_PROBE {% endif %} Z_TILT_ADJUST_ORIG {% if printer["gcode_macro RatOS"].z_probe == 'stowable' %} STOW_PROBE {% endif %} [stepper_x] step_pin = x_step_pin dir_pin = x_dir_pin enable_pin = !x_enable_pin rotation_distance = 40 microsteps = 64 homing_speed = 50 homing_retract_dist = 5.0 position_max = 300 position_endstop = 0 endstop_pin = ^x_endstop_pin [stepper_y] step_pin = y_step_pin dir_pin = y_dir_pin enable_pin = !y_enable_pin rotation_distance = 40 microsteps = 64 homing_speed = 50 homing_retract_dist = 5.0 position_max = 300 position_endstop = 300 endstop_pin = ^y_endstop_pin homing_positive_dir = true [stepper_z] endstop_pin = probe:z_virtual_endstop step_pin = z0_step_pin dir_pin = !z0_dir_pin enable_pin = !z0_enable_pin rotation_distance = 4 microsteps = 64 position_min = -5 homing_speed = 10 position_max = 300 [stepper_z1] step_pin = z1_step_pin dir_pin = !z1_dir_pin enable_pin = !z1_enable_pin rotation_distance = 4 microsteps = 64 [stepper_z2] step_pin = z2_step_pin dir_pin = !z2_dir_pin enable_pin = !z2_enable_pin rotation_distance = 4 microsteps = 64 [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 = ATC Semitec 104GT-2 sensor_pin = e_sensor_pin min_extrude_temp = 170 min_temp = 0 max_temp = 285 pressure_advance = 0.03 control = pid pid_kp = 28.413 pid_ki = 1.334 pid_kd = 151.300 [tmc2209 stepper_x] stealthchop_threshold = 1 uart_pin = x_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_y] stealthchop_threshold = 1 uart_pin = y_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 extruder] uart_pin = e_uart_pin run_current = 0.707 stealthchop_threshold = 0 interpolate = False driver_tbl = 1 driver_toff = 3 driver_hend = 9 driver_hstrt = 7 [tmc2209 stepper_z] stealthchop_threshold = 1 uart_pin = z0_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_z1] stealthchop_threshold = 1 uart_pin = z1_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [tmc2209 stepper_z2] stealthchop_threshold = 1 uart_pin = z2_uart_pin run_current = 1.1 driver_tbl = 1 driver_toff = 3 driver_hend = 0 driver_hstrt = 0 [bed_mesh] speed = 200 horizontal_move_z = 5 mesh_min = 20,20 mesh_max = 265,260 probe_count = 7,7 fade_start = 1.0 fade_end = 10.0 mesh_pps = 2,2 algorithm = bicubic bicubic_tension = .2 [z_tilt] speed = 200 z_positions = 0,0 150,300 300,0 points = 60,60 185,270 260,60 horizontal_move_z = 20 retries = 10 retry_tolerance = 0.02 [probe] pin = ^probe_pin x_offset = -27.8 y_offset = -12 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 = 0.0 [firmware_retraction] retract_speed = 120 unretract_extra_length = 0 unretract_speed = 120 retract_length = 0.5 ======================= 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/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' webhooks client 547796624096: New connection webhooks client 547796624096: Client info {'program': 'Moonraker', 'version': 'v0.8.0-48-gaa0f89c'} mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' mcu 'mcu': Unable to open serial port: [Errno 2] could not open port /dev/btt-octopus-pro-429: [Errno 2] No such file or directory: '/dev/btt-octopus-pro-429' MCU error during connect Traceback (most recent call last): File "/home/pi/klipper/klippy/mcu.py", line 798, 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 803, in _mcu_identify raise error(str(e)) mcu.error: mcu 'mcu': Unable to connect Build file /home/pi/klipper/klippy/../.config(746): Fri Jun 9 03:26:03 2023 ========= Last MCU build config ========= # CONFIG_LOW_LEVEL_OPTIONS is not set # CONFIG_MACH_AVR is not set # CONFIG_MACH_ATSAM is not set # CONFIG_MACH_ATSAMD is not set # CONFIG_MACH_LPC176X is not set # CONFIG_MACH_STM32 is not set # CONFIG_MACH_HC32F460 is not set # CONFIG_MACH_RP2040 is not set # CONFIG_MACH_PRU is not set # CONFIG_MACH_AR100 is not set CONFIG_MACH_LINUX=y # CONFIG_MACH_SIMU is not set CONFIG_BOARD_DIRECTORY="linux" CONFIG_CLOCK_FREQ=50000000 CONFIG_LINUX_SELECT=y CONFIG_USB_VENDOR_ID=0x1d50 CONFIG_USB_DEVICE_ID=0x614e CONFIG_USB_SERIAL_NUMBER="12345" CONFIG_CANBUS_FREQUENCY=1000000 CONFIG_HAVE_GPIO=y CONFIG_HAVE_GPIO_ADC=y CONFIG_HAVE_GPIO_SPI=y CONFIG_HAVE_GPIO_I2C=y CONFIG_HAVE_GPIO_HARD_PWM=y CONFIG_HAVE_GPIO_BITBANGING=y CONFIG_INLINE_STEPPER_HACK=y ======================= Build file /home/pi/klipper/klippy/../out/klipper.dict(9343): Fri Jun 9 03:27:28 2023 Last MCU build version: ?-20230609_032728-fv-az592-720 Last MCU build tools: gcc: (Debian 10.2.1-6) 10.2.1 20210110 binutils: (GNU Binutils for Debian) 2.35.2 Last MCU build config: ADC_MAX=4095 CLOCK_FREQ=50000000 MCU=linux PCA9685_MAX=4096 PWM_MAX=32768 STATS_SUMSQ_BASE=256 Build file /home/pi/klipper/klippy/../out/klipper.elf(855112): Fri Jun 9 03:27:58 2023