Adaptive bed mesh is merged into klipper master branch. You can use this feature without this custom macro. Official klipper adaptive bed mesh
- This macro will dynamically changing the bed mesh area based on the size of the parts will be printed. The fw will only probe on the area that the part will be printed (plus mesh_area_offset value)
- (1) Add the following macro to your printer config, this will replace the default
BED_MESH_CALIBRATE
command.
[gcode_macro BED_MESH_CALIBRATE] rename_existing: BED_MESH_CALIBRATE_BASE ; gcode parameters variable_parameter_AREA_START : 0,0 variable_parameter_AREA_END : 0,0 ; the clearance between print area and probe area variable_mesh_area_offset : 5.0 ; number of sample per probe point variable_probe_samples : 2 ; minimum probe count variable_min_probe_count : 4 ; scale up the probe count, should be 1.0 ~ < variable_max_probe_count/variable_min_probe_count variable_probe_count_scale_factor : 1.0 ; enable preference index variable_enable_reference_index : False gcode: {% if params.AREA_START and params.AREA_END %} {% set bedMeshConfig = printer["configfile"].config["bed_mesh"] %} {% set safe_min_x = bedMeshConfig.mesh_min.split(",")[0]|float %} {% set safe_min_y = bedMeshConfig.mesh_min.split(",")[1]|float %} {% set safe_max_x = bedMeshConfig.mesh_max.split(",")[0]|float %} {% set safe_max_y = bedMeshConfig.mesh_max.split(",")[1]|float %} {% set area_min_x = params.AREA_START.split(",")[0]|float %} {% set area_min_y = params.AREA_START.split(",")[1]|float %} {% set area_max_x = params.AREA_END.split(",")[0]|float %} {% set area_max_y = params.AREA_END.split(",")[1]|float %} {% if bedMeshConfig.probe_count.split(",")|length == 2 %} {% set meshPointX = bedMeshConfig.probe_count.split(",")[0]|int %} {% set meshPointY = bedMeshConfig.probe_count.split(",")[1]|int %} {% else %} {% set meshPointX = bedMeshConfig.probe_count.split(",")[0]|int %} {% set meshPointY = bedMeshConfig.probe_count.split(",")[0]|int %} {% endif %} {% set meshMaxPointX = meshPointX %} {% set meshMaxPointY = meshPointY %} {% if (area_min_x < area_max_x) and (area_min_y < area_max_y) %} {% if area_min_x - mesh_area_offset >= safe_min_x %} {% set area_min_x = area_min_x - mesh_area_offset %} {% else %} {% set area_min_x = safe_min_x %} {% endif %} {% if area_min_y - mesh_area_offset >= safe_min_y %} {% set area_min_y = area_min_y - mesh_area_offset %} {% else %} {% set area_min_y = safe_min_y %} {% endif %} {% if area_max_x + mesh_area_offset <= safe_max_x %} {% set area_max_x = area_max_x + mesh_area_offset %} {% else %} {% set area_max_x = safe_max_x %} {% endif %} {% if area_max_y + mesh_area_offset <= safe_max_y %} {% set area_max_y = area_max_y + mesh_area_offset %} {% else %} {% set area_max_y = safe_max_y %} {% endif %} {% set meshPointX = (meshPointX * (area_max_x - area_min_x) / (safe_max_x - safe_min_x) * probe_count_scale_factor)|round(0)|int %} {% if meshPointX < min_probe_count %} {% set meshPointX = min_probe_count %} {% endif %} {% if meshPointX > meshMaxPointX %} {% set meshPointX = meshMaxPointX %} {% endif %} {% set meshPointY = (meshPointY * (area_max_y -area_min_y ) / (safe_max_y - safe_min_y) * probe_count_scale_factor )|round(0)|int %} {% if meshPointY < min_probe_count %} {% set meshPointY = min_probe_count %} {% endif %} {% if meshPointY > meshMaxPointY %} {% set meshPointY = meshMaxPointY %} {% endif %} {% set algorithm = "bicubic" %} {% if "algorithm" in bedMeshConfig %} {% set algorithm = bedMeshConfig.algorithm %} {% endif %} {% if meshPointX >=7 or meshPointY >=7 %} {% set algorithm = "bicubic" %} {% endif %} {% if enable_reference_index %} {% set referenceIndex = (meshPointX * meshPointY / 2 - 1 )|round(0)|int %} BED_MESH_CALIBRATE_BASE mesh_min={area_min_x},{area_min_y} mesh_max={area_max_x},{area_max_y} probe_count={meshPointX},{meshPointY} samples={probe_samples|int} algorithm={algorithm} relative_reference_index={referenceIndex} {% else %} BED_MESH_CALIBRATE_BASE mesh_min={area_min_x},{area_min_y} mesh_max={area_max_x},{area_max_y} probe_count={meshPointX},{meshPointY} samples={probe_samples|int} algorithm={algorithm} {% endif %} {% else %} BED_MESH_CALIBRATE_BASE {% endif %} {% else %} BED_MESH_CALIBRATE_BASE {% endif %}
- (2) Go to slicer setting and replace the old bed mesh gcode the following command.
Prusa Slicer
BED_MESH_CALIBRATE AREA_START={first_layer_print_min[0]},{first_layer_print_min[1]} AREA_END={first_layer_print_max[0]},{first_layer_print_max[1]}
Ideal maker
BED_MESH_CALIBRATE AREA_START={print_pos_min_x},{print_pos_min_y} AREA_END={print_pos_max_x},{print_pos_max_y}
Cura slicer
BED_MESH_CALIBRATE AREA_START=%MINX%,%MINY% AREA_END=%MAXX%,%MAXY%
*(Cura slicer plugin) To make the macro to work in Cura slicer, you need to install the post process plugin click here to download (based on frankbags's script)
- In cura menu Help
-> Show configuration folder
.
- Copy the python script from the above link in to scripts
folder.
- Restart Cura
- In cura menu Extensions
-> Post processing
-> Modify G-Code
and select Klipper print area mesh
- (*) If you use single command start gcode like
START_PRINT BED_TEMP={material_bed_temperature_layer_0} EXTRUDER_TEMP={material_print_temperature_layer_0}
.You might need to add parameter parsing to BED_MESH_CALIBRATE inside START_PRINT. This is an example, also check my macro sample
[gcode_macro START_PRINT] variable_parameter_EXTRUDER_TEMP: 190 variable_parameter_BED_TEMP: 60 ; gcode parameters for area bed mesh variable_parameter_AREA_START : 0,0 variable_parameter_AREA_END : 0,0 gcode: # preheat, homing, etc BED_MESH_CALIBRATE AREA_START={params.AREA_START|default("0,0")} AREA_END={params.AREA_END|default("0,0")} # the rest of your start macro here
And you will need to change Slicer start gcode to this
- Cura:
START_PRINT EXTRUDER_TEMP={material_print_temperature_layer_0} BED_TEMP={material_bed_temperature_layer_0} AREA_START=%MINX%,%MINY% AREA_END=%MAXX%,%MAXY%
- Prusa slicer:
START_PRINT EXTRUDER_TEMP=[first_layer_temperature] BED_TEMP=[first_layer_bed_temperature] AREA_START={first_layer_print_min[0]},{first_layer_print_min[1]} AREA_END={first_layer_print_max[0]},{first_layer_print_max[1]}
- 2022/07/21
- Added force lagrange algorithm for mesh with lower than 3 points
- Added
enable_reference_index
config flag
- I will try to help if possible, you will have to post ALL of your configs, your slicer start gcode and your sliced gcode.
- If I'm cannot or too slow to respose, our discord members might help you. Check our discord here
please help, I sometimes get an error and I haven't figured out the reason why? the frustrating thing is that it only happens sometimes. although I do understand what the error is saying I don't understand why is happening.
``[gcode_macro BED_MESH_CALIBRATE]
rename_existing: BED_MESH_CALIBRATE_BASE
; gcode parameters
variable_parameter_AREA_START : 0,0
variable_parameter_AREA_END : 0,0
; the clearance between print area and probe area
variable_mesh_area_offset : 2.0
; number of sample per probe point
variable_probe_samples : 1
; minimum probe count
variable_min_probe_count : 3
; scale up the probe count, should be 1.0 ~ < variable_max_probe_count/variable_min_probe_count
variable_probe_count_scale_factor : 1.0
; enable preference index
variable_enable_reference_index : False
gcode:
{% if params.AREA_START and params.AREA_END %}
{% set bedMeshConfig = printer["configfile"].config["bed_mesh"] %}
{% set safe_min_x = bedMeshConfig.mesh_min.split(",")[0]|float %}
{% set safe_min_y = bedMeshConfig.mesh_min.split(",")[1]|float %}
{% set safe_max_x = bedMeshConfig.mesh_max.split(",")[0]|float %}
{% set safe_max_y = bedMeshConfig.mesh_max.split(",")[1]|float %}
``[gcode_macro START_PRINT]
variable_parameter_EXTRUDER_TEMP: 235
variable_parameter_BED_TEMP: 50
; gcode parameters for area bed mesh
variable_parameter_AREA_START : 0,0
variable_parameter_AREA_END : 0,0
gcode:
{% set BED_TEMP = params.BED_TEMP|default(50)|float %}
{% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(235)|float %}
M104 S{EXTRUDER_TEMP} T0
M140 S{BED_TEMP}
G28
# preheat, homing, etc
BED_MESH_CALIBRATE AREA_START={params.AREA_START|default("0,0")} AREA_END={params.AREA_END|default("0,0")}
# the rest of your start macro here
M117 Waiting for temperature
# Start bed heating and continue
#M140 S{BED_TEMP}
{% if printer.heater_bed.temperature < params.BED_TEMP|float0.95 %}
M190 S{params.BED_TEMP|float0.95} # wait till 0.85 of bed temp is reached, then continue
{% endif %}
#M140 S{EXTRUDER_TEMP}
#M190 S{BED_TEMP}
#M109 S{EXTRUDER_TEMP}
M190 S{BED_TEMP}
M109 S{EXTRUDER_TEMP} T0
PRIME_LINE
M117 Printing...
[gcode_macro END_PRINT]
gcode:
M117 Done printing :)
# move z down
G91
G1 Z10 F3000
G1 E-5
G28 X Y
#disable hotend and heated bed
M104 S0
M140 S0
# disable steppers
M84
BED_MESH_CLEAR