做一台笔式绘图机:两根能准确到位的步进轴
一台绘图机:能自己回零,画出一个最后一角与第一角相差不过零点几毫米的 100 mm 方框,而且能重复画出来。
做的是什么
一台笛卡尔坐标绘图机:两条互相垂直的皮带传动轴、一支可以抬起的笔,以及一台知道笔在哪儿的控制器——因为它在开机时靠限位开关回过原点,并且此后一直在数每一个脉冲。
有必要说清楚它为什么会是一台适合入门的精密机器,因为它并不是本站最炫的项目。本站其他项目——循迹车、避障车、平衡车——都有反馈:传感器看到世界,代码作出反应,误差被持续修正。这台机器完全没有这些。上面没有任何部件在测量笔在哪里。纸上的线条之所以能落在正确的位置,唯一的原因就是你内置的每一个假设都成立。
这让它成为一位异常诚实的老师。漂了位的循迹车照样还能跟着线走。漂了位的绘图机画出的方框却合不上,而那道缺口就以墨水的形式留在纸上、以毫米为单位,精确地告诉你你错得有多厉害。
贯穿整个项目的那一个数
画一个 100 mm 的方框,量一量本该重合的最后一个角和第一个角之间差了多少。
这一个测量值就是整个项目的记分牌,它之所以有价值,在于误差的形状本身就能告诉你原因:
| 方框的表现 | 原因 | 在哪里解决 |
|---|---|---|
| 总是大几个百分点或小几个百分点 | 每毫米步数不对 | 标定 |
| 任何尺寸下开口都差不多大 | 背隙 | 皮带张力与顶丝 |
| 每次开口都不一样 | 丢步 | 电流、速度与加速度 |
| 能闭合,但是个平行四边形 | 两轴不垂直 | 框架 |
| 慢速能闭合,一快就开口 | 超过拉入转速或拐角速度 | 加速度,或者改用 24 V |
这五条里有四条属于参数设置,一条是框架问题。动手改之前先弄清自己遇到的是哪一种,这就是这件事的全部难点所在。
物料清单
| 零件 | 数量 | 价格 | 备注 |
|---|---|---|---|
| NEMA 17 步进电机,1.5–1.8 A | 2 | £18–28 | 40 mm 机身。别买 20 mm 的薄饼款。 |
| A4988 驱动器 | 2(另备 1 块) | £6–12 | 或者用 DRV8825——注意 Vref 的公式不一样 |
| Arduino Uno | 1 | £4–20 | Nano 也能用,而且更小 |
| CNC 扩展板 v3 | 1 | £5 | 可选但推荐——自带大容量电容 |
| SG90 舵机 | 1 | £2 | 用来抬笔 |
| 杠杆式微动开关 | 2 | £1 | 每轴一个,装在行程最小的一端 |
| GT2 皮带,6 mm | 2 m | £5 | 玻纤芯的。纯橡胶的会拉伸。 |
| GT2 20 齿同步轮,5 mm 孔径 | 2 | £4 | 80 步/mm 就是从这里来的 |
| GT2 惰轮 | 4 | £5 | 光孔、不带齿,用作回程轮 |
| 8 mm 光轴,400 mm | 4 | £10 | 或者用 2020 铝型材配滑块 |
| LM8UU 直线轴承 | 8 | £6 | 每根轴两端各两个 |
| 12–24 V 电源,2 A 以上 | 1 | £8–15 | 想要速度就用 24 V |
| 100 µF 电解电容,35 V 以上 | 1 | £0.20 | 不是可选项;不用扩展板的话就必须配它 |
| 万用表 | 1 | £10–25 | 调 Vref 必需。没有替代品。 |
| M3 紧固件、打印支架 | — | £5 | 或者用激光切割的胶合板 |
**大约 £90–130。**万用表和电源以后还能复用;运动部件大约 £60。
有两个看起来省钱、其实并不省钱的做法值得点出来。其一,纯橡胶芯的 GT2 皮带拉伸量足以表现为背隙,而玻纤芯的只贵一镑。其二,只买两块驱动器而不是三块,意味着你第一次因为忘记加电容而烧掉一块驱动器时,项目要停摆一周。
整体怎么接线
12–24 V ──┬── 100 µF ──┬── VMOT (X driver)
│ └── VMOT (Y driver)
└── GND ─────┬── Arduino GND
│
Arduino Uno │
D2 ── X STEP D5 ── Y STEP │ X driver ── coil A ── motor X
D3 ── X DIR D6 ── Y DIR │ └ coil B
D8 ── ENABLE (both, active low) │ Y driver ── coil A ── motor Y
D9 ── X endstop (INPUT_PULLUP) │ └ coil B
D10 ── Y endstop (INPUT_PULLUP) │
D11 ── pen servo signal ────────────┴── servo 5 V from the Arduino
唯一一条不容易想到的规则:**限位开关的线要远离电机线走。**步进电机的线缆是一个斩波电流源,而与它并行 300 mm 的限位线就是一根天线。如果你的机器在电机断电时能正常回零、一开动就失败,那问题就是这个,别无其他。
按里程碑来做
每个里程碑都以一次测试收尾。不要跳过任何一个——它们各自都能抓出一个故障,而等到那时另外三样东西也一起坏了,这种故障就难查得多。
**1. 台架上的单个电机。**驱动器接好线,Vref 调好,ENABLE 拉低,命令输出 3200 个脉冲。
→ *通过:*轴正好转一整圈,轴上做的记号回到原处,连续十次都如此。
**2. 两块驱动器的 Vref。**根据电机额定值和你自己板子上的采样电阻来算——看清丝印,是 R100 还是 R050。
→ *通过:*两块的读数都在目标值的 ±0.02 V 以内,通电保持十分钟后电机只是温热,手指还能一直放在上面。
**3. 框架装好,两轴都能动。**皮带装好并张紧——要结实,不要紧到像吉他弦。 → *通过:*电机关闭时用手推动,每个轴都能从一端到另一端顺畅滑动,没有卡死的点。现在就把卡滞修掉;否则它以后会永远伪装成丢步。
**4. 每毫米步数。**在每个轴上命令走 100 mm,用直尺量出实际值,按比例修正,再量一次。 → *通过:*命令 100 mm,两轴实测都是 99.5–100.5 mm,连做两次都成立。
**5. 背隙。**从左边接近标记,记下位置;从右边接近,记下位置。 → *通过:*差值小于 0.2 mm。超过这个数,就把皮带张紧,并检查皮带轮的顶丝是否打在轴的平面上。
**6. 先找到极限,再退回来。**逐步提高速度和加速度,直到某个轴开始丢步,然后把两项都设成该值的 50–60%。 → *通过:*在设定的参数下,往返二十次都能回到同一个标记,误差在 0.1 mm 以内。
**7. 回零。**装上限位开关,实现三段式找零,做十次回零,每次做一个记号。 → *通过:*十个记号都在 0.05 mm 以内。另外还要做这一项:拔掉一个限位开关再回零,确认它会报错放弃,而不是一路磨着往前走。
**8. 抬笔机构。**装好舵机,反复试出抬起和落下的角度。 → *通过:*笔以轻微而均匀的压力接触纸面,整个台面范围内压力都一致。笔如果刚性安装,在不平的台面上就会往一侧扎——用弹簧或者重力悬挂会宽容得多。
**9. 方框。**先回零,然后在纸上画 100 mm。 → *通过:*最后一个角和第一个角的偏差在 0.3 mm 以内,而且连画三次,三个方框都落在同一处。
做到什么程度算好
| 测量项 | 第一台能跑起来的机器 | 标定之后 | 极限 |
|---|---|---|---|
| 100 mm 方框的闭合度 | 1–3 mm | 0.2–0.3 mm | 框架方正度 |
| 回零重复精度 | 0.3 mm | 0.02–0.05 mm | 限位开关的重复精度 |
| 背隙 | 0.5 mm | 0.05–0.15 mm | 皮带与同步轮的配合 |
| 绘制速度 | 20 mm/s | 100–200 mm/s | 先受拉入转速限制,再受拐角速度限制 |
| 微步距 | — | 0.0125 mm | 远细于其他任何环节 |
最后两行合起来就是整个项目最核心的教训。电机的分辨率——0.0125 mm——大约比你实际能达到的误差还细二十倍。最终精度没有任何一项是受步进电机限制的。全部取决于皮带、框架和方正度。
在为了解决绘图问题而去买一台更好的电机之前,这一点值得先记清楚;这也正是步进模拟器被列进学习路径的原因:它会告诉你,在真实的负载下,转子已经落在驱动器以为的位置之后三四微步,无论你选择哪种细分方式。
值得注意的硬件细节
**如果可以选,就用 24 V 而不是 12 V。**两种都能用。差别在于扭矩从哪里开始往下掉:同样的电机、同样的限流下,12 V 大约在 280 rpm 之后掉扭矩,24 V 要到 600 rpm 之后。配上 20 齿的 GT2 同步轮,机器开始吃力之前大约分别是 190 mm/s 和 400 mm/s。如果绘图机永远只会慢慢爬,12 V 也够。
**把 MS1–MS3 跳线接高。**十六细分并不会让机器更准,但它能让电机不再在每一步都发出振铃般的响声——在单薄的框架上,这决定了机器听起来像一台机器,还是像一只愤怒的黄蜂。代价是在 100 mm/s 时每秒多出 8 000 个脉冲,Uno 完全应付得了。
**皮带张到结实,而不是绷紧。**过紧的皮带给电机轴承增加负载,还会引入吃掉扭矩裕量的摩擦;过松的皮带则会增加背隙。弹起来声音发闷,就说明松紧合适了。
**两个顶丝都要压在同步轮的平面齿上。**在轴上打滑的 20 齿同步轮,产生的误差看起来和丢步一模一样,而针对丢步的任何办法都不管用。这里用一点螺纹胶并不算过头。
出问题时看这张表
| 现象 | 原因 | 处理 |
|---|---|---|
| 电机嗡嗡响却不转 | 线圈分组接错,或没有加速斜坡 | 用万用表重新配线;加上斜坡 |
| 某个轴每走一趟都多偏一点 | 加速段丢步 | 降低加速度、提高 Vref,或者整体减速 |
| 慢速正常,一快就跳步 | 超过拐角速度 | 换 24 V——加大电流没有用 |
| 方框总是大 2% | 每毫米步数不对 | 用直尺标定并按比例修正 |
| 方框开口量固定 | 背隙 | 张紧皮带;检查顶丝 |
| 每次回零都落在不同位置 | 缺少慢速二次找零 | 加入 1–3 mm/s 的二次找零 |
| 单独回零正常,绘制时却失败 | 限位线拾取了驱动器的噪声 | 重新布线;在引脚处对地加 100 nF |
| 上电瞬间驱动器就烧 | VMOT 上没有大容量电容 | 100 µF,尽量贴近板子 |
| 绘制中途驱动器进入保护 | 热保护 | 降低 Vref;加散热片和通风 |
| 笔在纸的一侧拖行 | 台面不平,或笔刚性安装 | 找平;笔用弹性悬挂,不要固定死 |
| 线条只在某一个速度下抖动 | 中段共振 | 略微改变速度,或给龙门增加配重 |
| 各项都对,图形还是歪的 | 两轴不垂直 | 找方框架——没有参数能解决这个问题 |
接下来可以往哪走
**换用 GRBL。**机器验证通过之后,烧上 GRBL,你就得到了一台真正的 G 代码解释器,回零、软限位、坐标系和加速都已经写好了。用标定出来的每毫米步数配置好 $100 和 $101,就可以用任何 CAM 软件驱动它。
**CoreXY。**还是那两台电机,但都固定在框架上,皮带走向改成让 X 和 Y 成为两台电机速度的组合,而不是各由一台驱动。运动质量更小,所以更快也更准——代价是在坐标和电机之间多出一层运动学混合。
**用激光代替笔。**机械上就是同一台机器换个工具,但二极管激光会带来实打实的眼睛安全要求,还需要外壳和联锁。把它当成一个独立项目,而不是一次简单替换。
**改用丝杠 Z 轴。**如果你想在有高度的表面上绘制,或者转做浅雕,一根 T8 丝杠可以做到 400 步/mm,而且断电后仍能保持位置。
**闭环步进电机。**这是唯一一个能彻底去掉本项目最尖锐失效模式的升级。每台电机后面装一个编码器,就能在悄悄丢步时给出修正或报警。代价是三到四倍的价格,如果上面的里程碑全部通过,那确实没有必要。
项目路线图
搭建路径
沿着技术树,从零件一路走到一台能正常工作的机器人。每个节点在其前置条件完成后解锁,你的进度会保存在这台设备上。
已完成 0 / 20
元器件
本路径中的教程
- 中级 · 35 分钟步进电机工作原理:滞后角与丢步滞后角就是步进电机行为的全部。把它弄懂一次,丢步就不再神秘。
- 入门 · 30 分钟A4988 接线与 Vref:设定步进电机限流决定步进电机是正常工作还是烧毁的那一项调节:用万用表设定 Vref。
- 入门 · 25 分钟每毫米步数:皮带、丝杠与分辨率一个数字把脉冲和毫米联系起来。先推导出它,再用实测来验证。
- 中级 · 30 分钟用限位开关回零:机器坐标与工件坐标为什么每台 CNC 机器开机都要先撞一下限位开关,以及它设定的那个数值到底意味着什么。
- 中级 · 40 分钟运动曲线规划:梯形与 S 形加减速给运动加上斜坡,而不是直接下指令——梯形曲线、jerk 限制,以及 S 形曲线真正的代价。
- 中级 · 30 分钟机器人减速箱背隙:怎样测量,怎样解决每个减速箱都有空隙。量出你的减速箱有多大背隙,看看它正在悄悄让你的机器人付出什么代价。
- 入门 · 30 分钟为什么 delay() 会让机器人失灵:用 millis() 计时卡在 delay() 里的机器人什么也看不见。用 millis() 取代它,并把计数回绕时的比较写对。
- 入门 · 30 分钟为什么电机一启动,机器人就复位看起来像代码 bug 的复位,几乎总是电池的问题。先做电流预算,再测量电压跌落。
接线之前先练习
用在线模拟器把它调好
搭建路径会经过一个浏览器实验台。先在这里把行为调对,再把参数迁移到真实的机器人上。
常见问题解答
业余笔式绘图机能有多精确?
一台精心制作的皮带传动绘图机,重复精度大约在 0.1 到 0.2 mm,画出的 100 mm 方框能闭合到零点几毫米以内。限制并不在电机:20 齿 GT2 同步轮在 1/16 细分下,一个微步是 0.0125 mm,远比机器里其他任何环节都细。真正决定误差的是皮带张力、框架刚度、同步轮处的背隙,以及两根轴之间的垂直度。如果你的误差超过半毫米,在动任何固件设置之前,先把这四项量一量。
需要 CNC 扩展板吗,还是可以用面包板搭?
两种都行。CNC 扩展板大约五英镑,给驱动器提供插座,引出限位开关和主轴引脚,还自带大容量电容——这就消除了烧毁驱动器最常见的那一种方式。只有两根轴的话,用面包板也没问题,前提是你自己在 VMOT 上跨接一颗 100 µF 电容,并让电机线远离步进信号线;不过扩展板的价钱,比你原本可能烧掉的第二块驱动器还便宜。
为什么抬笔用舵机,而不用第三台步进电机?
因为笔只需要两个位置——抬起和落下——而且哪个位置都不需要精度。一只业余舵机只用一个信号引脚、完全不需要驱动器就能做到,这正是它擅长的活儿。用步进电机做 Z 轴则需要第三块驱动器、第三组引脚、一根丝杠和一个回零开关,而这一切只是为了复现一只两英镑的舵机用一行代码就能做到的事。
X 轴和 Y 轴用皮带还是丝杠?
用皮带,不用太犹豫。GT2 皮带是 80 步/mm,跑到 200 mm/s 甚至更快都没问题;T8 丝杠是 400 步/mm,但同样的距离需要五倍的脉冲,这在 Arduino Uno 上会把你限制在大约 30 mm/s。绘图机几乎不承载任何重量,却需要在纸面上快速移动,这正是皮带擅长的情况。丝杠的用武之地是必须撑住重量的 Z 轴。
为什么我的方框合不上?
有四种原因,而且可以区分开来。如果误差是距离的一个固定百分比,那就是每毫米步数不对——用直尺来标定。如果无论尺寸大小,误差都是一个固定量,那就是背隙,要张紧皮带并检查同步轮的顶丝。如果每次误差都不一样,说明你在丢步,要降低加速度或提高电流。而如果方框变成了平行四边形而不是开口,说明两根轴互相不垂直,这是框架问题,任何设置都修不好。
可以直接用 GRBL,而不是自己写固件吗?
可以,而且一旦机器能正常工作,这就是明智的做法。GRBL 能把 Uno 变成一台 G 代码解释器,回零、软限位、加速度和坐标系都已经实现好了,你只需要用 $100 和 $101 来配置每毫米步数。之所以要先自己写一个简单版本,是因为同时调试一台机器和一份固件配置,要比一件一件分开做难得多。