机器人的电机控制:一份学习路线图
能以精确的速度和方向驱动两台电机,读出它们转了多远,并让一台差速驱动机器人按你的意图转向。
电机是机器人的决策变成运动的地方。这条路线从零开始建立电机控制:先用 H 桥和 PWM 安全地开关真实的电机电流,然后通过读取编码器闭合回路,让你知道每个轮子转了多远、转得多快,最后把两个轮子组合成差速驱动的转向和里程计。
按顺序走完这些节点——每完成一个就会解锁下一个。到最后你就能以真实的精度指挥机器人的轮子,这是循迹、迷宫求解和自主导航的基础。
开始之前
你需要熟悉面包板接线和读电压,并且需要一块已经能烧录的单片机—— Arduino Uno是通常的选择。不需要控制理论; 那是PID 路线的内容,而它假定你先完成这条路线。
你将会做到什么
- 以指令速度双向驱动一台有刷直流电机,而且不让驱动器或板子发热。
- 解释为什么电机在 15% 占空比下静止不动、到 30% 才开始动,并为自己的硬件测出这个阈值,而不是猜。
- 把原始编码器脉冲换算成行驶的毫米和毫米每秒,包括把 ×4 正交倍频这个系数弄对。
- 把“原地左转 90°“变成左右轮的速度,并仅凭轮子运动预测机器人最后停在哪里。
- 依据你自己的机器人质量和轮子来给减速电机选型,而不是买套件里那个、然后在地毯上才发现问题。
- 实测你的减速箱背隙是多少度,并说出它让里程计付出什么代价。
- 算出你的机器人能施加在地面上的最大力,并说明拦住你的是电机还是轮胎。
大家卡在哪里
**用控制器的 5 V 轨给电机供电。**这是第一台机器人上最常见的单一故障。 稳压器供不出电机电流,于是电源轨塌陷、板子欠压复位,而症状看起来像 一个软件 bug。电机要用自己的电源;只有驱动器的逻辑侧才共用板子的 5 V—— 电源预算页里有相应的算术和测量方法。
**没有共地。**驱动器和控制器必须共用一个地参考,否则方向引脚毫无意义。 所有接线看起来都对,却什么都不动。
**指望里程计一直保持真实。**轮式里程计的漂移没有上限——每一次打滑、 每一毫米的轮径误差都会累积,而且永远不会被修正。它在一米的范围内 表现出色,在一百米的范围内一文不值。这个限制正是 建图路线存在的理由。
**不一致地计数编码器边沿。**一个正交编码器每个周期给出四个可计数的边沿。 只数一个却用数据手册上的 ×4 系数,会让每个距离都差出四倍, 读起来就像轮子被彻底标定错了。
**把减速箱的错怪到控制器头上。**会随方向变号的误差是机械问题,不是整定问题。 齿轮组有间隙,每次换向都会结算一次,而装在电机轴上的编码器完全看不见它。
你需要什么
| 什么 | 这条路线为什么需要它 | 说明 |
|---|---|---|
| 两台直流减速电机 | 整条路线的主题 | 带编码器的版本贵一点,但能省掉日后返工 |
| 一个电机驱动器 | 一个 H 桥,好让逻辑引脚能指令电机电流 | 套件里带的就用 L298N,要买就买 TB6612FNG |
| 一块独立的电机电池 | 电机拉低的那条轨不能是板子运行所依赖的那条 | 任何能供出堵转电流的电池组 |
| 一台万用表 | 测堵转电流和电源压降 | 这里电流档很重要,不只是电压 |
| 一把卷尺 | 核对“开 1 m”是否真的走了 1 m | 台架上最便宜、也最诚实的仪器 |
为什么按这个顺序
选型刻意排在接线之前。几乎每一个“我的机器人太慢”或“我的驱动器烧了” 的问题,都是几个月前用盒子里那个电机而意外做出的选型决策。 算出你自己的机器人需要多少扭矩要花二十分钟,却能解决这条路线其余部分 会反复提出的问题。
附着力紧接在选型之后,因为它设定了第二个上限,而在一台小机器人上 它才是较低的那个。堵转扭矩说明电机能产出什么;摩擦说明地面会接受什么。 一台轻机器人在光滑地面上,大约在四分之一堵转扭矩处就撞上附着极限, 这意味着你电机能力的后四分之三根本传不到地面。不考虑附着力的选型 给你的机器人是纸面上强壮、实际在原地空转。
PWM 排在编码器之前,因为开环电机是最简单的一样会出错的东西, 而在上面没有叠控制回路时,调试接线故障要容易得多。 先让两个轮子都能以指令占空比双向转起来。
编码器排在差速驱动之前,因为差速驱动是建立在实测轮子运动之上的算术。 没有编码器你可以转向,却说不出机器人去了哪里,而那个节点里里程计那一半 也无从下手。
运动曲线和两个损失节点排在最后,因为每一个都是在纠正前面那些节点 让你相信的错误想法。运动曲线纠正“你可以直接指令一个位置”这个想法。 轮子打滑纠正“编码器测量的是地面”这个想法。背隙纠正“编码器测量的是轮子” 这个想法。三者都是令人失望的事实,而三者在这里学会, 都比在一台你正想赶紧做完的机器人上学要便宜。
检查点:如何判断一个阶段已经落地
| 阶段 | 检查内容 | 通过是什么样 |
|---|---|---|
| 电机选型 | 由机器人的质量、轮半径和目标加速度算出所需扭矩 | 一个可以拿去和数据手册比较的 N·m 数值——而且你知道你电机的堵转电流 |
| 附着极限 | 全油门下把机器人顶在厨房秤上保持不动 | 读数远低于电机的堵转力处就趋于平稳,而轮子还在转 |
| PWM 控制 | 在每个轮子上把占空比从 0 到 255 以 5 为步长扫一遍 | 你能说出每个轮子第一次转起来的占空比,而且两个数值不同 |
| 方向控制 | 在两个通道上分别指令前进、后退和刹车 | 六种状态行为都正确,而且你能解释刹车与滑行有什么不同 |
| 编码器 | 用手把机器人精确推 1 m 并读取计数 | 用上 ×4 正交倍频系数后,计数能换算成 1000 mm ± 20 mm |
| 差速驱动 | 指令一次 90° 原地转向,用量角器测量 | 几度以内且可重复——一致的误差是背隙,随机的误差是打滑 |
| 运动曲线 | 用同样的限位指令一次短行程和一次长行程 | 短行程永远到不了最高速度,而且你能从曲线形状说出为什么 |
| 背隙 | 用手向两个方向转动轮子,直到阻力点 | 你有了一个以度为单位的数值,而且它不为零 |
这条路线到哪里为止
这条路线停在准确地指令运动。它不会围绕一个外部目标闭合成回路—— 没有要跟随的线,没有要保持的墙面,没有要收敛到的设定点。那是 PID 控制的内容,而它假定这里的一切。
有三处刻意的省略值得点名。无刷电机和电调是另一个控制问题, 而几乎没有哪台小型地面机器人需要它。步进电机用编码器换来了 开环定位,代价是扭矩和速度——这对打印机是正确的取舍,对漫游车则是 错误的;它们有自己的一条路线,见步进电机的精密运动。 全向传动——能横移的麦克纳姆轮和全向轮——需要四个独立控制的轮子 和另一套运动学,它们也有自己的一条路线,见全向驱动。 而电流检测——测量电机实际吸取的电流,而不是你指令的电流—— 是检测堵转的专业做法,而且确实有用,但它需要大多数入门级驱动器 并不具备的硬件。
学习路线
路线
按顺序完成各个节点——完成一个就会解锁下一个。你的进度会保存在这台设备上。
已完成 0 / 13
常见问题
常见问题解答
要控制机器人的电机,需要学些什么?
四层,按顺序来。第一,选型:把机器人的质量和轮径换算成你真正需要的扭矩和转速,让电机是选出来的,而不是从套件里继承来的。第二,开关:H 桥和 PWM,让逻辑引脚能控制它自己永远供不出的电流。第三,测量:编码器,让机器人知道每个轮子转了多远,而不是靠假设。第四,组合:差速驱动,把两个轮速变成航向和位置。之后的一切——循迹、PID、导航——都建立在这四层之上。
为什么我的电机要到大约 30% 的 PWM 占空比才开始转?
在任何东西转起来之前,必须先克服静摩擦和减速箱的静阻力,低于这个阈值时电机只会待在那里嗡嗡响。这个值是你这套具体硬件的属性——减速比、轴承状况、温度,以及轮子上压了多少重量——所以它必须实测,而不能查表。以 5 为步长逐步提高占空比,记下每个轮子第一次转起来的位置。机器人常常有两个不同的阈值,每侧一个,而一台在低速时跑偏的机器人,通常是在向你展示这个差异,而不是转向逻辑有缺陷。
轮式里程计有多准?
一米之内非常出色,一百米之外一文不值。里程计是对车轮运动的积分,所以它犯的每一个错误都是永久的——没有任何测量能修正它。随机打滑按距离的平方根增长,这还能接受;但系统误差,比如轮径偏了 1%,会线性增长,这就不行了。实际的结论是:里程计是在接下来几秒内闭合控制回路的合适工具,却不是用来知道五分钟后你身在何处的工具。
L298N 和 TB6612FNG,该用哪个电机驱动?
几乎任何小型机器人都该用 TB6612FNG。它的 MOSFET 输出级压降约为 0.5 V,而 L298N 大约是 2 V;在 6 V 电机上,这个差距相当于电源的三分之一在到达电机之前就被烧成了热量。L298N 的用武之地是:你需要每通道持续超过约 1.2 A 的电流,或者电机电源高于 TB6612FNG 的 13.5 V 上限。它也是大多数套件自带的驱动器,所以即使你要换掉它,也值得把它弄熟。
入门机器人需要编码器吗?
循迹车不需要,它靠线传感器转向,从来不需要知道自己走了多远。一旦机器人必须行驶一段设定的距离、转过一个设定的角度,或者保持一个不会因电池电压下降或地毯变厚而掉下来的速度,你就需要编码器了。线迷宫求解器需要它们;第一台循迹车不需要。以后再加就意味着要换电机,所以如果你预计会走到那一步,就直接买已经装好编码器的电机。
为什么我的机器人转弯时总是多转一个固定的量?
一致、且随方向变号的误差是机械问题,而不是整定问题。每一套齿轮传动都有背隙——输出端动起来之前必须先吃掉的自由间隙——而且每次换向都要结算一次。装在电机轴上的编码器位于减速箱错误的那一侧,完全看不到这一点,所以控制器以为动作已经完成了。在车轮处以度为单位测出这个间隙,然后要么在软件里补偿它,要么避免在动作中途换向。