1. Marlin固件概述

大家好,欢迎来到这门课的第一章。我是你们的老朋友,一个在3D打印和嵌入式领域摸爬滚打多年的工程师。今天咱们不聊虚的,直接切入正题——Marlin固件。

Marlin是什么?说白了,它就是3D打印机的“大脑”和“灵魂”。没有它,你手里的那台机器就是一堆冰冷的金属和塑料。我个人习惯把Marlin比作一个交响乐团的指挥,它协调着步进电机、加热棒、风扇、传感器……让它们各司其职,最终把一团塑料丝变成你想要的模型。

1.1 Marlin的历史与版本

Marlin的故事,得从2011年说起。那时候3D打印刚火起来,开源社区里有个叫RepRap的项目,大家用Arduino Mega板子做控制器。最初的固件叫Sprinter,后来有人觉得它不够灵活,就fork出来做了个改进版——这就是Marlin的雏形。

我记得最早接触Marlin是在2013年,那时候版本号才1.0.x。功能简单得可怜,连个像样的LCD菜单都没有。但它的代码结构清晰,扩展性强,很快就在社区里流行起来。

来看看Marlin的主要版本演进:

版本 发布时间 核心变化
1.0.x 2012-2015 基础功能,支持RAMPS 1.4,简单的G-code解析
1.1.x 2016-2018 引入自动调平、高级LCD菜单、SD卡支持
2.0.x 2019-2022 架构重构,支持32位板,线性调平,多热端
2.1.x 2023-至今 优化内存,新增输入整形、线性前进等高级功能

这里有个坑,我得提醒你一下。很多人一上来就下载最新的2.1.x版本,结果发现自己的8位板子根本跑不动。嗯,选版本要看硬件。我个人建议,如果你用的是经典的Mega2560+RAMPS 1.4,老老实实用1.1.x或者2.0.x的bugfix分支就好。

注意:Marlin 2.0.x开始,官方放弃了对8位板的全面支持。虽然还能编译,但很多新功能(比如线性调平)会占用大量内存,8位板根本扛不住。我曾经帮一个客户排查问题,他硬要在Mega2560上跑2.1.x,结果编译都过不了——白折腾了两天。

1.2 Marlin在3D打印生态中的角色

3D打印这个生态圈,其实挺复杂的。有硬件厂商(比如Creality、Prusa)、有切片软件(Cura、PrusaSlicer)、有控制板(Duet、SKR)、还有固件(Marlin、Klipper、RepRapFirmware)。Marlin在其中扮演什么角色?

我画了张图,帮你理清这个关系:

用户 切片软件 (Cura / PrusaSlicer) G-code 指令 Marlin 固件 解析G-code · 控制电机 · 管理温度 · 处理传感器 硬件层:步进电机 · 加热棒 · 热敏电阻 · 限位开关 主板 (Mega2560 / STM32 / LPC1768) + 驱动 (A4988 / TMC2209) ← 这就是我们关注的核心

看到了吗?Marlin处在中间层。它接收切片软件生成的G-code,然后翻译成硬件能理解的信号。说白了,它就是个翻译官+指挥官。

为什么Marlin这么流行?我觉得有几点原因:

  • 开源免费——社区驱动,迭代快,有问题随时有人修
  • 硬件兼容性好——从8位到32位,从RAMPS到SKR,几乎全覆盖
  • 功能丰富——自动调平、断料检测、断电续打……你能想到的它都有
  • 文档完善——虽然配置项多,但官方wiki写得还算清楚
小贴士:Marlin和Klipper怎么选?我个人看法:如果你喜欢折腾、追求高速打印,Klipper更合适;如果你想要稳定、开箱即用、社区支持多,Marlin是首选。我在工作室里两台机器,一台跑Marlin做精细件,一台跑Klipper打原型,各取所长。

1.3 Marlin源码结构初探

好,现在咱们来拆解一下Marlin的源码。别怕,第一次看确实会有点懵,但摸清门路后你会发现,它的结构其实挺清晰的。

我建议你从GitHub上clone一份Marlin 2.1.x的代码。打开后,你会看到这样的目录结构:

Marlin/
├── Marlin/              # 核心固件代码
│   ├── src/             # 源代码
│   │   ├── core/        # 核心模块(串口、温度、运动控制)
│   │   ├── module/      # 功能模块(调平、探头、LCD)
│   │   ├── gcode/       # G-code解析器
│   │   ├── HAL/         # 硬件抽象层(不同平台的适配)
│   │   └── ...
│   ├── Configuration.h  # 主配置文件(你主要改这个)
│   ├── Configuration_adv.h  # 高级配置(别乱动)
│   └── ...
├── buildroot/           # 构建系统
├── platformio.ini       # PlatformIO项目配置
└── README.md

这里我要重点说说Configuration.h和Configuration_adv.h。这两个文件,说白了就是Marlin的“控制面板”。你所有的配置——从电机方向到热床温度上限——都在这里改。

我刚开始学的时候,犯过一个低级错误。当时我想改一下加速度设置,结果在Configuration_adv.h里找了半天没找到,后来才发现它其实在Configuration.h里。嗯,这两个文件的分工是这样的:

  • Configuration.h:基础配置,比如主板类型、电机方向、限位开关位置、温度传感器型号。这些是“必须配”的。
  • Configuration_adv.h:高级配置,比如线性调平参数、输入整形、PID自动调谐。这些是“按需配”的。
我的经验:新手入门,先只改Configuration.h。把基础配置搞定,能正常打印了,再去碰Configuration_adv.h。我曾经见过一个学员,一上来就把高级配置里的“线性前进”打开了,结果打印出来的模型全是波纹——他花了一周才找到原因。

再来说说src/目录。这里面的代码,你不需要全部看懂。但有几个关键文件,我建议你了解一下:

文件/目录 作用 我什么时候会改它?
Marlin/src/core/ 运动控制核心算法(梯形加减速、S曲线) 几乎不改,除非你要魔改运动逻辑
Marlin/src/module/ 温度管理、探头、LCD交互 偶尔改,比如自定义探头触发逻辑
Marlin/src/gcode/ G-code指令解析(G1、M104、M140等) 很少改,除非你要添加自定义指令
Marlin/src/HAL/ 硬件抽象层,适配不同CPU架构 几乎不改,除非你要移植到新板子

你看,真正需要你动手的,其实就那两个配置文件。源码里的东西,大部分时候你只需要知道它们存在就行。

警告:千万别手贱去改src/里的核心代码!除非你非常清楚自己在做什么。我有个朋友,为了“优化”加减速算法,改了stepper.cpp里的几行代码,结果打印机直接变成了“振动棒”——整个桌子都在抖。最后他花了三天才把代码恢复回去。

最后,我想说说PlatformIO。现在编译Marlin,主流方式就是用PlatformIO。你只需要在platformio.ini里选好环境(比如mega2560或LPC1768),然后点一下编译就行。我个人习惯用VS Code + PlatformIO插件,比Arduino IDE方便太多了。

好了,第一章就到这里。内容不多,但都是基础中的基础。你只要记住:Marlin是3D打印机的固件,它的核心是那两个配置文件,源码结构清晰但别乱动。把这些概念理清了,后面的章节你学起来会轻松很多。