Klipper mesh on print area only install guide
What this macro do
- 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)
Setup guide
- (1) Add the following macrro 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 by frankbags
- 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
For user using single command START_PRINT
- (*) 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]}
change logs
- 2022/07/21
- Added force lagrange algorithm for mesh with lower than 3 points
- Added
enable_reference_index
config flag
The code does not work?
- 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
[include mainsail.cfg]
VzBoT############
#######################
[printer]
kinematics: corexy
max_velocity: 800
max_accel: 6000
max_accel_to_decel: 6000
max_z_velocity: 35
max_z_accel: 120
square_corner_velocity: 12
[mcu]
serial:/dev/serial/by-id/usb-Klipper_stm32h743xx_300039000951303339323537-if00
[mcu rpi]
serial: /tmp/klipper_host_mcu
[adxl345]
cs_pin: rpi:None
[resonance_tester]
accel_chip: adxl345
probe_points:
165, 165, 20 # an example
########################################
EXP1 / EXP2 (display) pins
########################################
[board_pins]
aliases:
# EXP1 header
EXP1_1=PC5, EXP1_3=PB1, EXP1_5=PE9, EXP1_7=PE11, EXP1_9=,
EXP1_2=PB0, EXP1_4=PE8, EXP1_6=PE10, EXP1_8=PE12, EXP1_10=<5V>,
# EXP2 header
EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PB2, EXP2_7=PC4, EXP2_9=,
EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=, EXP2_10=
See the sample-lcd.cfg file for definitions of common LCD displays.
########################
########################
[stepper_x]
step_pin: PA15
dir_pin: PA8
enable_pin: !PD1
microsteps: 16
rotation_distance: 40
endstop_pin: ^PC1
position_endstop: 0
position_min: 0
position_max: 328
homing_speed: 100
full_steps_per_rotation: 200
homing_retract_dist: 0
homing_positive_dir: false
step_pulse_duration: 0.000001
[tmc5160 stepper_x]
cs_pin: PD0
spi_software_miso_pin: PE15
spi_software_mosi_pin: PE13
spi_software_sclk_pin: PE14
run_current: 1.100
#hold_current: 1.200
diag1_pin: PC3
sense_resistor: 0.075
########################
[stepper_y]
step_pin: PD4
dir_pin: PD3
enable_pin: !PD6
microsteps: 16
rotation_distance: 40
endstop_pin: ^PC3
position_endstop: 0
position_min: 0
position_max: 325
homing_speed: 100
full_steps_per_rotation: 200
homing_retract_dist: 0
homing_positive_dir: false
step_pulse_duration: 0.000001
[tmc5160 stepper_y]
cs_pin: PD5
spi_software_miso_pin: PE15
spi_software_mosi_pin: PE13
spi_software_sclk_pin: PE14
run_current: 1.100
#hold_current: 1.000
diag1_pin: PC1
sense_resistor: 0.075
########################
[stepper_z]
step_pin: PE2
dir_pin: PE3
enable_pin: !PE0
microsteps: 16
rotation_distance: 3.985
endstop_pin: probe:z_virtual_endstop
position_min: -3
position_max: 320
full_steps_per_rotation: 200
homing_retract_dist: 5.0
homing_positive_dir: false
homing_speed: 5.0
second_homing_speed: 2.5
step_pulse_duration: 0.000001
[tmc5160 stepper_z]
cs_pin: PE1
spi_software_miso_pin: PE15
spi_software_mosi_pin: PE13
spi_software_sclk_pin: PE14
run_current: 1.5
#hold_current: 0.600
diag1_pin: PC0
sense_resistor: 0.075
[stepper_z1]
step_pin: PD11
dir_pin: PD10
enable_pin: !PD13
microsteps: 16
rotation_distance: 3.985
full_steps_per_rotation: 200
step_pulse_duration: 0.000001
[tmc5160 stepper_z1]
cs_pin: PD12
spi_software_miso_pin: PE15
spi_software_mosi_pin: PE13
spi_software_sclk_pin: PE14
run_current: 1.5
#hold_current: 0.600
diag1_pin: PA0
sense_resistor: 0.075
########################
[extruder]
Vz-HextrudORT
step_pin: PD15
dir_pin: PD14
enable_pin: !PC7
microsteps: 16
rotation_distance: 5.586
nozzle_diameter: 0.600
#nozzle_diameter: 0.400
filament_diameter: 1.750
full_steps_per_rotation: 200
heater_pin: PB3
sensor_type: ATC Semitec 104NT-4-R025H42G
sensor_pin: PA2
control: pid
pid_kp = 24.525
pid_ki = 2.555
pid_kd = 58.860
min_temp: 0
max_temp: 305
max_extrude_only_distance: 500.0
max_extrude_cross_section: 300
min_extrude_temp: 0
#pressure_advance: 0.02
#pressure_advance_smooth_time: 0.03
step_pulse_duration: 0.000001
[tmc5160 extruder]
cs_pin: PC6
spi_software_miso_pin: PE15
spi_software_mosi_pin: PE13
spi_software_sclk_pin: PE14
run_current: 0.6
#hold_current:0.300
diag1_pin: PC1
sense_resistor: 0.075
########################
########################
[heater_bed]
heater_pin: PD7
sensor_type: Generic 3950
sensor_pin: PA1
min_temp: 0
max_temp: 130
control: pid
pid_kp = 60.859
pid_ki = 3.145
pid_kd = 294.406
########################
FANS
########################
[fan]
##Print Cooling Fan - FAN1 Connector
pin: PB6
max_power: 1
kick_start_time: 0.5
off_below: 0.10
[heater_fan hotend_fan]
##Hotend Fan - FAN0 Connector
pin: PB7
max_power: 1.0
kick_start_time: 0.5
heater: extruder
heater_temp: 50.0
[fan_generic Exhaust_fan]
exhaust fan - FAN2
pin: PB5
max_power: 1
shutdown_speed: 0
kick_start_time: 0.1
off_below: 0.10
########################
PAUSE_RESUME
########################
[pause_resume]
recover_velocity: 350
########################
SCREWSADJUST
########################
[screws_tilt_adjust]
screw1: 40, 35
screw1_name: front left screw
screw2: 328, 35
screw2_name: front right screw
screw3: 328, 318
screw3_name: rear right screw
screw4: 40, 318
screw4_name: rear left screw
horizontal_move_z: 12
speed: 350
screw_thread: CW-M3
########################
PROBE
########################
[bltouch]
sensor_pin: ^PC13
control_pin: PE5
x_offset: -22
y_offset: -9.5
#z_offset: 3.350
#[safe_z_home]
#home_xy_position: 187, 175
#speed: 400
#z_hop: 7
#z_hop_speed: 30
[homing_override]
set_position_z: 0
#set_position_x: 0
#set_position_y: 0
axes: xyz
gcode:
G90
G0 Z5 F600
G28 X0 Y0
G0 X187 Y175 F9000
G28 Z0
G0 Z5 F500
Z_TILT_ADJUST
G0 X187 Y175 F9000
G28 Z0
G0 Z5 F500
########################
MeshBed
########################
[z_tilt]
z_positions: 383, 160
-50, 160
points: 328, 170
35, 170
speed: 400
horizontal_move_z: 7
retries: 20
retry_tolerance: 0.0020
########################
MeshBed
########################
[bed_mesh]
speed: 400
horizontal_move_z: 7
mesh_min: 22, 10
mesh_max: 300, 310
probe_count: 21, 21
algorithm: bicubic
relative_reference_index: 220
[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 : 10.0
; number of sample per probe point
variable_probe_samples : 2
; 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 %}
########################
######## MACROS ########
########################
########################
Z TILT ADJUST
########################
[gcode_macro Z_TILT]
gcode:
Z_TILT_ADJUST
########################
START_PRINT
########################
[gcode_macro START_PRINT]
gcode:
Use Mesh Profile
#BED_MESH_PROFILE LOAD="achtzig"
#BED_MESH_PROFILE LOAD="neunzig"
#BED_MESH_PROFILE LOAD="neunzigrau"
#####Princore PA12 CF#####
#SET_PRESSURE_ADVANCE ADVANCE=0.03
#SET_PRESSURE_ADVANCE EXTRUDER=extruder SMOOTH_TIME=0.03
########################
END_PRINT
########################
[gcode_macro END_PRINT]
variable_machine_depth: 300
variable_machine_width: 300
gcode:
# Turn off bed, extruder, and fan
M140 S0
M104 S0
M106 S0
# Relative positionning
G91
# Retract and raise Z
G1 Z0.2 E-2 F2400
# Wipe out
G1 X5 Y5 F3000
# Raise Z more
G1 Z10
# Absolute positionning
G90
# Present print
G1 X{machine_width} Y{machine_depth}
# Disable steppers
M84
BED_MESH_CLEAR
# Print message on LCD
M117 Druck beendet!
## <---------------------- SAVE_CONFIG ---------------------->
## DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
##
## [bltouch]
#*# z_offset = 3.55