简介:面向 Arduino 初学者与进阶开发者,以及 CNC 雕刻、3D 打印和激光切割爱好者,内含 GRBL 0.9 固件与 ArduinoBuilder 构建工具,可解决 G 代码到运动控制转换时的固件烧录、舵机精确控制与参数配置问题。包体共 1060 个文件,涵盖 h/cpp/ino/c 源码、a/o 静态库、exe 工具、hex 固件及 txt/conf 配置文件,整体约 15.9MB,源码与预编译产物齐全,便于直接烧录或二次修改。1535 人已学习下载,社区验证度较高。通过 ArduinoBuilder 可简化 GRBL 固件编译与上传流程,避免繁琐的命令行操作;大量源码和库文件则有助于深入理解 G 代码解析、舵机运动控制以及 AVR 底层实现。从包内结构看,完整的 AVR libc 库和构建依赖也已附带,适合从零搭建 Arduino+GRBL 控制方案,也可用于 CNC、激光雕刻等项目中的固件定制与排错学习。
1. GRBL 0.9 和 ArduinoBuilder 0.8.9:旧套件里的固件与编译工具为何还能用
ArduinoBuilder-0.8.9.zip 这个压缩包经常出现在 A4988 驱动板、CNC Shield v3 的资料盘和网盘分享里。打开之后并不是一个完整的 Arduino IDE,而是一套 2015 年前后的命令行编译工具链,配套的固件源码通常就是 GRBL 0.9。GRBL 0.9 是 GRBL 1.1 之前最后一个改动幅度相对克制的版本,很多二手雕刻机、自组小铣床至今还跑着 0.9j。搜索这个标题的人,多数是刚拿到一块 Uno 或 Nano,想把手里的 GRBL 固件刷进去调试,结果发现网上教程几乎都换了 1.1 的写法,连编译工具都要重新摸索。
这篇直接沿用这套老组合,把 ArduinoBuilder 0.8.9 编译、avrdude 烧写、GRBL 0.9 轴参数标定、再迁到 1.1 之前要确认的细节一次讲清。适合两类人:一类是老设备维护者,手里只有旧资料包,想把机器救活;另一类是刚接触 grbl,不想被 1.1 新指令干扰的入门者。
2. GRBL 0.9 固件结构:先认清源码、引脚映射和工具链的分工
2.1 GRBL 0.9 不是单个文件,是个小型 C 工程
grbl 0.9 的源码以 Arduino 工程形式组织,根目录只有一个 grbl.ino,但编译时会引进 grbl/ 目录下的一堆模块,包括 stepper、planner、gcode 解析器和串口协议处理。对只需要改板子、改固件参数的普通使用者来说,源码里真正要碰的文件只有三个。
// grbl/config.h 中建议保持默认的几处 #define SERIAL_BAUD_RATE 115200 // GRBL 0.9 与上位机通信的波特率 #define VERSION 0.9j // 版本号,grbl.h 中也有对应定义config.h 是编译开关的集中地,比如是否启用冷却液控制、是否反转主轴使能等;cpu_map.h 是引脚映射,决定步进脉冲、方向信号接到 ATmega328P 的哪几个引脚;defaults.h 是出厂$参数,但实际改参数时不要动这个文件,而是通过串口发$100=640这类命令写进 EEPROM。这一点很容易被新用户误解:改了 defaults.h 重新编译确实生效,可下次再通过面板调参就会覆盖掉,不如直接用$命令统一管理。
2.2 用一张表确认 CNC Shield v3 与固件的引脚对应
GRBL 0.9 官方对 ATmega328P 的引脚安排在 CNC Shield v3 上几乎是完美匹配,这也是为什么很多套件默认就刷官方固件。拿到板子先对照表确认,比直接看原理图更快。
| 功能 | CNC Shield v3 丝印引脚 | GRBL 0.9 中对应逻辑 |
|---|---|---|
| X 轴 STEP | D2 | X_STEP_BIT |
| X 轴 DIR | D5 | X_DIRECTION_BIT |
| Y 轴 STEP | D3 | Y_STEP_BIT |
| Y 轴 DIR | D6 | Y_DIRECTION_BIT |
| Z 轴 STEP | D4 | Z_STEP_BIT |
| Z 轴 DIR | D7 | Z_DIRECTION_BIT |
| 限位信号 X/Y/Z | D9 / D10 / D11 | LIMIT_BIT 系列宏 |
| 主轴使能 | D12 | SPINDLE_ENABLE_BIT |
提示:看表时不要只记丝印编号,要记住 GRBL 0.9 默认使能信号是低有效,A4988 的 EN 引脚接低才释放电机。焊错跳线或把使能极性配反,电机通电后会锁死,不是丢步问题。
2.3 ArduinoBuilder 0.8.9 到底在编译流程里干什么
ArduinoBuilder 0.8.9 不是编译器本身,它是一层构建封装。真正把 .ino 变成 .hex 的是内置的 avr-gcc,而 ArduinoBuilder 负责处理硬件平台选择、核心库展开、依赖收集和编译参数拼装。它对应的是 IDE 1.6.x 时代的命令行路径,所以对 GRBL 0.9 这种老工程的兼容性比新版 IDE 更好,至少不会因为库路径变化或 API 检查报一堆无关错误。
这个工具包的目录结构通常能看到 hardware/、tools/、libraries/ 三块,其中 hardware 里装着 boards.txt 和 arduino 核心库。理解了这一层,后面命令行参数就不会觉得是黑魔法。
3. 用 ArduinoBuilder 0.8.9 编译并烧写 GRBL 0.9 的最小步骤
3.1 解压后先检查这三个目录
拿到 ArduinoBuilder-0.8.9.zip 之后,不要急着找 exe 双击。命令行工具包的正确用法是解压后手动调用其中的可执行文件。先确认目录结构是否完整:
ArduinoBuilder-0.8.9/ ├── hardware/ │ └── arduino/ │ └── avr/ │ ├── boards.txt │ ├── cores/arduino/ │ └── variants/standard/ ├── tools/ │ ├── avr/bin/avr-g++ │ └── avrdude/ └── libraries/如果缺少 variants/standard 目录,编译时会出现 pin 定义找不到的错误;如果缺 boards.txt,-fqbn参数就无法解析。大多数网盘里流传的包是完整的,但也有精简版把 libraries 目录删了,GRBL 0.9 虽然不依赖第三方库,报错时还要回头排查,不如一开始验一遍。
| 目录或文件 | 编译参数对应位置 | 缺失时的典型报错 |
|---|---|---|
| hardware/ | -hardware | Board arduino:avr:uno not found |
| tools/avr/bin | -tools | avr-g++: No such file or directory |
| boards.txt | -fqbn解析依据 | Unknown FQBN |
| variants/standard | 核心库引用的引脚头文件 | pins_arduino.h: No such file |
3.2 用 arduino-builder 编译 grbl.ino 的命令与参数
确认目录没问题后,把 grbl 0.9 源码放到 ArduinoBuilder 同级目录,或单独指定路径。核心编译命令如下:
./arduino-builder \ -compile \ -fqbn arduino:avr:uno \ -hardware ./hardware \ -tools ./tools \ -tools ./hardware/tools \ -libraries ./libraries \ -verbose \ ./grbl/grbl.ino参数逻辑按顺序看:-fqbn是板子描述,三段分别是硬件平台名、avr 平台、uno 板型;-hardware指向 boards.txt 所在根的上一级;-tools可以重复指定,avr-g++ 和 avrdude 分别在不同目录时都要写全;-libraries指向第三方库根目录,GRBL 0.9 不强制需要,但缺了会看到 warning,不影响出 hex。
编译成功后输出文件在build/arduino.avr.uno/grbl.ino.hex。如果中途报Invalid library found,注意 grbl 源码不要放在 libraries 目录里,否则会被当成库而不是主工程来编译。
3.3 用 avrdude 烧写,保留 EEPROM 里的旧参数
烧写命令没有图形界面那么友好,但可控性高很多:
avrdude -v -patmega328p -carduino -PCOM3 -b115200 \ -D -Uflash:w:build/arduino.avr.uno/grbl.ino.hex:i-p指定目标芯片为 atmega328p,-c arduino表示使用 Arduino bootloader 的 stk500v1 协议,-P是串口设备名,Windows 写 COM3,Linux 写 /dev/ttyUSB0。-b115200是 bootloader 通信波特率,不是 GRBL 运行时的 115200,二者不要混。
-D参数的作用是不执行全片擦除,这一点在反复调参时特别重要。GRBL 的$参数存放在 EEPROM 里,如果烧录时忘了-D,avrdude 会先把整个 Flash 和 EEPROM 擦掉,之前校准好的步进值全部清零。第一次烧新芯片无所谓,但对已经调完轴的机器,重新写一遍参数并不愉快。
烧完立即打开串口工具,波特率 115200,8N1,然后按一下开发板上的 reset。GRBL 0.9 上电后通常会自动返回一行版本信息,类似Grbl 0.9j ['$' for help]。看到这行字说明固件已经跑起来,下一步才进入调参。
4. GRBL 0.9 的轴参数调参:步进值、最大进给和加速度怎么算
4.1 步进/mm 的通用计算方式
GRBL 0.9 的轴参数核心是$100、$101、$102,分别对应 X、Y、Z 轴每毫米所需的步进脉冲数。这个值由电机固有步距角、驱动器细分和机械传动比三者共同决定,碰巧这台机器用什么电机、什么丝杆,必须实际算。
motor_step = 200 # 1.8° 步进电机一整圈 200 步;0.9° 电机为 400 microstep = 16 # A4988 驱动板细分拨码设置 pitch = 5.0 # 丝杆导程,单位 mm;1605 丝杆就是 5mm steps_per_mm = motor_step * microstep / pitch print(steps_per_mm) # 本例输出 640.0代入实际设备前先确认两个容易写错的地方。驱动板细分如果是 16,公式里直接写 16;如果是 TB6600 拨码 32 细分就写 32。梯形丝杆导程要看规格,标称 1605 的丝杆转一圈走 5mm,标称 1204 的就是 4mm。同步带结构要把分母改成“齿距 x 齿数”,例如 GT2 带配 20 齿同步轮,分母是 2mm x 20 = 40mm,200x16/40 = 80 步/mm。
算出数值后分三条命令写入:
$100=640 $101=640 $102=640写入后发$$查看,确认状态无误再测实际位移。最直接的做法是用铅笔在滑块上做标记,发G91 X50 F300移动 50mm,用卡尺量结果,误差超过 0.3mm 就重新核算齿比或导程。
4.2 最大进给与加速度的设置顺序
$110、$111、$112控制各轴最大进给速度,单位是 mm/min;$120、$121、$122控制各轴最大加速度,单位是 mm/sec²。这两个参数组必须一起调整,因为 GRBL 的规划器先用加速度限制计算速度曲线,如果只把最大进给调高而加速度不跟上,高速时只会频繁丢步。
建议按下面顺序写入初值:
$110=800 $111=800 $112=600 $120=300 $121=300 $122=300$120先给 300 是比较保守的起点,适合大多数 42 步进电机配轻型龙门结构。实测时用加速度固定、逐步提高$110的方式:从 F500 开始跑一个 100mm 的来回,如果听到电机咔咔声、位移量明显变短,就把当前 F 值回退 20% 再写入。要区分共振和丢步:共振往往在特定速度区间出现,声音发闷,过了这个区间又正常;丢步则是速度越高越严重,没有恢复区间。
提示:改完
$100步进/mm 后,GRBL 内部的速度计算基准就变了,所以$110、$120必须重新写一遍。很多机器调完轴距发现 x 轴走得慢,就是只改了步进值,没动速度参数。
4.3 GRBL 0.9 常用$参数速查表
| 参数 | 含义 | 调参场景 |
|---|---|---|
| $0 | 步进脉冲时间,单位 µs | 高速丢步时可从 10 加到 20 |
| $1 | 步进空闲延迟,单位 ms | 电机发热严重时适当降低 |
| $3 | 方向反相掩码,0-7 | 某个轴方向反了就用它翻转 |
| $4 | 步进使能反相 | 默认 0 表示低电平使能 |
| $5 | 限位引脚反相 | 常开/常闭限位开关不同时使用 |
| $10 | 状态报告开关 | 调上位机时设 1 方便看坐标 |
| $20 | 软限位 | 开启后依赖 $130-$132 行程值 |
| $21 | 硬限位 | 接限位开关后开启 |
| $22 | 归位循环 | 有原点开关再开 |
不要一次改太多参数。每改一个就发$$确认,再手动走两下看效果。GRBL 0.9 的$命令是一行一参数,不支持$100=640 $101=640这种连写,分开写更不容易在某条命令失败后不知道改到哪一步。
5. 从 GRBL 0.9 验证到迁移 1.1:升级前要做的三个确认
5.1 不接主轴先验证三轴运动,缩小问题排查范围
机器首次上电,先不要接主轴电机和激光头。把 GRBL 的限位锁定解除后,用三个短指令验证每根轴:
$X G91 X10 F300 G91 X-10 F300发完能看到串口逐次回ok,并且对应轴移动又回位,说明步进驱动和机械连接第一层通过。如果发$X报错或直接回error,先检查是不是处于报警状态,按一次 reset 再试。G91是相对模式,X10表示走 10mm,后一个命令走回负方向,等于原地来回。
完整验证时再用G91 Y10 F300、G91 Z10 F300测另外两轴。Z 轴如果带配重或弹簧,正反行程速度会有差异,这属正常;但发出命令后立刻反冲,就要怀疑方向信号反相,用$3单独翻转那一轴。
5.2 GRBL 0.9 的参数导出与 1.1 迁移对照
做迁移前最稳妥的做法是先把整份参数导出来保存。串口工具里发$$,把返回内容原样复制到文本文件,一行都不要少。烧完 GRBL 1.1 后再逐条重新写入,不要试图直接沿用旧的 EEPROM,因为两代固件的参数布局并不完全兼容。
| 项目 | GRBL 0.9 | GRBL 1.1 | 迁移注意点 |
|---|---|---|---|
| EEPROM 参数布局 | 旧格式 | 不兼容旧格式 | 刷完必须用$重新设置 |
| $10 状态报告 | 0 或 1 | 位掩码,支持更多报告内容 | 0.9 的值不能直接平移 |
| 归位搜索参数 | $24/$25 分离 | 部分行为合并调整 | 重新根据机型设置 |
| $JOG= 在线运动 | 不支持 | 支持 | 老上位机控制方式可能失效 |
| 引脚默认布局 | 328P | 328P 基本一致 | 改过 cpu_map.h 的要重新对照 |
烧完 1.1 之后不要立刻跑加工,先重复一遍上一节的$X和移动验证。因为 1.1 对限位逻辑、报警状态的处理与 0.9 有细节差别,依赖旧版行为写好的 G 代码未必还能按同样方式响应。如果机器上有激光头,尤其注意$32激光模式在两代里对 S 值的映射不同,直接沿用 0.9 设置会有功率失控风险。
本文还有配套的精品资源,点击获取