元器件 · 电源
机器人电池与电源包
如何给小车供电:为什么 9V 方块电池一带电机电压就下跌、AA 和 18650 电池组怎么选,以及怎样不让电机和逻辑电源把控制板拖复位。
它是什么
电源包是新手想得最少、错得最多的部分。就是给电机和电路供电流的电池——但选错了代码再好车也抽搐、复位、不动。供电做对经常是跑起来的车和反复重启的车的区别。
关键是车有两种很不同的电流胃口:电机阵发大口吃,逻辑细水长流。一包电池能喂两个,但要安排得贪吃的电机饿不着敏感的大脑。
工作原理
顺着电流从电池包走:
- 电池出原始电压——4 节 AA 6 V,2 节 18650 7.4 V。
- 电机轨从电池包直进 L298N 驱动 Vin。大而冲击的电机电流走这里——完全不经过 Arduino。
- 逻辑轨是稳压 5 V(驱动板载稳压或 USB),给 Arduino 和传感器干净稳定的电压。
- 共地把一切连起来。每一路电源都必须共用同一条地线,否则逻辑信号没有共同的参考电位,读数就变得毫无意义。
这样分开,电机突然吃一安拉塌自己的轨,拖不下 Arduino 的 5 V。
为什么 9 V 方块不行
最常见的第一台车错误,是用矩形 9 V PP3 电池给电机供电。看着方便,但它储能很少、内阻很高。电机一取电流,它的电压立刻塌下去——Arduino 跌破最低工作电压而复位,于是小车一顿一顿地重启、循环往复。9 V 块电池用来给只喝毫安电流的面包板供电没问题,但凡是带轮子的活,它都是错误选择。
选择与接线
- **电压配电机。**3–6 V 电机在 6 V 或 7.4 V 包上都欢;速度用 PWM 驯,别欠压电池包。
- **容量是续航。**mAh 大充一次跑更久;18650 比 AA 耐得多,要带保护的电池座。
- **一开关,极性对。**电池包上加一个总开关,首次上电前把极性核对两遍——反接的代价是瞬间烧板。
- **别倒灌。**除非板子本来就为此设计,否则别同时用 USB 和电池给 Arduino 供电。
- 加大容量电容并在电机电源上,用来吸收启动冲击、稳定电源轨。
内阻:决定一切的数
每块电池的行为都像是一个串了电阻的理想电压源。这个电阻,就是为什么一包电池能跑而另一包让你板子复位的全部原因。
V_under_load = V_open_circuit - (I x R_internal)
2 A 冲击过 0.5 Ω 内阻的包,下游看到之前先丢一整伏。常见选项对照:
| 电池包 | 标称 | 典型内阻 | 2 A 时压降 | 结论 |
|---|---|---|---|---|
| 9 V PP3 碱性 | 9 V | 1.5–3 Ω | 3–6 V | 带电机没法用 |
| 4×AA 碱性 | 6 V | 0.6–1.2 Ω | 1.2–2.4 V | 勉强,很快虚 |
| 4×AA 镍氢 | 4.8 V | 0.1–0.2 Ω | 0.2–0.4 V | 好,但电压低 |
| 6×AA 镍氢 | 7.2 V | 0.15–0.3 Ω | 0.3–0.6 V | 扎实的选择 |
| 2×18650 锂离子 | 7.4 V | 0.05–0.15 Ω | 0.1–0.3 V | 极好 |
| 2S 锂聚合物 | 7.4 V | 0.02–0.05 Ω | 不到 0.1 V | 最好,只是要小心操作 |
这张表把 9 V 块电池解释得再清楚不过。问题不在电压错——它的电压是全表最高的。问题在于 2 A 的冲击电流下它只能给出 3 V,于是小车复位。搁在货架上的电压什么都说明不了;带载时的压降说明一切。
两分钟量你自己的
1. Measure the pack's voltage with nothing connected. -> V_open
2. Stall the motors and measure again while stalled. -> V_load
3. Measure the stall current with the meter in series. -> I
4. R_internal = (V_open - V_load) / I
记号笔写包上。内阻随电芯老化涨,翻倍的包就是“随机”复位的包。
电流预算
买之前先在纸上算一遍。用堵转电流,不用典型值。
| 设备 | 典型 | 峰值 / 堵转 |
|---|---|---|
| Arduino Uno | 45 mA | 50 mA |
| ESP32(Wi-Fi 开) | 80 mA | 阵发 500 mA |
| TT 减速电机 ×2 | 300 mA | 2 A |
| N20 金属减速电机 ×2 | 200 mA | 1.6 A |
| SG90 舵机 | 200 mA | 650 mA |
| HC-SR04 | 15 mA | 15 mA |
| MPU-6050 | 4 mA | 4 mA |
| 8 通道红外阵列 | 100 mA | 200 mA |
| NEO-6M GPS | 45 mA | 60 mA |
典型避障小车——Uno、两台 TT 电机、舵机上的超声波传感器——预算大约是典型 360 mA、峰值 2.7 A。按峰值选电池包,按典型值算续航:
runtime (hours) = capacity (mAh) / average draw (mA)
2000 mAh AA 镍氢 360 mA 约 5.5 小时,比大多数机器人的电池一辈子跑的都多。容量很少是约束——冲击能力是。
正确接线
Battery + ──── master switch ──┬──── motor driver VM (the heavy path)
│
└──── 5 V regulator ──── Arduino, sensors
Battery − ─────────────────────┴──── COMMON GROUND ──── everything
四条规则,按它们被违反的频率排序:
**共地,永远。**每个电源、每块板、每个传感器都接到同一个地上。少了共地,逻辑信号就没有参考电位,而这种故障是无声的——什么都不工作,什么都不发热,看着也没什么毛病。
**地线走星形,不要串。**每一路地都回到同一个点,而不是经电机驱动菊花链式串过去。电机的回流电流流过共用的地线会在线上产生压差,于是电机一动,你的传感器读数就跟着漂。
正极加总开关,在一切之前。失控车瞬间掐电值两分钟。
**反接保护。**串联一个肖特基二极管大约损失 0.3 V,或者用一只 P 沟道 MOSFET,代价几乎为零。两种都比一块被反接烧掉的板子便宜——而反接只需要一走神。
电容:能干什么不能干什么
电机电源并470–1000 µF 电解,贴着驱动。值得做。也常被指望干它干不了的。
它能修:PWM 和电机换向的尖锐瞬态,微秒级,耦合到逻辑轨的噪声。
它不能修:持续冲击。算术无情:
dV = I x t / C
1000 uF supplying 2 A for 10 ms -> dV = 2 x 0.01 / 0.001 = 20 V
2 A 电机冲击 10 ms 要电容掉 20 V,包里都没这么多。**只有更硬的电池扛冲击。**电机一转板子复位,加大电容不是答案——低内阻电池包是。
每颗 IC 电源脚旁再加 100 nF 瓷片。完全另一活:管芯片自己开关的高频需求,电解太慢够不着。
选哪种化学
| 镍氢 AA | 锂离子 18650 | 锂聚合物 | |
|---|---|---|---|
| 单节电压 | 1.2 V | 3.7 V | 3.7 V |
| 内阻 | 低 | 很低 | 最低 |
| 自放电 | 低(用“即用型”) | 很低 | 很低 |
| 过放 | 耐造 | 低于 3.0 V/节损伤 | 低于 3.0 V/节损伤 |
| 充电 | 简单皮实 | 要正规充电器或保护板 | 要平衡充 |
| 起火风险 | 可忽略 | 乱来真着 | 乱来真着 |
| 适合 | 第一台车 | 大多数车 | 性能作品 |
**镍氢是第一台的正解。**六节 7.2 V 内阻低,耐犯错,包死了是麻烦不是事故。
锂离子 18650 是最合算的升级:同样的重量能存多得多的能量,内阻很低,而且便宜。用带保护的电池座或一块保护板——锂电芯被放到约 3.0 V 以下会造成永久损伤,而一台跑到没电才停的机器人正好会干出这种事。
锂聚合物电池是性能作品用的那种,也是唯一必须小心对待的一种。绝不无人值守充电,绝不刺穿,绝不把放完电的电池留着,并用平衡充电器充电。
故障排查
| 现象 | 可能原因 | 解决 |
|---|---|---|
| 电机一转板子复位 | 电池包压降——内阻太高 | 量一量;唯一的解是换内阻更低的电池包 |
| 加大电容没用 | 它本来就不可能有用 | 见上面的算术;换电池 |
| 什么都不工作,也都不发热 | 没有共地 | 把所有地接到同一个点 |
| 电机一动传感器读数就漂 | 地线菊花链连接 | 把各地线星形接回同一个点 |
| 越跑越慢 | 电池包电量耗尽,电压下降 | 正常现象;闭一个速度环,或者监测电池包 |
| 一开始电机就无力 | 驱动压降加上正在下垂的电池包 | L298N 自己要先吃掉约 2 V,电机才拿得到电压 |
| 稳压器很烫 | 线性稳压器上压差太大 | 换成开关稳压器,或降低输入电压 |
| 充电时电池包发热 | 充电器与电池化学体系不匹配 | 停。充电器要配电芯 |
| 锂电包废了充不进电 | 被放到了 3.0 V 以下 | 永久损伤——下次用带保护的电池座 |
监控电池包
最后值得加的:知道自己电池电压的车欠压前会停,两电阻的事。
// 100k / 33k divider: 8.4 V max in -> ~2.09 V at the pin. Safe for a 3.3 V ADC.
const float DIVIDER = (100.0 + 33.0) / 33.0;
float packVolts() {
return analogRead(A0) * (5.0 / 1023.0) * DIVIDER;
}
一条值得认真对待的提醒:在 Arduino 上,analogRead 是以 5 V 电源轨为基准的,而电机一跑,这条轨本身就在下垂。用一个正在下降的参考去量一个正在下降的电池,读数反而会升高。改用芯片内部的 1.1 V 基准,配上 analogReference(INTERNAL),并按这个基准重新设计分压比,读数就诚实了——模拟输入教程讲的正是这个坑。
探索关联图谱
用到它的搭建
包含 机器人电池与电源包 的项目、学习路线和模拟器。
- 项目做一只四自由度机械臂:PCA9685、舵机与运动学
- 项目做一只微型迷宫鼠:用洪水填充求解迷宫的机器人
- 项目做一台带 LSRB 路线记忆的线迷宫求解机器人
- 项目做一台循迹机器人:从模拟器到真实赛道
- 项目做一台知道自己抓空了的抓取搬运机器人
- 项目做一台笔式绘图机:两根能准确到位的步进轴
- 项目做一台能扫遍整个地面的房间覆盖机器人
- 项目做一台能横着走的麦克纳姆轮机器人
- 项目做一台能看见标记并开过去的 ROS 2 机器人
- 项目做一台能自主行驶的 GPS 航点漫游车
- 项目做一台迷你相扑机器人:抓地、铲子与边缘感知
- 项目做一台通过蓝牙或 Wi-Fi 用手机控制的机器人小车
- 项目做一台避障机器人:感知、扫描与转向
- 项目用 8051 单片机做一台循迹机器人
- 项目用 MPU6050 和 PID 做一台自平衡机器人
- 学习路线机器人电子基础:一份学习路线图
问题
机器人电池与电源包 常见问题
Arduino 机器人小车该用什么电池?
标准选择是用 4×AA 电池包(6 V)或 2×18650 电池包(7.4 V)给电机驱动供电。两者都能提供电机所需的电流,带载时电压也不会崩塌。开发期间,Arduino 可以由驱动板的稳压 5 V 输出供电,或者通过 USB 供电。
能用 9 V 电池给机器人的电机供电吗?
效果不好。9 V PP3 方块电池容量很小、内阻很高,所以电机一开始取电流,它的电压就会下垂,Arduino 随之欠压复位。凡是带电机的东西都用 AA 或 18650 电池包;9 V 方块电池留给面包板用。
Arduino 和电机共用同一块电池吗?
通常共用一个电池包,但走不同的电源轨。电机经驱动板的 Vin 端子从电池包取电;逻辑电路则运行在稳压后的 5 V 上。关键在于,所有电源都必须共地,否则你的信号就没有共同的参考电位,什么都读不对。
为什么电机一启动,我的机器人就复位?
因为电机启动时会短暂地吸取很大的冲击电流,把共用的电压拉低到 Arduino 所需的电压以下,于是它重新启动。解决办法是:换一块更“硬”(内阻更低)的电池,从同一个电池包分出独立的电机轨和逻辑轨,并在电机电源上并联一个电容来吸收冲击电流。
延伸阅读