提到RoboMaster,很多人的第一反应是赛场上飞驰的步兵机器人、转得飞快的哨兵和云台上稳定瞄准的19mm弹丸。但真正带过队伍的人都知道,一辆看似简单的步兵,背后牵扯的是电源拓扑、电机控制、通信总线、嵌入式底层、视觉处理一整条链条。对新手来说最痛苦的不是算法有多难,而是面对一块主控板、四个电机和一个不知道怎么接的开关,完全不知道从哪下手。
我之前在实验室里带备赛队员,每年都会遇到同样的问题:新同学上来就急着调代码,结果电机的线序接反,板子一上电就冒烟;还有人把舵机的电源线和信号线插错,直接让接收板报废。经过三个赛季的折腾,我把自己带新人时用的硬件培训教案整理成了一份讲义,也就是目前最新的《RoboMaster硬件基础讲义V0.2.1》。它面向的是零基础但打算真正动手做机器人的同学,内容集中在硬件选型、电路原理、接线规范和调试方法上,不强行堆公式,也不停留在"把线插上就行"的层面。
这篇博文我就把自己的教案思路、硬件框架、实践中的调试方法,以及V0.2.1这版讲义里做了哪些取舍,完整地分享出来。如果你也在带队伍、写教程,或者准备从零开始搭一辆自己的机器人,这份内容可以直接当参考底稿。
1. 为什么会有这份讲义
1.1 新队员在硬件学习上的三个真实困境
先说第一个困境:官方资料太重,新人看不进去。RoboMaster官网的开源教程其实做得不差,但它是针对所有参赛队的通用文档,从机械图纸到裁判系统、从云台到超级电容全都有。新人拿到手,往往只会打开其中一个页面,然后被各种接口定义和寄存器说明淹没,看两页就关了,最后线还是不会接。
第二个困境是很多队伍的教学"口口相传",信息损耗严重。上一届队员会接线,但说不清楚为什么这样接;会设置PWM,但不明白占空比和电机转速的关系。到了赛季中期,老队员退场,新队员接手,硬件问题全部靠猜。我见过一个队伍因为把CAN总线终端电阻的位置放错,整车通信时断时续,整整查了三天才发现问题,这种隐性知识是任何PPT都覆盖不到的。
第三个困境是硬件问题难以被"看见"。软件代码报错有串口日志,视觉识别有问题可以看显示画面,但硬件只有一种表现——不工作或者冒烟。新人缺少排查工具,也缺少排查顺序,经常把用万用表量通断和查短路混为一谈,最后只能盲目换板子。
所以这份讲义的定位很明确:它不充当官方手册的替代品,而是给"从零拉线到第一次让电机转起来"这个过程做了一本阶梯式操作指南。V0.2.1在初版基础上,把原来偏理论的章节全部重写了,改成"插线—供电—测信号—闭环—排查"的顺序,让新队员能沿着一条主线走下去。
1.2 版本号里的心思:V0.2.1到底改了什么
版本号这个东西,自己写教程最容易忽略,但我坚持维护。V0.1版本是最原始的培训提纲,里面还有大段复制来的芯片手册内容,当时只是临时打印出来给队员上课用。V0.2版本我花了两个周末重写,把所有章节按"先能跑、再优化"的原则重新排了一次。
到了V0.2.1,变化的重点在三个地方。
第一,把电源章节单独拆出来,并且强制加入了"上电前测量清单"。此前我发现队员上电太随意,经常是电池一插直接开整,板子烧了才想起来查极性。现在讲义的第二章就是一张硬性检查表:输入电压范围、电源开关前后电平、板子对地阻抗,每项打勾之后才能接电。
第二,新增了电机异构的对比内容。一辆步兵通常同时存在直流减速电机、云台无刷电机和舵机,三种电机的驱动逻辑完全不同。V0.1版本把这三种混在一章里讲,新人很容易混淆。V0.2.1把它们分开,每个电机独立成节,配了引脚定义和实测波形示例。
第三,补充了通信总线的实测排查章节。之前很多队员调不通CAN,就认为是代码问题,绕了一大圈。其实大部分是波特率设置、120欧终端电阻的位置和线束屏蔽层接地这仨问题。这一版里我把排错路径写成了表格,照着查就行。
说实话,讲义跟正式出版的书比仍然非常粗糙,但它对我的队伍是真有用。每改一次版,都是把上一赛季在赛场上流过的血变成文字。
2. 整车硬件架构:先搭框架再看细节
2.1 从底盘到云台:模块划分与信号流向
拿到一台步兵机器人,第一件事不是打开代码,而是把它拆成一个个功能模块画出来。我习惯让队员在白板上画一张信号流图:电源从哪里来,送到哪块板子;主控从哪个总线收遥控器数据,又通过哪条总线给电调发送指令;云台板跟底盘板的通信是CAN还是串口。
这种"先画箭头、再碰螺丝"的方式,能避免大量接线错误,因为只要箭头方向理解对了,就不可能把电机线插到电调的地线上。我的讲义里专门有一页是步兵标准模块图,拆成六个部分:电源系统、主控板、执行机构、遥控接收链路、视觉系统、裁判系统。任何硬件问题都能落到其中一个方框里,排查范围直接缩小。
以底盘为例,信号流向大概是这样的:遥控器接收机通过DBUS串口把控制信号送到主控板,主控板把期望转速算好,用CAN总线发给四个电调模块,电调再驱动电机,电机轴上的编码器把实际转速读回主控,构成闭环。云台部分同理,区别在于主控板与云台板之间一般用CAN传输目标角度,云台板自己再内部闭环。
这张图是所有后续操作的地基。很多队员问我"为什么电机不转",我让他们先画这条链,通常画到一半自己就发现问题了,这就是模块化思维的好处。
2.2 供电链路:所有问题的第一来源
在赛场上,我见过最多的一句话是"供电没问题啊,电压都有"。但电压只是供电的一部分。电源模块要解决的是一整套链路:电池输出、稳压、分电、滤波、防反接、欠压保护。
常规步兵的电池一般是7.4V或者14.8V锂聚合物电池。7.4V等级的电池相对安全,适合做入门教学,V0.2.1的供电链路图也以7.4V为主。拿到电池电压之后首先要面临的选择是:哪些设备可以直接吃电池电压,哪些必须降压。
以我们的配置为例,电机电调模块可以直接吃7.4V,因为电调内部有自己的稳压和驱动电路。而主控板、裁判系统、视觉计算设备通常需要5V或者3.3V,因此要在电源链路里插入降压模块。这里有个常见坑:很多新人以为降压模块的功率只看输出电压,实际上输出电流才是关键。比如4路舵机同时转,瞬间电流可能飙到2A以上,如果用了额定1A的降压模块,电压就会被拉低,轻则舵机无力,重则主控复位。
所以讲义里给了一个非常笨但管用的估算方法:把所有负载的最大工作电流相加,再乘上1.5倍系数,按这个数值去选电源模块。我在测试中发现,乘1.5不是保守过度,而是一旦启动瞬间电流上去,模块如果没有余量,输出电压跌落很快,会让整个系统出现奇怪的偶发重启。
另外,地线的处理也要写进讲义。模拟地、数字地、功率地在单块主空板上往往就在一起,但电机功率地回流大电流时会造成地电位抬升,偶尔会导致编码器读数突变。稳妥做法是功率地和逻辑地在主控板下方用一颗0欧电阻或磁珠单点连接,这个知识点看起来不起眼,实战中能救回不少莫名其妙的数据抖动。
2.3 执行机构选型:品牌之外要懂原理
很多新手问的第一问题是"我该选哪个电机",而不是"电机在系统里承担什么职责"。这里需要先把电机分个类。
底盘电机要求扭矩充足且响应够快,最常用的是带减速箱的直流无刷电机,比如RM3508搭配C620电调。它的特点是外转子、无传感器反馈,电调内部通过反电动势或者额外霍尔获得转子位置,自己完成FOC控制,主控只需要通过CAN报文给它发送目标速度。对新手而言,这种组合的友好之处在于不用自己写换相算法,它把驱动部分全部封装在电调里了。
云台电机则要求高控制精度和双向平滑,常见的是RM6025这类大中空无刷电机。它同样接电调,但控制的不是转速而是角度,电调和主控之间通信的是角度闭环链路。云台电机需要注意中速段的顿挫感和低速段的爬行问题,如果没有做好电流环,准星瞄准时会有肉眼可见的抖动。
舵机在RoboMaster硬件体系里是个另类,它通常用于拨弹盘、摩擦轮压弹或者云台限位。舵机内置了电机、减速器、控制电路和位置传感器,本质上是一个完整的小闭环系统,外部只要提供PWM信号和电源就能工作,但它的核心参数是输出扭矩和响应速度,而不是单纯的转速。很多拨弹故障根本不是舵机坏,而是选了个扭矩不够的便宜舵机,被弹丸卡住后就过流保护了。
V0.2.1在每个电机小节后面都加了一个"如果换型需要改什么"的提示,目的是让队员意识到电机和驱动不是锁死的,换电机往往意味着要改电调参数、改通信协议、改机械安装孔,而不是只做软件替换。
3. 主控、驱动与闭环:控制链路的关键细节
3.1 主控选型:为什么绕不开STM32F4
在RoboMaster生态里,最常见的主控芯片就是STM32F4系列。选择它的原因不是性能最强,而是生态完善、外设接口和比赛完全匹配。
以STM32F405RGT6为例,内部有CAN控制器、USART、SPI、I2C、高级定时器,可以生成互补PWM并带死区插入。对一辆步兵来说,这些能力基本覆盖了所有基础控制需求。更重要的是,比赛官方开源代码和社区例程几乎都是基于STM32F4写的,新队员遇到问题能搜到大量参考,这对学习来说比芯片本身的算力更重要。
V0.2.1讲义里不建议一开始就追求高性能芯片,因为算力更强的芯片往往需要对应的软件框架,调试复杂度指数上升。新手阶段最宝贵的是"跑通闭环"的成就感,而不是把时间花在搭建复杂工程上。等到对控制链路真正熟悉了,再迁移到更高性能的H7系列或者配合协处理器处理视觉,是更平滑的路径。
在主控板设计上,一个容易忽略的点是外部晶振和RC复位电路。我见过一批板子,程序烧得进去但运行一段时间就死机,最后怀疑是复位电路抗干扰差。上位机和电机共用一个电源时,电机启停造成的电压毛刺会通过复位引脚引入误复位,处理方式是在复位引脚到地之间加一个稳定的下拉电容,并且让复位线路远离电机驱动线路。这类电路小改动,写在讲义里只有一行字,但排查起来往往花掉一整天。
3.2 电机驱动:把H桥和FOC讲得足够通俗
底层驱动部分最容易吓跑新人,所以V0.2.1用了比较大的篇幅讲H桥和FOC,但尽量用比喻和示波器截图代替公式。
直流有刷电机的双向调速,本质上就是一个H桥:四个开关管组成类似H形的拓扑,通过对角导通让电流正向或反向流过电机,用PWM的占空比控制平均电压。无刷电机的驱动稍复杂,因为需要按转子位置依次切换六组换相状态,电流方向不断变化,这就是所谓"六步换向"。而FOC更进一步,它把三相电流做坐标变换,将定子磁场分解成直轴和交轴分量,用液体的涡轮类比,实时调整电压矢量让转子平滑旋转。
我建议队员把这个过程拆成三层理解:最底层是产生占空比可调的PWM波形;中间层是换相逻辑,要根据编码器或者反电动势判断转子位置,决定哪一相通电;最顶层是电流/速度闭环,根据传感器反馈实时修正输出。比赛常用的集成电调把二三两层都封装好了,主控只发送目标值,所以在教学阶段不用自己造轮子,但应该清楚每一层在做什么。
讲到电流检测时,我特意强调采样电阻和放大器的位置。真正的高端驱动里,电流检测是为了做电流环,而我们教学用的电调一般只提供电压指令模式,不需要自己采样电流。如果有人想自己焊一个电机驱动板,至少要在下桥臂串采样电阻,然后用差分放大器把毫伏级信号放大到ADC量程,这个知识在市面上很多教程里直接跳过了,结果是很多人自己画完板子电流环根本调不起来。
3.3 编码器与PID闭环:从手调参数到稳定跑直线
闭环控制是讲义里我最舍不得删去的内容,因为比赛里所有"跑得稳"的底层,本质上都是PID的功劳。
底盘电机通常用C620电调,电调自己能返回电机的实时转速,主控读取后和期望速度做差,送给PID控制器,计算出新的指令值。V0.2.1里把PID公式做了降维:比例项是对当前误差的即时反应,积分项用来消除长期累计的稳态误差,微分项则抵抗变化的趋势。我给队员的比喻是,比例P是方向盘,积分I是扶正累积偏移的微调,微分D是预判即将到来的弯道快速踩刹车。
实际调参顺序上,先把I和D清零,只留P,从小到大慢慢加,观察电机是否出现低频振荡;然后加少许D,振荡会变小;最后加一点I,让速度在带载时不掉。这个顺序我写在讲义里,并且配了同一组P参数下空载和带载时两条转速曲线的对比图,两张图一对照,队员很快就能理解为什么纯P控制在摩擦轮堵转时会往下掉速度。
编码器部分单独说一句:磁编码器和光电编码器的差异,以及多圈累计值溢出。RoboMaster常用的云台电机内置的编码器是磁编码器,角度范围0度到360度,如果要用它做连续多圈角度的累加,必须在代码里处理圈数计数,不然反转超过一圈之后角度值会发生跳变。这个坑在V0.2.1的调试记录里单独列出来了,因为我曾经在这上面卡了一个下午,电机明明转了很多圈,云台角度复位后突然像失控一样乱转,原因就是没有处理零点跳变。
4. 调试方法论:把讲义落到实车
4.1 上电前必须完成的检查清单
上电,是所有硬件操作里最激动人心也最容易翻车的一步。V0.2.1要求的步骤很简单:先不要插电池,用稳压电源设定到电池标称电压,加上限流。
具体流程这样走。第一,万用表量电池接口的极性,确认正负极和插头的定义一致,这一步能挡掉一半的烧板风险。第二,通路测试,在板子电源输入端量一下对地阻抗,正常情况下应该在几十欧以上,如果直接短路,先不要继续通电,回到焊接部分检查。第三,给稳压电源设置一个保守的限流值,比如底盘整机预期3A,首通就先限1A,然后观察电流缓慢上升还是瞬间顶到限流。如果瞬间顶到限流,立即关断,这表示板子上有焊接桥连或者极性错误。
首通成功之后,要做的不是急着启动电机,而是依次测量各个关键电压点:主控3.3V、外设5V、电调电源端电压。这步用万用表量一遍,同时记录数值,之后如果出现不稳定可以对比。很多灵异问题其实是首通时电压点就偏离了,但当时没记录,之后排查只能靠猜。
这套检查清单被我用醒目框体放在讲义V0.2.1最前面,后面所有章节都默认读者已经按照这个流程完成过至少一次上电操作。从实际效果看,执行了这套流程的队员,炸板率低很多。
4.2 示波器是硬件调试的眼睛
如果队伍预算允许,示波器应该排在购置清单的第一位。它的核心用途有两个:看电压是否干净,看PWM是否正常。
在排查电源纹波时,用示波器探头点在某路3.3V电源的测试点上,观察波形。正常情况是一条平直线,如果周围叠加了很多锯齿状纹波,尤其在电机启动的瞬间变大,说明电源去耦不足或者开关电源模块反馈环路增益不稳。解决办法也不是直接换电容,而是先把电机停转,再用金属外壳接触板子地线,确认纹波是否下降,这样可以判断是接地问题还是滤波问题。
排查PWM信号就更好理解了,用示波器的单次触发模式去抓引脚,如果看到频率和占空比跟代码里设置的不一致,多半是定时器分频和时钟配置错误。另外,互补PWM输出必须要看死区时间,死区为零意味着上下桥臂可能同时导通,瞬间直通大电流烧毁驱动。V0.2.1里专门放了一张死区时间设置的截图,提醒队员在调驱动板的时候,这个参数硬性不能省。
示波器还有一个使用频率很高的场景,是看CAN总线波形。CANH和CANL在空闲时是2.5V左右,发送数据时报文以差分电压形式出现。如果波形幅度不足或者末端有明显振铃,就要检查终端电阻和线缆屏蔽层是否可靠接地。这些测量能力不是看书能会的,必须上手,所以我每届带新队员都会安排一个下午专门做"示波器找不同"训练:事先设置三处隐性问题,让他们通过波形找出来,效果很直接。
4.3 总线通信:CAN和串口排错优先级
RoboMaster的底层通信里,最常见的两种就是CAN和串口。CAN用于点对点和广播方式的设备通信,比如主控到电调、云台板到视觉板;串口则多用于调试日志和GPS等外部设备。V0.2.1专门有一小节写总线排错顺序,因为代码问题往往藏在通信链路上。
碰到CAN通信异常,我的排查步骤永远是先物理、再配置、最后代码。先量终端电阻,按照CAN规范,总线上两端各需要120欧匹配电阻,并联阻值应该在60欧左右。如果测得60欧,说明两端终端OK。然后查看波特率,CAN总线上所有节点必须一样,1Mbps、500Kbps混用会出现间歇性成功偶尔失败的情况,这个现象很容易误导人。最后再看代码里的过滤器配置,CAN接收过滤器如果配置得太严格,合法报文也会被硬件过滤掉,这个属于新手高频踩坑。
串口排错相对简单,但有一个点经常被忽略:电平标准。板子上的USART一般是3.3V TTL电平,而USB转串口模块有的是5V电平,直接接上去可能长期工作也不出错,但在电应力上属于慢性伤害。如果是工业环境,还有隔离问题,不过在比赛车上是低速短距离传输,暂时不用考虑太复杂的光耦隔离。
通信数据格式方面,建议从一开始就统一为小端序,并定义好报文ID表。之前我看到有队伍因为云端包定义混乱,三个模块都在往ID0x200发不同的数据,排查了整整两天。这种管理成本只需要一个简单的头文件注释就能解决,但很多队伍没做,最后只能用调试器慢慢抓。
5. 实战问题记录:从炸板到稳定运行
5.1 芯片烧录失败,先别急着怪代码
主控板最常遇到的问题之一就是无法烧录。现象是点击下载后,软件提示连接不上目标芯片,或者连接超时。这时候大部分队员的第一反应是重新插拔USB线和检查boot引脚,但我的排查顺序不太一样。
先确认目标板供电指示灯是否正常。有些主控制板的调试口和电源来自同一个USB口,如果之前的电源电路保护了,USB口无法提供足够电流,芯片从一开始就不能枚举。然后检查复位引脚电平,STM32在复位状态下是不能被调试的,如果复位引脚被一个异常电路拉低,就会一直无法连接。最后才是软件设置,查看调试器的时钟频率和接口类型是否匹配,比如SWD接口只接了SWDIO和SWCLK,需要在软件里关闭复位引脚的占用。
如果以上都检查了还是烧不进,就要怀疑芯片本身是否已经损坏。我有一个习惯:准备一片同款芯片和一个热风枪,遇到烧录失败超过半小时就换新芯片测试,而不是一直怀疑自己的代码和接线。因为大部分所谓"顽固烧录失败",最终都被证明是芯片的BOOT0引脚状态不对,或者内部固件损坏,后者换芯片最快。
5.2 电机发抖、转速抖动,大概率不是电机问题
电机异常抖动这个故障,在答疑记录里被翻牌的次数排第一。电气表象是转速不稳,声音忽高忽低,而且伴随轻微的振动声。很多队员第一反应是PID参数没调好,于是疯狂改P和D,结果浪费几个小时还是抖。
V0.2.1里给了一个判断树,用来区分故障来源。其一,如果是上电后原地就抖,且不随目标转速变化而改变,先查电调的供电电压是否充足。我曾经遇到过电池电压剩7.2V,空载正常,一旦电机带载立即掉压抖动,最后发现是电池内阻变大,电调欠压保护频繁触发。其二,如果抖动只在一个特定转速区间出现,大概率是机械共振或电机端盖螺丝松动,从声音特征和固定方式排查,而不是改代码。其三,如果抖动随P增益升高而越来越明显,才真正属于控制环参数问题,回到PID调参步骤。
很多人容易忽略的是编码器插头的接触不良。底盘电机编码器线一般经过关节处,如果公母头没有加锁扣,机器人运行振动时接触电阻会波动,导致读回的转速出现毛刺,PID看到毛刺后的响应就是抖动。这种情况在示波器上看电调返回的报文数据能看到明显的跳变点,从通信报文字段异常入手,比直接改参数更有效。
5.3 视觉帧率和主控性能的平衡
随着硬件基础扎实,队伍开始把精力转到视觉,这时候会冒出一类新问题:主控跑视觉之后,底盘控制变得卡顿,通信延迟变大。本质上是单个MCU的资源竞争。
主线任务需要频繁处理图像数据,又需要实时更新电机PID和裁判系统通信,一旦CPU占用过高,控制周期就被拉长,底盘响应自然变肉。解法有两种:一种是改为双主控架构,视觉计算由高性能协处理器承担,主控只负责底盘实时控制,相互之间通过CAN或者串口传递目标信息;另一种是优化软件结构,把视觉计算放到中断外部专用任务,控制循环放在高优先级实时任务中,并用消息队列传递数据。
从讲义修订的角度,V0.2.1把双板通信的架构图放在了拓展阅读章节,因为这一阶段很多队伍已经具备硬件基础和基本的通信能力,可以开始计划系统升级。双板架构里最难的其实是时钟同步和时间戳对齐,仲裁摄像头和底盘数据时,如果两边的时间基准不同,视觉预测到的目标位置会有系统误差。这是一个进阶话题,讲义里没有深入展开,但指出了研究方向,留给有需求的队员自己去挖。
6. V0.2.1的取舍与下一个版本
6.1 这一版删掉的内容和原因
版本管理不只是加内容,删内容同样重要。V0.1版本里我放了很多芯片数据手册的摘抄,包括定时器每一个寄存器的位定义,几乎读起来像芯片参考手册。后来发现新队员根本不需要在第一周看这么多,他们更需要的是"这个端子接哪、怎么初始化定时器、怎么输出PWM"这类结果导向的说明。
所以V0.2.1删掉了两大部分:一部分是完整的STM32寄存器手册式描述,改成"常用外设功能速查表";另一部分是超级电容和弹道解算相关内容,它们属于高级专题,放在基础讲义里只会让新人感到恐惧和跑题。保持基础讲义的基础性,这个原则我一直紧绷着,否则版本号往下走会失控成一个什么都讲但什么都不透的杂物间。
同时,V0.2.1把一些实验步骤改成了带预期结果的对照表。比如"给电机发送1000RPM指令,实际转速波动应该在±20RPM以内",如果测试结果超差,说明链路有问题,按表格排查。这类量化的内容,比单纯写"检查是否正常"更有用。
6.2 接下来准备加入的内容
目前正在计划V0.3版本,初步考虑加入两个方向。
第一个方向是更多关于电路设计入门的内容。很多队员学完硬件基础之后,不满足于拿现成板子连线,想自己画一套降载板或者传感器转接板。讲义里会补充原理图阅读方法、PCB布局基本原则、常见低压电路的注意事项。这部分的重点是避免选手一开始就画四层高速板,而是从两层板的小模块做起。
第二个方向是调试工具箱的整理,包括文档模板、调试日志格式、常用命令脚本。我在实际带队伍过程中发现,硬件调试最容易失序的是缺少统一的日志规范。如果把"上电时间、电压、电流、故障现象、已经尝试的方法"记录下来,很多反复出现的间歇性故障可以被更快定位。把这份经验变成讲义的一章,是我下一步的主要任务。
写讲义这件事情,本质上是在替未来的队员提前踩一遍坑。每一版迭代,都是队伍真实的比赛经验换来的。对我来说,V0.2.1不是终点,而是一个新的起始版本,以后还会有V0.3、V0.4,只希望能让每一位翻开它的新人少一点懵、少一点炸管,多一点自己动手解决问题的底气。