学习路线入门

机器人电子基础:一份学习路线图

给机器人搭一套带载也能稳住的电源,把多个传感器挂到同一条 I²C 总线上,并写出一个能读取全部传感器、却从不阻塞的回路。

看起来像软件问题的机器人问题,大多不是。板子复位了,怪到代码头上;传感器返回一堆乱码,怪到库头上;机器人无视它的保险杠,怪到逻辑头上。每一次,故障都在更下面一层,在系统的那个部件里——没人给它写过教程,因为它看起来太基础了,好像不需要写。

这条路线讲的就是那一层。它涵盖电源——为什么电机一启动电池电压就会塌下去,以及该怎么办;I²C 总线——每个传感器都共用的那两根线到底在做什么;以及时序——为什么一个会停下来等待的回路,就是一个无法作出反应的机器人。

这些内容没有一样是难的。但本站的每一条其他路线都假定它们成立。

开始之前

你需要一个已经能烧录的单片机,以及愿意把万用表搭到电池两端的意愿。不需要控制理论,也不需要加法和一次除法之外的数学。如果你做过任何东西——哪怕是一个闪烁的 LED——你就准备好了。

你将会做到什么

  • 在一分钟内区分复位和崩溃,并且在打开任何代码之前就知道自己面对的是哪一种。
  • 把一台机器人的电流消耗加起来,用这个数字挑电池组,而不是照着套件里附带的那块来选。
  • 解释为什么货架上电压最高的 9 V 块电池在带载时表现最差,并预测任何电池组会塌到什么程度。
  • 把多个传感器接到同一条 I²C 总线上,用扫描器把它们找出来,并用三种不同的方法解决地址冲突。
  • 写一个以三种不同速率读取传感器、驱动电机并报告状态、且全程不阻塞的回路——并且把回绕比较写对。
  • 实测自己回路的最坏耗时,而不是假设它。

大家卡在哪里

**把“它没有复位”当成电源正常的证据。**Arduino 的欠压检测设在 2.7 V, 但一颗 16 MHz 的 ATmega328P 需要大约 3.8 V 才能工作在额定速度上。在 这个区间里芯片运行在规格之外,却没有任何机制会介入——机器人上最诡异的 故障就住在这个区间里:变量被破坏、舵机突然跳动、传感器返回看似合理的乱数。

**加一个电容就指望它能修好复位。**算术说的正相反:一个 1000 µF 的电容 被要求承担 2 A 持续 10 ms 的冲击,会掉 20 V。它能清理开关纹波和换向尖峰, 这值得做,但只有更硬的电池才能扛住冲击。

**在同一条总线上堆扩展板。**几乎每块板子出厂都自带上拉电阻,而它们是并联的。 三块板子已经处于临界,第四块会把总线拉到任何器件都无法灌入电流的低电平—— 于是三个传感器正常工作,第四个把它们全部搞死,却没有任何东西真的坏了。

**从数据手册上照抄 8 位地址。**MPU-6050 的数据手册写的是 0xD0;而 Arduino 的库要的是 0x68,同一组位右移一位。这是最常见的一个 I²C 错误,而它的 表现和一块坏掉的板子一模一样。

**写 now >= last + interval。**它读起来比相减的形式更自然,但它在 第 49.7 天的回绕处会失效,变成持续触发而不是等待。永远用相减。

**把回路被阻塞的锅甩给回路逻辑。**在 delay() 期间中断仍在运行,所以 编码器计数始终完全正确,而机器人却不再反应——这让症状看起来像是一个 决策 bug,而不是时序问题。

你需要什么

什么 这条路线为什么需要它 大致成本
一块能烧录的单片机 这里每一次测量都是在运行中的板子上取得的,而不是在纸上 Arduino Uno,克隆版约 $8
一台万用表 这条路线唯一离不开的仪器——它提出的每一个判断都要你自己去验证 约 $15
一组带载电池 没挂任何负载测出来的电池组什么也说明不了;你需要一组正在驱动某个东西的电池 4×AA 电池座或 2S 锂电
两块 I²C 扩展板 一块板子永远让你看不到上拉问题。两块就开始看到了。 MPU-6050 加任意一块,约 $5
一两个电机 让电源轨塌下去的负载——这条路线存在的理由就是要解释这个故障 任意直流减速电机

不需要示波器。这条路线上的每一次测量都是廉价万用表就能完成的直流测量。

为什么按这个顺序

这个顺序不是随意定的——每一个节点都消除掉一种下一个节点可能对你撒谎的方式。

**时序排在所有测量之前。**一个被阻塞的回路会让其他所有测量都变得可疑, 因为你再说不出一次读数是什么时候取的。一旦回路是非阻塞的,你才能相信 时间戳,也只有到那时一次测量才值得记录下来。

**电源排在模拟量之前。**Arduino 上的 analogRead 是比值式的——它把 输入报告为参考电压的一个分数,而默认参考恰好就是电机正在拖低的那条 5 V 轨。 在一条正在塌陷的轨上通过分压器测电池,读数会随着电池电压下降而上升。 在知道你的电源轨在做什么之前,诚实地读取一个电压是不可能的,所以电源节点必须排在前面。

**I²C 排在电源之后,但与模拟量无关。**这条总线是一个独立的子系统, 它以自己的方式失效——通过上拉电阻的算术和地址冲突,而不是通过电源塌陷。 它直接挂在板子节点上,这就是那棵树在那里分叉的原因。

**实验台排在最后。**传感器模拟器让你刻意地给一个干净信号加上噪声、偏置和丢包。 只有在你先看过自己的硬件意外地产生它们、并且知道每一种的成因之后,这才有教益。

检查点:如何判断一个阶段已经落地

下面每一项都是台架测试,不是小测验。如果你拿不出那个数字,这个阶段就还没完成。

阶段 检查内容 通过是什么样
非阻塞时序 打印你的回路在 10 秒内的最坏耗时 一个你实测出来的微秒数,而不是假设出来的——而且拔掉传感器时它不会变大
带载电池 先在电机关机时测电池组电压,再在堵转时测 你能说出电压塌陷了多少伏,再除以电流得到电池组的内阻
电源预算 先在纸上把每个器件的电流加起来,再测总量 纸面和万用表相差在 20% 以内;如果对不上,你就找到了一个电流大于其数据手册标称的器件
模拟输入 电机分别在关和开的状态下,通过你的分压器读同一块电池 电机启动时读数不变——如果变了,说明你的参考在动
I²C 总线 每加一块板子就跑一次总线扫描 每个地址都出现,而且你能说出总线上拉电阻的总阻值
地址冲突 把 MPU-6050 的 AD0 引脚拉高 扫描器报的是 0x69 而不是 0x68——而且你能解释数据手册为什么写 0xD0

这条路线到哪里为止

这条路线刻意停在电子学不再对你撒谎的地方。它不涵盖电机驱动、 控制回路,或任何决定机器人该往哪走的东西——那些属于 电机控制和 PID 控制 路线,而这两条都假定了本路线的一切。

它同样在三件值得点名的事情之前停下,好让你知道它们的存在。它不涵盖 开关型稳压器——那是从 12 V 电池组得到 5 V、而不在线性稳压器里把差值 全部烧成热的办法。它不涵盖 5 V 与 3.3 V 器件之间的电平转换——当你第一次 把 ESP32 和一个 5 V 传感器接到同一条总线上时就会需要它。它也不涵盖 PCB 布局或焊接——这里的一切都在面包板上完成,这对学习是够用的,而且 一旦机器人开始运动,面包板本身就会成为间歇性故障的来源。

学习路线

路线

按顺序完成各个节点——完成一个就会解锁下一个。你的进度会保存在这台设备上。

已完成 0 / 9

100%
模拟器

看看真实的传感器数据流是什么样子

交互

打开模拟器
目标

在坚实的基础上搭建

技能解锁

常见问题

常见问题解答

做机器人之前需要懂哪些电子知识?

三样,而且没有一样是高深的。你需要根据机器人实际吸取的电流来确定电源规格,这样电机启动时它才不会复位。你需要足够了解 I²C 总线,才能把几个传感器挂到两根共用的线上而不互相打架。你还需要写出一个从不停下来等待的控制回路,这样机器人在做别的事情时也能作出反应。其他的一切——控制理论、导航、运动学——都建立在这三样之上。

为什么电机一启动我的 Arduino 就复位?

电池的内阻把电机的浪涌电流变成了电压降,整条电源轨都随之下垂。一台电机通过一块内阻为 0.5 Ω 的电池组吸取 2 A 的浪涌电流,在任何电流到达稳压器之前,就会把电源轨拉低整整一伏。如果这一下跌落让板子低于欠压阈值,它就会重启。解决办法是更硬的电池和独立的电机电源,而不是更大的电容——一个 1000 µF 的电容如果要承担 2 A、持续 10 ms,电压会掉 20 V,所以它根本扛不住这种规模的冲击。

一块 Arduino 上能挂多少个 I²C 传感器?

地址空间允许 112 个器件,但电气上的极限远在那之前就到了。几乎每块扩展板都自带上拉电阻,通常是 4.7 kΩ,而把板子叠在一起就会让这些电阻并联。四块板子大约是 1.2 kΩ,在 5 V 下需要超过 4 mA 的灌电流——超出了 I²C 器件被要求能承受的 3 mA。三块板子通常还能工作,第四块会把整条总线搞死。把除一块之外所有板子上的上拉电阻去掉,你就能挂多得多的器件。

机器人代码里的 delay() 真有那么糟吗?

对机器人来说,确实如此。处理器停在 delay() 里时,不读任何传感器,也不做任何决策——一台处在 delay(500) 里的机器人会瞎上半秒,以 0.3 m/s 的速度计算,就是 15 cm 的行程。让它难以诊断的是,中断仍在运行,所以编码器计数自始至终都完全正确。症状看起来像是决策逻辑坏了,而不是时序被阻塞了。用 millis() 模式来取代它,比较时用减法而不是加法,否则比较会在 49.7 天的回绕处失效。

学这条路线需要示波器吗?

不需要。这里的一切用万用表就够了——测量电池带载时的电压、检查分压器的输出、确认电源轨没有下垂。示波器能让欠压和 I²C 问题看得清楚得多,如果你有一台,就应该用它,但这条路线要求的每一次测量,都是一台 10 英镑的万用表就能完成的直流测量。

这条路线要花多长时间?

四篇教程大约需要两个小时的阅读,而实际在台架上把测量做完,现实地说需要一两个晚上。测量才是重点——这条路线教你去信赖的数字,是你自己电池的电压下垂、你自己总线的上拉电阻总值,以及你自己回路的最坏耗时,而这些都没法查到。