2、3D打印基础:FDM/SLA原理、G代码基本概念、打印机固件(Marlin/Klipper)简介
上位机软件的核心任务是向打印机发送指令并接收状态反馈,而这一切都建立在理解打印机的物理工作原理、指令语言和固件行为之上。本章将系统梳理FDM与SLA两种主流成型技术的差异,解析G代码的语法结构与坐标系统,并对比Marlin与Klipper两种固件的架构与适用场景,为后续开发上位机通信协议和运动控制模块打下坚实的认知基础。
上图展示了从物理成型原理到指令解析再到固件执行的整体链路。上位机软件处于最顶层,它生成的G代码必须同时匹配固件的解析能力和物理硬件的执行特性。例如,向SLA打印机发送FDM的挤出指令(G1 E5)会导致固件无法识别或执行错误动作。因此,理解这些底层差异是开发可靠上位机的前提。
2.1 FDM与SLA:两种核心成型原理
2.1.1 FDM(熔融沉积建模)核心原理
FDM打印机通过加热喷嘴将热塑性线材(如PLA、ABS、PETG)熔化,然后按照切片软件规划的路径逐层挤出,材料冷却后凝固成型。其关键子系统包括:
- 挤出机构:包含步进电机驱动的齿轮(挤出机)和加热块(热端)。挤出机负责推送线材,热端将线材加热到熔点以上(PLA约200°C,ABS约240°C)。
- 运动系统:通常采用笛卡尔坐标系(X/Y/Z三轴),通过同步带、丝杆或导轨驱动。常见的结构有Prusa式(X轴移动)、CoreXY式(双电机联动)和Delta式(并联臂)。
- 热床与冷却:热床(加热平台)减少模型底部翘曲,冷却风扇对模型层间进行快速降温以提升悬垂质量。
FDM的层高通常在0.1mm至0.3mm之间,打印速度约30-150mm/s。其优势在于成本低、材料种类多、操作简单;劣势是表面有层纹、精度相对较低(±0.2mm左右)、悬垂结构需要支撑。
2.1.2 SLA(光固化)核心原理
SLA打印机使用紫外激光或DLP投影仪选择性固化光敏树脂。成型平台浸入树脂槽中,激光按照切片截面扫描,树脂在光照下发生聚合反应固化,平台逐层上升(或下沉)完成打印。
- 光源系统:激光振镜(Galvo)或DLP数字投影。激光光斑直径约0.1-0.15mm,DLP则一次性投影整层图像。
- 树脂槽与平台:平台移动精度要求极高(通常0.01mm),树脂需要保持恒温(25-30°C)以保证流动性。
- 后处理:打印完成后需用酒精清洗未固化的树脂,再进行二次紫外固化以增强机械强度。
SLA的层厚可达0.025mm,表面质量远优于FDM,适合珠宝、牙科、手办等高精度场景。但树脂材料有毒且成本高,打印件脆性较大,不适合功能性零件。
| 对比维度 | FDM | SLA |
|---|---|---|
| 材料形态 | 固态线材 | 液态光敏树脂 |
| 成型精度 | ±0.2mm | ±0.05mm |
| 层厚范围 | 0.1-0.3mm | 0.025-0.1mm |
| 典型速度 | 30-150mm/s | 10-30mm/h(垂直方向) |
| 后处理 | 去支撑、打磨 | 清洗、二次固化 |
| 材料成本 | 低(约100元/kg) | 高(约300-800元/L) |
| 主要风险 | 翘曲、堵头、层间分离 | 树脂泄漏、固化不足、收缩变形 |
2.2 G代码基本概念与语法结构
G代码是3D打印机通用的指令语言,本质上是文本文件中的一行行命令。每行代码由字母+数字组成,字母代表指令类型,数字代表参数值。上位机通过串口或网络将G代码逐行发送给固件,固件解析后执行。
2.2.1 常用指令分类
- 运动指令(G):G0(快速移动)、G1(线性插补移动)、G28(回原点)、G29(自动调平)、G90/G91(绝对/相对坐标)。
- 辅助指令(M):M104(设置喷嘴温度)、M140(设置热床温度)、M106(开启风扇)、M109(等待喷嘴达到目标温度)、M82/M83(绝对/相对挤出)。
- 特殊指令:T0(选择工具)、M117(LCD显示消息)、M300(蜂鸣器)。
2.2.2 坐标系统与参数解析
FDM打印机使用笛卡尔坐标系,X/Y/Z分别对应三个运动轴,E轴表示挤出机。例如:
G1 X100.5 Y50.2 Z0.3 F1800 E5.2
这条指令表示以1800mm/min的速度线性移动到(X=100.5, Y=50.2, Z=0.3)的位置,同时挤出5.2mm的线材。上位机在解析时需要注意:
- 单位制:G21设置毫米为单位,G20为英寸。绝大多数切片软件默认毫米。
- 绝对/相对模式:G90为绝对坐标(所有坐标相对于原点),G91为相对坐标(相对于当前位置)。切片文件通常在开头设置G90。
- 挤出量计算:E值由切片软件根据线径、层高、挤出宽度计算得出。上位机不应修改E值,否则会导致挤出过多或不足。
2.2.3 典型G代码文件结构
; 切片软件:Cura 5.0
; 打印时间:2小时15分
M140 S60 ; 设置热床温度60°C
M104 S200 ; 设置喷嘴温度200°C
M190 S60 ; 等待热床达到60°C
M109 S200 ; 等待喷嘴达到200°C
G28 ; 回原点
G29 ; 自动调平
G92 E0 ; 重置挤出机位置
G1 Z2.0 F300 ; 抬升Z轴
G1 X10 Y10 F3000 ; 移动到起始点
G1 Z0.3 F300 ; 下降到打印高度
G1 X50 Y10 E5.0 F1800 ; 开始打印第一层
...
2.3 打印机固件:Marlin与Klipper
固件是运行在打印机主控板上的底层软件,负责解析G代码、控制电机、读取传感器温度、管理加热器等。目前主流固件为Marlin和Klipper,两者架构差异显著,直接影响上位机的通信协议设计。
2.3.1 Marlin固件架构与特点
Marlin是运行在MCU(如AVR、STM32、ESP32)上的裸机程序,所有逻辑在单芯片内完成。它采用中断驱动+定时器轮询的方式,实时性高,响应延迟通常在毫秒级。
- 通信方式:通过串口(UART)接收G代码,默认波特率115200。固件逐行解析,每执行完一行返回"ok"或错误信息。
- 运动规划:内置梯形加减速算法,通过定时器中断产生步进脉冲。最大加速度和速度在编译时配置。
- 温度控制:PID算法控制加热棒,通过热敏电阻读取温度。上位机可通过M105指令查询当前温度。
Marlin的优点是稳定、离线打印能力强、无需外部依赖;缺点是运动规划能力有限,高速打印时容易丢步,且无法实现复杂的共振补偿。
2.3.2 Klipper固件架构与特点
Klipper采用"上位机+下位机"双处理器架构:上位机(通常是树莓派或PC)运行Linux系统,负责所有运动规划和G代码解析;下位机(MCU)仅执行简单的步进脉冲和温度读取。两者通过USB或UART通信。
- 通信协议:上位机与MCU之间使用Klipper自定义的二进制协议,而非标准G代码。上位机将运动规划结果打包发送给MCU。
- 运动规划:在Linux上运行,支持高加速度(如5000mm/s²)和共振补偿(Input Shaper),大幅提升打印速度和表面质量。
- 配置方式:通过printer.cfg文本文件配置,无需重新编译固件。上位机可通过HTTP API或Moonraker插件与Klipper交互。
| 对比项 | Marlin | Klipper |
|---|---|---|
| 运行平台 | MCU裸机 | Linux主机 + MCU从机 |
| G代码解析 | MCU内逐行解析 | 主机解析,MCU执行脉冲 |
| 通信接口 | 串口(115200) | USB/网络(虚拟串口) |
| 运动规划 | 梯形加减速 | 高精度规划+共振补偿 |
| 配置灵活性 | 需重新编译 | 修改cfg文件即可 |
| 上位机复杂度 | 低(直接发G代码) | 高(需处理API/WebSocket) |
| 适用场景 | 单机打印、稳定可靠 | 高速打印、远程监控、多机管理 |
2.3.3 固件选择对上位机开发的影响
如果目标打印机运行Marlin,上位机只需实现串口通信,发送G代码并解析"ok"响应即可。如果运行Klipper,上位机可以选择两种方式:
- 直接发送G代码:Klipper兼容标准G代码,通过虚拟串口接收,适合简单场景。
- 使用Moonraker HTTP API:通过JSON-RPC调用获取打印机状态、上传文件、控制打印任务,适合Web上位机或远程监控系统。
2.4 案例拆解:从G代码到实际打印的完整链路
下面通过一个实际打印任务,展示上位机如何与固件协作完成一次打印。
背景:使用Ender-3打印机(Marlin固件),打印一个20mm×20mm×10mm的测试方块。切片软件生成G代码文件,上位机需要逐行发送并监控状态。
关键步骤:
- 连接与初始化:上位机打开串口COM3(波特率115200),发送"G28"回原点,等待固件返回"ok"。
- 温度预热:发送"M104 S200"设置喷嘴温度,发送"M140 S60"设置热床温度。然后循环发送"M105"查询温度,直到达到目标值。
- 开始打印:逐行发送G代码文件中的指令。每发送一行,等待"ok"响应后再发送下一行。如果收到"Error"或"!!"前缀,立即停止并报警。
- 状态监控:每10秒发送一次"M105"获取温度,每30秒发送一次"M119"获取限位开关状态。如果温度异常(如喷嘴温度超过250°C),立即发送"M112"紧急停止。
- 打印完成:发送"M104 S0"和"M140 S0"关闭加热,发送"G28"将平台移回原点,最后关闭串口。
结果与复盘:打印过程中,上位机发现第150层时喷嘴温度从200°C波动到195°C,通过PID调节后恢复。这提示上位机需要实现温度波动报警功能,而不仅仅是温度超限报警。另外,由于Marlin的串口缓冲区较小(通常64字节),上位机发送长G代码行(如包含多个坐标点的G1指令)时,需要拆分为多行发送,否则会溢出。
2.5 常见误区与总结
- 误区一:所有打印机都支持相同的G代码。实际上,不同固件对G代码的支持范围不同。例如,Marlin支持M420(加载调平数据),而某些精简固件可能不支持。上位机应通过发送"M115"查询固件版本和功能支持列表。
- 误区二:忽略串口流控。Marlin默认无硬件流控,依赖软件握手("ok"响应)。如果上位机不等待"ok"就连续发送,会导致缓冲区溢出。Klipper的虚拟串口则支持更大的缓冲区,但仍建议逐行确认。
- 误区三:将FDM的G代码直接用于SLA。SLA打印机使用不同的指令集(如Marlin SLA变种或专用固件),且坐标轴含义不同(SLA的Z轴是平台升降,无E轴)。开发上位机时必须根据打印机类型选择对应的指令模板。