经过一系列的折腾,我终于把我的老3D打印机Ender-3S刷为了Klipper固件,配合树莓派上位机实现了打印速度翻倍,接下来接下来当然要上一些好用的功能,比如网床校准
网床校准介绍
什么是网床校准(Bed Mesh Calibration)
在理想情况下,3D 打印机的热床应当与喷嘴运动平面完全平行。但在实际使用中,由于以下原因,热床几乎不可能做到“绝对平整”:
- 热床本身存在制造公差(常见为中间凹陷或边缘翘起)
- 铝基板在加热后产生热变形
- 调平螺丝只控制四角,无法影响中间区域
- 长期使用后结构轻微形变
网床校准(Bed Mesh) 的核心目的,就是测量喷嘴与热床在不同 XY 位置上的高度差,并在打印过程中实时补偿 Z 轴高度,让喷嘴始终“贴合”真实的床面形状,而不是一个理想的平面。
Klipper 中网床校准的工作原理
Klipper 的 Bed Mesh 并不是“把床调平”,而是:
建立一张“高度误差地图”,并在打印时动态修正 Z 轴位置
具体流程如下:
- 在多个 XY 点测量喷嘴到热床的 Z 高度
- 可以通过探针(如 BLTouch)
- 也可以通过 手动纸张法(Manual Mesh)
- 生成一张二维高度矩阵(Mesh)
- 每个点代表该位置相对于基准面的高度偏差
- 高的地方喷嘴抬高,低的地方喷嘴压低
- 打印过程中进行 Z 轴插值补偿
- Klipper 会在相邻网格点之间进行插值
- Z 轴会随着 XY 移动而连续、平滑地微调
因此,即使你的热床是“碗状”或“波浪状”,只要变化不超过合理范围,首层依然可以稳定贴合。
可能大多数人是用的如 BLTouch这类探针模块接到打印机主板上,Klipper调用探针自动建立网床,但是我并没有探针,而且我的打印机主板很老也没有留多余的扩展口,所以我这里采用了 手动纸张法(Manual Mesh),来手动创建网床
手动网床流程
第一步 修改配置文件
printer.cfg配置文件增加网床相关参数:
[bed_mesh]
speed: 100 # 探针移动测量每个点时的速度,单位 mm/s
horizontal_move_z: 5 # 探针在 XY 移动时保持的 Z 高度(防止碰撞床面)
mesh_min: 20, 20 # 测量网格区域左下角 XY 坐标(单位 mm)
mesh_max: 220, 220 # 测量网格区域右上角 XY 坐标(单位 mm)
probe_count: 5, 5 # X 和 Y 方向的测量点数(越多越精细,但测量时间更长)
fade_start: 1 # 从第几层开始衰减 Mesh 补偿(单位 mm)
fade_end: 10 # 到第几层 Mesh 补偿完全消失
fade_target: 0 # 衰减结束后 Z 补偿目标值(一般为 0)
[stepper_z]
#......这里省略你z轴原来的参数,下面这一行是要追加到Z轴上的参数
position_min: -1 # 定义 Z 轴允许的最小位置,允许 Z 轴向下再移动 1 mm,这对于 **Bed Mesh 时会用到
其中mesh_min、mesh_max、probe_count这3个参数可能需要修改,因为我这里是一张235235的热床,所以我设置的网床校准起始结束坐标是(20,20)到(220,220)一块200200的区域,探测点是5*5一共25个点,代表待会打印头需要手动采样25个点位的高度值。
改好配置文件后保存并重启
第二步 手动调平
我们在创建网床前,需要先对热床进行手动调平,这个没什么好说的,用3D打印机的应该都会,归零后拿张A4纸调螺丝测试就好了,唯一需要强调的就是记得把热床和喷嘴加热到你平时打印的温度,避免热胀冷缩造成的误差
第三步 手动纸测采样
一般大家应用都是用的Fluidd作为可视化页面操作打印机,前面的准备工作做好后我们直接进入调整页面,点击全部Home归零,再点击校准,这时喷头会移动到第一个采样点上方5mm处,并且页面上弹出对话框,给了好几个档位的上升下降,哪一张A4纸放采样点位和喷头之间,点击减号下降,直到纸与喷头轻微摩擦,再点击接受,喷头会自动移动到下一个采样点,重复操作直至25个采样点全部调式到位。
这时会生成一张网床图出来,并且数据会自动保存到printer.cfg配置文件中,如下:
#*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [bed_mesh default]
#*# version = 1
#*# points =
#*# 0.100000, 0.100000, 0.100000, 0.100000, 0.100000
#*# -0.030000, 0.005000, 0.035000, 0.025000, -0.050000
#*# -0.060000, -0.050000, -0.050000, -0.085000, -0.100000
#*# -0.075000, -0.030000, -0.060000, -0.125000, -0.165000
#*# -0.100000, -0.025000, -0.045000, -0.065000, -0.110000
#*# x_count = 5
#*# y_count = 5
#*# mesh_x_pps = 2
#*# mesh_y_pps = 2
#*# algo = lagrange
#*# tension = 0.2
#*# min_x = 20.0
#*# max_x = 200.0
#*# min_y = 20.0
#*# max_y = 200.0
以上就是我手动网床校准生成的一张名为default的网床
启用网床校准
生成的网床后还需要把他启用,网上我看有些教程是在printer.cfg配置文件中增加以下配置:
[gcode_macro START_PRINT]
gcode:
BED_MESH_PROFILE LOAD=default
但是这行代码只是创建了一个名为START_PRINT宏定义,如果这个宏定义没有在打印开始时被调用,应该是不会让网床生效的,一般切片软件中会定义一连串起始G-Code代码,用于执行一些正式打印模型前的动作,比如:加热喷头、加热热床、各轴归零等,如下是我的切片软件PrusaSlicer中配置起始G-Code代码:
G90 ; 设置 XYZ 为 绝对坐标模式,必须保留
M83 ; 挤出机 E 轴使用 相对模式,强烈建议保留
M104 S[first_layer_temperature] ; 设置喷嘴温度
M140 S[first_layer_bed_temperature] ; 设置热床温度
M190 S[first_layer_bed_temperature] ; 等待热床达到目标温度
M109 S[first_layer_temperature] ; 等待喷嘴达到目标温度
G28 W ; XYZ 归零,W表示不自动加载 / 清空 mesh
START_PRINT ; 调用Klipper中的宏定义
G92 E0.0 ; 重置挤出机计数
G1 Z2.0 F3000 ; 抬起Z轴,防止横向移动刮床
G1 X0 Y0 Z0.28 F5000.0 ; 移动到左下角起始点
G1 X0 Y100 Z0.28 F1500.0 E8 ; 一边走一边挤料(第一条线)
G1 X2 Y100 Z0.28 F5000.0 ; 横向偏移 2mm
G1 X2 Y0 Z0.28 F1500.0 E8 ; 第二条回拉线,增强清嘴效果
G92 E0.0 ; 再次清零 E
G1 Z2.0 F3000 ; 抬 Z 离开,准备进入正式打印
其中最重要的就是START_PRINT,这里调用了一个宏定义,就是Klipper配置文件中定义的那行:BED_MESH_PROFILE LOAD=default,他会把这行代码插入到这里,要注意这个行一定要在归零G28 W动作的后面,因为每次归零后都会清除当前激活的 mesh 补偿。
当然你直接把BED_MESH_PROFILE LOAD=default这行加到G28 W动作的后面也行,不过我习惯切片软件只管通用流程,网床校准相关的内容放Klipper里
评论区