Grbl — Arduino UNO 上跑的 CNC G-code 控制器
待复核Grbl 是一个跑在 Arduino UNO 这类 328p 小板子上的 CNC 运动控制固件:电脑把 G-code 发给它,它把这些文字命令变成电机一步一步的脉冲。
日常类比:像餐厅后厨的出餐员。点菜单写着“先切菜、再煎、最后摆盘”,出餐员不发明新菜谱,只负责按顺序、按节奏,把每一步落到具体动作上。
最小交互感大概是这样:
Grbl 1.1e ['$' for help]> $$> G21 G90> G1 X10 F200$$ 查看机器参数,G21 表示毫米单位,G90 表示绝对坐标,G1 X10 F200 表示用进给速度移动到 X=10。
一句话记住:Grbl 把“普通电脑 + 廉价 Arduino + 步进电机驱动器”拼成了低成本 CNC 控制器。
不理解 Grbl,下面这些事会很难解释:
- 为什么很多桌面雕刻机、激光雕刻机、DIY CNC 都从“刷一个 Grbl 固件”开始。
- 为什么 G-code 不是直接让电机转,而是先经过解析、缓冲、加减速规划,再输出脉冲。
- 为什么小小的 8-bit Arduino 还能做平滑转角、16 段前瞻和实时暂停。
- 为什么有些高级 G-code 宏、变量、固定循环不支持;Grbl 把复杂前处理留给上位机或 CAM。
-
串口是收银台:电脑通过 USB 串口把一行行 G-code 递给 Grbl。类比:前台一张单一张单地送进后厨,后厨每处理完会回
ok或error:x。 -
运动规划是排队系统:Grbl 不只看当前一行,还会把后面的运动放进 planner buffer。类比:厨师提前看后几桌订单,才能决定锅要不要一直热着,转角要不要提前减速。
-
实时命令是急停按钮旁的小按钮:
?、!、~、软复位和 override 不走普通 G-code 队列。类比:正在出餐时,经理可以立刻喊“暂停”“继续”“报当前位置”,不用等菜单排完。
案例 1:先检查 G-code,再真的开机跑
Section titled “案例 1:先检查 G-code,再真的开机跑”官方 interface 文档建议 GUI 在真正加工前,可以用 $C 进入 check mode,让 Grbl 只解析和报错,不移动轴、不打开主轴。
$CG21 G90 G17G1 X20 Y0 F300G2 X20 Y20 I0 J10$C逐部分解释:
- 第一个
$C:打开检查模式,像先让后厨读菜单但不点火。 G21 G90 G17:设置毫米、绝对坐标、XY 平面,避免后面命令被旧状态误读。G1和G2:一条直线、一条圆弧,Grbl 会检查语法和几何是否可执行。- 第二个
$C:退出检查模式,Grbl 会软复位,让解析器回到一致状态。
案例 2:用 jogging 微调刀头位置
Section titled “案例 2:用 jogging 微调刀头位置”Grbl v1.1 的 $J= jogging 命令专门用于手动挪轴,重点是不会污染普通 G-code 解析器状态。
$J=G91 G21 X1.0 F120$J=G91 G21 Y-0.5 F80?逐部分解释:
$J=:告诉 Grbl 这是 jog,不是正式加工程序的一行。G91:只对这一条 jog 使用增量移动,不会永久改掉后续程序的绝对坐标习惯。G21:这次 jog 用毫米;如果前面机器在英寸模式,也只临时覆盖这一条。?:实时查询状态,GUI 可以据此更新当前位置和 Jog / Idle 状态。
案例 3:把同一套控制器用于激光雕刻
Section titled “案例 3:把同一套控制器用于激光雕刻”官方 laser mode 文档把 $32 作为开关:启用后,Grbl 会把主轴 PWM 当成激光功率控制,并尽量避免每次功率变化都停顿。
$32=1M4 S600G1 X10 F400G1 X20 S300G0 X0M5逐部分解释:
$32=1:启用 laser mode;换回铣削主轴前要改回$32=0。M4 S600:使用动态激光功率模式,Grbl 会按实际运动速度调整输出。G1 X20 S300:边走边改功率,laser mode 下不会像普通主轴那样每次停下来等转速。G0 X0:快速移动时激光会被关掉,避免空移时烧材料。
-
把
ok理解成“动作已经物理完成”:很多时候它只表示这一行已解析并进入队列,机器可能还在运动。 -
在 startup block 里塞运动命令:上电或复位就自动移动,紧急情况下可能让机器越撞越糟。
-
用高速 character-counting 流式发送配置命令:写 EEPROM 时 AVR 会关中断,设置类命令更适合一行一等的 send-response。
-
忘记
$X只是解除锁,不是恢复定位:报警后位置可能已经不可信,正确做法通常是小心移开,再重新 homing。
适用 vs 不适用场景
Section titled “适用 vs 不适用场景”适用:
- 桌面 CNC、绘图机、轻型雕刻机、激光雕刻机这类三轴或类三轴设备。
- 想用低成本 Arduino 生态学习 G-code、步进电机、限位、homing 和坐标系。
- 上位机愿意负责 UI、文件管理、宏展开、复杂 CAM 输出,固件只专注稳定运动。
- 需要清晰串口协议,方便自己写 GUI、发送器或测试脚本。
不适用:
- 需要多轴工业控制、换刀库、复杂宏变量、固定循环完整支持的高端机床。
- 希望板子自己读 U 盘、联网、显示屏全套管理加工文件的场景。
- 想把实时闭环伺服、视觉纠偏、大量传感器逻辑都塞进同一块小板。
- 对安全认证、工业冗余和厂线级责任链有硬性要求的生产系统。
历史小故事(可跳过)
Section titled “历史小故事(可跳过)”- 2009 年前后:Simen Svale Skogsrud 写出早期 Grbl,让 Arduino 控制 CNC 变成大众 DIY 路线。
- 2011 年:Grbl v0.6 成为后续分支的重要基础,社区开始围绕上位机、控制板和教程扩散。
- 2010s 中期:Sungeun “Sonny” Jeon 继续维护并重写大量核心,项目走向 v1.1 的实时 override、jogging、laser mode。
- 2019 年:v1.1h 发布,成为很多廉价控制板和桌面设备仍在使用的稳定基线。
- 今天:Grbl 已有数千 GitHub stars,同时也催生了 grblHAL、Grbl-Mega 等面向新 MCU 或更多轴的后继生态。
- Grbl 的核心价值不是“能读 G-code”,而是能在小芯片上稳定地产生准时脉冲。
- 嵌入式系统经常靠分工取胜:上位机管复杂交互,固件管确定性运动。
- 运动控制里的“平滑”来自 planner buffer、加速度约束和前瞻,而不是电机自己变聪明。
- 小资源项目的取舍很硬:删掉人类可读字符串、放弃宏功能,都是为了把实时能力塞进去。
- 官方仓库:gnea/grbl
- 官方 Wiki:Grbl Wiki
- 串口协议文档:Interface Basics
- 激光模式文档:Laser Mode
- g-code —— Grbl 解释的输入语言,描述刀具或激光该怎么走。
- embedded-c —— Grbl 用紧凑 C 代码把实时行为压进 AVR 小芯片。
- arduino —— Grbl 最经典的运行载体就是 328p 系列 Arduino 板。
- g-code —— 所有运动、单位、坐标模式都从 G-code 行里来。
- stepper-motor —— Grbl 最终输出的是给步进驱动器的 step / direction 脉冲。
- real-time-systems —— 脉冲时序不能随便抖动,体现了实时系统约束。
- embedded-c —— 资源紧张时,C 代码布局和中断设计直接影响可靠性。
- cnc —— Grbl 是理解桌面 CNC 控制链路的入门项目。