2、3D打印基础:FDM/SLA原理、G代码基本概念、打印机固件(Marlin/Klipper)简介

上位机软件的核心任务是向打印机发送指令并接收状态反馈,而这一切都建立在理解打印机的物理工作原理、指令语言和固件行为之上。本章将系统梳理FDM与SLA两种主流成型技术的差异,解析G代码的语法结构与坐标系统,并对比Marlin与Klipper两种固件的架构与适用场景,为后续开发上位机通信协议和运动控制模块打下坚实的认知基础。

3D打印技术栈与上位机控制链路 FDM 熔融沉积 • 线材(1.75/2.85mm)加热熔化 • 挤出机+热端+喷嘴(0.4mm) • 逐层堆叠,层高0.1-0.3mm • 需要热床/冷却风扇/支撑 控制量:温度/速度/挤出量/风扇 SLA 光固化 • 紫外激光/投影固化光敏树脂 • 液槽+成型平台+刮刀 • 逐层固化,层厚0.025-0.1mm • 需要后处理(清洗/二次固化) 控制量:激光路径/平台升降/曝光时间 G代码指令层 G0/G1 快速/线性移动 G28 回原点 | G29 自动调平 M104/M140 设置温度 M106 风扇控制 | M82 绝对挤出 坐标:X/Y/Z + E(挤出) Marlin 固件 • 8位/32位MCU,裸机运行 • 中断+定时器,实时性强 • 串口(115200)逐行解析G代码 • 适合:单机打印、稳定可靠 Klipper 固件 • 上位机(Linux) + MCU从机 • 运动规划在主机端完成 • 支持高加速度/共振补偿 • 适合:高速打印、远程控制 上位机 → G代码 → 固件解析 → 电机/加热/传感器 → 成型

上图展示了从物理成型原理到指令解析再到固件执行的整体链路。上位机软件处于最顶层,它生成的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,适合珠宝、牙科、手办等高精度场景。但树脂材料有毒且成本高,打印件脆性较大,不适合功能性零件。

对比维度FDMSLA
材料形态固态线材液态光敏树脂
成型精度±0.2mm±0.05mm
层厚范围0.1-0.3mm0.025-0.1mm
典型速度30-150mm/s10-30mm/h(垂直方向)
后处理去支撑、打磨清洗、二次固化
材料成本低(约100元/kg)高(约300-800元/L)
主要风险翘曲、堵头、层间分离树脂泄漏、固化不足、收缩变形
上位机开发启示:FDM需要监控挤出机温度、热床温度、风扇转速和挤出量;SLA则需要控制激光功率、扫描速度和平台Z轴步进。开发上位机时,应根据打印机类型选择不同的状态轮询字段和报警阈值。

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的线材。上位机在解析时需要注意:

  1. 单位制:G21设置毫米为单位,G20为英寸。绝大多数切片软件默认毫米。
  2. 绝对/相对模式:G90为绝对坐标(所有坐标相对于原点),G91为相对坐标(相对于当前位置)。切片文件通常在开头设置G90。
  3. 挤出量计算: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  ; 开始打印第一层
...
常见误区:初学者常将G0和G1混用。G0是快速定位,不要求精确路径;G1是线性插补,必须保证路径精确。在打印过程中使用G0会导致挤出路径偏移,造成模型错位。上位机在发送G代码时,应严格区分这两种指令的用途。

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交互。
对比项MarlinKlipper
运行平台MCU裸机Linux主机 + MCU从机
G代码解析MCU内逐行解析主机解析,MCU执行脉冲
通信接口串口(115200)USB/网络(虚拟串口)
运动规划梯形加减速高精度规划+共振补偿
配置灵活性需重新编译修改cfg文件即可
上位机复杂度低(直接发G代码)高(需处理API/WebSocket)
适用场景单机打印、稳定可靠高速打印、远程监控、多机管理

2.3.3 固件选择对上位机开发的影响

如果目标打印机运行Marlin,上位机只需实现串口通信,发送G代码并解析"ok"响应即可。如果运行Klipper,上位机可以选择两种方式:

  1. 直接发送G代码:Klipper兼容标准G代码,通过虚拟串口接收,适合简单场景。
  2. 使用Moonraker HTTP API:通过JSON-RPC调用获取打印机状态、上传文件、控制打印任务,适合Web上位机或远程监控系统。
实战场景:假设你正在开发一个Web上位机,需要同时支持Marlin和Klipper打印机。建议抽象一个"打印机驱动层",定义统一的接口(如connect()、sendGcode()、getStatus())。Marlin驱动通过串口发送G代码并解析文本响应;Klipper驱动通过Moonraker API发送指令并接收JSON数据。这样上层业务逻辑无需关心底层固件差异。

2.4 案例拆解:从G代码到实际打印的完整链路

下面通过一个实际打印任务,展示上位机如何与固件协作完成一次打印。

背景:使用Ender-3打印机(Marlin固件),打印一个20mm×20mm×10mm的测试方块。切片软件生成G代码文件,上位机需要逐行发送并监控状态。

关键步骤:

  1. 连接与初始化:上位机打开串口COM3(波特率115200),发送"G28"回原点,等待固件返回"ok"。
  2. 温度预热:发送"M104 S200"设置喷嘴温度,发送"M140 S60"设置热床温度。然后循环发送"M105"查询温度,直到达到目标值。
  3. 开始打印:逐行发送G代码文件中的指令。每发送一行,等待"ok"响应后再发送下一行。如果收到"Error"或"!!"前缀,立即停止并报警。
  4. 状态监控:每10秒发送一次"M105"获取温度,每30秒发送一次"M119"获取限位开关状态。如果温度异常(如喷嘴温度超过250°C),立即发送"M112"紧急停止。
  5. 打印完成:发送"M104 S0"和"M140 S0"关闭加热,发送"G28"将平台移回原点,最后关闭串口。

结果与复盘:打印过程中,上位机发现第150层时喷嘴温度从200°C波动到195°C,通过PID调节后恢复。这提示上位机需要实现温度波动报警功能,而不仅仅是温度超限报警。另外,由于Marlin的串口缓冲区较小(通常64字节),上位机发送长G代码行(如包含多个坐标点的G1指令)时,需要拆分为多行发送,否则会溢出。

风险提示:Marlin固件在收到无法解析的G代码时会返回"Error:Unknown command",但不会自动停止打印。上位机必须实现错误计数机制,连续收到3个错误后主动发送M112紧急停止,防止打印机在错误状态下继续运动。

2.5 常见误区与总结

  • 误区一:所有打印机都支持相同的G代码。实际上,不同固件对G代码的支持范围不同。例如,Marlin支持M420(加载调平数据),而某些精简固件可能不支持。上位机应通过发送"M115"查询固件版本和功能支持列表。
  • 误区二:忽略串口流控。Marlin默认无硬件流控,依赖软件握手("ok"响应)。如果上位机不等待"ok"就连续发送,会导致缓冲区溢出。Klipper的虚拟串口则支持更大的缓冲区,但仍建议逐行确认。
  • 误区三:将FDM的G代码直接用于SLA。SLA打印机使用不同的指令集(如Marlin SLA变种或专用固件),且坐标轴含义不同(SLA的Z轴是平台升降,无E轴)。开发上位机时必须根据打印机类型选择对应的指令模板。