ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

大一电赛备赛全攻略:从零到稳跑小车的心得

大一电赛备赛全攻略:从零到稳跑小车的心得 凌晨三点实验室的灯还亮着我们三个人围着一辆巴掌大的小车它正在地上原地画圈。电机在转轮子在动车不走直线甚至不走弧线就是轴心旋转。那是2024年电赛四天三夜里的第三天题目是自动行驶小车而我们的大一暑假在这一刻显得格外漫长。后来问题找到了不是算法逻辑写错而是左侧驱动模块的一根信号线松了导致PID拿到的编码器数据只有一半。这个坑我们花了将近两个小时才挖出来但在那之前它差点让我们把整套控制参数推翻重调。这篇心得就是写给那些和我一样大一就跃跃欲试想参加电赛的人。我不会讲太多高深理论只讲一个真实的大一队伍是怎么从零开始备赛、怎么熬过四天三夜、又怎么在测评间里尽量多拿分的。如果你也在纠结“大一到底能不能打电赛”“要不要等到大二再上”那这篇文章应该能给你一个参考答案。1. 大一上场我在报名前先想清楚的三件事1.1 先承认大一确实有短板但短板不致命报名之前我心里其实特别虚。模电只学了半本C语言刚会写指针单片机只在开发板上点过灯。再看看历年真题自动行驶小车、送药小车、纸张测量、风力摆这些题目听上去就需要嵌入式、电路设计、控制算法三座大山同时压过来。我当时的想法是这哪是大一能碰的东西但后来我翻了不少往届优秀作品报告发现一个规律很多拿奖队伍的核心成员真正入行的时间并不长。大一和大二的区别主要不是你多学了多少门课而是你有没有完整地做过一个东西。电赛本质上是一场“以赛代学”的极限训练它不是等你全学会了再上场而是逼你在短时间内围绕一个具体目标去补所有缺的东西。我身边甚至有队伍大一暑假就拿省二的他们的共同点不是天赋异禀而是“敢报名并且提前三个月就开始动手”。所以如果你现在大一觉得基础知识不够这很正常。关键是别把“基础不够”当成不报名的理由而应该把它当成你去补课的最强动力。电赛准备期那三个月里学到的东西可能比一个学期课堂上记住的还多。1.2 组队三个人各管一块而不是三个人都会同一件事电赛规则是三人一队组队的思路直接决定了后续干活效率。很多大一队伍最容易犯的错是三个人都觉得自己什么都会一点结果拿到题目之后大家抢着写代码没人管硬件最后交作品前一天才临时焊板子。我们当时的分工比较土但很有效一个人主攻软件和控制算法一个人主攻硬件电路和传感器选型一个人主攻文档、测试和整体进度管理。这个“软/硬/文”分工本质上对应了电赛评分的基本盘作品功能靠软件硬件配合设计报告靠文档人员整理测评答辩靠对系统全貌最清楚的那个人来主导。分工不是说另外两块就完全不懂而是每个人要有自己的“责任田”遇到问题先由责任人拿方案再集体讨论。另外组队时最好先小人后君子。提前说清楚谁负责最终决策、谁兜底、意见冲突时怎么处理。比赛到了第三天大家睡眠不足、压力爆表如果那时候才开始讨论“到底该听谁的”队伍基本就散了。我们队当时立了一个很简单的规矩功能取舍上软件听硬件硬件听队长队长听测试数据。谁有数据谁说话没数据就少废话。1.3 心态定位目标不是拿国奖是完整走完一次四天三夜这一点我认为是大一队伍最需要提前建立的认知。第一次参赛把目标定成“拿国奖”“进综合测评”很容易在比赛第二天就崩盘——因为一旦发现作品离题目要求差得很远心理落差会直接杀死所有动力。我们当时定的目标很简单完整走完四天三夜做出一个能在赛道上跑完一个来回的小车交上一本像样的设计报告测评的时候不要一句话都答不上来。至于奖项那是副产品。事实证明这个心态让整个比赛过程中我们几乎没有什么内耗。哪怕某个模块翻车了我们的第一反应也是“还剩多少时间、怎么补救”而不是“完了这次没戏了”。还有一个很现实的点大一最大的资本是试错成本低。你就算比赛结果不理想后面还有大二大三经验已经攒下了。所以我真心建议大一看重的不是那张奖状而是完整地把电赛流程走一遍选题、查资料、画框图、焊板子、写代码、调参、写报告、答辩。这个过程比任何一门课都更像“真正的工程师做事方式”。2. 备赛三个月我在时间表上排了这些内容2.1 第一优先级把单片机跑起来而不是把理论学完如果你问一个刚打完电赛的大一学生备赛阶段最后悔的是什么大概率不是学得太少而是动手太晚。我们队当时也差点陷入“先把课本啃完再实践”的误区后来是一个学长点醒了我电赛不需要你证明自己理论厉害需要你拿作品说话所以一切学习都要围绕“让东西跑起来”展开。我们的入门路线非常朴素一支STM32F103C8T6核心板就够。为什么选这板子而不是Arduino理由有三点第一STM32的资料已经多到溢出来遇到问题几乎都能搜到解决方案第二它的定时器、编码器接口、ADC、串口、PWM输出对于小车类题目来说完全够用而且驱动能力比Arduino强第三电赛评审对STM32方案很熟悉这意味着你的设计在评委眼里是“标准路线”不容易被质疑。不是说Arduino不能做但测评时如果被问到“你怎么保证实时性”用Arduino回答起来会吃力不少。学习路径我给后来的人列一个可以直接抄的清单第一周GPIO点灯读按键掌握开发环境编译下载流程第二周定时器中断PWM输出控制电机转速第三周编码器读取串口打印把这些数据实时显示在电脑上第四周增量式PID闭环控制让电机转速稳在一个目标值如果每天能稳定投入一到两个小时这条路大概四周可以走通。走通之后再回头看电赛真题你会发现至少题目里“运动控制”这个板块你已经不是零基础了。2.2 硬件清单提前备齐别在现场等快递大一新生最容易忽略的就是硬件物料准备。备赛时觉得什么都有一到比赛前两天才发现还缺一块稳压模块网上买来不及学校周边电子市场又未必有合适型号只能干着急。我们的经验是凡是比赛要用到的核心器件准备两到三份凡是便宜且容易烧坏的器件按损坏概率加倍备。这里给一份小车类题目常用的物料清单我们队当时就是按这个框架采购的类别具体器件数量备注主控STM32F103C8T6核心板2块即使用不上也要备着电机驱动TB6612模块买2L298N模块买1备用3个TB6612效率高发热小L298N底噪大但皮实动力带编码器的直流减速电机带轮子套装2套编码器是PID闭环的“眼睛”不能省姿态感知MPU6050陀螺仪模块2个判断朝向、转弯角度赛道感知灰度传感器阵列/OpenMV摄像头按方案定循迹和识别标识用电源12V锂电池组降压模块若干2组电机和主控分开供电最稳工具万用表、电烙铁、稳压电源、杜邦线、扎带1套缺啥现场借都费劲这里我想单独说一下电源部分这是大一队伍最不重视、后期最容易翻车的地方。电机启动瞬间电流可能到2安培以上如果主控和电机共用一组降压电压跌落会造成单片机直接复位表现就是小车一加速就重启。我们的解决办法很快主控板单独用一个5V稳压芯片供电电机驱动单独吃电池电源模拟地和数字地单点连接。这个“电源分区”的思路越早建立越好后面调其他模块时能省掉大量排查时间。2.3 模块化验证先让小车“动起来”再做感知与控制备赛时最容易走的一条弯路是一开始就想把整个系统闭环搭好结果某个环节卡住就全盘卡死。正确的做法是拆成一个个小模块分别验证最后再集成。我们的模块化验证顺序是这样的第一步纯开环让小车跑起来。什么传感器都不接直接给固定占空比的PWM让车跑直线。如果这都跑不直先查轮胎气压、轴距、电机安装位置这些机械问题不解决后面加什么控制算法都白搭。第二步让编码器数据“可视化”。把左右轮转速实时打印到串口用手转动轮子观察数值是否合理。这一步能发现很多隐藏问题编码器信号线接反、A/B相接错、减速比设置不对全都能在这时暴露出来。第三步上PID闭环。先用增量式PID把单个电机的转速稳在目标值再扩展到双轮差速转向。调PID的时候有一个很实用的口诀先调比例P让系统不振荡再加积分I消除稳态误差最后加微分D抑制超调。我们第一次调PID时走了不少弯路后来发现最简单可靠的起步参数是把I和D先设成0只用一个P慢慢加大直到电机出现轻微振荡再把I加进去最后微调D。第四步才接入传感器让小车具备“感知-决策”闭环。你看历年题目的共同套路就会发现无论是送药小车还是自动行驶小车本质上都是“感知运动控制任务逻辑”三个模块的组合。模块化验证的意义在于任何一步出问题你都知道问题在哪一块而不是面对一个完全黑盒的失控小车干瞪眼。3. 四天三夜的现场我靠这套节奏没有被拖垮3.1 拿到题的第一天读题和拆解比动手更重要电赛从拿到题目到封箱一般是四天三夜。很多人第一天就开始闷头焊板子写代码但我的经验是第一天上午最重要的事情是读完题把任务拆成可执行的模块清单。以2024年电赛H题自动行驶小车为例不管具体参数怎么变一个典型的任务池大概长这样核心功能小车能沿地面标识线自动从起点行驶到终点过程中不压线、不偏出赛道次核心功能在指定位置停车识别数字或标识牌并作出反馈加分功能能绕开障碍物、能语音播报、能通过手机App查看状态拿到题目后我们三个人坐在一起拿白板把所有能想出来的功能全列出来然后按“必须做/应该做/可以做”分三档。当天晚上之前确认一个原则先保核心功能核心功能稳定运行之后谁有时间谁去碰加分项。这套“需求分级法”听起来简单但很多队之所以最后什么都差点意思就是因为没有分级每块都想做结果每块都不够稳。第一天最好还能把系统框图和数据流画出来哪个传感器接哪个引脚数据往哪送决策在哪里做控制命令下给谁。这张图不需要多专业关键是让三个人对“东西是怎么跑起来的”有一个共同理解。后面两天哪怕代码写飞了对着框图也能快速定位问题出在哪个环节。3.2 第二天到第三天主功能优先侥幸功能全砍比赛进行到第二天下午最容易出现的情况是核心功能还不是很稳但某个人突然冒出一个新点子——“我们要不顺便加个蓝牙遥控吧”。听我的这种时候一定要有人出来当恶人把“顺便加功能”的需求毙掉。我们当时也犯过一次类似的冲动。第二天下午小车循迹还时不时冲出赛道队友却花了大半天去调一个显示当前速度的OLED屏幕理由是“这样测评时看起来高级”。结果等到晚上联调时发现显示屏走的是I2C和灰度传感器抢总线导致传感器数据偶尔卡顿反而把核心功能影响了。最后只能把显示屏的代码注释掉那块屏幕到封箱都没再亮过。这里我想分享一个特别有用的“砍需求标准”任何不能在两个小时内完成、且不影响核心功能判断的新点子一律先记到纸上不做。核心功能如果有问题先修核心功能核心功能已经稳定再考虑要不要做加分项。比赛时间不是均匀分配的越到后面改动带来的风险越大一个愚蠢的“锦上添花”完全可能毁掉已经稳定的主流程。第三天晚上的状态冻结非常重要。一旦小车成功跑完了第一次完整的任务流程立刻做三件事第一把源代码整个复制一份放到U盘里备份第二用手机拍下当前所有接线照片和PID参数第三在纸上写下“当前最优参数表”。这个操作可以确保后面哪怕把代码调崩了也能随时回到这个稳定状态。我们队当时正是靠着这组备份在最后一天上午改坏了几版参数后又成功回滚到了那个能跑的状态。3.3 最后一天不折腾新功能只做整机联调电赛最后一天上午物理意义上的“最后一天”会很折磨人。封箱时间通常在晚上之前你从早上起来会觉得自己还有十多个小时可以做很多事但实际上最后这段时间最正确的用途只有一个整机反复跑流程把成功率拉高。“整机联调”和我们前面说的“模块化验证”是相对的。模块化验证是每个模块单独测整机联调是把所有模块接在一起连续跑完整流程。为什么需要这个步骤因为很多问题只在系统集成时才会暴露传感器互相干扰、电源负载变化导致电压跌落、逻辑代码在连续运行N次后出现状态错乱这些统统不是单独模块能发现的。联调时我强烈建议每次测试都做记录。方法很简单拿一张纸左边写时间右边写这条记录。例如“14:30 满电跑全程成功耗时21秒”“15:10 电池剩余75%中途偏出赛道疑似路肩检测失败”“15:45 复位后重跑成功但起点倒退时压线”。这些记录看起来粗糙用处很大它能帮你判断系统的成功率到底有多少是不是稳定复现以及故障是不是和电量、环境光线、按钮操作顺序有关。封箱前一个小时尽量不要再改代码和电路了。我们已经见过太多队在最后半小时把一套本来能跑的系统改崩了然后哭着装进箱子。正确的做法是封箱前只做“无风险操作”——充满电、检查接线有没有松动、确认所有开关都处于正确位置、把报告打印好。把一份稳定运行的代码原封不动装进箱子里比带着一个“理论上应该更强但没测过”的新版本从容得多。4. 那些让小车“原地转圈”的坑排查链路比结果更重要4.1 一上负载就“假死”驱动模块供电不足我在开头提到的那个原地转圈的夜晚其实只是我们踩的一连串坑之一。更早的时候小车甚至根本不动。接上电池按启动键主控板指示灯闪一下然后整机就像被抽走灵魂一样没反应。拔掉电源重插又好了一按启动又没。后来我们拿万用表调到电压档量电机驱动模块电源输入和输出的电压差发现启动瞬间输入电压从12V掉到7V左右。再量电池本身空载12.4V接上负载瞬间掉到8.9V。问题一下就清楚了电池内阻太大加上驱动模块和主控共用一根细长的杜邦线启动瞬间大电流在线上产生压降电压低于主控的最低工作电压于是单片机直接复位。这个问题的修复方案有三步换一块内阻更小的大容量锂电池把电机电源线和主控电源线完全分开各自独立走线电源线尽量短、尽量粗不要用又细又长的杜邦线给动力供电。处理完之后再上电电机猛地一冲的瞬间主控依然稳稳的。从那以后我们队就立了一个规矩凡是动力相关的电源走线一律用粗短线所有信号和电源分开布置。4.2 PID怎么调都摆不直先查编码器数据再调算法另一个让人崩溃的坑是PID参数怎么调都调不好。小车不是往左偏就是往右偏或者一个轮子猛转另一个轮子不动场面非常滑稽。我们一开始以为是PID参数没调好把P从1加到50从50减到0.5折腾了两个多小时一点改善都没有。还是队友冷静下来说“先别调参了看看编码器数据到底准不准”。我们用串口把左右轮转速打到电脑上手动把两个轮子抬起来用手指匀速转动。结果发现右侧轮子每转一圈编码器读数大概是左侧轮子的两倍而且数字跳动非常大。这个现象说明了什么要么减速比不一样要么编码器安装有问题要么信号被干扰。经过排查发现是电机驱动模块输出的PWM信号线绑在了编码器信号线旁边PWM频率比较高的时候就会在编码器信号线上感应出脉冲干扰导致单片机误判转速。我们把信号线拨开重新走线用胶枪固定再用屏蔽线分别传送数据立刻稳定下来。之后PID参数沿用之前调过的那个“凑合版本”效果都好了不少。这条经验我后来逢人就说参数调不好的时候先怀疑机械和电气再怀疑算法。算法大部分情况下是背锅的真正的凶手往往是传感器数据不可信。4.3 陀螺仪数值在漂移电源纹波在搞鬼为了要让小车在转弯时能精确转一个角度而不是靠估算时间我们给小车加了MPU6050陀螺仪模块。结果一上电小车放在桌子上一动不动打印出来的yaw角却在十几秒内慢慢从0漂到了二十多度。刚开始我以为是陀螺仪没校准重新校准后还是漂。后来我们用手持稳压电源直接给陀螺仪模组单独供电发现数据漂移量立刻小了很多。再查原因发现陀螺仪模块和电机驱动模块共用了同一个5V电源电机一启动整个电源的纹波就大得吓人陀螺仪的电源端噪声直接干扰到内部传感器。解决办法很简单给陀螺仪单独用一个AMS1117-3.3的线性稳压芯片做二次稳压后再供电同时传感器底部加一点海绵胶减震安装位置尽量靠近小车的几何中心。处理后yaw角的零漂基本控制在每10分钟一度以内完全够用。这个坑给我们的启发是在电赛小车里电源纹波是一个隐形杀手。它不会像短路那样直接冒烟而是让你看到各种诡异的现象比如传感器数值漂移、单片机偶尔复位、电机转速不稳定。如果你的系统出现这种“完全没规律的随机故障”优先想到电源质量。4.4 一套能省两小时的排查习惯经过几个大坑的洗礼我慢慢总结出了一套适用于电赛现场的排查方法其实很简单第一一次只改一个变量。不要同时动代码参数和硬件接线否则出了问题你根本不知道是哪一个改动导致的。第二遇到异常先做“最小系统测试”。把系统切开找出最简单的一定可以工作的子集再逐步把其他模块接回去。比如小车不动就把控制算法断开直接给电机一个固定PWM确认电机本身是好的再往上加逻辑。第三手边常备万用表和示波器。万用表负责量电压、检查通断示波器负责看波形、找干扰。如果条件有限没有示波器用串口打印数据加上逻辑分析仪也能解决大部分问题。第四把排查过的现象记录下来。卡了很久的问题把“现象原因修复方法”记在纸上一方面防止忘掉另一方面后面写报告时也是现成的测试素材。这套习惯平时看不出来有多厉害比赛最后一天尤其管用。凌晨两点的实验室里靠的不是灵光一现而是一套稳定的排查流程支撑着你不慌不乱。5. 测评间里的十分钟我在评委面前踩过的软钉子5.1 演示的本质稳定复现而不是现场炫技作品做完了封箱交了你以为完事了还早。测评环节才是真正把人分档次的时刻。电赛测评一般让评委现场观看作品运行小车必须在规定时间内完成任务。这个时候最忌讳的心态是“我现场秀一把极限操作”。我见过有的队伍在小车上加了很多花哨功能正常流程已经跑通非要现场加一个“极速模式”表演结果小车直接在评委眼前冲出赛道场面一度非常尴尬。测评的核心逻辑只有一个向评委证明你的作品稳定、可靠、能完成任务。所以演示之前要做的功课是在比赛场地的相似条件下完整跑三次以上记录每一次的成功率和耗时。测评现场如果条件允许尽量把电池电量充到最满把所有传感器校准一遍把小车放在起点时调整好朝向。演示过程不要急步骤要肉眼可见地清晰打开开关等待初始化完成按下启动按钮小车开始走。这样评委看到的是一台“可以预期”的机器而不是一个随机行为的小精灵。5.2 设计报告大一的“分数大礼包”很多队伍把全部精力放在作品上设计报告只是最后一天晚上草草赶出来。这是非常亏的因为设计报告在电赛评分里占的比重相当可观。一份合格的报告应该按照“题目分析→方案选择→硬件电路设计→软件算法设计→系统测试→总结与改进”这个顺序来写。大一学生容易犯两个毛病一是原理图截图不清晰公式不带物理量注释二是测试部分写得太虚什么“系统运行良好”“各项指标达到设计要求”这种话说了等于没说。我的建议是测试部分一定要有真实数据。哪怕数据不完美只要真实评委反而会觉得你们踏实。比如你可以写“空载状态下小车在3米直线赛道上跑10次平均用时15.6秒最大偏差4厘米成功率为90%。”这种数据比任何形容词都有说服力。再比如PID整定过程可以放几组P、I、D参数以及对应的超调量和调节时间做成表格这比大段理论分析更能体现工程能力。报告中还要注意克制。不要说“完全实现了题目所有要求”这种大话评委一旦追问某个细节答不上来反而扣分。可以适当写“本系统在xx条件下实现了xx功能在xx条件下存在一定偏差后续可通过xx方式改进”。这种诚实中带着解决方案的表述拿分效率反而更高。5.3 被评委问到不会的问题怎么说才不掉分电赛答辩环节评委一定会追问作品细节。对于大一队伍来说有些问题答不上来太正常了。但“答不上来”也有不同的答法。最忌的是不懂装懂硬编一个答案或者跟评委争执。最可惜的是直接说“不知道”完全没有展示任何思考过程。比较稳妥的套路是先复述评委的问题确认自己理解没有偏差然后讲自己“在调试过程中如何间接接触到这个问题”的经验最后诚实承认自己在这块的系统性认识还在补课。举个例子评委问“你们怎么保证两个电机转速的一致性”如果你只用了开环PWM控制千万别硬吹你可以说“我们最初用固定占空比控制两个电机发现两个轮子转速不一致导致小车跑偏。后来我们把左右轮的编码器数据接入单片机用PID做闭环每个控制周期都会分别计算两个电机的误差并独立修正。实际测试中左右轮转速差从大约10%降到了2%以内。”这种回答既诚实又展示了工程处理能力哪怕你不知道具体怎么推导转速环的传递函数评委也不会太为难你。再有就是如果评委问的问题你真的完全没碰过比如“你们的系统如果断电再上电能不能自动恢复之前的任务状态”你没做过就是没做过可以回答“目前我们没有实现断电恢复功能这是我们在设计时考虑过的方向但由于时间关系没有完成。如果要实现我理解可以通过把状态变量写入非易失存储上电时再读取恢复。”这种表达说明你至少知道问题在哪、解决思路是什么而不是完全空白。6. 赛后复盘这些非奖牌收获我到现在都在用6.1 工程直觉从“代码能跑”到“系统能稳”打完电赛以后我最大的变化不是会了几种芯片而是思维方式变了。以前写代码功能跑通就算完事比赛之后我开始习惯性地追问三个问题这个系统断电会怎样输入信号噪声大了会怎样连续运行一小时后会怎样这种“可靠性意识”就是电赛送给我最值钱的东西。举个生活中的例子后来我用单片机做了个宿舍智能门锁代码写完之后我第一件事不是去演示怎么开门而是测试如果断电再上电门锁会不会自动解锁。这要是在打电赛之前我根本不会想到这个场景。正因为有了这层思维方式这个门锁才没在室友忘带钥匙而我又不在宿舍时闹出大动静。6.2 时间管理四天三夜教会我的“极简迭代”电赛的四天三夜是一种极端的时间管理训练。正常的项目做砸了可以多花一个星期比赛没有退路到点就封箱。在那种压力之下你不得不学会判断什么事情最要紧、什么功能完全可砍、什么细节可以等到测评前再说。我后来做很多长期项目都受益于这种“极简迭代”的思路早上先列出今天必须完成的三个目标中途不要追加一件事情在约定期限内没做完直接降级处理而不是无限拖下去。这套方法听着朴素真正坚持下来的人其实不多。6.3 给大一的你几条实在建议如果让我给准备参赛的大一新生一个精简的清单我会写这几条第一别做大一的“观望者”。可能你觉得什么都不懂但队友也不需要你什么都懂你需要的是动手意愿和时间投入。一个肯学肯干的大一队员在队伍里的价值比一个不肯干活的大三队员高得多。第二有学长带就多问但问之前先自己搜。电赛的坑基本都有人踩过上网搜关键词往往比等人回答快。问问题不要上来就“这个怎么弄”而是说“我试了哪几种方法都没效果卡在哪个具体点上”这样学长才愿意认真帮你。第三经费要花在关键项目上。核心传感器和电源模块不要省开发板可以买二手杜邦线和杂七杂八的小零件多备一些没坏处。实验室里能借到的工具提前跟老师打好招呼。第四比赛结束不等于学习结束。四天三夜只是打开了一扇门后面你会发现自己不知道的东西反而更多了。继续保持折腾的习惯大二再看大一的自己你会感激那段熬夜调车的日子。如果现在让我重新走一遍大一路线我还是会毫不犹豫地报名电赛。不是因为那张奖状而是因为我发现大学里能让你在短短三天内同时体会到“崩溃、坚持、柳暗花明”三种心情的事情真的不多。凌晨三点实验室里那个原地转圈的小车最后在测评间里稳稳地跑完了全程那一瞬间我觉得什么参数调不对的深夜都值了。
返回列表