diff --git a/config/CreatBot_D1000/base.cfg b/config/CreatBot_D1000/base.cfg index 20b9215b0..81445271b 100644 --- a/config/CreatBot_D1000/base.cfg +++ b/config/CreatBot_D1000/base.cfg @@ -41,7 +41,7 @@ canbus_interface: can0 kinematics: cartesian max_velocity: 300 max_accel: 5000 -max_z_velocity: 10 +max_z_velocity: 7 max_z_accel: 100 square_corner_velocity: 2.5 diff --git a/config/CreatBot_D1000_V0/base.cfg b/config/CreatBot_D1000_V0/base.cfg new file mode 100644 index 000000000..161461a92 --- /dev/null +++ b/config/CreatBot_D1000_V0/base.cfg @@ -0,0 +1,939 @@ +# This is a configuration file for the Creatbot D1000_V0. +[include mainsail.cfg] + +[virtual_sdcard] +path: ~/printer_data/gcodes +on_error_gcode: CANCEL_PRINT + +[save_variables] +filename: ~/printer_data/config/config_variables.cfg + +[exclude_object] + +[gcode_arcs] +resolution: 1.0 + +[force_move] +enable_force_move: True + +[idle_timeout] +gcode: + {% if printer.webhooks.state|lower == 'ready' %} + {% if printer.pause_resume.is_paused %} + {% if printer["extruder"] is defined %} + SET_HEATER_TEMPERATURE HEATER=extruder + {% endif %} + {% if printer["extruder1"] is defined %} + SET_HEATER_TEMPERATURE HEATER=extruder1 + {% endif %} + {% else %} + TURN_OFF_HEATERS + {% endif %} + {% endif %} +timeout: 1800 # 0.5 hour timeout + +# F446 MotherBoard ID +[mcu] +canbus_uuid:000000000010 +canbus_interface: can0 + +[printer] +kinematics: cartesian +max_velocity: 300 +max_accel: 5000 +max_z_velocity: 7 +max_z_accel: 100 +square_corner_velocity: 2.5 + +[bed_mesh] +speed: 300 +horizontal_move_z: 5 +mesh_min: 40,60 +mesh_max: 1000, 1000 +probe_count: 6,6 +mesh_pps: 2,2 +algorithm: bicubic +bicubic_tension: 0.2 + +[stepper_x] +step_pin: PD1 +dir_pin: PD0 +enable_pin: !PA15 +rotation_distance: 75 +microsteps: 100 +full_steps_per_rotation: 200 +endstop_pin: !PC10 +position_min: 0 +position_endstop: 0 +position_max: 1000 +homing_speed: 100 +homing_retract_speed: 50 +second_homing_speed: 5 +homing_retract_dist: 10 +# homing_positive_dir: true + +[stepper_y] +step_pin: PD4 +dir_pin: !PD3 +enable_pin: !PD2 +rotation_distance: 75 +microsteps: 40 +full_steps_per_rotation: 200 +gear_ratio: 2.5:1 +endstop_pin: !PC11 +position_min: 0 +position_endstop: 0 +position_max: 1000 +homing_speed: 100 +homing_retract_speed: 50 +second_homing_speed: 5 +homing_retract_dist: 10 +# homing_positive_dir: true + +[stepper_z] +step_pin: PD7 +dir_pin: PD6 +enable_pin: !PD5 +rotation_distance: 5 +gear_ratio: 3:1 +microsteps: 16 +full_steps_per_rotation: 200 +endstop_pin: probe:z_virtual_endstop +position_max: 1000 +position_min: -4 +homing_speed: 10 +second_homing_speed: 1 +homing_retract_dist: 2.0 + +[heater_bed] +heater_pin: PD12 +sensor_type: Generic 3950 +sensor_pin: PC0 +max_power: 1.0 +min_temp: 0 +max_temp: 130 +# control: pid +# pid_kp: 17.22 +# pid_ki: 0.9 +# pid_kd: 218.61 + +[verify_heater heater_bed] +max_error: 20 +hysteresis: 5 +check_gain_time: 120 +heating_gain: 1 + +[heater_generic chamber] +heater_pin:PD15 +max_power:1.0 +sensor_type: Generic 3950 +sensor_pin:PC3 +min_temp: 0 +max_temp: 70 +pwm_cycle_time: 0.3 +# control: pid +# pid_kp: 30.68 +# pid_ki: 0.21 +# pid_kd: 0 + +[verify_heater chamber] +max_error: 120 +hysteresis: 100 +check_gain_time: 3600 +heating_gain: 0.01 + +[fan_generic Air_filter_fan] +pin: PC8 +max_power: 1.0 +shutdown_speed: 0.0 +kick_start_time: 1.0 +off_below: 0.10 + +[filament_switch_sensor extruder] +pause_on_runout: False +runout_gcode: _RUNOUT_HANDLE +event_delay: 3.0 +pause_delay: 0.5 +switch_pin: ^PC14 + +[filament_switch_sensor extruder1] +pause_on_runout: False +runout_gcode: _RUNOUT_HANDLE +event_delay: 3.0 +pause_delay: 0.5 +switch_pin: ^PC15 +[fan] +pin:PC7 +kick_start_time: 0.5 +off_below: 0.10 +max_power: 1.0 + +[heater_fan Sink_fan_0] +pin:PC6 +max_power: 1.0 +kick_start_time: 0.5 +heater: extruder +off_below: 0.10 +heater_temp: 100 + +[extruder] +sensor_type: AD8495 +adc_voltage: 3.3 +sensor_pin: PC1 + +[verify_heater extruder] +max_error: 20 +check_gain_time: 60 +hysteresis: 10 +heating_gain: 1 + +[extruder] +step_pin: PD9 +dir_pin: PD10 +enable_pin: !PD11 +microsteps: 16 +full_steps_per_rotation: 200 +rotation_distance:22.9116807962642578993 +gear_ratio: 48:19 +nozzle_diameter: 0.8 +filament_diameter: 1.750 +max_extrude_only_distance: 500.0 +max_extrude_only_velocity: 60.0 +max_extrude_only_accel: 1000.0 +max_extrude_cross_section:5 +heater_pin: PD13 +max_power: 1.0 +min_temp: 0 +max_temp: 435 +min_extrude_temp: 180 +pressure_advance: 0.03 +pressure_advance_smooth_time:0.040 +# control = pid +# pid_kp = 23.904 +# pid_ki = 1.476 +# pid_kd = 96.810 + +[extruder1] +sensor_type: AD8495 +adc_voltage: 3.3 +sensor_pin: PC2 + +[verify_heater extruder1] +max_error: 20 +check_gain_time: 60 +hysteresis: 10 +heating_gain: 1 + +[extruder1] +step_pin: PE15 +dir_pin: PB10 +enable_pin: !PD8 +microsteps: 16 +full_steps_per_rotation: 200 +rotation_distance: 22.9116807962642578993 +gear_ratio: 48:19 +nozzle_diameter: 0.8 +filament_diameter: 1.750 +max_extrude_only_distance: 500.0 +max_extrude_only_velocity: 60.0 +max_extrude_only_accel: 1000.0 +max_extrude_cross_section:5 +heater_pin: PD14 +max_power: 1.0 +min_temp: 0 +max_temp: 435 +min_extrude_temp: 180 +pressure_advance: 0.032 +pressure_advance_smooth_time:0.040 +# control = pid +# pid_kp = 23.904 +# pid_ki = 1.476 +# pid_kd = 96.810 + + +[probe] +pin: !PC12 +x_offset: 36 +y_offset: 59 +#z_offset: 4 +speed: 5.0 +samples: 3 +samples_result: median +sample_retract_dist: 2.0 +samples_tolerance: 0.05 +samples_tolerance_retries: 3 +deactivate_on_each_sample: False +activate_gcode: PROBE_SERVO_OPEN +deactivate_gcode: PROBE_SERVO_CLOSE + +[servo probe_servo] +pin: PE5 +maximum_servo_angle: 180 +minimum_pulse_width: 0.000900 +maximum_pulse_width: 0.002100 +initial_angle: 130 +# initial_pulse_width: + +[servo switch_nozzle] +pin: PE6 +maximum_servo_angle: 270 +minimum_pulse_width: 0.000512 +maximum_pulse_width: 0.002528 +initial_angle: 135 +# initial_pulse_width: + +[safe_z_home] +home_xy_position: 400,400 +speed:100 +z_hop:5 +z_hop_speed: 10 + +[gcode_macro ENABLE_MOTOR] +gcode: + SET_STEPPER_ENABLE STEPPER=stepper_x ENABLE=1 + SET_STEPPER_ENABLE STEPPER=stepper_y ENABLE=1 + SET_KINEMATIC_POSITION X=500 Y=500 Z=0 + +[gcode_macro T0] +gcode: + SET_SERVO SERVO=switch_nozzle angle=135 + G4 P500 + SET_GCODE_OFFSET Z=0 + SET_GCODE_OFFSET Y=0 + SET_GCODE_OFFSET X=0 + SET_SERVO SERVO=switch_nozzle angle=45 + ACTIVATE_EXTRUDER EXTRUDER=extruder + _RUNOUT_HANDLE + +[gcode_macro T1] +gcode: + {% set sv = printer.save_variables.variables %} + {% set x_offset = sv.dual_x_offset|default(60)|float %} + {% set y_offset = sv.dual_y_offset|default(0)|float %} + {% set z_offset = sv.dual_z_offset|default(0)|float %} + SET_SERVO SERVO=switch_nozzle angle=135 + G4 P500 + SET_GCODE_OFFSET Z={z_offset} + SET_GCODE_OFFSET Y={y_offset} + SET_GCODE_OFFSET X={x_offset} + SET_SERVO SERVO=switch_nozzle angle=225 + ACTIVATE_EXTRUDER EXTRUDER=extruder1 + _RUNOUT_HANDLE + +[gcode_macro PROBE_SERVO_OPEN] +gcode: + SET_SERVO SERVO=probe_servo angle=15 + G4 P1000 + +[gcode_macro PROBE_SERVO_CLOSE] +gcode: + SET_SERVO SERVO=probe_servo angle=130 + +[gcode_macro _START_PRINT_BASE] +description: Call when starting to print +gcode: + _CLEAR_LAST_FILE + _RUNOUT_HANDLE + +[gcode_macro START_PRINT] +gcode: + {% set BED_TEMP = params.BED|default(0)|float %} + {% set EXTRUDER_TEMP = params.EXTRUDER|default(0)|float %} + {% set EXTRUDER_TEMP1 = params.EXTRUDER1|default(0)|float %} + {% set CHAMBER_TEMP = params.CHAMBER|default(0)|float %} + {% if params.BED is defined %} + M140 S{BED_TEMP} + {% endif %} + {% if params.EXTRUDER is defined %} + M104 T0 S{EXTRUDER_TEMP} + {% endif %} + {% if params.EXTRUDER1 is defined %} + M104 T1 S{EXTRUDER_TEMP1} + {% endif %} + {% if params.CHAMBER is defined %} + M141 S{CHAMBER_TEMP} + {% endif %} + G28 + _START_PRINT_BED_MESH + {% if BED_TEMP != 0 %} + M190 S{BED_TEMP} + {% endif %} + {% if EXTRUDER_TEMP != 0 %} + M109 T0 S{EXTRUDER_TEMP} + {% endif %} + {% if EXTRUDER_TEMP1 != 0 %} + M109 T1 S{EXTRUDER_TEMP1} + {% endif %} + {% if CHAMBER_TEMP != 0 %} + M191 S{CHAMBER_TEMP} + {% endif %} + G92 E0 + M117 Printing start... + +[gcode_macro END_PRINT] +gcode: + M400 + G92 E0 + G1 E-10.0 F3600 + G91 + G0 Z1.00 X20.0 Y20.0 F6000 + TURN_OFF_HEATERS + M107 + G1 Z2 F3000 + G90 + G0 X590 Y590 F3600 + # BED_MESH_CLEAR + +[gcode_macro LOAD_FILAMENT] +variable_load_distance: 120 +variable_purge_distance: 25 +gcode: + {% set speed = params.SPEED|default(200) %} + {% set max_velocity = printer.configfile.settings['extruder'].max_extrude_only_velocity * 10 %} + SAVE_GCODE_STATE NAME=load_state + G91 + G92 E0 + G1 E{load_distance} F{max_velocity} # fast-load + G1 E{purge_distance} F{speed} # purge + RESTORE_GCODE_STATE NAME=load_state + +[gcode_macro UNLOAD_FILAMENT] +variable_unload_distance: 50 +variable_advance_unload_distance: 80 +variable_purge_distance: 10 +gcode: + {% set speed = params.SPEED|default(200) %} + {% set max_velocity = printer.configfile.settings['extruder'].max_extrude_only_velocity * 10 %} + SAVE_GCODE_STATE NAME=unload_state + G91 + G92 E0 + G1 E{purge_distance} F{speed} # purge + G1 E-{advance_unload_distance} F{max_velocity} + G1 E-{4} F60 + G1 E-{unload_distance} F{max_velocity} # fast-unload + RESTORE_GCODE_STATE NAME=unload_state + +[gcode_macro SET_X_OFFSET] +gcode: + {% set svv = printer.save_variables.variables %} + {% set dual_x_offset=params.S|default(-60)|float %} + SAVE_VARIABLE VARIABLE=dual_x_offset VALUE={dual_x_offset} + +[gcode_macro SET_Y_OFFSET] +gcode: + {% set svv = printer.save_variables.variables %} + {% set dual_y_offset=params.S|default(0)|float %} + SAVE_VARIABLE VARIABLE=dual_y_offset VALUE={dual_y_offset} + +[gcode_macro SET_Z_OFFSET] +gcode: + {% set svv = printer.save_variables.variables %} + {% set dual_z_offset=params.S|default(0)|float %} + SAVE_VARIABLE VARIABLE=dual_z_offset VALUE={dual_z_offset} + +[gcode_macro _ACTIVATE_DEFAULT_EXTRUDER] + gcode: + {% if printer.toolhead.extruder == 'extruder' %} + T0 + {% elif printer.toolhead.extruder == 'extruder1' %} + T1 + {% endif %} + +######################################## +# GCODE +######################################## + +[gcode_macro G28] +rename_existing: C28 +gcode: + {% set homing_cmd = ''%} + {% set do_x = 'X' in params|string %} + {% set do_y = 'Y' in params|string %} + {% set do_z = 'Z' in params|string %} + + {% if do_x %} + SET_STEPPER_ENABLE STEPPER=stepper_x ENABLE=1 + G4 P300 + {% set homing_cmd = 'X ' %} + {% endif %} + {% if do_y %} + SET_STEPPER_ENABLE STEPPER=stepper_y ENABLE=1 + G4 P300 + {% set homing_cmd = homing_cmd + 'Y ' %} + {% endif %} + {% if do_z %} + {% if 'x' not in printer.toolhead.homed_axes|lower or 'y' not in printer.toolhead.homed_axes|lower %} + {% set homing_cmd = 'X Y Z' %} + {% else %} + {% set homing_cmd = homing_cmd + 'Z' %} + {% endif %} + {% endif %} + {% if not homing_cmd %} + SET_STEPPER_ENABLE STEPPER=stepper_x ENABLE=1 + SET_STEPPER_ENABLE STEPPER=stepper_y ENABLE=1 + G4 P300 + C28 + _ACTIVATE_DEFAULT_EXTRUDER + {% else %} + C28 {homing_cmd} + {% if 'X' in homing_cmd %} + _ACTIVATE_DEFAULT_EXTRUDER + {% endif %} + {% endif %} + +[gcode_macro M109] +rename_existing: C109 +gcode: + {% set hotend = printer.toolhead.extruder %} + {% set s = params.S|default(0)|float %} + {% set t = params.T|default(0)|int %} + {% if params.S is defined %} + {% if params.T is defined %} + {% set hotend = "extruder" ~ (t if t != 0 else '') %} + {% endif %} + SET_HEATER_TEMPERATURE HEATER={hotend} TARGET={s} + {% if s != 0 %} + TEMPERATURE_WAIT SENSOR={hotend} MINIMUM={s-3} MAXIMUM={s+3} + {% endif %} + {% endif %} + +[gcode_macro M141] +gcode: + {% set s = params.S|default(0)|float %} + {% if params.S is defined %} + SET_HEATER_TEMPERATURE HEATER=chamber target={s|int} + {% endif %} + +[gcode_macro M190] +rename_existing: C190 +gcode: + {% set s = params.S|default(0)|float %} + {% if params.S is defined %} + SET_HEATER_TEMPERATURE HEATER="heater_bed" TARGET={s} + {% if s != 0 %} + TEMPERATURE_WAIT SENSOR="heater_bed" MINIMUM={s-3} MAXIMUM={s+3} + {% endif %} + {% endif %} + +[gcode_macro M191] +gcode: + {% set s = params.S|default(0)|float %} + {% if params.S is defined %} + M141 S{s} + {% if s != 0 %} + TEMPERATURE_WAIT SENSOR="heater_generic chamber" MINIMUM={s-3} MAXIMUM={s+3} + {% endif %} + {% endif %} + +[gcode_macro M84] +rename_existing: C84 +gcode: + C84 + SET_STEPPER_ENABLE STEPPER=stepper_z enable=1 + +######################################## +# CANCEL_PRINT/PAUSE/RESUME/ +######################################## + +[gcode_macro _CLIENT_VARIABLE] +variable_use_custom_pos : True +variable_custom_park_x : 500.0 +variable_custom_park_y : 350.0 +variable_custom_park_dz : 20.0 +variable_retract : 2.0 +variable_cancel_retract : 10.0 +variable_speed_retract : 60.0 +variable_unretract : 20.0 +variable_speed_unretract : 6.0 +variable_speed_hop : 5.0 +variable_speed_move : 100.0 +variable_park_at_cancel : False +variable_park_at_cancel_x : None +variable_park_at_cancel_y : None +variable_use_fw_retract : False +variable_idle_timeout : 600 +variable_runout_sensor : "" +variable_filament_sensor : "filament_switch_sensor extruder" +variable_filament_sensor1 : "filament_switch_sensor extruder1" +variable_user_temp_macro : "_USER_TEMP_RESUME" +variable_user_pause_macro : "_USER_PAUSE" +variable_user_resume_macro: "" +variable_user_cancel_macro: "_USER_CANCEL" +gcode: + # Nothing + +[gcode_macro _USER_PAUSE] +gcode: + {% set extruderTools = [('extruder', 'last_extruder_temp'), + ('extruder1', 'last_extruder1_temp')] %} + {% set act = printer.gcode_move.gcode_position %} + SAVE_VARIABLE VARIABLE=power_resume_z VALUE={act.z} + {% for extruder_name, name in extruderTools %} + {% set temp = printer[extruder_name].target if extruder_name in printer else 0 %} + {% set restore = False if printer[extruder_name] == '' + else True if params.RESTORE|default(1)|int == 1 else False %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE={name} VALUE="{{'restore': restore, 'temp': temp}}" + {% endfor %} + +[gcode_macro _USER_TEMP_RESUME] +gcode: + {% set extruder_info = [ + {'index': 0, 'name': 'last_extruder_temp'}, + {'index': 1, 'name': 'last_extruder1_temp'}] %} + + {% for info in extruder_info %} + {% set variable = printer["gcode_macro RESUME"][info.name] %} + {% if variable.restore %} + M104 T{ info.index } S{ variable.temp } + {% endif %} + {% endfor %} + {% for info in extruder_info %} + {% set variable = printer["gcode_macro RESUME"][info.name] %} + {% if variable.restore %} + {% set tool = "extruder" if info.index == 0 else "extruder1" %} + {% set needwait = True if printer[tool].temperature < variable.temp else False %} + {% if needwait %} + M109 T{info.index} S{variable.temp} + {% endif %} + {% endif %} + {% endfor %} + +[gcode_macro _USER_CANCEL] +gcode: + G91 + G1 Z30 F600 ; lift nozzle + M84 + +[gcode_macro RESUME] +description: Resume the actual running print +rename_existing: RESUME_BASE +variable_last_extruder_temp: {'restore': False, 'temp': 0} +variable_last_extruder1_temp: {'restore': False, 'temp': 0} +variable_restore_idle_timeout: 0 +variable_idle_state: False +variable_filament_state: False +gcode: + ##### get user parameters or use default ##### + {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} + {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config + else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder + {% set do_resume = False %} + {% set prompt_txt = [] %} + {% set runout = True %} + ##### end of definitions ##### + _FILAMENT_UPDATE + #### Printer comming from timeout idle state #### + {% if printer.idle_timeout.state|upper == "IDLE" or idle_state %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False + {% if last_extruder_temp.restore or last_extruder1_temp.restore %} + # we need to use the unicode (\u00B0) for the ° as py2 env's would throw an error otherwise + RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % (printer.toolhead.extruder, last_extruder_temp.temp) }' + {client.user_temp_macro|default("")} + {% set do_resume = True %} + {% elif can_extrude %} + {% set do_resume = True %} + {% else %} + RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}' + {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} + {% endif %} + #### Printer comming out of regular PAUSE state #### + {% elif can_extrude %} + {% set do_resume = True %} + {% else %} + RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}' + {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} + {% endif %} + _ACT_RESUME DO_RESUME={do_resume} + +[gcode_macro _ACT_RESUME] +gcode: + ##### get user parameters or use default ##### + {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} + {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} + {% set sp_move = client.speed_move|default(velocity) %} + {% set do_resume = true if params.DO_RESUME|default(False)|lower == 'true' else false %} + {% set filament_state = printer['gcode_macro RESUME'].filament_state|default(False) %} + {% set restore_idle_timeout = printer['gcode_macro RESUME'].restore_idle_timeout|default(0) %} + {% set prompt_txt = [] %} + {% if filament_state %} + {% if do_resume %} + {% if restore_idle_timeout > 0 %} SET_IDLE_TIMEOUT TIMEOUT={restore_idle_timeout} {% endif %} # restore idle_timeout time + {client.user_resume_macro|default("")} + _CLIENT_EXTRUDE + RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} + {% else %} + {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} + {% endif %} + {% else %} + RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" detects no filament, please load filament and press RESUME" % printer.toolhead.extruder}' + {% set _d = prompt_txt.append("\"%s\" detects no filament, please load filament and press RESUME" % printer.toolhead.extruder) %} + {% endif %} + ##### Generate User Information box in case of abort ##### + {% if not (filament_state and do_resume) %} + RESPOND TYPE=command MSG="action:prompt_begin RESUME aborted !!!" + {% for element in prompt_txt %} + RESPOND TYPE=command MSG='{"action:prompt_text %s" % element}' + {% endfor %} + RESPOND TYPE=command MSG="action:prompt_footer_button Ok|RESPOND TYPE=command MSG=action:prompt_end|info" + RESPOND TYPE=command MSG="action:prompt_show" + {% endif %} + +######################################## +# filament_runout +######################################## + +[gcode_macro _FILAMENT_UPDATE] +gcode: + {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} + {% set runout_resume = True if client.filament_sensor|default("") == "" # no runout + else True if not printer[client.filament_sensor].enabled # sensor is disabled + else printer[client.filament_sensor].filament_detected %} # sensor status + {% set runout_resume1 = True if client.filament_sensor1|default("") == "" # no runout + else True if not printer[client.filament_sensor1].enabled # sensor1 is disabled + else printer[client.filament_sensor1].filament_detected %} # sensor1 status + ##### filament check ##### + {% if printer["dual_carriage"] is not defined %} + {% set runout = runout_resume if printer.toolhead.extruder == "extruder" else runout_resume1 %} + {% else %} + {% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %} + {% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %} + {% set runout = True if (runout_resume and runout_resume1) else false %} + {% else %} + {% set runout = runout_resume if printer.toolhead.extruder == "extruder" else runout_resume1 %} + {% endif %} + {% endif %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=filament_state VALUE={ runout } + +[gcode_macro _RUNOUT_HANDLE] +description: filament state update +gcode: + _FILAMENT_UPDATE + {% if printer.print_stats.state == "printing" %} + _RUNOUT_PAUSE + {% endif %} + +[gcode_macro _RUNOUT_PAUSE] +gcode: + {% set filament_state = printer['gcode_macro RESUME'].filament_state|default(False) %} + {% if not filament_state %} + {% set msg_extruder = "extruder" if printer.toolhead.extruder == "extruder" else "extruder1" %} + RESPOND TYPE=echo MSG='{"Noting! \"%s\" filament has been pulled out." % msg_extruder}' + PAUSE + {% endif %} + +######################################## +# power loss recovery +######################################## + +[delayed_gcode _CHECK_POWER_LOSS_RECOVERY] +initial_duration: 1 +gcode: + {% set was_interrupted = printer.save_variables.variables.was_interrupted | default(False) | string %} + {% set enable_recovery = printer.save_variables.variables.power_loss_recovery | default(Ture) | string %} + {% if enable_recovery != "False" and was_interrupted == "True" %} + RESPOND TYPE=command MSG="action:prompt_begin " + RESPOND TYPE=command MSG="action:prompt_text The last print job was not completed continue printing?" + RESPOND TYPE=command MSG="action:prompt_footer_button Continue|_RESUME_INTERRUPTED" + RESPOND TYPE=command MSG="action:prompt_footer_button Cancel|_ABORT_INTERRUPTED|error" + RESPOND TYPE=command MSG="action:prompt_show" + {% endif %} + +[gcode_shell_command _CLEAR_PLR] +command: sh /home/klipper/klipper/scripts/clear_plr.sh +timeout: 5. +verbose: False + +[gcode_macro _CLEAR_LAST_FILE] +gcode: + {% set filename = '' %} + {% set filepath = '' %} + RUN_SHELL_COMMAND CMD=_CLEAR_PLR + SAVE_VARIABLE VARIABLE=last_file VALUE='"{ filename }"' + SAVE_VARIABLE VARIABLE=filepath VALUE='"{ filepath }"' + {% set zero_vars = ['power_resume_x', 'power_resume_y', 'power_resume_z'] %} + {% for var in zero_vars %} + SAVE_VARIABLE VARIABLE={var} VALUE=0 + {% endfor %} + SAVE_VARIABLE VARIABLE=was_interrupted VALUE=False + +[gcode_shell_command _POWER_LOSS_RECOVERY] +command: /home/klipper/klipper/scripts/plr.sh +timeout: 420. +verbose: False + +[gcode_macro _RESUME_INTERRUPTED] +gcode: + {% set sv = printer.save_variables.variables %} + {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} + {% set park_dz = client.custom_park_dz|default(2.0)|abs %} + RESPOND TYPE=command MSG="action:prompt_end" + SET_GCODE_OFFSET Z=0 MOVE=0 + {% set z_height = params.Z_HEIGHT|default(sv.power_resume_z)|float %} + {% set is_paused = sv.power_loss_paused|default(False) %} + {% set last_file = params.GCODE_FILE|default(sv.last_file)|string %} + {% set hotend = sv.power_resume_extruder|default("extruder")%} + {% set z_offset = sv.nozzle_z_offset_val|default(0)|float %} + {% set z_offset_total = park_dz if is_paused else 0 %} + {% if hotend == "extruder1" %} + {% set z_offset_total = z_offset_total + z_offset %} + {% endif %} + M118 Recovery in progress, please wait + RUN_SHELL_COMMAND CMD=_POWER_LOSS_RECOVERY PARAMS="{z_height} \"{last_file}\" \"{z_offset_total}\"" + SDCARD_PRINT_FILE FILENAME=.plr/"{last_file}" + SAVE_VARIABLE VARIABLE=was_interrupted VALUE=False + +[gcode_macro _ABORT_INTERRUPTED] +gcode: + RESPOND TYPE=command MSG="action:prompt_end" + _CLEAR_LAST_FILE + +######################################## +# Adaptive mesh +######################################## + +[gcode_macro Adaptive_Mesh] +description: This macro contains all adjustable settings for KAMP +variable_verbose_enable: True # Set to True to enable KAMP information output when running. This is useful for debugging. +variable_mesh_margin: 5 # Expands the mesh size in millimeters if desired. Leave at 0 to disable. +variable_fuzz_amount: 0 # Slightly randomizes mesh points to spread out wear from nozzle-based probes. Leave at 0 to disable. + +gcode: # Gcode section left intentionally blank. Do not disturb. +# Noting + +[gcode_macro _START_PRINT_BED_MESH] +gcode: + {% set idex_mode = False %} + {% set profiles = printer["bed_mesh"].profiles %} + {% set svv = printer.save_variables.variables %} + {% set adaptive_mesh = svv.adaptive_meshing|default(false)|lower %} + {% if printer["dual_carriage"] is defined %} + {% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %} + {% if current_idex_mode == "copy" or idex_mode == "mirror" %} + {% set idex_mode = True %} + {% endif %} + {% endif %} + + {% if adaptive_mesh|lower == 'true' %} + {% if printer.exclude_object.objects != [] %} + {% if idex_mode %} + BED_MESH_CLEAR + {% else %} + BED_MESH_CALIBRATE PROFILE=adaptive + {% endif %} + {% else %} + {% if idex_mode %} + BED_MESH_CLEAR + {% else %} + {% if 'default' in profiles %} + BED_MESH_PROFILE LOAD=default + {% else %} + BED_MESH_CALIBRATE PROFILE=default + BED_MESH_PROFILE SAVE=default + {% endif %} + {% endif %} + {% endif %} + {% endif %} + +[gcode_macro BED_MESH_CALIBRATE] +rename_existing: _BED_MESH_CALIBRATE +gcode: + {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} # Gather all object points + {% set bed_mesh_min = printer.configfile.settings.bed_mesh.mesh_min %} # Get bed mesh min from printer.cfg + {% set bed_mesh_max = printer.configfile.settings.bed_mesh.mesh_max %} # Get bed mesh max from printer.cfg + {% set probe_count = printer.configfile.settings.bed_mesh.probe_count %} # Get probe count from printer.cfg + {% set kamp_settings = printer["gcode_macro Adaptive_Mesh"] %} # Pull variables from _KAMP_Settings + {% set verbose_enable = kamp_settings.verbose_enable | abs %} # Pull verbose setting from _KAMP_Settings + {% set mesh_margin = kamp_settings.mesh_margin | float %} # Pull mesh margin setting from _KAMP_Settings + {% set fuzz_amount = kamp_settings.fuzz_amount | float %} # Pull fuzz amount setting from _KAMP_Settings + {% set default_profile = params.PROFILE | default("default") %} # get default mesh profile + {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} # If probe count is only a single number, convert it to 2. E.g. probe_count:7 = 7,7 + {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} # Determine max probe point distance + {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} # Determine max probe point distance + {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} # Set x_min from smallest object x point + {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} # Set y_min from smallest object y point + {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} # Set x_max from largest object x point + {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} # Set y_max from largest object y point + + {% set fuzz_range = range((0) | int, (fuzz_amount * 100) | int + 1) %} # Set fuzz_range between 0 and fuzz_amount + {% set adapted_x_min = x_min - mesh_margin - (fuzz_range | random / 100.0) %} # Adapt x_min to margin and fuzz constraints + {% set adapted_y_min = y_min - mesh_margin - (fuzz_range | random / 100.0) %} # Adapt y_min to margin and fuzz constraints + {% set adapted_x_max = x_max + mesh_margin + (fuzz_range | random / 100.0) %} # Adapt x_max to margin and fuzz constraints + {% set adapted_y_max = y_max + mesh_margin + (fuzz_range | random / 100.0) %} # Adapt y_max to margin and fuzz constraints + + {% set adapted_x_min = [adapted_x_min , bed_mesh_min[0]] | max %} # Compare adjustments to defaults and choose max + {% set adapted_y_min = [adapted_y_min , bed_mesh_min[1]] | max %} # Compare adjustments to defaults and choose max + {% set adapted_x_max = [adapted_x_max , bed_mesh_max[0]] | min %} # Compare adjustments to defaults and choose min + {% set adapted_y_max = [adapted_y_max , bed_mesh_max[1]] | min %} # Compare adjustments to defaults and choose min + + {% set points_x = (((adapted_x_max - adapted_x_min) / max_probe_point_distance_x) | round(method='ceil') | int) + 1 %} # Define probe_count's x point count and round up + {% set points_y = (((adapted_y_max - adapted_y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} # Define probe_count's y point count and round up + + {% if (([points_x, points_y]|max) > 6) %} # + {% set algorithm = "bicubic" %} # + {% set min_points = 4 %} # + {% else %} # Calculate if algorithm should be bicubic or lagrange + {% set algorithm = "lagrange" %} # + {% set min_points = 3 %} # + {% endif %} # + + {% set points_x = [points_x , min_points]|max %} # Set probe_count's x points to fit the calculated algorithm + {% set points_y = [points_y , min_points]|max %} # Set probe_count's y points to fit the calculated algorithm + {% set points_x = [points_x , probe_count[0]]|min %} + {% set points_y = [points_y , probe_count[1]]|min %} + + {% if verbose_enable == True %} # If verbose is enabled, print information about KAMP's calculations + {% if printer.exclude_object.objects != [] %} + + { action_respond_info( "Algorithm: {}.".format( + (algorithm), + )) } + + { action_respond_info("Default probe count: {},{}.".format( + (probe_count[0]), + (probe_count[1]), + )) } + + { action_respond_info("Adapted probe count: {},{}.".format( + (points_x), + (points_y), + )) } + + {action_respond_info("Default mesh bounds: {}, {}.".format( + (bed_mesh_min[0],bed_mesh_min[1]), + (bed_mesh_max[0],bed_mesh_max[1]), + )) } + + {% if mesh_margin > 0 %} + {action_respond_info("Mesh margin is {}, mesh bounds extended by {}mm.".format( + (mesh_margin), + (mesh_margin), + )) } + {% else %} + {action_respond_info("Mesh margin is 0, margin not increased.")} + {% endif %} + + {% if fuzz_amount > 0 %} + {action_respond_info("Mesh point fuzzing enabled, points fuzzed up to {}mm.".format( + (fuzz_amount), + )) } + {% else %} + {action_respond_info("Fuzz amount is 0, mesh points not fuzzed.")} + {% endif %} + + { action_respond_info("Adapted mesh bounds: {}, {}.".format( + (adapted_x_min, adapted_y_min), + (adapted_x_max, adapted_y_max), + )) } + + {action_respond_info("KAMP adjustments successful. Happy KAMPing!")} + + {% else %} + + {action_respond_info("No objects detected! Check your gcode and make sure that EXCLUDE_OBJECT_DEFINE is happening before BED_MESH_CALIBRATE is called. Defaulting to regular meshing.")} + G4 P5000 # Wait 5 seconds to make error more visible + {% endif %} + + {% endif %} + + _BED_MESH_CALIBRATE PROFILE={default_profile} mesh_min={adapted_x_min},{adapted_y_min} mesh_max={adapted_x_max},{adapted_y_max} ALGORITHM={algorithm} PROBE_COUNT={points_x},{points_y} # End of verbose + BED_MESH_PROFILE LOAD={default_profile} diff --git a/config/CreatBot_D1000_V0/printer.cfg b/config/CreatBot_D1000_V0/printer.cfg new file mode 100644 index 000000000..633bf59e4 --- /dev/null +++ b/config/CreatBot_D1000_V0/printer.cfg @@ -0,0 +1,37 @@ +[include base.cfg] + +[extruder] +control = pid +pid_kp = 26.414 +pid_ki = 1.334 +pid_kd = 130.750 + +[extruder1] +control = pid +pid_kp = 26.414 +pid_ki = 1.334 +pid_kd = 130.750 + +[heater_bed] +control = pid +pid_kp = 52.123 +pid_ki = 0.922 +pid_kd = 736.891 + +[heater_generic chamber] +control: pid +pid_kp: 214.568 +pid_ki: 8.115 +pid_kd: 0 + +[probe] +z_offset: 4 + +#*# <---------------------- SAVE_CONFIG ----------------------> +#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated. +#*# +#*# [input_shaper] +#*# shaper_type_x = mzv +#*# shaper_freq_x = 31.2 +#*# shaper_type_y = ei +#*# shaper_freq_y = 29.6 \ No newline at end of file diff --git a/config/CreatBot_D600Pro2_V0/base.cfg b/config/CreatBot_D600Pro2_V0/base.cfg new file mode 100644 index 000000000..95b0bf4d3 --- /dev/null +++ b/config/CreatBot_D600Pro2_V0/base.cfg @@ -0,0 +1,932 @@ +# This is a configuration file for the Creatbot D600Pro2_V0. +[include mainsail.cfg] + +[virtual_sdcard] +path: ~/printer_data/gcodes +on_error_gcode: CANCEL_PRINT + +[save_variables] +filename: ~/printer_data/config/config_variables.cfg + +[exclude_object] + +[gcode_arcs] +resolution: 1.0 + +[force_move] +enable_force_move: True + +[idle_timeout] +gcode: + {% if printer.webhooks.state|lower == 'ready' %} + {% if printer.pause_resume.is_paused %} + {% if printer["extruder"] is defined %} + SET_HEATER_TEMPERATURE HEATER=extruder + {% endif %} + {% if printer["extruder1"] is defined %} + SET_HEATER_TEMPERATURE HEATER=extruder1 + {% endif %} + {% else %} + TURN_OFF_HEATERS + {% endif %} + {% endif %} +timeout: 1800 # 0.5 hour timeout + +# F446 MotherBoard ID +[mcu] +canbus_uuid:000000000010 +canbus_interface: can0 + +[printer] +kinematics: cartesian +max_velocity: 300 +max_accel: 5000 +max_z_velocity: 10 +max_z_accel: 100 +square_corner_velocity: 2.5 + +[bed_mesh] +speed: 300 +horizontal_move_z: 5 +mesh_min: 40,60 +mesh_max: 600, 600 +probe_count: 6,6 +mesh_pps: 2,2 +algorithm: bicubic +bicubic_tension: 0.2 + +[stepper_x] +step_pin: PD1 +dir_pin: PD0 +enable_pin: !PA15 +rotation_distance: 75 +microsteps: 100 +full_steps_per_rotation: 200 +endstop_pin: !PC10 +position_min: 0 +position_endstop: 0 +position_max: 600 +homing_speed: 100 +homing_retract_speed: 50 +second_homing_speed: 5 +homing_retract_dist: 10 +# homing_positive_dir: true + +[stepper_y] +step_pin: PD4 +dir_pin: !PD3 +enable_pin: !PD2 +rotation_distance: 75 +microsteps: 40 +full_steps_per_rotation: 200 +gear_ratio: 2.5:1 +endstop_pin: !PC11 +position_min: 0 +position_endstop: 0 +position_max: 600 +homing_speed: 100 +homing_retract_speed: 50 +second_homing_speed: 5 +homing_retract_dist: 10 +# homing_positive_dir: true + +[stepper_z] +step_pin: PD7 +dir_pin: PD6 +enable_pin: !PD5 +rotation_distance: 5 +gear_ratio: 2.5:1 +microsteps: 16 +full_steps_per_rotation: 200 +endstop_pin: probe:z_virtual_endstop +position_max: 600 +position_min: -4 +homing_speed: 10 +second_homing_speed: 1 +homing_retract_dist: 2.0 + +[heater_bed] +heater_pin: PD12 +sensor_type: Generic 3950 +sensor_pin: PC0 +max_power: 1.0 +min_temp: 0 +max_temp: 130 +# control: pid +# pid_kp: 59.368 +# pid_ki: 1.656 +# pid_kd: 532.083 + +[verify_heater heater_bed] +max_error: 20 +hysteresis: 5 +check_gain_time: 120 +heating_gain: 1 + +[heater_generic chamber] +heater_pin:PD15 +max_power:1.0 +sensor_type: Generic 3950 +sensor_pin:PC3 +min_temp: 0 +max_temp: 80 +pwm_cycle_time: 0.3 +# control: pid +# pid_kp: 30.68 +# pid_ki: 0.21 +# pid_kd: 0 + +[verify_heater chamber] +max_error: 120 +hysteresis: 100 +check_gain_time: 3600 +heating_gain: 0.01 + +[fan_generic Air_filter_fan] +pin: PC8 +max_power: 1.0 +shutdown_speed: 0.0 +kick_start_time: 1.0 +off_below: 0.10 + +[filament_switch_sensor extruder] +pause_on_runout: False +runout_gcode: _RUNOUT_HANDLE +event_delay: 3.0 +pause_delay: 0.5 +switch_pin: ^PC14 + +[filament_switch_sensor extruder1] +pause_on_runout: False +runout_gcode: _RUNOUT_HANDLE +event_delay: 3.0 +pause_delay: 0.5 +switch_pin: ^PC15 +[fan] +pin:PC7 +kick_start_time: 0.5 +off_below: 0.10 +max_power: 1.0 + +[heater_fan Sink_fan_0] +pin:PC6 +max_power: 1.0 +kick_start_time: 0.5 +heater: extruder +off_below: 0.10 +heater_temp: 100 + +[extruder] +sensor_type: AD8495 +adc_voltage: 3.3 +sensor_pin: PC1 + +[verify_heater extruder] +max_error: 20 +check_gain_time: 60 +hysteresis: 10 +heating_gain: 1 + +[extruder] +step_pin: PD9 +dir_pin: PD10 +enable_pin: !PD11 +microsteps: 16 +full_steps_per_rotation: 200 +rotation_distance:22.9116807962642578993 +gear_ratio: 48:19 +nozzle_diameter: 0.6 +filament_diameter: 1.750 +max_extrude_only_distance: 500.0 +max_extrude_only_velocity: 60.0 +max_extrude_only_accel: 1000.0 +max_extrude_cross_section:5 +heater_pin: PD13 +max_power: 1.0 +min_temp: 0 +max_temp: 435 +min_extrude_temp: 180 +pressure_advance: 0.03 +pressure_advance_smooth_time:0.040 +# control = pid +# pid_kp = 21.950 +# pid_ki = 0.887 +# pid_kd = 135.815 + +[extruder1] +sensor_type: AD8495 +adc_voltage: 3.3 +sensor_pin: PC2 + +[verify_heater extruder1] +max_error: 20 +check_gain_time: 60 +hysteresis: 10 +heating_gain: 1 + +[extruder1] +step_pin: PE15 +dir_pin: PB10 +enable_pin: !PD8 +microsteps: 16 +full_steps_per_rotation: 200 +rotation_distance: 22.9116807962642578993 +gear_ratio: 48:19 +nozzle_diameter: 0.6 +filament_diameter: 1.750 +max_extrude_only_distance: 500.0 +max_extrude_only_velocity: 60.0 +max_extrude_only_accel: 1000.0 +max_extrude_cross_section:5 +heater_pin: PD14 +max_power: 1.0 +min_temp: 0 +max_temp: 435 +min_extrude_temp: 180 +pressure_advance: 0.032 +pressure_advance_smooth_time:0.040 +# control = pid +# pid_kp = 21.950 +# pid_ki = 0.887 +# pid_kd = 135.815 + + +[probe] +pin: !PC12 +x_offset: 36 +y_offset: 59 +#z_offset: 4 +speed: 5.0 +samples: 3 +samples_result: median +sample_retract_dist: 2.0 +samples_tolerance: 0.05 +samples_tolerance_retries: 3 +deactivate_on_each_sample: False +activate_gcode: PROBE_SERVO_OPEN +deactivate_gcode: PROBE_SERVO_CLOSE + +[servo probe_servo] +pin: PE5 +maximum_servo_angle: 180 +minimum_pulse_width: 0.000900 +maximum_pulse_width: 0.002100 +initial_angle: 130 +# initial_pulse_width: + +[servo switch_nozzle] +pin: PE6 +maximum_servo_angle: 270 +minimum_pulse_width: 0.000512 +maximum_pulse_width: 0.002528 +initial_angle: 135 +# initial_pulse_width: + +[safe_z_home] +home_xy_position: 300,300 +speed:100 +z_hop:5 +z_hop_speed: 10 + +[gcode_macro ENABLE_MOTOR] +gcode: + SET_STEPPER_ENABLE STEPPER=stepper_x ENABLE=1 + SET_STEPPER_ENABLE STEPPER=stepper_y ENABLE=1 + SET_KINEMATIC_POSITION X=300 Y=300 Z=0 + +[gcode_macro T0] +gcode: + SET_SERVO SERVO=switch_nozzle angle=135 + G4 P500 + SET_GCODE_OFFSET Z=0 + SET_GCODE_OFFSET Y=0 + SET_GCODE_OFFSET X=0 + SET_SERVO SERVO=switch_nozzle angle=45 + ACTIVATE_EXTRUDER EXTRUDER=extruder + _RUNOUT_HANDLE + +[gcode_macro T1] +gcode: + {% set sv = printer.save_variables.variables %} + {% set x_offset = sv.dual_x_offset|default(60)|float %} + {% set y_offset = sv.dual_y_offset|default(0)|float %} + {% set z_offset = sv.dual_z_offset|default(0)|float %} + SET_SERVO SERVO=switch_nozzle angle=135 + G4 P500 + SET_GCODE_OFFSET Z={z_offset} + SET_GCODE_OFFSET Y={y_offset} + SET_GCODE_OFFSET X={x_offset} + SET_SERVO SERVO=switch_nozzle angle=225 + ACTIVATE_EXTRUDER EXTRUDER=extruder1 + _RUNOUT_HANDLE + +[gcode_macro PROBE_SERVO_OPEN] +gcode: + SET_SERVO SERVO=probe_servo angle=15 + G4 P1000 + +[gcode_macro PROBE_SERVO_CLOSE] +gcode: + SET_SERVO SERVO=probe_servo angle=130 + +[gcode_macro _START_PRINT_BASE] +description: Call when starting to print +gcode: + _CLEAR_LAST_FILE + _RUNOUT_HANDLE + +[gcode_macro START_PRINT] +gcode: + {% set BED_TEMP = params.BED|default(0)|float %} + {% set EXTRUDER_TEMP = params.EXTRUDER|default(0)|float %} + {% set EXTRUDER_TEMP1 = params.EXTRUDER1|default(0)|float %} + {% set CHAMBER_TEMP = params.CHAMBER|default(0)|float %} + {% if params.BED is defined %} + M140 S{BED_TEMP} + {% endif %} + {% if params.EXTRUDER is defined %} + M104 T0 S{EXTRUDER_TEMP} + {% endif %} + {% if params.EXTRUDER1 is defined %} + M104 T1 S{EXTRUDER_TEMP1} + {% endif %} + {% if params.CHAMBER is defined %} + M141 S{CHAMBER_TEMP} + {% endif %} + G28 + _START_PRINT_BED_MESH + {% if BED_TEMP != 0 %} + M190 S{BED_TEMP} + {% endif %} + {% if EXTRUDER_TEMP != 0 %} + M109 T0 S{EXTRUDER_TEMP} + {% endif %} + {% if EXTRUDER_TEMP1 != 0 %} + M109 T1 S{EXTRUDER_TEMP1} + {% endif %} + {% if CHAMBER_TEMP != 0 %} + M191 S{CHAMBER_TEMP} + {% endif %} + G92 E0 + M117 Printing start... + +[gcode_macro END_PRINT] +gcode: + M400 + G92 E0 + G1 E-10.0 F3600 + G91 + G0 Z1.00 X20.0 Y20.0 F6000 + TURN_OFF_HEATERS + M107 + G1 Z2 F3000 + G90 + G0 X590 Y590 F3600 + # BED_MESH_CLEAR + +[gcode_macro LOAD_FILAMENT] +variable_load_distance: 120 +variable_purge_distance: 25 +gcode: + {% set speed = params.SPEED|default(200) %} + {% set max_velocity = printer.configfile.settings['extruder'].max_extrude_only_velocity * 10 %} + SAVE_GCODE_STATE NAME=load_state + G91 + G92 E0 + G1 E{load_distance} F{max_velocity} # fast-load + G1 E{purge_distance} F{speed} # purge + RESTORE_GCODE_STATE NAME=load_state + +[gcode_macro UNLOAD_FILAMENT] +variable_unload_distance: 50 +variable_advance_unload_distance: 80 +variable_purge_distance: 10 +gcode: + {% set speed = params.SPEED|default(200) %} + {% set max_velocity = printer.configfile.settings['extruder'].max_extrude_only_velocity * 10 %} + SAVE_GCODE_STATE NAME=unload_state + G91 + G92 E0 + G1 E{purge_distance} F{speed} # purge + G1 E-{advance_unload_distance} F{max_velocity} + G1 E-{4} F60 + G1 E-{unload_distance} F{max_velocity} # fast-unload + RESTORE_GCODE_STATE NAME=unload_state + +[gcode_macro SET_X_OFFSET] +gcode: + {% set svv = printer.save_variables.variables %} + {% set dual_x_offset=params.S|default(-60)|float %} + SAVE_VARIABLE VARIABLE=dual_x_offset VALUE={dual_x_offset} + +[gcode_macro SET_Y_OFFSET] +gcode: + {% set svv = printer.save_variables.variables %} + {% set dual_y_offset=params.S|default(0)|float %} + SAVE_VARIABLE VARIABLE=dual_y_offset VALUE={dual_y_offset} + +[gcode_macro SET_Z_OFFSET] +gcode: + {% set svv = printer.save_variables.variables %} + {% set dual_z_offset=params.S|default(0)|float %} + SAVE_VARIABLE VARIABLE=dual_z_offset VALUE={dual_z_offset} + +[gcode_macro _ACTIVATE_DEFAULT_EXTRUDER] + gcode: + {% if printer.toolhead.extruder == 'extruder' %} + T0 + {% elif printer.toolhead.extruder == 'extruder1' %} + T1 + {% endif %} + +######################################## +# GCODE +######################################## + +[gcode_macro G28] +rename_existing: C28 +gcode: + {% set homing_cmd = ''%} + {% set do_x = 'X' in params|string %} + {% set do_y = 'Y' in params|string %} + {% set do_z = 'Z' in params|string %} + + {% if do_x %} + {% set homing_cmd = 'X ' %} + {% endif %} + {% if do_y %} + {% set homing_cmd = homing_cmd + 'Y ' %} + {% endif %} + {% if do_z %} + {% if 'x' not in printer.toolhead.homed_axes|lower or 'y' not in printer.toolhead.homed_axes|lower %} + {% set homing_cmd = 'X Y Z' %} + {% else %} + {% set homing_cmd = homing_cmd + 'Z' %} + {% endif %} + {% endif %} + {% if not homing_cmd %} + C28 + _ACTIVATE_DEFAULT_EXTRUDER + {% else %} + C28 {homing_cmd} + {% if 'X' in homing_cmd %} + _ACTIVATE_DEFAULT_EXTRUDER + {% endif %} + {% endif %} + +[gcode_macro M109] +rename_existing: C109 +gcode: + {% set hotend = printer.toolhead.extruder %} + {% set s = params.S|default(0)|float %} + {% set t = params.T|default(0)|int %} + {% if params.S is defined %} + {% if params.T is defined %} + {% set hotend = "extruder" ~ (t if t != 0 else '') %} + {% endif %} + SET_HEATER_TEMPERATURE HEATER={hotend} TARGET={s} + {% if s != 0 %} + TEMPERATURE_WAIT SENSOR={hotend} MINIMUM={s-3} MAXIMUM={s+3} + {% endif %} + {% endif %} + +[gcode_macro M141] +gcode: + {% set s = params.S|default(0)|float %} + {% if params.S is defined %} + SET_HEATER_TEMPERATURE HEATER=chamber target={s|int} + {% endif %} + +[gcode_macro M190] +rename_existing: C190 +gcode: + {% set s = params.S|default(0)|float %} + {% if params.S is defined %} + SET_HEATER_TEMPERATURE HEATER="heater_bed" TARGET={s} + {% if s != 0 %} + TEMPERATURE_WAIT SENSOR="heater_bed" MINIMUM={s-3} MAXIMUM={s+3} + {% endif %} + {% endif %} + +[gcode_macro M191] +gcode: + {% set s = params.S|default(0)|float %} + {% if params.S is defined %} + M141 S{s} + {% if s != 0 %} + TEMPERATURE_WAIT SENSOR="heater_generic chamber" MINIMUM={s-3} MAXIMUM={s+3} + {% endif %} + {% endif %} + +[gcode_macro M84] +rename_existing: C84 +gcode: + C84 + SET_STEPPER_ENABLE STEPPER=stepper_z enable=1 + +######################################## +# CANCEL_PRINT/PAUSE/RESUME/ +######################################## + +[gcode_macro _CLIENT_VARIABLE] +variable_use_custom_pos : True +variable_custom_park_x : 300.0 +variable_custom_park_y : 200.0 +variable_custom_park_dz : 20.0 +variable_retract : 2.0 +variable_cancel_retract : 10.0 +variable_speed_retract : 60.0 +variable_unretract : 20.0 +variable_speed_unretract : 6.0 +variable_speed_hop : 5.0 +variable_speed_move : 100.0 +variable_park_at_cancel : False +variable_park_at_cancel_x : None +variable_park_at_cancel_y : None +variable_use_fw_retract : False +variable_idle_timeout : 600 +variable_runout_sensor : "" +variable_filament_sensor : "filament_switch_sensor extruder" +variable_filament_sensor1 : "filament_switch_sensor extruder1" +variable_user_temp_macro : "_USER_TEMP_RESUME" +variable_user_pause_macro : "_USER_PAUSE" +variable_user_resume_macro: "" +variable_user_cancel_macro: "_USER_CANCEL" +gcode: + # Nothing + +[gcode_macro _USER_PAUSE] +gcode: + {% set extruderTools = [('extruder', 'last_extruder_temp'), + ('extruder1', 'last_extruder1_temp')] %} + {% set act = printer.gcode_move.gcode_position %} + SAVE_VARIABLE VARIABLE=power_resume_z VALUE={act.z} + {% for extruder_name, name in extruderTools %} + {% set temp = printer[extruder_name].target if extruder_name in printer else 0 %} + {% set restore = False if printer[extruder_name] == '' + else True if params.RESTORE|default(1)|int == 1 else False %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE={name} VALUE="{{'restore': restore, 'temp': temp}}" + {% endfor %} + +[gcode_macro _USER_TEMP_RESUME] +gcode: + {% set extruder_info = [ + {'index': 0, 'name': 'last_extruder_temp'}, + {'index': 1, 'name': 'last_extruder1_temp'}] %} + + {% for info in extruder_info %} + {% set variable = printer["gcode_macro RESUME"][info.name] %} + {% if variable.restore %} + M104 T{ info.index } S{ variable.temp } + {% endif %} + {% endfor %} + {% for info in extruder_info %} + {% set variable = printer["gcode_macro RESUME"][info.name] %} + {% if variable.restore %} + {% set tool = "extruder" if info.index == 0 else "extruder1" %} + {% set needwait = True if printer[tool].temperature < variable.temp else False %} + {% if needwait %} + M109 T{info.index} S{variable.temp} + {% endif %} + {% endif %} + {% endfor %} + +[gcode_macro _USER_CANCEL] +gcode: + G91 + G1 Z30 F600 ; lift nozzle + M84 + +[gcode_macro RESUME] +description: Resume the actual running print +rename_existing: RESUME_BASE +variable_last_extruder_temp: {'restore': False, 'temp': 0} +variable_last_extruder1_temp: {'restore': False, 'temp': 0} +variable_restore_idle_timeout: 0 +variable_idle_state: False +variable_filament_state: False +gcode: + ##### get user parameters or use default ##### + {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} + {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config + else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder + {% set do_resume = False %} + {% set prompt_txt = [] %} + {% set runout = True %} + ##### end of definitions ##### + _FILAMENT_UPDATE + #### Printer comming from timeout idle state #### + {% if printer.idle_timeout.state|upper == "IDLE" or idle_state %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False + {% if last_extruder_temp.restore or last_extruder1_temp.restore %} + # we need to use the unicode (\u00B0) for the ° as py2 env's would throw an error otherwise + RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % (printer.toolhead.extruder, last_extruder_temp.temp) }' + {client.user_temp_macro|default("")} + {% set do_resume = True %} + {% elif can_extrude %} + {% set do_resume = True %} + {% else %} + RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}' + {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} + {% endif %} + #### Printer comming out of regular PAUSE state #### + {% elif can_extrude %} + {% set do_resume = True %} + {% else %} + RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}' + {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} + {% endif %} + _ACT_RESUME DO_RESUME={do_resume} + +[gcode_macro _ACT_RESUME] +gcode: + ##### get user parameters or use default ##### + {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} + {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} + {% set sp_move = client.speed_move|default(velocity) %} + {% set do_resume = true if params.DO_RESUME|default(False)|lower == 'true' else false %} + {% set filament_state = printer['gcode_macro RESUME'].filament_state|default(False) %} + {% set restore_idle_timeout = printer['gcode_macro RESUME'].restore_idle_timeout|default(0) %} + {% set prompt_txt = [] %} + {% if filament_state %} + {% if do_resume %} + {% if restore_idle_timeout > 0 %} SET_IDLE_TIMEOUT TIMEOUT={restore_idle_timeout} {% endif %} # restore idle_timeout time + {client.user_resume_macro|default("")} + _CLIENT_EXTRUDE + RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} + {% else %} + {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} + {% endif %} + {% else %} + RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" detects no filament, please load filament and press RESUME" % printer.toolhead.extruder}' + {% set _d = prompt_txt.append("\"%s\" detects no filament, please load filament and press RESUME" % printer.toolhead.extruder) %} + {% endif %} + ##### Generate User Information box in case of abort ##### + {% if not (filament_state and do_resume) %} + RESPOND TYPE=command MSG="action:prompt_begin RESUME aborted !!!" + {% for element in prompt_txt %} + RESPOND TYPE=command MSG='{"action:prompt_text %s" % element}' + {% endfor %} + RESPOND TYPE=command MSG="action:prompt_footer_button Ok|RESPOND TYPE=command MSG=action:prompt_end|info" + RESPOND TYPE=command MSG="action:prompt_show" + {% endif %} + +######################################## +# filament_runout +######################################## + +[gcode_macro _FILAMENT_UPDATE] +gcode: + {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} + {% set runout_resume = True if client.filament_sensor|default("") == "" # no runout + else True if not printer[client.filament_sensor].enabled # sensor is disabled + else printer[client.filament_sensor].filament_detected %} # sensor status + {% set runout_resume1 = True if client.filament_sensor1|default("") == "" # no runout + else True if not printer[client.filament_sensor1].enabled # sensor1 is disabled + else printer[client.filament_sensor1].filament_detected %} # sensor1 status + ##### filament check ##### + {% if printer["dual_carriage"] is not defined %} + {% set runout = runout_resume if printer.toolhead.extruder == "extruder" else runout_resume1 %} + {% else %} + {% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %} + {% if current_idex_mode == 'copy' or current_idex_mode == 'mirror' %} + {% set runout = True if (runout_resume and runout_resume1) else false %} + {% else %} + {% set runout = runout_resume if printer.toolhead.extruder == "extruder" else runout_resume1 %} + {% endif %} + {% endif %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=filament_state VALUE={ runout } + +[gcode_macro _RUNOUT_HANDLE] +description: filament state update +gcode: + _FILAMENT_UPDATE + {% if printer.print_stats.state == "printing" %} + _RUNOUT_PAUSE + {% endif %} + +[gcode_macro _RUNOUT_PAUSE] +gcode: + {% set filament_state = printer['gcode_macro RESUME'].filament_state|default(False) %} + {% if not filament_state %} + {% set msg_extruder = "extruder" if printer.toolhead.extruder == "extruder" else "extruder1" %} + RESPOND TYPE=echo MSG='{"Noting! \"%s\" filament has been pulled out." % msg_extruder}' + PAUSE + {% endif %} + +######################################## +# power loss recovery +######################################## + +[delayed_gcode _CHECK_POWER_LOSS_RECOVERY] +initial_duration: 1 +gcode: + {% set was_interrupted = printer.save_variables.variables.was_interrupted | default(False) | string %} + {% set enable_recovery = printer.save_variables.variables.power_loss_recovery | default(Ture) | string %} + {% if enable_recovery != "False" and was_interrupted == "True" %} + RESPOND TYPE=command MSG="action:prompt_begin " + RESPOND TYPE=command MSG="action:prompt_text The last print job was not completed continue printing?" + RESPOND TYPE=command MSG="action:prompt_footer_button Continue|_RESUME_INTERRUPTED" + RESPOND TYPE=command MSG="action:prompt_footer_button Cancel|_ABORT_INTERRUPTED|error" + RESPOND TYPE=command MSG="action:prompt_show" + {% endif %} + +[gcode_shell_command _CLEAR_PLR] +command: sh /home/klipper/klipper/scripts/clear_plr.sh +timeout: 5. +verbose: False + +[gcode_macro _CLEAR_LAST_FILE] +gcode: + {% set filename = '' %} + {% set filepath = '' %} + RUN_SHELL_COMMAND CMD=_CLEAR_PLR + SAVE_VARIABLE VARIABLE=last_file VALUE='"{ filename }"' + SAVE_VARIABLE VARIABLE=filepath VALUE='"{ filepath }"' + {% set zero_vars = ['power_resume_x', 'power_resume_y', 'power_resume_z'] %} + {% for var in zero_vars %} + SAVE_VARIABLE VARIABLE={var} VALUE=0 + {% endfor %} + SAVE_VARIABLE VARIABLE=was_interrupted VALUE=False + +[gcode_shell_command _POWER_LOSS_RECOVERY] +command: /home/klipper/klipper/scripts/plr.sh +timeout: 420. +verbose: False + +[gcode_macro _RESUME_INTERRUPTED] +gcode: + {% set sv = printer.save_variables.variables %} + {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} + {% set park_dz = client.custom_park_dz|default(2.0)|abs %} + RESPOND TYPE=command MSG="action:prompt_end" + SET_GCODE_OFFSET Z=0 MOVE=0 + {% set z_height = params.Z_HEIGHT|default(sv.power_resume_z)|float %} + {% set is_paused = sv.power_loss_paused|default(False) %} + {% set last_file = params.GCODE_FILE|default(sv.last_file)|string %} + {% set hotend = sv.power_resume_extruder|default("extruder")%} + {% set z_offset = sv.nozzle_z_offset_val|default(0)|float %} + {% set z_offset_total = park_dz if is_paused else 0 %} + {% if hotend == "extruder1" %} + {% set z_offset_total = z_offset_total + z_offset %} + {% endif %} + M118 Recovery in progress, please wait + RUN_SHELL_COMMAND CMD=_POWER_LOSS_RECOVERY PARAMS="{z_height} \"{last_file}\" \"{z_offset_total}\"" + SDCARD_PRINT_FILE FILENAME=.plr/"{last_file}" + SAVE_VARIABLE VARIABLE=was_interrupted VALUE=False + +[gcode_macro _ABORT_INTERRUPTED] +gcode: + RESPOND TYPE=command MSG="action:prompt_end" + _CLEAR_LAST_FILE + +######################################## +# Adaptive mesh +######################################## + +[gcode_macro Adaptive_Mesh] +description: This macro contains all adjustable settings for KAMP +variable_verbose_enable: True # Set to True to enable KAMP information output when running. This is useful for debugging. +variable_mesh_margin: 5 # Expands the mesh size in millimeters if desired. Leave at 0 to disable. +variable_fuzz_amount: 0 # Slightly randomizes mesh points to spread out wear from nozzle-based probes. Leave at 0 to disable. + +gcode: # Gcode section left intentionally blank. Do not disturb. +# Noting + +[gcode_macro _START_PRINT_BED_MESH] +gcode: + {% set idex_mode = False %} + {% set profiles = printer["bed_mesh"].profiles %} + {% set svv = printer.save_variables.variables %} + {% set adaptive_mesh = svv.adaptive_meshing|default(false)|lower %} + {% if printer["dual_carriage"] is defined %} + {% set current_idex_mode = printer["dual_carriage"].carriage_1|lower %} + {% if current_idex_mode == "copy" or idex_mode == "mirror" %} + {% set idex_mode = True %} + {% endif %} + {% endif %} + + {% if adaptive_mesh|lower == 'true' %} + {% if printer.exclude_object.objects != [] %} + {% if idex_mode %} + BED_MESH_CLEAR + {% else %} + BED_MESH_CALIBRATE PROFILE=adaptive + {% endif %} + {% else %} + {% if idex_mode %} + BED_MESH_CLEAR + {% else %} + {% if 'default' in profiles %} + BED_MESH_PROFILE LOAD=default + {% else %} + BED_MESH_CALIBRATE PROFILE=default + BED_MESH_PROFILE SAVE=default + {% endif %} + {% endif %} + {% endif %} + {% endif %} + +[gcode_macro BED_MESH_CALIBRATE] +rename_existing: _BED_MESH_CALIBRATE +gcode: + {% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} # Gather all object points + {% set bed_mesh_min = printer.configfile.settings.bed_mesh.mesh_min %} # Get bed mesh min from printer.cfg + {% set bed_mesh_max = printer.configfile.settings.bed_mesh.mesh_max %} # Get bed mesh max from printer.cfg + {% set probe_count = printer.configfile.settings.bed_mesh.probe_count %} # Get probe count from printer.cfg + {% set kamp_settings = printer["gcode_macro Adaptive_Mesh"] %} # Pull variables from _KAMP_Settings + {% set verbose_enable = kamp_settings.verbose_enable | abs %} # Pull verbose setting from _KAMP_Settings + {% set mesh_margin = kamp_settings.mesh_margin | float %} # Pull mesh margin setting from _KAMP_Settings + {% set fuzz_amount = kamp_settings.fuzz_amount | float %} # Pull fuzz amount setting from _KAMP_Settings + {% set default_profile = params.PROFILE | default("default") %} # get default mesh profile + {% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} # If probe count is only a single number, convert it to 2. E.g. probe_count:7 = 7,7 + {% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} # Determine max probe point distance + {% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} # Determine max probe point distance + {% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} # Set x_min from smallest object x point + {% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} # Set y_min from smallest object y point + {% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} # Set x_max from largest object x point + {% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} # Set y_max from largest object y point + + {% set fuzz_range = range((0) | int, (fuzz_amount * 100) | int + 1) %} # Set fuzz_range between 0 and fuzz_amount + {% set adapted_x_min = x_min - mesh_margin - (fuzz_range | random / 100.0) %} # Adapt x_min to margin and fuzz constraints + {% set adapted_y_min = y_min - mesh_margin - (fuzz_range | random / 100.0) %} # Adapt y_min to margin and fuzz constraints + {% set adapted_x_max = x_max + mesh_margin + (fuzz_range | random / 100.0) %} # Adapt x_max to margin and fuzz constraints + {% set adapted_y_max = y_max + mesh_margin + (fuzz_range | random / 100.0) %} # Adapt y_max to margin and fuzz constraints + + {% set adapted_x_min = [adapted_x_min , bed_mesh_min[0]] | max %} # Compare adjustments to defaults and choose max + {% set adapted_y_min = [adapted_y_min , bed_mesh_min[1]] | max %} # Compare adjustments to defaults and choose max + {% set adapted_x_max = [adapted_x_max , bed_mesh_max[0]] | min %} # Compare adjustments to defaults and choose min + {% set adapted_y_max = [adapted_y_max , bed_mesh_max[1]] | min %} # Compare adjustments to defaults and choose min + + {% set points_x = (((adapted_x_max - adapted_x_min) / max_probe_point_distance_x) | round(method='ceil') | int) + 1 %} # Define probe_count's x point count and round up + {% set points_y = (((adapted_y_max - adapted_y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} # Define probe_count's y point count and round up + + {% if (([points_x, points_y]|max) > 6) %} # + {% set algorithm = "bicubic" %} # + {% set min_points = 4 %} # + {% else %} # Calculate if algorithm should be bicubic or lagrange + {% set algorithm = "lagrange" %} # + {% set min_points = 3 %} # + {% endif %} # + + {% set points_x = [points_x , min_points]|max %} # Set probe_count's x points to fit the calculated algorithm + {% set points_y = [points_y , min_points]|max %} # Set probe_count's y points to fit the calculated algorithm + {% set points_x = [points_x , probe_count[0]]|min %} + {% set points_y = [points_y , probe_count[1]]|min %} + + {% if verbose_enable == True %} # If verbose is enabled, print information about KAMP's calculations + {% if printer.exclude_object.objects != [] %} + + { action_respond_info( "Algorithm: {}.".format( + (algorithm), + )) } + + { action_respond_info("Default probe count: {},{}.".format( + (probe_count[0]), + (probe_count[1]), + )) } + + { action_respond_info("Adapted probe count: {},{}.".format( + (points_x), + (points_y), + )) } + + {action_respond_info("Default mesh bounds: {}, {}.".format( + (bed_mesh_min[0],bed_mesh_min[1]), + (bed_mesh_max[0],bed_mesh_max[1]), + )) } + + {% if mesh_margin > 0 %} + {action_respond_info("Mesh margin is {}, mesh bounds extended by {}mm.".format( + (mesh_margin), + (mesh_margin), + )) } + {% else %} + {action_respond_info("Mesh margin is 0, margin not increased.")} + {% endif %} + + {% if fuzz_amount > 0 %} + {action_respond_info("Mesh point fuzzing enabled, points fuzzed up to {}mm.".format( + (fuzz_amount), + )) } + {% else %} + {action_respond_info("Fuzz amount is 0, mesh points not fuzzed.")} + {% endif %} + + { action_respond_info("Adapted mesh bounds: {}, {}.".format( + (adapted_x_min, adapted_y_min), + (adapted_x_max, adapted_y_max), + )) } + + {action_respond_info("KAMP adjustments successful. Happy KAMPing!")} + + {% else %} + + {action_respond_info("No objects detected! Check your gcode and make sure that EXCLUDE_OBJECT_DEFINE is happening before BED_MESH_CALIBRATE is called. Defaulting to regular meshing.")} + G4 P5000 # Wait 5 seconds to make error more visible + {% endif %} + + {% endif %} + + _BED_MESH_CALIBRATE PROFILE={default_profile} mesh_min={adapted_x_min},{adapted_y_min} mesh_max={adapted_x_max},{adapted_y_max} ALGORITHM={algorithm} PROBE_COUNT={points_x},{points_y} # End of verbose + BED_MESH_PROFILE LOAD={default_profile} diff --git a/config/CreatBot_D600Pro2_V0/printer.cfg b/config/CreatBot_D600Pro2_V0/printer.cfg new file mode 100644 index 000000000..2fbd6934d --- /dev/null +++ b/config/CreatBot_D600Pro2_V0/printer.cfg @@ -0,0 +1,28 @@ +[include base.cfg] + +[extruder] +control = pid +pid_kp = 21.950 +pid_ki = 0.887 +pid_kd = 135.815 + +[extruder1] +control = pid +pid_kp = 21.950 +pid_ki = 0.887 +pid_kd = 135.815 + +[heater_bed] +control = pid +pid_kp = 40.673 +pid_ki = 0.837 +pid_kd = 494.176 + +[heater_generic chamber] +control = pid +pid_kp = 59.529 +pid_ki = 0.621 +pid_kd = 1426.459 + +[probe] +z_offset: 4 diff --git a/klippy/extras/spi_temperature.py b/klippy/extras/spi_temperature.py index 92d1b385f..056abbe99 100644 --- a/klippy/extras/spi_temperature.py +++ b/klippy/extras/spi_temperature.py @@ -13,7 +13,7 @@ from . import bus ###################################################################### REPORT_TIME = 0.300 -MAX_INVALID_COUNT = 3 +MAX_INVALID_COUNT = 15 class SensorBase: def __init__(self, config, chip_type, config_cmd=None, spi_mode=1):