修改打印中切换喷头 babystep值丢失问题
修改最小挤出温度为100℃ 低于时只警告不停止 修改F430NX切换喷头时候降平台 优化打印中切换喷头不重置挤出量,打印结束时重置挤出量和速度 新增支持P800 Squashed commit of the following: commit 617b5bd632590bb66e6186952d895fe1a8343f0d Merge: 530470a41 434e023f3 Author: zkk <1007518571@qq.com> Date: Sat Jun 21 14:03:49 2025 +0800 # Conflicts: # config/CreatBot_D1000/base.cfg resolved by 617b5bd632590bb66e6186952d895fe1a8343f0d version # config/CreatBot_D1000_V0/base.cfg resolved by 617b5bd632590bb66e6186952d895fe1a8343f0d version # config/CreatBot_D600Pro2/base.cfg resolved by 617b5bd632590bb66e6186952d895fe1a8343f0d version # config/CreatBot_D600Pro2_V0/base.cfg resolved by 617b5bd632590bb66e6186952d895fe1a8343f0d version # config/CreatBot_F430NX/base.cfg resolved by 617b5bd632590bb66e6186952d895fe1a8343f0d version # scripts/graph_mesh.py resolved by master version
This commit is contained in:
parent
9790e360f4
commit
5cd9e09192
@ -257,7 +257,7 @@ max_power: 1.0
|
|||||||
min_temp: -20
|
min_temp: -20
|
||||||
max_temp: 420
|
max_temp: 420
|
||||||
overshoot: 20
|
overshoot: 20
|
||||||
min_extrude_temp: 180
|
min_extrude_temp: 100
|
||||||
pressure_advance: 0.03
|
pressure_advance: 0.03
|
||||||
pressure_advance_smooth_time:0.040
|
pressure_advance_smooth_time:0.040
|
||||||
# control = pid
|
# control = pid
|
||||||
@ -307,7 +307,7 @@ max_power: 1.0
|
|||||||
min_temp: -20
|
min_temp: -20
|
||||||
max_temp: 420
|
max_temp: 420
|
||||||
overshoot: 20
|
overshoot: 20
|
||||||
min_extrude_temp: 180
|
min_extrude_temp: 100
|
||||||
pressure_advance: 0.032
|
pressure_advance: 0.032
|
||||||
pressure_advance_smooth_time:0.040
|
pressure_advance_smooth_time:0.040
|
||||||
# control = pid
|
# control = pid
|
||||||
@ -373,6 +373,9 @@ gcode:
|
|||||||
|
|
||||||
[gcode_macro T0]
|
[gcode_macro T0]
|
||||||
gcode:
|
gcode:
|
||||||
|
{% set sv = printer.save_variables.variables %}
|
||||||
|
{% set z_offset = sv.nozzle_z_offset_val|default(0)|float %}
|
||||||
|
{% set z_offset = -z_offset %}
|
||||||
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
||||||
{% set filament_insert = True if client.filament_sensor|default("") == ""
|
{% set filament_insert = True if client.filament_sensor|default("") == ""
|
||||||
else True if not printer[client.filament_sensor].enabled
|
else True if not printer[client.filament_sensor].enabled
|
||||||
@ -381,10 +384,12 @@ gcode:
|
|||||||
{% if filament_insert or printing == False %}
|
{% if filament_insert or printing == False %}
|
||||||
SET_SERVO SERVO=switch_nozzle angle=135
|
SET_SERVO SERVO=switch_nozzle angle=135
|
||||||
G4 P500
|
G4 P500
|
||||||
|
{% if printer.toolhead.extruder != 'extruder' %}
|
||||||
{% if "z" in printer.toolhead.homed_axes | lower %}
|
{% if "z" in printer.toolhead.homed_axes | lower %}
|
||||||
SET_GCODE_OFFSET Z=0 MOVE=1
|
SET_GCODE_OFFSET Z_ADJUST={z_offset} MOVE=1
|
||||||
{% else %}
|
{% else %}
|
||||||
SET_GCODE_OFFSET Z=0
|
SET_GCODE_OFFSET Z_ADJUST={z_offset}
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
SET_GCODE_OFFSET Y=0
|
SET_GCODE_OFFSET Y=0
|
||||||
SET_GCODE_OFFSET X=0
|
SET_GCODE_OFFSET X=0
|
||||||
@ -411,10 +416,12 @@ gcode:
|
|||||||
{% if filament_insert or printing == False %}
|
{% if filament_insert or printing == False %}
|
||||||
SET_SERVO SERVO=switch_nozzle angle=135
|
SET_SERVO SERVO=switch_nozzle angle=135
|
||||||
G4 P500
|
G4 P500
|
||||||
|
{% if printer.toolhead.extruder != 'extruder1' %}
|
||||||
{% if "z" in printer.toolhead.homed_axes | lower %}
|
{% if "z" in printer.toolhead.homed_axes | lower %}
|
||||||
SET_GCODE_OFFSET Z={z_offset} MOVE=1
|
SET_GCODE_OFFSET Z_ADJUST={z_offset} MOVE=1
|
||||||
{% else %}
|
{% else %}
|
||||||
SET_GCODE_OFFSET Z={z_offset}
|
SET_GCODE_OFFSET Z_ADJUST={z_offset}
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
SET_GCODE_OFFSET Y={y_offset}
|
SET_GCODE_OFFSET Y={y_offset}
|
||||||
SET_GCODE_OFFSET X={x_offset}
|
SET_GCODE_OFFSET X={x_offset}
|
||||||
@ -445,7 +452,8 @@ gcode:
|
|||||||
[gcode_macro _CANCEL_PRINT_BASE]
|
[gcode_macro _CANCEL_PRINT_BASE]
|
||||||
description: Call when cancelled to print
|
description: Call when cancelled to print
|
||||||
gcode:
|
gcode:
|
||||||
# Nothing
|
M220 S100
|
||||||
|
M221 S100
|
||||||
|
|
||||||
[gcode_macro START_PRINT]
|
[gcode_macro START_PRINT]
|
||||||
gcode:
|
gcode:
|
||||||
@ -489,6 +497,8 @@ gcode:
|
|||||||
[gcode_macro END_PRINT]
|
[gcode_macro END_PRINT]
|
||||||
gcode:
|
gcode:
|
||||||
M400
|
M400
|
||||||
|
M220 S100
|
||||||
|
M221 S100
|
||||||
G92 E0
|
G92 E0
|
||||||
G1 E-10.0 F3600
|
G1 E-10.0 F3600
|
||||||
G91
|
G91
|
||||||
@ -535,10 +545,14 @@ gcode:
|
|||||||
|
|
||||||
[gcode_macro _ACTIVATE_DEFAULT_EXTRUDER]
|
[gcode_macro _ACTIVATE_DEFAULT_EXTRUDER]
|
||||||
gcode:
|
gcode:
|
||||||
|
{% set sv = printer.save_variables.variables %}
|
||||||
|
{% set z_offset = sv.nozzle_z_offset_val|default(0)|float %}
|
||||||
|
SET_GCODE_OFFSET Z=0
|
||||||
{% if printer.toolhead.extruder == 'extruder' %}
|
{% if printer.toolhead.extruder == 'extruder' %}
|
||||||
T0
|
T0
|
||||||
{% elif printer.toolhead.extruder == 'extruder1' %}
|
{% elif printer.toolhead.extruder == 'extruder1' %}
|
||||||
T1
|
T1
|
||||||
|
SET_GCODE_OFFSET Z_ADJUST={z_offset} MOVE=1
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
@ -1046,15 +1060,11 @@ gcode:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if adaptive_mesh|lower == 'true' %}
|
{% if adaptive_mesh|lower == 'true' %}
|
||||||
|
{% if idex_mode %}
|
||||||
|
BED_MESH_CLEAR
|
||||||
|
{% else %}
|
||||||
{% if printer.exclude_object.objects != [] %}
|
{% if printer.exclude_object.objects != [] %}
|
||||||
{% if idex_mode %}
|
BED_MESH_CALIBRATE PROFILE=adaptive ADAPTIVE=1
|
||||||
BED_MESH_CLEAR
|
|
||||||
{% else %}
|
|
||||||
BED_MESH_CALIBRATE PROFILE=adaptive
|
|
||||||
{% endif %}
|
|
||||||
{% else %}
|
|
||||||
{% if idex_mode %}
|
|
||||||
BED_MESH_CLEAR
|
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if 'default' in profiles %}
|
{% if 'default' in profiles %}
|
||||||
BED_MESH_PROFILE LOAD=default
|
BED_MESH_PROFILE LOAD=default
|
||||||
@ -1066,110 +1076,6 @@ gcode:
|
|||||||
{% 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}
|
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
# Nozzle Calibrate
|
# Nozzle Calibrate
|
||||||
########################################
|
########################################
|
||||||
|
@ -210,7 +210,7 @@ max_power: 1.0
|
|||||||
min_temp: -1
|
min_temp: -1
|
||||||
max_temp: 420
|
max_temp: 420
|
||||||
overshoot: 20
|
overshoot: 20
|
||||||
min_extrude_temp: 180
|
min_extrude_temp: 100
|
||||||
pressure_advance: 0.03
|
pressure_advance: 0.03
|
||||||
pressure_advance_smooth_time:0.040
|
pressure_advance_smooth_time:0.040
|
||||||
# control = pid
|
# control = pid
|
||||||
@ -248,7 +248,7 @@ max_power: 1.0
|
|||||||
min_temp: -1
|
min_temp: -1
|
||||||
max_temp: 420
|
max_temp: 420
|
||||||
overshoot: 20
|
overshoot: 20
|
||||||
min_extrude_temp: 180
|
min_extrude_temp: 100
|
||||||
pressure_advance: 0.032
|
pressure_advance: 0.032
|
||||||
pressure_advance_smooth_time:0.040
|
pressure_advance_smooth_time:0.040
|
||||||
# control = pid
|
# control = pid
|
||||||
@ -305,6 +305,9 @@ gcode:
|
|||||||
|
|
||||||
[gcode_macro T0]
|
[gcode_macro T0]
|
||||||
gcode:
|
gcode:
|
||||||
|
{% set sv = printer.save_variables.variables %}
|
||||||
|
{% set z_offset = sv.nozzle_z_offset_val|default(0)|float %}
|
||||||
|
{% set z_offset = -z_offset %}
|
||||||
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
||||||
{% set filament_insert = True if client.filament_sensor|default("") == ""
|
{% set filament_insert = True if client.filament_sensor|default("") == ""
|
||||||
else True if not printer[client.filament_sensor].enabled
|
else True if not printer[client.filament_sensor].enabled
|
||||||
@ -313,10 +316,12 @@ gcode:
|
|||||||
{% if filament_insert or printing == False %}
|
{% if filament_insert or printing == False %}
|
||||||
SET_SERVO SERVO=switch_nozzle angle=135
|
SET_SERVO SERVO=switch_nozzle angle=135
|
||||||
G4 P500
|
G4 P500
|
||||||
|
{% if printer.toolhead.extruder != 'extruder' %}
|
||||||
{% if "z" in printer.toolhead.homed_axes | lower %}
|
{% if "z" in printer.toolhead.homed_axes | lower %}
|
||||||
SET_GCODE_OFFSET Z=0 MOVE=1
|
SET_GCODE_OFFSET Z_ADJUST={z_offset} MOVE=1
|
||||||
{% else %}
|
{% else %}
|
||||||
SET_GCODE_OFFSET Z=0
|
SET_GCODE_OFFSET Z_ADJUST={z_offset}
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
SET_GCODE_OFFSET Y=0
|
SET_GCODE_OFFSET Y=0
|
||||||
SET_GCODE_OFFSET X=0
|
SET_GCODE_OFFSET X=0
|
||||||
@ -343,10 +348,12 @@ gcode:
|
|||||||
{% if filament_insert or printing == False %}
|
{% if filament_insert or printing == False %}
|
||||||
SET_SERVO SERVO=switch_nozzle angle=135
|
SET_SERVO SERVO=switch_nozzle angle=135
|
||||||
G4 P500
|
G4 P500
|
||||||
|
{% if printer.toolhead.extruder != 'extruder1' %}
|
||||||
{% if "z" in printer.toolhead.homed_axes | lower %}
|
{% if "z" in printer.toolhead.homed_axes | lower %}
|
||||||
SET_GCODE_OFFSET Z={z_offset} MOVE=1
|
SET_GCODE_OFFSET Z_ADJUST={z_offset} MOVE=1
|
||||||
{% else %}
|
{% else %}
|
||||||
SET_GCODE_OFFSET Z={z_offset}
|
SET_GCODE_OFFSET Z_ADJUST={z_offset}
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
SET_GCODE_OFFSET Y={y_offset}
|
SET_GCODE_OFFSET Y={y_offset}
|
||||||
SET_GCODE_OFFSET X={x_offset}
|
SET_GCODE_OFFSET X={x_offset}
|
||||||
@ -377,7 +384,8 @@ gcode:
|
|||||||
[gcode_macro _CANCEL_PRINT_BASE]
|
[gcode_macro _CANCEL_PRINT_BASE]
|
||||||
description: Call when cancelled to print
|
description: Call when cancelled to print
|
||||||
gcode:
|
gcode:
|
||||||
# Nothing
|
M220 S100
|
||||||
|
M221 S100
|
||||||
|
|
||||||
[gcode_macro START_PRINT]
|
[gcode_macro START_PRINT]
|
||||||
gcode:
|
gcode:
|
||||||
@ -421,6 +429,8 @@ gcode:
|
|||||||
[gcode_macro END_PRINT]
|
[gcode_macro END_PRINT]
|
||||||
gcode:
|
gcode:
|
||||||
M400
|
M400
|
||||||
|
M220 S100
|
||||||
|
M221 S100
|
||||||
G92 E0
|
G92 E0
|
||||||
G1 E-10.0 F3600
|
G1 E-10.0 F3600
|
||||||
G91
|
G91
|
||||||
@ -467,10 +477,14 @@ gcode:
|
|||||||
|
|
||||||
[gcode_macro _ACTIVATE_DEFAULT_EXTRUDER]
|
[gcode_macro _ACTIVATE_DEFAULT_EXTRUDER]
|
||||||
gcode:
|
gcode:
|
||||||
|
{% set sv = printer.save_variables.variables %}
|
||||||
|
{% set z_offset = sv.nozzle_z_offset_val|default(0)|float %}
|
||||||
|
SET_GCODE_OFFSET Z=0
|
||||||
{% if printer.toolhead.extruder == 'extruder' %}
|
{% if printer.toolhead.extruder == 'extruder' %}
|
||||||
T0
|
T0
|
||||||
{% elif printer.toolhead.extruder == 'extruder1' %}
|
{% elif printer.toolhead.extruder == 'extruder1' %}
|
||||||
T1
|
T1
|
||||||
|
SET_GCODE_OFFSET Z_ADJUST={z_offset} MOVE=1
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
@ -959,15 +973,11 @@ gcode:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if adaptive_mesh|lower == 'true' %}
|
{% if adaptive_mesh|lower == 'true' %}
|
||||||
|
{% if idex_mode %}
|
||||||
|
BED_MESH_CLEAR
|
||||||
|
{% else %}
|
||||||
{% if printer.exclude_object.objects != [] %}
|
{% if printer.exclude_object.objects != [] %}
|
||||||
{% if idex_mode %}
|
BED_MESH_CALIBRATE PROFILE=adaptive ADAPTIVE=1
|
||||||
BED_MESH_CLEAR
|
|
||||||
{% else %}
|
|
||||||
BED_MESH_CALIBRATE PROFILE=adaptive
|
|
||||||
{% endif %}
|
|
||||||
{% else %}
|
|
||||||
{% if idex_mode %}
|
|
||||||
BED_MESH_CLEAR
|
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if 'default' in profiles %}
|
{% if 'default' in profiles %}
|
||||||
BED_MESH_PROFILE LOAD=default
|
BED_MESH_PROFILE LOAD=default
|
||||||
@ -979,110 +989,6 @@ gcode:
|
|||||||
{% 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}
|
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
# Nozzle Calibrate
|
# Nozzle Calibrate
|
||||||
########################################
|
########################################
|
||||||
|
@ -257,7 +257,7 @@ max_power: 1.0
|
|||||||
min_temp: -20
|
min_temp: -20
|
||||||
max_temp: 420
|
max_temp: 420
|
||||||
overshoot: 20
|
overshoot: 20
|
||||||
min_extrude_temp: 180
|
min_extrude_temp: 100
|
||||||
pressure_advance: 0.03
|
pressure_advance: 0.03
|
||||||
pressure_advance_smooth_time:0.040
|
pressure_advance_smooth_time:0.040
|
||||||
# control = pid
|
# control = pid
|
||||||
@ -307,7 +307,7 @@ max_power: 1.0
|
|||||||
min_temp: -20
|
min_temp: -20
|
||||||
max_temp: 420
|
max_temp: 420
|
||||||
overshoot: 20
|
overshoot: 20
|
||||||
min_extrude_temp: 180
|
min_extrude_temp: 100
|
||||||
pressure_advance: 0.032
|
pressure_advance: 0.032
|
||||||
pressure_advance_smooth_time:0.040
|
pressure_advance_smooth_time:0.040
|
||||||
# control = pid
|
# control = pid
|
||||||
@ -345,7 +345,7 @@ pin: tool:PC8
|
|||||||
maximum_servo_angle: 180
|
maximum_servo_angle: 180
|
||||||
minimum_pulse_width: 0.000900
|
minimum_pulse_width: 0.000900
|
||||||
maximum_pulse_width: 0.002100
|
maximum_pulse_width: 0.002100
|
||||||
initial_angle: 130
|
initial_angle: 170
|
||||||
steps_decomposed: 60
|
steps_decomposed: 60
|
||||||
signal_duration: 0.1
|
signal_duration: 0.1
|
||||||
# initial_pulse_width:
|
# initial_pulse_width:
|
||||||
@ -373,6 +373,9 @@ gcode:
|
|||||||
|
|
||||||
[gcode_macro T0]
|
[gcode_macro T0]
|
||||||
gcode:
|
gcode:
|
||||||
|
{% set sv = printer.save_variables.variables %}
|
||||||
|
{% set z_offset = sv.nozzle_z_offset_val|default(0)|float %}
|
||||||
|
{% set z_offset = -z_offset %}
|
||||||
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
||||||
{% set filament_insert = True if client.filament_sensor|default("") == ""
|
{% set filament_insert = True if client.filament_sensor|default("") == ""
|
||||||
else True if not printer[client.filament_sensor].enabled
|
else True if not printer[client.filament_sensor].enabled
|
||||||
@ -381,10 +384,12 @@ gcode:
|
|||||||
{% if filament_insert or printing == False %}
|
{% if filament_insert or printing == False %}
|
||||||
SET_SERVO SERVO=switch_nozzle angle=135
|
SET_SERVO SERVO=switch_nozzle angle=135
|
||||||
G4 P500
|
G4 P500
|
||||||
|
{% if printer.toolhead.extruder != 'extruder' %}
|
||||||
{% if "z" in printer.toolhead.homed_axes | lower %}
|
{% if "z" in printer.toolhead.homed_axes | lower %}
|
||||||
SET_GCODE_OFFSET Z=0 MOVE=1
|
SET_GCODE_OFFSET Z_ADJUST={z_offset} MOVE=1
|
||||||
{% else %}
|
{% else %}
|
||||||
SET_GCODE_OFFSET Z=0
|
SET_GCODE_OFFSET Z_ADJUST={z_offset}
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
SET_GCODE_OFFSET Y=0
|
SET_GCODE_OFFSET Y=0
|
||||||
SET_GCODE_OFFSET X=0
|
SET_GCODE_OFFSET X=0
|
||||||
@ -411,10 +416,12 @@ gcode:
|
|||||||
{% if filament_insert or printing == False %}
|
{% if filament_insert or printing == False %}
|
||||||
SET_SERVO SERVO=switch_nozzle angle=135
|
SET_SERVO SERVO=switch_nozzle angle=135
|
||||||
G4 P500
|
G4 P500
|
||||||
|
{% if printer.toolhead.extruder != 'extruder1' %}
|
||||||
{% if "z" in printer.toolhead.homed_axes | lower %}
|
{% if "z" in printer.toolhead.homed_axes | lower %}
|
||||||
SET_GCODE_OFFSET Z={z_offset} MOVE=1
|
SET_GCODE_OFFSET Z_ADJUST={z_offset} MOVE=1
|
||||||
{% else %}
|
{% else %}
|
||||||
SET_GCODE_OFFSET Z={z_offset}
|
SET_GCODE_OFFSET Z_ADJUST={z_offset}
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
SET_GCODE_OFFSET Y={y_offset}
|
SET_GCODE_OFFSET Y={y_offset}
|
||||||
SET_GCODE_OFFSET X={x_offset}
|
SET_GCODE_OFFSET X={x_offset}
|
||||||
@ -445,7 +452,8 @@ gcode:
|
|||||||
[gcode_macro _CANCEL_PRINT_BASE]
|
[gcode_macro _CANCEL_PRINT_BASE]
|
||||||
description: Call when cancelled to print
|
description: Call when cancelled to print
|
||||||
gcode:
|
gcode:
|
||||||
# Nothing
|
M220 S100
|
||||||
|
M221 S100
|
||||||
|
|
||||||
[gcode_macro START_PRINT]
|
[gcode_macro START_PRINT]
|
||||||
gcode:
|
gcode:
|
||||||
@ -489,6 +497,8 @@ gcode:
|
|||||||
[gcode_macro END_PRINT]
|
[gcode_macro END_PRINT]
|
||||||
gcode:
|
gcode:
|
||||||
M400
|
M400
|
||||||
|
M220 S100
|
||||||
|
M221 S100
|
||||||
G92 E0
|
G92 E0
|
||||||
G1 E-10.0 F3600
|
G1 E-10.0 F3600
|
||||||
G91
|
G91
|
||||||
@ -535,10 +545,14 @@ gcode:
|
|||||||
|
|
||||||
[gcode_macro _ACTIVATE_DEFAULT_EXTRUDER]
|
[gcode_macro _ACTIVATE_DEFAULT_EXTRUDER]
|
||||||
gcode:
|
gcode:
|
||||||
|
{% set sv = printer.save_variables.variables %}
|
||||||
|
{% set z_offset = sv.nozzle_z_offset_val|default(0)|float %}
|
||||||
|
SET_GCODE_OFFSET Z=0
|
||||||
{% if printer.toolhead.extruder == 'extruder' %}
|
{% if printer.toolhead.extruder == 'extruder' %}
|
||||||
T0
|
T0
|
||||||
{% elif printer.toolhead.extruder == 'extruder1' %}
|
{% elif printer.toolhead.extruder == 'extruder1' %}
|
||||||
T1
|
T1
|
||||||
|
SET_GCODE_OFFSET Z_ADJUST={z_offset} MOVE=1
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
@ -1047,15 +1061,11 @@ gcode:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if adaptive_mesh|lower == 'true' %}
|
{% if adaptive_mesh|lower == 'true' %}
|
||||||
|
{% if idex_mode %}
|
||||||
|
BED_MESH_CLEAR
|
||||||
|
{% else %}
|
||||||
{% if printer.exclude_object.objects != [] %}
|
{% if printer.exclude_object.objects != [] %}
|
||||||
{% if idex_mode %}
|
BED_MESH_CALIBRATE PROFILE=adaptive ADAPTIVE=1
|
||||||
BED_MESH_CLEAR
|
|
||||||
{% else %}
|
|
||||||
BED_MESH_CALIBRATE PROFILE=adaptive
|
|
||||||
{% endif %}
|
|
||||||
{% else %}
|
|
||||||
{% if idex_mode %}
|
|
||||||
BED_MESH_CLEAR
|
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if 'default' in profiles %}
|
{% if 'default' in profiles %}
|
||||||
BED_MESH_PROFILE LOAD=default
|
BED_MESH_PROFILE LOAD=default
|
||||||
@ -1067,110 +1077,6 @@ gcode:
|
|||||||
{% 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}
|
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
# Nozzle Calibrate
|
# Nozzle Calibrate
|
||||||
########################################
|
########################################
|
||||||
|
@ -211,7 +211,7 @@ max_power: 1.0
|
|||||||
min_temp: -1
|
min_temp: -1
|
||||||
max_temp: 420
|
max_temp: 420
|
||||||
overshoot: 20
|
overshoot: 20
|
||||||
min_extrude_temp: 180
|
min_extrude_temp: 100
|
||||||
pressure_advance: 0.03
|
pressure_advance: 0.03
|
||||||
pressure_advance_smooth_time:0.040
|
pressure_advance_smooth_time:0.040
|
||||||
# control = pid
|
# control = pid
|
||||||
@ -249,7 +249,7 @@ max_power: 1.0
|
|||||||
min_temp: -1
|
min_temp: -1
|
||||||
max_temp: 420
|
max_temp: 420
|
||||||
overshoot: 20
|
overshoot: 20
|
||||||
min_extrude_temp: 180
|
min_extrude_temp: 100
|
||||||
pressure_advance: 0.032
|
pressure_advance: 0.032
|
||||||
pressure_advance_smooth_time:0.040
|
pressure_advance_smooth_time:0.040
|
||||||
# control = pid
|
# control = pid
|
||||||
@ -278,7 +278,7 @@ pin: PE5
|
|||||||
maximum_servo_angle: 180
|
maximum_servo_angle: 180
|
||||||
minimum_pulse_width: 0.000900
|
minimum_pulse_width: 0.000900
|
||||||
maximum_pulse_width: 0.002100
|
maximum_pulse_width: 0.002100
|
||||||
initial_angle: 130
|
initial_angle: 170
|
||||||
steps_decomposed: 60
|
steps_decomposed: 60
|
||||||
signal_duration: 0.1
|
signal_duration: 0.1
|
||||||
# initial_pulse_width:
|
# initial_pulse_width:
|
||||||
@ -306,6 +306,9 @@ gcode:
|
|||||||
|
|
||||||
[gcode_macro T0]
|
[gcode_macro T0]
|
||||||
gcode:
|
gcode:
|
||||||
|
{% set sv = printer.save_variables.variables %}
|
||||||
|
{% set z_offset = sv.nozzle_z_offset_val|default(0)|float %}
|
||||||
|
{% set z_offset = -z_offset %}
|
||||||
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
||||||
{% set filament_insert = True if client.filament_sensor|default("") == ""
|
{% set filament_insert = True if client.filament_sensor|default("") == ""
|
||||||
else True if not printer[client.filament_sensor].enabled
|
else True if not printer[client.filament_sensor].enabled
|
||||||
@ -314,10 +317,12 @@ gcode:
|
|||||||
{% if filament_insert or printing == False %}
|
{% if filament_insert or printing == False %}
|
||||||
SET_SERVO SERVO=switch_nozzle angle=135
|
SET_SERVO SERVO=switch_nozzle angle=135
|
||||||
G4 P500
|
G4 P500
|
||||||
|
{% if printer.toolhead.extruder != 'extruder' %}
|
||||||
{% if "z" in printer.toolhead.homed_axes | lower %}
|
{% if "z" in printer.toolhead.homed_axes | lower %}
|
||||||
SET_GCODE_OFFSET Z=0 MOVE=1
|
SET_GCODE_OFFSET Z_ADJUST={z_offset} MOVE=1
|
||||||
{% else %}
|
{% else %}
|
||||||
SET_GCODE_OFFSET Z=0
|
SET_GCODE_OFFSET Z_ADJUST={z_offset}
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
SET_GCODE_OFFSET Y=0
|
SET_GCODE_OFFSET Y=0
|
||||||
SET_GCODE_OFFSET X=0
|
SET_GCODE_OFFSET X=0
|
||||||
@ -344,10 +349,12 @@ gcode:
|
|||||||
{% if filament_insert or printing == False %}
|
{% if filament_insert or printing == False %}
|
||||||
SET_SERVO SERVO=switch_nozzle angle=135
|
SET_SERVO SERVO=switch_nozzle angle=135
|
||||||
G4 P500
|
G4 P500
|
||||||
|
{% if printer.toolhead.extruder != 'extruder1' %}
|
||||||
{% if "z" in printer.toolhead.homed_axes | lower %}
|
{% if "z" in printer.toolhead.homed_axes | lower %}
|
||||||
SET_GCODE_OFFSET Z={z_offset} MOVE=1
|
SET_GCODE_OFFSET Z_ADJUST={z_offset} MOVE=1
|
||||||
{% else %}
|
{% else %}
|
||||||
SET_GCODE_OFFSET Z={z_offset}
|
SET_GCODE_OFFSET Z_ADJUST={z_offset}
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
SET_GCODE_OFFSET Y={y_offset}
|
SET_GCODE_OFFSET Y={y_offset}
|
||||||
SET_GCODE_OFFSET X={x_offset}
|
SET_GCODE_OFFSET X={x_offset}
|
||||||
@ -366,7 +373,7 @@ gcode:
|
|||||||
|
|
||||||
[gcode_macro PROBE_SERVO_CLOSE]
|
[gcode_macro PROBE_SERVO_CLOSE]
|
||||||
gcode:
|
gcode:
|
||||||
SET_SERVO SERVO=probe_servo angle=130
|
SET_SERVO SERVO=probe_servo angle=170
|
||||||
G4 P2000
|
G4 P2000
|
||||||
|
|
||||||
[gcode_macro _START_PRINT_BASE]
|
[gcode_macro _START_PRINT_BASE]
|
||||||
@ -378,7 +385,8 @@ gcode:
|
|||||||
[gcode_macro _CANCEL_PRINT_BASE]
|
[gcode_macro _CANCEL_PRINT_BASE]
|
||||||
description: Call when cancelled to print
|
description: Call when cancelled to print
|
||||||
gcode:
|
gcode:
|
||||||
# Nothing
|
M220 S100
|
||||||
|
M221 S100
|
||||||
|
|
||||||
[gcode_macro START_PRINT]
|
[gcode_macro START_PRINT]
|
||||||
gcode:
|
gcode:
|
||||||
@ -422,6 +430,8 @@ gcode:
|
|||||||
[gcode_macro END_PRINT]
|
[gcode_macro END_PRINT]
|
||||||
gcode:
|
gcode:
|
||||||
M400
|
M400
|
||||||
|
M220 S100
|
||||||
|
M221 S100
|
||||||
G92 E0
|
G92 E0
|
||||||
G1 E-10.0 F3600
|
G1 E-10.0 F3600
|
||||||
G91
|
G91
|
||||||
@ -468,10 +478,14 @@ gcode:
|
|||||||
|
|
||||||
[gcode_macro _ACTIVATE_DEFAULT_EXTRUDER]
|
[gcode_macro _ACTIVATE_DEFAULT_EXTRUDER]
|
||||||
gcode:
|
gcode:
|
||||||
|
{% set sv = printer.save_variables.variables %}
|
||||||
|
{% set z_offset = sv.nozzle_z_offset_val|default(0)|float %}
|
||||||
|
SET_GCODE_OFFSET Z=0
|
||||||
{% if printer.toolhead.extruder == 'extruder' %}
|
{% if printer.toolhead.extruder == 'extruder' %}
|
||||||
T0
|
T0
|
||||||
{% elif printer.toolhead.extruder == 'extruder1' %}
|
{% elif printer.toolhead.extruder == 'extruder1' %}
|
||||||
T1
|
T1
|
||||||
|
SET_GCODE_OFFSET Z_ADJUST={z_offset} MOVE=1
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
@ -954,15 +968,11 @@ gcode:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if adaptive_mesh|lower == 'true' %}
|
{% if adaptive_mesh|lower == 'true' %}
|
||||||
|
{% if idex_mode %}
|
||||||
|
BED_MESH_CLEAR
|
||||||
|
{% else %}
|
||||||
{% if printer.exclude_object.objects != [] %}
|
{% if printer.exclude_object.objects != [] %}
|
||||||
{% if idex_mode %}
|
BED_MESH_CALIBRATE PROFILE=adaptive ADAPTIVE=1
|
||||||
BED_MESH_CLEAR
|
|
||||||
{% else %}
|
|
||||||
BED_MESH_CALIBRATE PROFILE=adaptive
|
|
||||||
{% endif %}
|
|
||||||
{% else %}
|
|
||||||
{% if idex_mode %}
|
|
||||||
BED_MESH_CLEAR
|
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if 'default' in profiles %}
|
{% if 'default' in profiles %}
|
||||||
BED_MESH_PROFILE LOAD=default
|
BED_MESH_PROFILE LOAD=default
|
||||||
@ -974,110 +984,6 @@ gcode:
|
|||||||
{% 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}
|
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
# Nozzle Calibrate
|
# Nozzle Calibrate
|
||||||
########################################
|
########################################
|
||||||
|
@ -304,7 +304,7 @@ max_power: 1.0
|
|||||||
min_temp: -20
|
min_temp: -20
|
||||||
max_temp: 450
|
max_temp: 450
|
||||||
overshoot: 20
|
overshoot: 20
|
||||||
min_extrude_temp: 150
|
min_extrude_temp: 100
|
||||||
pressure_advance: 0.032
|
pressure_advance: 0.032
|
||||||
pressure_advance_smooth_time:0.040
|
pressure_advance_smooth_time:0.040
|
||||||
# control = pid
|
# control = pid
|
||||||
@ -398,7 +398,7 @@ max_power: 1.0
|
|||||||
min_temp: -20
|
min_temp: -20
|
||||||
max_temp: 450
|
max_temp: 450
|
||||||
overshoot: 20
|
overshoot: 20
|
||||||
min_extrude_temp: 150
|
min_extrude_temp: 100
|
||||||
pressure_advance: 0.032
|
pressure_advance: 0.032
|
||||||
pressure_advance_smooth_time:0.040
|
pressure_advance_smooth_time:0.040
|
||||||
# control = pid
|
# control = pid
|
||||||
@ -436,6 +436,18 @@ gcode:
|
|||||||
ACTIVATE_EXTRUDER EXTRUDER=extruder
|
ACTIVATE_EXTRUDER EXTRUDER=extruder
|
||||||
SET_DUAL_CARRIAGE CARRIAGE=0
|
SET_DUAL_CARRIAGE CARRIAGE=0
|
||||||
|
|
||||||
|
[gcode_macro _PLATFORM_LIFT]
|
||||||
|
gcode:
|
||||||
|
{% set distance = params.DISTANCE|default(0) %}
|
||||||
|
{% set speed = params.SPEED|default(300) %}
|
||||||
|
|
||||||
|
{% if "z" in printer.toolhead.homed_axes %}
|
||||||
|
SAVE_GCODE_STATE NAME=platform_lift_state
|
||||||
|
G91
|
||||||
|
G1 Z{distance} F{speed}
|
||||||
|
RESTORE_GCODE_STATE NAME=platform_lift_state
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
[gcode_macro _PARK_extruder]
|
[gcode_macro _PARK_extruder]
|
||||||
gcode:
|
gcode:
|
||||||
ACTIVATE_EXTRUDER EXTRUDER=extruder
|
ACTIVATE_EXTRUDER EXTRUDER=extruder
|
||||||
@ -458,6 +470,7 @@ gcode:
|
|||||||
{% set x_home = true %}
|
{% set x_home = true %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if printer.toolhead.extruder != 'extruder' or x_home %}
|
{% if printer.toolhead.extruder != 'extruder' or x_home %}
|
||||||
|
_PLATFORM_LIFT DISTANCE=1
|
||||||
_PARK_{printer.toolhead.extruder}
|
_PARK_{printer.toolhead.extruder}
|
||||||
ACTIVATE_EXTRUDER EXTRUDER=extruder
|
ACTIVATE_EXTRUDER EXTRUDER=extruder
|
||||||
SET_DUAL_CARRIAGE CARRIAGE=0
|
SET_DUAL_CARRIAGE CARRIAGE=0
|
||||||
@ -472,6 +485,7 @@ gcode:
|
|||||||
G90
|
G90
|
||||||
G1 X0 F6000
|
G1 X0 F6000
|
||||||
RESTORE_GCODE_STATE NAME=park0
|
RESTORE_GCODE_STATE NAME=park0
|
||||||
|
_PLATFORM_LIFT DISTANCE=-1
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% else %}
|
{% else %}
|
||||||
PAUSE
|
PAUSE
|
||||||
@ -510,6 +524,7 @@ gcode:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if printer.toolhead.extruder != 'extruder1' or x_home %}
|
{% if printer.toolhead.extruder != 'extruder1' or x_home %}
|
||||||
|
_PLATFORM_LIFT DISTANCE=1
|
||||||
_PARK_{printer.toolhead.extruder}
|
_PARK_{printer.toolhead.extruder}
|
||||||
ACTIVATE_EXTRUDER EXTRUDER=extruder1
|
ACTIVATE_EXTRUDER EXTRUDER=extruder1
|
||||||
SET_DUAL_CARRIAGE CARRIAGE=1
|
SET_DUAL_CARRIAGE CARRIAGE=1
|
||||||
@ -525,6 +540,7 @@ gcode:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
SET_GCODE_OFFSET Y={y_offset}
|
SET_GCODE_OFFSET Y={y_offset}
|
||||||
SET_GCODE_OFFSET X={x_offset}
|
SET_GCODE_OFFSET X={x_offset}
|
||||||
|
_PLATFORM_LIFT DISTANCE=-1
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% else %}
|
{% else %}
|
||||||
PAUSE
|
PAUSE
|
||||||
@ -592,6 +608,8 @@ gcode:
|
|||||||
[gcode_macro _CANCEL_PRINT_BASE]
|
[gcode_macro _CANCEL_PRINT_BASE]
|
||||||
description: Call when cancelled to print
|
description: Call when cancelled to print
|
||||||
gcode:
|
gcode:
|
||||||
|
M220 S100
|
||||||
|
M221 S100
|
||||||
_ACTIVATE_PRIMARY_MODE
|
_ACTIVATE_PRIMARY_MODE
|
||||||
|
|
||||||
[gcode_macro START_PRINT]
|
[gcode_macro START_PRINT]
|
||||||
@ -638,6 +656,8 @@ gcode:
|
|||||||
{% set svv = printer.save_variables.variables %}
|
{% set svv = printer.save_variables.variables %}
|
||||||
{% set y_offset = svv.nozzle_y_offset_val|default(0)|float %}
|
{% set y_offset = svv.nozzle_y_offset_val|default(0)|float %}
|
||||||
M400
|
M400
|
||||||
|
M220 S100
|
||||||
|
M221 S100
|
||||||
G92 E0
|
G92 E0
|
||||||
G1 E-10.0 F3600
|
G1 E-10.0 F3600
|
||||||
G91
|
G91
|
||||||
@ -1229,15 +1249,11 @@ gcode:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if adaptive_mesh|lower == 'true' %}
|
{% if adaptive_mesh|lower == 'true' %}
|
||||||
|
{% if idex_mode %}
|
||||||
|
BED_MESH_CLEAR
|
||||||
|
{% else %}
|
||||||
{% if printer.exclude_object.objects != [] %}
|
{% if printer.exclude_object.objects != [] %}
|
||||||
{% if idex_mode %}
|
BED_MESH_CALIBRATE PROFILE=adaptive ADAPTIVE=1
|
||||||
BED_MESH_CLEAR
|
|
||||||
{% else %}
|
|
||||||
BED_MESH_CALIBRATE PROFILE=adaptive
|
|
||||||
{% endif %}
|
|
||||||
{% else %}
|
|
||||||
{% if idex_mode %}
|
|
||||||
BED_MESH_CLEAR
|
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if 'default' in profiles %}
|
{% if 'default' in profiles %}
|
||||||
BED_MESH_PROFILE LOAD=default
|
BED_MESH_PROFILE LOAD=default
|
||||||
@ -1249,110 +1265,6 @@ gcode:
|
|||||||
{% 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}
|
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
# Nozzle Calibrate
|
# Nozzle Calibrate
|
||||||
########################################
|
########################################
|
||||||
|
1
config/CreatBot_P800/1.1/door_detect.cfg
Normal file
1
config/CreatBot_P800/1.1/door_detect.cfg
Normal file
@ -0,0 +1 @@
|
|||||||
|
../../module/door_detect.cfg
|
701
config/CreatBot_P800/base.cfg
Normal file
701
config/CreatBot_P800/base.cfg
Normal file
@ -0,0 +1,701 @@
|
|||||||
|
# This is a configuration file for the Creatbot P800.
|
||||||
|
[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 %}
|
||||||
|
{% set heaters = ["extruder", "pre-heater", "mid-heater"] %}
|
||||||
|
{% for heater in heaters %}
|
||||||
|
{% if printer["%s" % heater] is defined %}
|
||||||
|
SET_HEATER_TEMPERATURE HEATER={heater}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
TURN_OFF_HEATERS
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
timeout: 1800 # 0.5 hour timeout
|
||||||
|
|
||||||
|
[mcu]
|
||||||
|
canbus_uuid: 000000000010
|
||||||
|
canbus_interface: can0
|
||||||
|
|
||||||
|
[printer]
|
||||||
|
kinematics: cartesian
|
||||||
|
max_velocity: 100
|
||||||
|
max_accel: 100
|
||||||
|
max_z_velocity: 5
|
||||||
|
max_z_accel: 5
|
||||||
|
square_corner_velocity: 5.0
|
||||||
|
|
||||||
|
[stepper_x]
|
||||||
|
step_pin: PD1
|
||||||
|
dir_pin: PD0
|
||||||
|
enable_pin: !PA15
|
||||||
|
rotation_distance: 53.3
|
||||||
|
microsteps: 16
|
||||||
|
full_steps_per_rotation: 200
|
||||||
|
gear_ratio:4:3
|
||||||
|
endstop_pin: PE10
|
||||||
|
position_min: 0
|
||||||
|
position_endstop: 0
|
||||||
|
position_max: 800
|
||||||
|
homing_speed: 120
|
||||||
|
homing_retract_dist: 5
|
||||||
|
|
||||||
|
[stepper_y]
|
||||||
|
step_pin: PD4
|
||||||
|
dir_pin: PD3
|
||||||
|
enable_pin: !PD2
|
||||||
|
rotation_distance: 60
|
||||||
|
microsteps: 8
|
||||||
|
full_steps_per_rotation: 200
|
||||||
|
gear_ratio: 2:1
|
||||||
|
endstop_pin: PE11
|
||||||
|
position_min: 0
|
||||||
|
position_endstop: 0
|
||||||
|
position_max: 800
|
||||||
|
homing_speed: 80
|
||||||
|
homing_retract_dist: 5
|
||||||
|
step_pulse_duration: 0.000005
|
||||||
|
|
||||||
|
[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:PE12
|
||||||
|
position_endstop: 0
|
||||||
|
position_min:-20
|
||||||
|
position_max: 800
|
||||||
|
homing_speed: 5
|
||||||
|
second_homing_speed: 4
|
||||||
|
homing_retract_speed: 5
|
||||||
|
homing_retract_dist: 2.0
|
||||||
|
step_pulse_duration: 0.000005
|
||||||
|
|
||||||
|
[heater_generic pre-heater]
|
||||||
|
heater_pin: PD15
|
||||||
|
sensor_type: AD8495
|
||||||
|
adc_voltage: 3.3
|
||||||
|
sensor_pin: PC3
|
||||||
|
max_power: 1.0
|
||||||
|
min_temp: -235
|
||||||
|
max_temp: 300
|
||||||
|
|
||||||
|
|
||||||
|
[verify_heater pre-heater]
|
||||||
|
max_error: 120
|
||||||
|
hysteresis: 100
|
||||||
|
check_gain_time: 36000
|
||||||
|
heating_gain: 0.01
|
||||||
|
|
||||||
|
|
||||||
|
[heater_generic mid-heater]
|
||||||
|
heater_pin: PD14
|
||||||
|
sensor_type: AD8495
|
||||||
|
adc_voltage: 3.3
|
||||||
|
sensor_pin: PC2
|
||||||
|
max_power: 1.0
|
||||||
|
min_temp: -235
|
||||||
|
max_temp: 300
|
||||||
|
|
||||||
|
[verify_heater mid-heater]
|
||||||
|
max_error: 120
|
||||||
|
hysteresis: 100
|
||||||
|
check_gain_time: 3600
|
||||||
|
heating_gain: 0.01
|
||||||
|
|
||||||
|
[extruder]
|
||||||
|
step_pin: PE1
|
||||||
|
dir_pin: !PE0
|
||||||
|
enable_pin: !PB9
|
||||||
|
microsteps: 16
|
||||||
|
full_steps_per_rotation: 200
|
||||||
|
rotation_distance: 233.4
|
||||||
|
gear_ratio: 10:1
|
||||||
|
nozzle_diameter: 1
|
||||||
|
filament_diameter: 1.750
|
||||||
|
max_extrude_only_distance: 3000.0
|
||||||
|
max_extrude_only_velocity: 5000.0
|
||||||
|
max_extrude_only_accel: 300.0
|
||||||
|
max_extrude_cross_section: 100.0
|
||||||
|
heater_pin: PD13
|
||||||
|
sensor_type: AD8495
|
||||||
|
adc_voltage: 3.3
|
||||||
|
sensor_pin: PC1
|
||||||
|
max_power: 1.0
|
||||||
|
min_temp: -235
|
||||||
|
max_temp: 500
|
||||||
|
min_extrude_temp: 100
|
||||||
|
pressure_advance: 0.032
|
||||||
|
pressure_advance_smooth_time:0.040
|
||||||
|
step_pulse_duration: 0.000005
|
||||||
|
|
||||||
|
[heater_bed]
|
||||||
|
heater_pin: PD12
|
||||||
|
sensor_type: Generic 3950
|
||||||
|
sensor_pin: PC0
|
||||||
|
max_power: 1.0
|
||||||
|
min_temp: -235
|
||||||
|
max_temp: 500
|
||||||
|
control: pid
|
||||||
|
pid_kp: 74.000
|
||||||
|
pid_ki: 1.965
|
||||||
|
pid_kd: 696.525
|
||||||
|
|
||||||
|
[verify_heater heater_bed]
|
||||||
|
max_error: 120
|
||||||
|
hysteresis: 100
|
||||||
|
check_gain_time: 36000
|
||||||
|
heating_gain: 0.01
|
||||||
|
|
||||||
|
[heater_generic chamber]
|
||||||
|
heater_pin:PB14
|
||||||
|
max_power:1.0
|
||||||
|
sensor_type:Generic 3950
|
||||||
|
sensor_pin:PB1
|
||||||
|
min_temp:-50
|
||||||
|
max_temp:100
|
||||||
|
|
||||||
|
[verify_heater chamber]
|
||||||
|
max_error: 120
|
||||||
|
hysteresis: 100
|
||||||
|
check_gain_time: 36000
|
||||||
|
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_airpump_sensor extruder]
|
||||||
|
switch_pin: !PE13
|
||||||
|
airpump_pin: PE2
|
||||||
|
pause_on_runout: False
|
||||||
|
runout_gcode: _RUNOUT_HANDLE
|
||||||
|
max_run_time: 30
|
||||||
|
insert_delay_time: 15.0
|
||||||
|
debounce_delay: 3.0
|
||||||
|
event_delay: 0.01
|
||||||
|
|
||||||
|
[state_led led]
|
||||||
|
red_pin: PD8
|
||||||
|
green_pin: PD9
|
||||||
|
blue_pin: PD10
|
||||||
|
initial_RED: 0.0
|
||||||
|
initial_GREEN: 0.0
|
||||||
|
initial_BLUE: 0.0
|
||||||
|
idle: 0.0, 1.0, 0.5
|
||||||
|
printing: 0.0, 1.0, 0.0
|
||||||
|
paused: 1.0, 1.0, 0.0
|
||||||
|
error: 1.0, 0.0, 0.0
|
||||||
|
heating: 0.0, 0.0, 1.0
|
||||||
|
|
||||||
|
[led Interior_lighting]
|
||||||
|
white_pin: PC13
|
||||||
|
cycle_time: 0.010
|
||||||
|
initial_WHITE: 1
|
||||||
|
|
||||||
|
[fan]
|
||||||
|
pin:PC7
|
||||||
|
kick_start_time: 0.5
|
||||||
|
off_below: 0.10
|
||||||
|
max_power: 1.0
|
||||||
|
|
||||||
|
[heater_fan Sink_fan]
|
||||||
|
pin:PC6
|
||||||
|
max_power: 1.0
|
||||||
|
kick_start_time: 0.5
|
||||||
|
heater: extruder
|
||||||
|
heater_temp: 100
|
||||||
|
fan_speed: 1.0
|
||||||
|
|
||||||
|
[safe_z_home]
|
||||||
|
home_xy_position:390,400
|
||||||
|
z_hop_speed: 5
|
||||||
|
speed: 150
|
||||||
|
z_hop: 5
|
||||||
|
|
||||||
|
[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=400 Y=400 Z=0
|
||||||
|
|
||||||
|
[gcode_macro LOAD_FILAMENT]
|
||||||
|
variable_load_distance: 2500
|
||||||
|
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
|
||||||
|
RESTORE_GCODE_STATE NAME=load_state
|
||||||
|
|
||||||
|
########################################
|
||||||
|
# GCODE
|
||||||
|
########################################
|
||||||
|
|
||||||
|
[gcode_macro _START_PRINT_BASE]
|
||||||
|
description: Call when starting to print
|
||||||
|
variable_door_can_start: True
|
||||||
|
variable_filament_can_start: True
|
||||||
|
gcode:
|
||||||
|
{% if printer['gcode_button _door_detection'] %}
|
||||||
|
_DOOR_START_PRINT_RESPOND
|
||||||
|
{% endif %}
|
||||||
|
_CLEAR_LAST_FILE
|
||||||
|
_START_FILAMENT_HANDLE
|
||||||
|
|
||||||
|
[gcode_macro _CANCEL_PRINT_BASE]
|
||||||
|
description: Call when cancelled to print
|
||||||
|
gcode:
|
||||||
|
M220 S100
|
||||||
|
M221 S100
|
||||||
|
|
||||||
|
[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 PRINT_START]
|
||||||
|
gcode:
|
||||||
|
START_PRINT
|
||||||
|
|
||||||
|
[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 PRINT_END]
|
||||||
|
gcode:
|
||||||
|
END_PRINT
|
||||||
|
|
||||||
|
########################################
|
||||||
|
# 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
|
||||||
|
{% else %}
|
||||||
|
C28 {homing_cmd}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
[gcode_macro M104]
|
||||||
|
rename_existing: C104
|
||||||
|
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 heater_mapping = {1: "pre-heater", 2: "mid-heater",} %}
|
||||||
|
{% set hotend = heater_mapping.get(t, "extruder") %}
|
||||||
|
{% endif %}
|
||||||
|
SET_HEATER_TEMPERATURE HEATER={hotend} TARGET={s}
|
||||||
|
{% 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 %}
|
||||||
|
M104 {rawparams}
|
||||||
|
{% if s != 0 %}
|
||||||
|
{% if params.T is defined %}
|
||||||
|
{% set heater_mapping = {1: "'heater_generic pre-heater'", 2: "'heater_generic mid-heater'",} %}
|
||||||
|
{% set hotend =heater_mapping.get(t, "'extruder'") %}
|
||||||
|
{% endif %}
|
||||||
|
TEMPERATURE_WAIT SENSOR={hotend} MINIMUM={s-3} MAXIMUM={s+3}
|
||||||
|
{% 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 : 400.0
|
||||||
|
variable_custom_park_y : 300.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 : 4.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_filament_sensor : "filament_airpump_sensor extruder"
|
||||||
|
variable_user_temp_macro : "_USER_TEMP_RESUME"
|
||||||
|
variable_user_pause_macro : "_USER_PAUSE"
|
||||||
|
variable_user_cancel_macro: "_USER_CANCEL"
|
||||||
|
gcode:
|
||||||
|
# Nothing
|
||||||
|
|
||||||
|
[gcode_macro _USER_PAUSE]
|
||||||
|
gcode:
|
||||||
|
{% set extruderTools = [('extruder', 'last_extruder_temp'),
|
||||||
|
('heater_generic pre-heater', 'last_perheater_temp'),
|
||||||
|
('heater_generic mid-heater', 'last_midheater_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_perheater_temp'},
|
||||||
|
{'index': 2, 'name': 'last_midheater_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 heater_mapping = {1: "heater_generic pre-heater",
|
||||||
|
2: "heater_generic mid-heater"} %}
|
||||||
|
{% set tool = heater_mapping.get(info.index, "extruder") %}
|
||||||
|
{% set needwait = True if printer[tool].temperature < variable.temp else False %}
|
||||||
|
{% if needwait %}
|
||||||
|
RESPOND TYPE=echo MSG='{"Restoring heater temperature, this may take some time."}'
|
||||||
|
M109 T{info.index} S{variable.temp}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
[gcode_macro _USER_CANCEL]
|
||||||
|
gcode:
|
||||||
|
{% if 'z' in printer.toolhead.homed_axes %}
|
||||||
|
G91
|
||||||
|
G1 Z30 F600 ; lift nozzle
|
||||||
|
{% endif %}
|
||||||
|
M84
|
||||||
|
|
||||||
|
[gcode_macro _CLIENT_EXTRUDE]
|
||||||
|
description: Extrudes, if the extruder is hot enough
|
||||||
|
gcode:
|
||||||
|
##### get user parameters or use default #####
|
||||||
|
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
||||||
|
{% set use_fw_retract = (client.use_fw_retract|default(false)|lower == 'true') and (printer.firmware_retraction is defined) %}
|
||||||
|
{% set length = params.LENGTH|default(client.unretract)|default(1.0)|float %}
|
||||||
|
{% set speed = params.SPEED|default(client.speed_unretract)|default(35) %}
|
||||||
|
{% set absolute_extrude = printer.gcode_move.absolute_extrude %}
|
||||||
|
##### end of definitions #####
|
||||||
|
{% if printer.toolhead.extruder != '' %}
|
||||||
|
{% if printer[printer.toolhead.extruder].can_extrude %}
|
||||||
|
{% if use_fw_retract %}
|
||||||
|
{% if length < 0 %}
|
||||||
|
G10
|
||||||
|
{% else %}
|
||||||
|
G11
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
M83
|
||||||
|
G1 E{length} F{(speed|float|abs) * 60}
|
||||||
|
{% if absolute_extrude %}
|
||||||
|
M82
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
[gcode_macro RESUME]
|
||||||
|
description: Resume the actual running print
|
||||||
|
rename_existing: RESUME_BASE
|
||||||
|
variable_last_extruder_temp: {'restore': False, 'temp': 0}
|
||||||
|
variable_last_perheater_temp: {'restore': False, 'temp': 0}
|
||||||
|
variable_last_midheater_temp: {'restore': False, 'temp': 0}
|
||||||
|
variable_restore_idle_timeout: 0
|
||||||
|
variable_idle_state: False
|
||||||
|
variable_filament_state: False
|
||||||
|
gcode:
|
||||||
|
_FILAMENT_UPDATE
|
||||||
|
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
||||||
|
{% set do_resume = False %}
|
||||||
|
{% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config
|
||||||
|
else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder
|
||||||
|
#### 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
|
||||||
|
{% endif %}
|
||||||
|
{% if last_extruder_temp.restore or last_perheater_temp.restore or last_midheater_temp.restore %}
|
||||||
|
{client.user_temp_macro|default("")}
|
||||||
|
{% set do_resume = True %}
|
||||||
|
{% elif can_extrude %}
|
||||||
|
{% set do_resume = True %}
|
||||||
|
{% 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 filament_state = printer['gcode_macro RESUME'].filament_state|default(False)|lower %}
|
||||||
|
{% set restore_idle_timeout = printer['gcode_macro RESUME'].restore_idle_timeout|default(0) %}
|
||||||
|
|
||||||
|
{% if filament_state == "false" %}
|
||||||
|
AIR_PUMP_ON
|
||||||
|
{% endif %}
|
||||||
|
{% if printer[printer.toolhead.extruder].can_extrude %}
|
||||||
|
{% if restore_idle_timeout > 0 %} SET_IDLE_TIMEOUT TIMEOUT={restore_idle_timeout} {% endif %}
|
||||||
|
_CLIENT_EXTRUDE
|
||||||
|
RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)}
|
||||||
|
{% else %}
|
||||||
|
RESPOND TYPE=error MSG='{"extruder not hot enough, Please confirm whether the temperature is normal."}'
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
########################################
|
||||||
|
# filament_runout
|
||||||
|
########################################
|
||||||
|
|
||||||
|
[gcode_macro AIR_PUMP_ON]
|
||||||
|
gcode:
|
||||||
|
SET_AIRPUMP AIRPUMP=extruder VALUE=1 RUN_TIME=20
|
||||||
|
|
||||||
|
[gcode_macro AIR_PUMP_OFF]
|
||||||
|
gcode:
|
||||||
|
SET_AIRPUMP AIRPUMP=extruder VALUE=0
|
||||||
|
|
||||||
|
[gcode_macro _START_FILAMENT_HANDLE]
|
||||||
|
gcode:
|
||||||
|
{% set runout = True if not printer['filament_airpump_sensor extruder'].enabled
|
||||||
|
else printer['filament_airpump_sensor extruder'].filament_detected %}
|
||||||
|
{% if not runout %}
|
||||||
|
SET_AIRPUMP AIRPUMP=extruder VALUE=1 RUN_TIME=10
|
||||||
|
{% endif %}
|
||||||
|
G4 P5000
|
||||||
|
_RUNOUT_HANDLE
|
||||||
|
|
||||||
|
[gcode_macro _FILAMENT_UPDATE]
|
||||||
|
gcode:
|
||||||
|
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
||||||
|
{% set runout = 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_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.runout|default(False) %}
|
||||||
|
{% if not filament_state %}
|
||||||
|
PAUSE
|
||||||
|
M118 "Nothing! granular material in the silo has been run out."
|
||||||
|
{% 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
|
||||||
|
|
||||||
|
[include module/*.cfg]
|
39
config/CreatBot_P800/printer.cfg
Normal file
39
config/CreatBot_P800/printer.cfg
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
[include base.cfg]
|
||||||
|
|
||||||
|
[printer]
|
||||||
|
kinematics: cartesian
|
||||||
|
max_velocity: 100
|
||||||
|
max_accel: 100
|
||||||
|
max_z_velocity: 5
|
||||||
|
max_z_accel: 5
|
||||||
|
square_corner_velocity: 5
|
||||||
|
|
||||||
|
[extruder]
|
||||||
|
control: pid
|
||||||
|
pid_kp: 44.910
|
||||||
|
pid_ki: 3.481
|
||||||
|
pid_kd: 144.835
|
||||||
|
|
||||||
|
[heater_bed]
|
||||||
|
control: pid
|
||||||
|
pid_kp: 53.939
|
||||||
|
pid_ki: 1.456
|
||||||
|
pid_kd: 499.607
|
||||||
|
|
||||||
|
[heater_generic pre-heater]
|
||||||
|
control: pid
|
||||||
|
pid_kp: 44.075
|
||||||
|
pid_ki: 2.332
|
||||||
|
pid_kd: 208.253
|
||||||
|
|
||||||
|
[heater_generic mid-heater]
|
||||||
|
control: pid
|
||||||
|
pid_kp: 44.497
|
||||||
|
pid_ki: 2.535
|
||||||
|
pid_kd: 195.229
|
||||||
|
|
||||||
|
[heater_generic chamber]
|
||||||
|
control: pid
|
||||||
|
pid_kp: 30.68
|
||||||
|
pid_ki: 0.21
|
||||||
|
pid_kd: 0
|
142
klippy/extras/filament_airpump_sensor.py
Normal file
142
klippy/extras/filament_airpump_sensor.py
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
# Filament air pump load Module
|
||||||
|
#
|
||||||
|
# Copyright (C) 2025 Creatbot
|
||||||
|
#
|
||||||
|
# This file may be distributed under the terms of the GNU GPLv3 license.
|
||||||
|
import logging
|
||||||
|
from . import output_pin, filament_switch_sensor
|
||||||
|
|
||||||
|
class AirPump:
|
||||||
|
def __init__(self, config, timeout_event_handler):
|
||||||
|
self.printer = config.get_printer()
|
||||||
|
self.name = config.get_name()
|
||||||
|
self.reactor = self.printer.get_reactor()
|
||||||
|
self.max_run_time = config.getfloat('max_run_time', 10., minval=0.)
|
||||||
|
self.insert_delay_time = config.getfloat('insert_delay_time', 2., minval=0.)
|
||||||
|
self.start_time = None
|
||||||
|
self.is_running = False
|
||||||
|
self.timeout_timer = None
|
||||||
|
|
||||||
|
ppins = self.printer.lookup_object('pins')
|
||||||
|
self.airpump_pin = None
|
||||||
|
airpump_pin = config.get('airpump_pin')
|
||||||
|
self.airpump_pin = ppins.setup_pin('digital_out', airpump_pin)
|
||||||
|
self.airpump_pin.setup_max_duration(0.)
|
||||||
|
self.airpump_mcu = self.airpump_pin.get_mcu()
|
||||||
|
self.timeout_event_handler = timeout_event_handler
|
||||||
|
|
||||||
|
def set_power(self, power, eventtime):
|
||||||
|
print_time = self.airpump_mcu.estimated_print_time(eventtime + 0.1)
|
||||||
|
logging.info(f"set air pump to {power} at {print_time}")
|
||||||
|
if power > 0:
|
||||||
|
if not self.is_running:
|
||||||
|
self.start_time = self.reactor.monotonic()
|
||||||
|
self.is_running = True
|
||||||
|
self.timeout_timer = self.reactor.register_timer(
|
||||||
|
self._check_timeout, self.start_time + self.max_run_time)
|
||||||
|
self.airpump_pin.set_digital(print_time, 1)
|
||||||
|
else:
|
||||||
|
if self.timeout_timer is not None:
|
||||||
|
self.reactor.unregister_timer(self.timeout_timer)
|
||||||
|
self.timeout_timer = None
|
||||||
|
self.is_running = False
|
||||||
|
self.start_time = None
|
||||||
|
self.airpump_pin.set_digital(print_time, 0)
|
||||||
|
|
||||||
|
def _check_timeout(self, eventtime):
|
||||||
|
if self.is_running and (eventtime - self.start_time >= self.max_run_time):
|
||||||
|
if self.timeout_event_handler:
|
||||||
|
self.timeout_event_handler(eventtime)
|
||||||
|
logging.info(f"Air pump '{self.name}' timed out after {self.max_run_time}s")
|
||||||
|
return self.reactor.NEVER
|
||||||
|
|
||||||
|
class AirPump_Helper(filament_switch_sensor.RunoutHelper):
|
||||||
|
def __init__(self, config):
|
||||||
|
super().__init__(config)
|
||||||
|
self.airpump = AirPump(config, self._timeout_event_handler)
|
||||||
|
self.retry_count = 0
|
||||||
|
|
||||||
|
def set_airpump_state(self, power, eventtime=None):
|
||||||
|
if eventtime is None:
|
||||||
|
eventtime = self.reactor.monotonic()
|
||||||
|
self.airpump.set_power(power, eventtime)
|
||||||
|
|
||||||
|
def _runout_event_handler(self, eventtime):
|
||||||
|
self.set_airpump_state(1, eventtime)
|
||||||
|
self.min_event_systime = self.reactor.monotonic() + self.event_delay
|
||||||
|
|
||||||
|
def _insert_pump_event_handler(self, eventtime):
|
||||||
|
delay = self.airpump.insert_delay_time
|
||||||
|
target_time = eventtime + delay
|
||||||
|
def delayed_action(eventtime):
|
||||||
|
self.set_airpump_state(0, eventtime)
|
||||||
|
self.min_event_systime = self.reactor.monotonic() + self.event_delay
|
||||||
|
return self.reactor.NEVER
|
||||||
|
self.reactor.register_callback(delayed_action, target_time)
|
||||||
|
self.retry_count = 0
|
||||||
|
|
||||||
|
def _timeout_event_handler(self, eventtime):
|
||||||
|
self.retry_count += 1
|
||||||
|
self.set_airpump_state(0, eventtime)
|
||||||
|
if self.retry_count < 3:
|
||||||
|
target_time = eventtime + 30
|
||||||
|
def retry_action(eventtime):
|
||||||
|
self._runout_event_handler(eventtime)
|
||||||
|
return self.reactor.NEVER
|
||||||
|
self.reactor.register_callback(retry_action, target_time)
|
||||||
|
else:
|
||||||
|
super()._runout_event_handler(eventtime)
|
||||||
|
self.retry_count = 0
|
||||||
|
|
||||||
|
class AirPumpLoad:
|
||||||
|
def __init__(self, config):
|
||||||
|
self.cmd_SET_AIRPUMP_help = "Sets the state of the filament airpump"
|
||||||
|
self.printer = config.get_printer()
|
||||||
|
buttons = self.printer.load_object(config, 'buttons')
|
||||||
|
switch_pin = config.get('switch_pin')
|
||||||
|
|
||||||
|
buttons.register_debounce_button(switch_pin, self._pump_status_handler, config)
|
||||||
|
self.airpump_helper = AirPump_Helper(config)
|
||||||
|
self.get_status = self.airpump_helper.get_status
|
||||||
|
|
||||||
|
self.name = config.get_name().split()[-1]
|
||||||
|
self.template_eval = output_pin.lookup_template_eval(config)
|
||||||
|
gcode = self.printer.lookup_object('gcode')
|
||||||
|
gcode.register_mux_command("SET_AIRPUMP", "AIRPUMP",
|
||||||
|
self.name,
|
||||||
|
self.cmd_SET_AIRPUMP,
|
||||||
|
desc=self.cmd_SET_AIRPUMP_help)
|
||||||
|
|
||||||
|
def _pump_status_handler(self, eventtime, state):
|
||||||
|
self.airpump_helper.note_filament_present(eventtime, state)
|
||||||
|
|
||||||
|
def _template_update(self, text):
|
||||||
|
try:
|
||||||
|
value = float(text)
|
||||||
|
except ValueError as e:
|
||||||
|
logging.exception("Airpump template render error")
|
||||||
|
value = 0.
|
||||||
|
self.airpump_helper.set_airpump_state(value)
|
||||||
|
|
||||||
|
def cmd_SET_AIRPUMP(self, gcmd):
|
||||||
|
value = gcmd.get_float('VALUE', None, minval=0., maxval=1.)
|
||||||
|
template = gcmd.get('TEMPLATE', None)
|
||||||
|
run_time = gcmd.get_float('RUN_TIME', None, minval=0.)
|
||||||
|
|
||||||
|
if (value is None) == (template is None):
|
||||||
|
raise gcmd.error("SET_AIRPUMP must specify VALUE or TEMPLATE")
|
||||||
|
if template is not None:
|
||||||
|
self.template_eval.set_template(gcmd, self._template_update)
|
||||||
|
return
|
||||||
|
self.airpump_helper.set_airpump_state(value)
|
||||||
|
gcmd.respond_info(f"{self.name} airpump set to: {value}")
|
||||||
|
|
||||||
|
if value > 0 and run_time is not None:
|
||||||
|
eventtime = self.airpump_helper.reactor.monotonic()
|
||||||
|
def turn_off_pump(eventtime):
|
||||||
|
self.airpump_helper.set_airpump_state(0, eventtime)
|
||||||
|
return self.airpump_helper.reactor.NEVER
|
||||||
|
self.airpump_helper.reactor.register_timer(turn_off_pump, eventtime + run_time)
|
||||||
|
|
||||||
|
def load_config_prefix(config):
|
||||||
|
return AirPumpLoad(config)
|
@ -76,6 +76,9 @@ class RunoutHelper:
|
|||||||
is_printing = idle_timeout.get_status(now)["state"] == "Printing"
|
is_printing = idle_timeout.get_status(now)["state"] == "Printing"
|
||||||
# Perform filament action associated with status change (if any)
|
# Perform filament action associated with status change (if any)
|
||||||
if is_filament_present:
|
if is_filament_present:
|
||||||
|
if hasattr(self, 'airpump'):
|
||||||
|
self.min_event_systime = self.reactor.NEVER
|
||||||
|
self.reactor.register_callback(self._insert_pump_event_handler)
|
||||||
if not is_printing and self.insert_gcode is not None:
|
if not is_printing and self.insert_gcode is not None:
|
||||||
# insert detected
|
# insert detected
|
||||||
self.min_event_systime = self.reactor.NEVER
|
self.min_event_systime = self.reactor.NEVER
|
||||||
|
@ -69,7 +69,7 @@ class GCodeMove:
|
|||||||
self.extrude_factor, self.speed)
|
self.extrude_factor, self.speed)
|
||||||
def _handle_activate_extruder(self):
|
def _handle_activate_extruder(self):
|
||||||
self.reset_last_position()
|
self.reset_last_position()
|
||||||
self.extrude_factor = 1.
|
# self.extrude_factor = 1.
|
||||||
self.base_position[3] = self.last_position[3]
|
self.base_position[3] = self.last_position[3]
|
||||||
def _handle_home_rails_end(self, homing_state, rails):
|
def _handle_home_rails_end(self, homing_state, rails):
|
||||||
self.reset_last_position()
|
self.reset_last_position()
|
||||||
|
116
klippy/extras/state_led.py
Normal file
116
klippy/extras/state_led.py
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
from . import led
|
||||||
|
import logging
|
||||||
|
|
||||||
|
class LEDStateHandler:
|
||||||
|
def __init__(self, config):
|
||||||
|
self.printer = config.get_printer()
|
||||||
|
self.led_name = config.get_name().split()[-1]
|
||||||
|
self.color_map = {}
|
||||||
|
states = ['idle', 'printing', 'paused', 'error', 'heating']
|
||||||
|
for state in states:
|
||||||
|
color_str = config.get(state, None)
|
||||||
|
if color_str:
|
||||||
|
r, g, b = [float(v.strip()) for v in color_str.split(',')]
|
||||||
|
self.color_map[state] = (r, g, b)
|
||||||
|
|
||||||
|
default_colors = {
|
||||||
|
'idle': (0.0, 0.0, 0.0),
|
||||||
|
'printing': (0.0, 1.0, 0.0),
|
||||||
|
'paused': (1.0, 1.0, 0.0),
|
||||||
|
'error': (1.0, 0.0, 0.0),
|
||||||
|
'heating': (1.0, 0.5, 0.0),
|
||||||
|
}
|
||||||
|
for state, color in default_colors.items():
|
||||||
|
if state not in self.color_map:
|
||||||
|
self.color_map[state] = color
|
||||||
|
|
||||||
|
self.led = led.PrinterPWMLED(config)
|
||||||
|
self.hot_targets = {}
|
||||||
|
self.is_ready = False
|
||||||
|
self.last_color = None
|
||||||
|
|
||||||
|
self.reactor = self.printer.get_reactor()
|
||||||
|
self.timer = None
|
||||||
|
|
||||||
|
self.print_stats = self.printer.lookup_object('print_stats')
|
||||||
|
self.heaters = self.printer.lookup_object('heaters')
|
||||||
|
self.printer.register_event_handler('klippy:ready', self._handle_ready)
|
||||||
|
|
||||||
|
def _handle_ready(self):
|
||||||
|
self.heaters = self.printer.lookup_object('heaters')
|
||||||
|
self.display_status = self.printer.lookup_object('display_status', None)
|
||||||
|
|
||||||
|
for heater_name in self.heaters.get_all_heaters():
|
||||||
|
self.hot_targets[heater_name] = 0.0
|
||||||
|
|
||||||
|
self.is_ready = True
|
||||||
|
self.timer = self.reactor.register_timer(
|
||||||
|
self._update_callback, self.reactor.NOW)
|
||||||
|
|
||||||
|
def _update_callback(self, eventtime):
|
||||||
|
if not self.is_ready:
|
||||||
|
return eventtime + 1.0
|
||||||
|
|
||||||
|
status = self.print_stats.get_status(eventtime)
|
||||||
|
current_state = status.get('state', 'standby')
|
||||||
|
message = status.get('message', '')
|
||||||
|
try:
|
||||||
|
hot_targets_copy = self.hot_targets.copy()
|
||||||
|
for heater_name in hot_targets_copy.keys():
|
||||||
|
try:
|
||||||
|
if heater_name.startswith('heater_generic '):
|
||||||
|
heater_name = heater_name.split(' ')[-1]
|
||||||
|
heater = self.heaters.lookup_heater(heater_name)
|
||||||
|
_, target = heater.get_temp(eventtime)
|
||||||
|
self.hot_targets[heater_name] = target
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
except Exception as e:
|
||||||
|
logging.error("Error updating heater targets: %s", str(e))
|
||||||
|
return eventtime + 1.0
|
||||||
|
|
||||||
|
max_hot_target = max(self.hot_targets.values()) if self.hot_targets else 0
|
||||||
|
|
||||||
|
if current_state == 'standby':
|
||||||
|
color_name = 'heating' if max_hot_target > 0 else 'idle'
|
||||||
|
elif current_state == 'printing':
|
||||||
|
color_name = 'printing'
|
||||||
|
elif current_state == 'paused':
|
||||||
|
color_name = 'paused'
|
||||||
|
elif current_state == 'cancelled':
|
||||||
|
color_name = 'paused' if message else 'idle'
|
||||||
|
elif current_state == 'error':
|
||||||
|
color_name = 'error'
|
||||||
|
else:
|
||||||
|
color_name = 'idle'
|
||||||
|
|
||||||
|
try:
|
||||||
|
r, g, b = self.color_map[color_name]
|
||||||
|
except KeyError:
|
||||||
|
logging.error("Missing color definition for state: %s", color_name)
|
||||||
|
r, g, b = (1.0, 0.0, 0.0)
|
||||||
|
|
||||||
|
if self.last_color != (r, g, b):
|
||||||
|
try:
|
||||||
|
color = (r, g, b, 0.0)
|
||||||
|
toolhead = self.printer.lookup_object('toolhead')
|
||||||
|
toolhead.register_lookahead_callback(
|
||||||
|
lambda pt: self._update_led_color(color, pt)
|
||||||
|
)
|
||||||
|
logging.info('LED %s: %s %s', self.led_name, current_state, (r, g, b))
|
||||||
|
self.last_color = (r, g, b)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error("Error updating LED color: %s", str(e))
|
||||||
|
|
||||||
|
return eventtime + 0.5
|
||||||
|
|
||||||
|
def _update_led_color(self, color, print_time):
|
||||||
|
try:
|
||||||
|
if self.led.led_helper.led_state[0] != color:
|
||||||
|
self.led.led_helper._set_color(None, color)
|
||||||
|
self.led.led_helper._check_transmit(print_time)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error("Error in LED transmission: %s", str(e))
|
||||||
|
|
||||||
|
def load_config_prefix(config):
|
||||||
|
return LEDStateHandler(config)
|
@ -136,6 +136,7 @@ class PrinterExtruder:
|
|||||||
def __init__(self, config, extruder_num):
|
def __init__(self, config, extruder_num):
|
||||||
self.printer = config.get_printer()
|
self.printer = config.get_printer()
|
||||||
self.name = config.get_name()
|
self.name = config.get_name()
|
||||||
|
self.err_count = 0
|
||||||
self.last_position = 0.
|
self.last_position = 0.
|
||||||
# Setup hotend heater
|
# Setup hotend heater
|
||||||
pheaters = self.printer.load_object(config, 'heaters')
|
pheaters = self.printer.load_object(config, 'heaters')
|
||||||
@ -177,12 +178,12 @@ class PrinterExtruder:
|
|||||||
self.extruder_stepper = ExtruderStepper(config)
|
self.extruder_stepper = ExtruderStepper(config)
|
||||||
self.extruder_stepper.stepper.set_trapq(self.trapq)
|
self.extruder_stepper.stepper.set_trapq(self.trapq)
|
||||||
# Register commands
|
# Register commands
|
||||||
gcode = self.printer.lookup_object('gcode')
|
self.gcode = self.printer.lookup_object('gcode')
|
||||||
if self.name == 'extruder':
|
if self.name == 'extruder':
|
||||||
toolhead.set_extruder(self, 0.)
|
toolhead.set_extruder(self, 0.)
|
||||||
gcode.register_command("M104", self.cmd_M104)
|
self.gcode.register_command("M104", self.cmd_M104)
|
||||||
gcode.register_command("M109", self.cmd_M109)
|
self.gcode.register_command("M109", self.cmd_M109)
|
||||||
gcode.register_mux_command("ACTIVATE_EXTRUDER", "EXTRUDER",
|
self.gcode.register_mux_command("ACTIVATE_EXTRUDER", "EXTRUDER",
|
||||||
self.name, self.cmd_ACTIVATE_EXTRUDER,
|
self.name, self.cmd_ACTIVATE_EXTRUDER,
|
||||||
desc=self.cmd_ACTIVATE_EXTRUDER_help)
|
desc=self.cmd_ACTIVATE_EXTRUDER_help)
|
||||||
def update_move_time(self, flush_time, clear_history_time):
|
def update_move_time(self, flush_time, clear_history_time):
|
||||||
@ -204,16 +205,28 @@ class PrinterExtruder:
|
|||||||
def check_move(self, move):
|
def check_move(self, move):
|
||||||
axis_r = move.axes_r[3]
|
axis_r = move.axes_r[3]
|
||||||
if not self.heater.can_extrude:
|
if not self.heater.can_extrude:
|
||||||
raise self.printer.command_error(
|
msg = (f"Extrude below minimum extrude temp of {self.heater.min_extrude_temp}℃")
|
||||||
"Extrude below minimum temp\n"
|
if self.printer.is_printing():
|
||||||
"See the 'min_extrude_temp' config option for details")
|
self.err_count += 1
|
||||||
|
if self.err_count > 100:
|
||||||
|
self.err_count = 0
|
||||||
|
self.gcode._respond_error(msg)
|
||||||
|
else:
|
||||||
|
raise self.printer.command_error(f"Extrude below minimum extrude temp of {self.heater.min_extrude_temp}℃")
|
||||||
if (not move.axes_d[0] and not move.axes_d[1]) or axis_r < 0.:
|
if (not move.axes_d[0] and not move.axes_d[1]) or axis_r < 0.:
|
||||||
# Extrude only move (or retraction move) - limit accel and velocity
|
# Extrude only move (or retraction move) - limit accel and velocity
|
||||||
if abs(move.axes_d[3]) > self.max_e_dist:
|
if abs(move.axes_d[3]) > self.max_e_dist:
|
||||||
raise self.printer.command_error(
|
msg = (
|
||||||
"Extrude only move too long (%.3fmm vs %.3fmm)\n"
|
"Extrude only move too long (%.3fmm vs %.3fmm)\n"
|
||||||
"See the 'max_extrude_only_distance' config"
|
"See the 'max_extrude_only_distance' config"
|
||||||
" option for details" % (move.axes_d[3], self.max_e_dist))
|
" option for details" % (move.axes_d[3], self.max_e_dist))
|
||||||
|
if self.printer.is_printing():
|
||||||
|
self.err_count += 1
|
||||||
|
if self.err_count > 100:
|
||||||
|
self.err_count = 0
|
||||||
|
self.gcode._respond_error(msg)
|
||||||
|
else:
|
||||||
|
raise self.printer.command_error(msg)
|
||||||
inv_extrude_r = 1. / abs(axis_r)
|
inv_extrude_r = 1. / abs(axis_r)
|
||||||
move.limit_speed(self.max_e_velocity * inv_extrude_r,
|
move.limit_speed(self.max_e_velocity * inv_extrude_r,
|
||||||
self.max_e_accel * inv_extrude_r)
|
self.max_e_accel * inv_extrude_r)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user