back

电赛失败指南

如何霍霍完你的电赛 (自动控制方向)

2025-11-15

luisleee, 澄净闪耀φωφ


排名区分先后,这些作者对本文做出了不同的贡献

(免责声明:本文不构成诊疗法律投资建议)

本文附赠精美的示例代码。


前言:为什么我要写这个?

因为我霍霍完了我的电赛。

这是一份 2025 年电赛的赛后复盘,也是一份“如何完美避开正确答案”的指南。本文将带你沉浸式地体验 2025 年电赛。


前期准备:比赛前一周开始就行

赛题预测:心大胆细

你一旦看到了材料清单,那就要立马进行一个稳准狠的赛题预测。

附上本次的材料清单:

仪器设备清单

主要元器件及器材清单

我们来看看有哪些元件和自动控制赛题有关:

这时候你可能会意识到,自动控制赛题是以激光笔为中心展开的,毕竟去年就是这样的。事实也证明我们没有错。

然后你就得押宝。你想想,给的器件有这么多可能性,我们怎么可能一周里准备面面俱到呢?所以只能押宝在一个方向上面。 且看我们缜密的分析:

然后就可以开始采购了,买什么呢?

买元器件:俭以养德

要知道,电赛前各种电子元器件的价格都会暴涨,到了竞赛中有的器件更是千金难求。 学校的经费来之不易,所以一定能省则省,一定要精挑细选便宜的,能买一个就不要买两个。

拿二维云台来说,自己用舵机拼装的就要比现成的要好。 选择舵机的时候你要相信 PWM 舵机比死贵的总线舵机和磁编码器舵机好。你要相信它的精度,要相信硬件上的差距是可以通过精妙的控制算法弥补的。 你要相信很多东西是可以灵活组合使用的。 你要相信两个 180 度的舵机可以通过一些小技巧当作 360 度舵机用。

选 MCU 的时候,你不要相信那些所谓的可扩展性,它只是多卖你钱的噱头。 最小系统板就是足够的,所谓的扩展板并不能给你的作品什么质的飞跃。 德州仪器这种东西不太需要,毕竟我们有 STM32,往年的赛题没有在控制类加德州的。 可惜有如鬼使神差一般,我们下单了一个 MSPM0G3507。

还要发挥你的人脉关系,尽量少买。我们的小车是向同学借来的,而原来小车是从拼多多上十几块钱买来的,主要构成是一块亚克力板和两个轮子和电机。

不在清单上的东西就不要考虑了:比如电池和转接线,这些东西非常不重要,困难都是可以克服的。

总而言之言而总之,一切都要精打细算,毕竟钱是从纳税人手里掏出来的。

知识储备:理论优先

事实上,本队队长所有自动控制相关知识是比赛前一天现学的。STM32 的外围硬件驱动代码是赛前晚上熬到4点写出来的。 PID 控制调参是从来没有上手过的,仅限颅内计算。这就要发挥出极高的理论水平了。 这也和团队之间的信任和羁绊有关,你要相信硬件的功能是足够强大的,有相当高的控制精度,只需要一些非常简单的控制算法就可以达成预期的控制效果。

很热血的是,本队另外两位队员也从来没有上手做过。


开发过程:千早爱音干的

赛况概览

第一天

早上端着一脚盆元器件来到实验室,到点一看自动控制的赛题E:

要求小车沿黑色方框循迹,并且激光瞄准一个靶子。

基本要求:

发挥部分: 边转圈边打靶,越准越好

硬性要求:小车控制使用德州仪器 MSPM0 系列 MCU

要不做 C 题吧。

看一眼:单目视觉测距。看看池水,看看 OpenMV 和 K230, 要不算了。

于是我们接受了这一事实。

赛题要义有三:

细数手头到货的器材,一看:

至少我们还有:

那么理论上,我们应该兵分三路开始了。一人研究 MSP 驱动电机,一人研究 STM32 驱动云台瞄准,一人研究 openmv 识别标靶。

但是事实上,STM32 的舵机驱动代码已经写好了,但是苦于没有目标识别,不能进行控制,只能先等 openmv 视觉代码完成。而德州仪器那边一个上午都没有什么名堂。上午主要进行了一些实验性的连线,并且确认 STM32 和 openmv 之间可以进行串口通信。

差点忘掉吃饭,下午回来之后,德州也没有进展。用 Keil 5 这个老掉渣工具编写的企图破产了,找到德州力推的 CCStudio 之后一下子代码就能跑了。CCStudio 一眼就是一个基于 VSCode 修改的 IDE,但是问题就在它是一个 IDE 而不是一个编辑器。它有着极其糟糕的用户体验,并且图形化配置 GPIO 引脚的 sysconfig 是导致代码难以复现的一个重要问题。我们通过直接拷贝引脚配置的纯文本解决了这个问题。在从网上找到了一个 L298N 的 PWM 驱动代码之后,发现小车轮子一动不动。

检查一番电路连接、引脚映射、代码配置,发现只要锁住一个轮子,另一个轮子就能微弱运动。用上物理调试器(也就是万用表)一看,就发现不对劲。输出电压不对。 理论上 L298N 应该接 12V 电压,而小车原主给接了 6V 电压,令人忍俊不禁。拧着拧着减压模块的电位器,小车开始动了,拧到 10V 多之后又不动了。拧回 9V 又正常了。至此,我们可以正大光明堂而皇之地嘲笑小车原主了。

排查到问题就很好了,这时我们就可以重新把线全接好了。用剥线钳把线头剥开一段,折起来压进端子,使劲拧紧螺丝~我他妈把正负极接反了。把螺丝拧开费了大力气。以 L298N 的电容为中心,散发出一股焦香。也许还有救,我反着接回来:以 L298N 的 T 桥为中心,散发出一股焦香,心暖暖的,摸上去的手也暖暖的。我们这时还不可以相信它烧坏了,所以等它冷了之后又试了试,通电后依然烫人。尝试找一个电容替换烧坏的电容,翻开实验室的器材柜标着 220µF 的格子。里面空空如也。

以后我都会先试触再接线了。

一切能做的都做完了。该没到货的都没有到货,该烧坏的都烧坏了,该有问题的还有问题。所以今夜不必通宵,遂回去睡觉。

第二天

早上有一个人的闹铃响了,但是没起来。但是问题不大,因为没啥新东西到了。大部分东西到货还是第三天呢。 到货的寥寥无几,只有一个无 MCU 的八路灰度传感器——据说是厂家(感为科技)听说风向不对才现设计的,和另一个 DC->DC 模块。

早上起来,视觉模块依然识别不到靶子,会识别到一些神秘的、不知从何而来的长方形。我仍然没有想好怎么固定巨他妈大的激光发射器。云台架上 openmv 还是超高。到货的只有几个快捷接线端子。

于是做什么呢?做所有模块的供电吧。这个供电从 12V 的电池出发,通过一转三的接线端子接到两个 DC->DC 降压模块上,再用接线端子分出多条线到对应模块上。一个降到 5V,驱动 MCU;另一个降到 9V ,驱动舵机。非常好走线,使我的电路旋转。

另一件是调试灰度传感器,虽然小车两肢僵劲不能动。这个传感器用一个多路复用器,传回对应通道的灰度模拟值。感为科技还附带了精美的示例程序,平均两个函数名就会有一个拼写错误。我相信他们是临时赶工出的了。很遗憾的是该程序不能运行(事实上后来我们发现问题在于我们在 sysconfig 的界面上没能完全复刻引脚配置)。这很重要,因为这事关感为科技的妈的存活性。通过不懈的 vibe coding 魔术,模数转换器和多路复用器的相关代码呈现出了极其丰富的一族错误。最终通过直接读德州驱动库的相关头文件解决了。在读出每个通道的数值之后,我们选中了一个精妙的黑白阈值,于是我们便无事可做了。

视觉模块的目标识别仍然抽象。把 openmv 和 STM32 的串口对着连接在一起吧,TX 对 RX,RX 对 TX。openmv 上做好对倾角的计算,直接传到 STM32 上,让舵机执行。于是舵机开始磕头,大开大阖,前仰后合。一定是仰角算错了。改一改,收敛了吗?依然磕头。

顺带一提,这天是差点忘记了晚饭。该做的都做了,该没到货的都没有到货(包括烧坏新买的 L298N)。所以今夜不必通宵,遂回去睡觉。

万一第四天还是到不了货呢?于是我们决定让澄净闪耀φωφ去中关村买点东西,同时又在本部花了三百块钱买一个 360 度舵机。

第三天

这是一个奇迹般的早晨。池水拿着他奇迹般的视觉模块来了。这个版本有着奇迹般的识别准确度,还能给出中心的位置和偏差的仰角。至于左右旋转角,我们是没有考虑的。虽然可以实现,但是一个 270 度舵机对此没有任何帮助。既在战略上要放弃,又在战术上没法做。

既然视觉模块如此可靠,云台控制和串口通信又早就写好了,那么别调试瞄准控制了。先虚空调试循迹转向控制吧。搞了一份混合 PID 和状态机控制的循线控制代码,每五秒为间隔采样,输出两个轮子的转速,手工模拟。结果上来就发现怎么怎么八路传感器全他妈是黑的?细细看来,黑白灰还是分明的,但是阈值好像写错了。我承认我们昨天确实疏忽了。改了阈值,手工的模拟完美贴合理论,爸爸我很欣慰。遂一高兴加了个滑动平均防抖,又叫做时域卷积。

结果电机驱动板到货了,接上线一看:此车在直线上运行平稳,可突然一点后就猛然向右一倾,一去不返。我很疑惑。看上去是右边的车轮在拼命反动。于是乎我怀疑电机装反了,这又是昨天的疏忽。事实证明不是,反接后小车直行不能。问题的正确答案稍后揭晓。

顺带一提,目前的接线完全是乱的,调试时是边捧着电脑边跟着车动的。

这是一个奇迹般的中午,澄净闪耀φωφ奇迹般带回了:

360 舵机来了就得优先研究下了:牌子叫做 Fashion Star,装在两只磨砂的塑料小盒子里。打开盒子,里面是两个精致的长方块,闪着绿色的金属光泽。放在手里沉甸甸的。此舵机和旧的 LD-3015 舵机相比,一看就是一顶一的尖货。但这是从学长手里花 300 现大洋买下来的,不能报销。仔细看看,它有三个接口,标着“+-S”,有一排线连接。我们自然没有这种接口,只能剥线钳剪断了线连接。熟悉舵机的朋友一眼就知道,这是一个 PWM 舵机,于是旧的舵机代码直接复用即可。花大力气把云台上的旧舵机卸下来,再费大力气安上这个,一切都变得赏心悦目起来了——除了不能跑——这也是另一种艺术的表现。

这他妈就不是 PWM 舵机,是一个用串口通信的舵机。于是乎照着文档翻串口数据格式,老老实实写封装,最后意识到:这他妈是个双工的东西。我们写的串口是全双工的,而它的这个接口显然是半双工的。看了看官网,人家还有一个转接板单独出售。我们不认为我们的三脚猫功夫能把这个写出来,遂放弃。唯一值得赞赏的是,这家的文档写得真好。

于是乎,去做点别的吧。先用新到的开关把供电搞好吧。这个供电的走线是这样的:两个 DCDC 模块用胶粘在电池两侧,开关粘在电池上侧。剩下的线乱连到 MCU 上,杜邦线连接,用塑料扎带捆住。配上 DCDC 模块上的数码电压显示,它好像一个爆炸头定时炸弹。不过它至少能勉强放在车上了,用蓝丁胶粘在车上。

回到循迹的测试,下面揭晓正确答案:白色的亮度值太大,导致滑动平均之后所有全变白,进入丢线状态:即保持刚才的转速状态(也就是右倾)不变。改掉之后,发现控制的参数略出了问题,先从简单保守的比例控制开始,再逐渐加上微分和积分的误差控制。非常好的一种实践……我操,怎么刷不进去程序了。之前都是板子进入了低耗电模式导致刷不进去,重启一下就好了。结果连续重启几次也不行。这时候一摸德州,烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫!

赶紧拔线。检查接线,看起来没有地方短路了。重新接上,烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫。德州死了,因此一切都许可了。

现在的工作是把一切线摧毁,然后再重建。去睡个觉吧。

回来了,仍然一筹莫展。但是我们其实有另一个德州仪器:一位好心的宋老师发的板子,我们本来打算匿下来留到明年高价抛售的。我感到悲伤和空虚。 这个排针没有焊,我们自己焊一下,唯手熟尔(物理)。

全完了,至少从意志上。所以今夜不必通宵,遂回去睡觉。

第四天

美美睡了一觉。人无压力一身轻。至少把第一问和第三问做了吧,所以调调舵机和目标识别。 另一款 360 度舵机到货了,PWM驱动,很易用。不过问题是:转盘接不到云台上。它看上去就是一个粗制滥造的塑料方块,唯有接口尺寸庞大而坚硬。 再仔细看看,加上这个舵机后云台超高了。

至少把第一问做了吧。把 openmv 和 STM32 的串口再对着连接在一起吧,TX 对 RX,RX 对 TX。磕头终于收敛了,它完全不动了。后来发现是没给舵机上电压。改下接线,它间或抽搐两三下。我开始磕头了,俯仰生姿,前倨后恭。

至少把第二问做了吧。看看我们灾后重建的小车。它又能跑了,但是绝不转向。这是为什么呢?因为它认为这八路位置都是白的。细细看来,黑白灰还是分明的,但是阈值好像写错了。我承认我们昨天确实疏忽了。我改了改阈值,于是就去吃饭了。吃完饭回来,它又不拐弯了。细细看来,黑白灰还是分明的,但是阈值好像写错了。我承认我们上午确实疏忽了。我们为什么会在同一个地方疏忽三次呢?答案是室内光线条件变了三次。于是我打算写一个自适应的阈值,减去平均值,除以标准差……但这不对。黑白的灰度值差别太大了。两路是黑色和只有一路是黑色时的结果完全是不一样的。

至少吧第一问做了吧。一切闭环控制都是多余的,开环控制也是多余的,只有固定的仰角才是正解——毕竟靶子的高度和小车的位置是自己决定的……

晚上八点,封箱,贴封条。

不用通宵,遂回去吃炸鸡,花了一百多,比舵机贵。

硬件总结:德克萨斯烧烤味

前文并没有一一记述所有的毁灭。

总计烧毁三个激光器,一个 MSPM0G3507,一个STM32F1C8T0,两个 L298N。

对于德州的毁灭,我们事后有如下的分析:

软件总结:一定是硬件的问题

其实三个部分的硬件都从来没有同时正常运行过。

视觉:一定是 openmv 的问题

视觉模块在第三天之前从来都不能正确识别到标靶。我们把它归结为 openmv 硬件本身的问题。直到第三天重写了识别算法。

瞄准控制:一定是视觉的问题

视觉模块挂了的情况下,瞄准控制自然是无从下手。但是第三天一开始下手,就会发现我们完全就没有上手。

当你发现手头没有一个能用的 360 度舵机的时候,就知道……

循迹控制:一定是千早爱音的问题

最开始买的八路灰度传感器是感为科技带 MCU 的版本,看到赛题之后才下单买的新的无 MCU 的传感器,在第三天才到货。

但此传感器有一些独到的特性,毕竟传感器本身就是厂商现设计的。第二天,在 TI 板子上写好了灰度传感器的黑白阈值。 第三天上午,莫名出错,修正。下午,再次出错,修正。

紧张刺激的测评环节

排大队两天。 测评最后一天的中午饭后,穿过弯弯绕绕的走廊,回到几天前我们曾经并肩战斗过的地方。

取回作品的箱子,搬到测评的教室,接受评委检查。评委看上去都在吃饭,让我们等一会。我们划开封条拿出小车。但是理论上我封箱的时候忘记关电源了,导致它没电了。实际上我之前没有跟任何人说过,我没有用开关控制 DCDC 模块,它们是常开的;最后一天也没给它充电。我们不能就此打道回府,我眼尖在旁边发现了一个和电池充电口接口一模一样的充电器,向评委请求让我们先充一会电。

本来汗已经冒了一后背了,又落下来了。

电充好了,汗又下来了。志愿者给了我们一个固定高度的靶子。我打开激光一看,坏了,和我预设的角度对不上。于是我们要求用自己的靶子,用一摞书垫高。通过对标靶高度精准的反馈控制,我们实现了精确的瞄准。

电赛生活:我一直在哭,我一直在哭

没怎么好好睡过觉。乱七八糟的饮食。

沉没成本陷阱

我们为啥没他妈退赛呢?不退赛就不能好好专心做一题吗?

团队合作:同一时间三个人至多应该有 1.14 个人在干活

你也许会怀疑这个团队有三个人但是本文却为什么一直在以第一人称视角论述,似乎无所不能呢?实际上这是一种叙述技巧,把三个人的经历缝合在了一个人身上。骗你的。实际的原因如本小节的标题。


总结

准备电赛,一定要从一个月前开始,一周前根据器材单调整方案。世人若学我,如同进魔道。

千早爱音

后记

如果您实在无法辨别文中的抽象行为,请联系作者或专业人士。

——谨以此文献给池水

back