1. 第一轮考核为什么只要求"跑完一圈",不要求快
1.1 任务背景:三周从零攒一台循迹小车
这批新队员进队的时候,实验室里摆着往届留下的各种残骸——断了轴的电机、烧了的L298N、缠成一团的杜邦线。我给他们布置的任务很简单:三周后,每人带一台能自己沿着黑线跑一圈的循迹小车来汇报。没要求速度,没要求过弯姿态,哪怕慢慢爬完一圈都算合格。
为什么定这个标准?因为智能车队的第一轮淘汰,淘汰的不是"做得慢的人",而是"连基础闭环都没建立起来的人"。循迹小车这玩意儿,看起来就是"检测到黑线就跟着走",但真正上手你会发现,从传感器高度、电机驱动的共地问题,到代码里的采样频率、阈值判据,每一环都是坑。新人能在三周内把这条链完整跑通,说明他具备了最基础的"现象→假设→验证"调试思维,这才是车队后续打比赛真正需要的能力。
所以第一轮我们不考创意,不考速度,只考一件事:能不能稳定地跑完一圈。事实证明这个门槛定得刚刚好——有人提前两天就反复跑圈了,有人在汇报当天上午还在调传感器阈值,还有几台车直到上场前十分钟才勉强能动。
1.2 方案选型的三条岔路:三轮/四轮、51/STM32、红外/摄像头
布置任务后最先炸开锅的不是代码,而是"用啥方案"。我在群里看到新队员讨论了一整天,这里把我的建议逻辑捋清楚,后来入队的也可以直接参考。
先说底盘。三轮差速结构是新人首选的稳妥答案:后轮两枚直流减速电机负责驱动和转向,前轮一个万向轮自由滚动。转弯靠两个后轮的速度差实现,不需要舵机、不需要转向机构,机械结构简单到基本不会出问题。四轮方案里如果做前轮转向,要额外处理阿克曼转角、舵机中值、连杆间隙,这些对新人来说三周根本消化不完。除非你明确知道自己要打比赛里的"四轮组",否则第一轮老老实实三轮。
再说主控芯片。这是分歧最大的地方,支持51和支持STM32的几乎吵起来。我的观点很直接:如果你之前写过一点C语言,直接上STM32F103C8T6,配STM32CubeMX生成初始化代码,HAL库写起来并不比51难多少,而且后面做编码器测速、PID闭环、无线调试都顺理成章,省得第四周再推倒重来。如果连中断是什么都没听说过,那就用STC89C52这类51芯片,寄存器少、资料多、一个GPIO翻转就能点亮LED,先把"传感器读值→控制电机"这条链路跑通,建立信心比什么都重要。第一轮用51跑通的人,后面换平台时再痛苦也比一上来就被HAL库劝退强。
最后是循迹传感器。红外是绝对主流,TCRT5000反射式光电传感器模块,带LM393比较器,直接输出数字高低电平。一颗模块几块钱,一排五颗焊在支架上就能用。摄像头方案(OpenMV之类)确实上限高,但新人第一轮就上摄像头,大概率会死在图像处理上,连循迹的边都摸不到。记住,红外循迹教会你的是"感知→决策→执行"的控制框架,这个框架换到任何传感器上都成立。
1.3 我们验收时的"最低可接受标准"
考核前我列了一份验收底线,逐条对照:
- 能独立完成至少一圈,中途不允许人工推车、不允许用手扶正
- 直道上不走出明显S形,弯道不甩出赛道边缘
- 静态检查时,五路传感器逐路都能稳定识别黑白
- 代码里不能只有死循环加延时,至少要能看到"读传感器→判断状态→输出PWM"的结构
这几条听起来朴素,但每条背后都对应着一个具体能力:第一条测整体集成,第二条测控制逻辑,第三条测硬件调试,第四条测代码思维。后面实际检查时,第四条直接筛掉了一半的重写选手。
2. 检查清单:机械、电路、传感器、控制,一条一条过
2.1 机械结构:螺丝、重心、传感器支架
新队员最容易忽略的是机械细节,但他们翻车也基本翻在机械上。检查时我第一件事就是拿螺丝刀把所有螺丝都试了一遍——至少一半的车有松动。电机固定座的螺丝松了,跑起来电机会在支架里晃,左右轮的有效轮距在不断变化,车自然走不直,很多人还去调代码,越调越乱。
重心是第二个体检项。电池别放车屁股后面,加速时前轮会翘,过弯时重心偏移会让内侧轮打滑。正确做法是把电池放在底盘中部靠前,压在两个驱动轮之间,这样后轮抓地力是均匀的。传感器支架必须装得足够牢,不能跑两圈就歪掉,否则你花一下午标定的阈值全白费了。
传感器离地高度是重点中的重点。TCRT5000的检测距离一般标称1~5厘米,但实际最好用的区间是1.0~1.5厘米。太矮了,赛道上一粒小石子或者胶带边缘的毛刺都会让传感器误触发;太高了,信号变得极其不稳定,阈值怎么调都调不出干净的高低电平。我的土办法:把小车放平,拿一张白纸垫在传感器下面抽动,观察指示灯从亮到灭的高度区间,然后让传感器支架高度落在区间中间偏下的位置。
2.2 电源与驱动:单电源、双电源还是共地,必须讲清楚
电路检查是翻车重灾区,尤其是电源。我见过三台车症状一模一样:上电后单片机正常,电机不动;用手碰一下电机驱动板,电机猛地转一下又停了。最后查出来全是共地问题——电机驱动板的地和单片机的地没有接在一起。信号线上飘着的电平,根本不知道什么时候是真高电平。
驱动板方面,L298N和TB6612FNG是两大主流。L298N便宜、皮实、资料多,但是内部是双极型晶体管,饱和压降大,12V供电到电机两端可能只剩9V不到,而且发热严重。TB6612是MOSFET方案,压降小、体积小、效率高,我们队里后来全部统一用TB6612。新人第一轮用L298N我不拦,但如果是新买的板子,我建议直接上TB6612,省得后面换板子重新接线。
电源架构上也有一条硬规矩:逻辑电源和电机电源尽量分开。最简单的方案是两节18650串联组成7.4V电池组,电机驱动直接吃电池电压,单片机通过降压模块单独取5V。如果非要用单电源,那必须在电机驱动输入端并联一个大电容,至少100微法,最好470微法,不然电机启动瞬间的浪涌电流会把单片机电压拉垮,造成复位重启——这个现象非常经典,症状就是小车一加速就"重启",跑一圈能重启四五次。
2.3 红外循迹模块:阈值校准比代码更重要
循迹模块的检查,我每次都让新队员当着我的面重新做一遍校准,而不是看他们"已经调好了"的结果。TCRT5000模块上有个蓝色电位器,拧它就是在调比较器的翻转阈值。校准的动作要领是:把传感器悬空对着白色赛道表面,拧电位器到指示灯刚好点亮,然后再往反向拧一点点让它处于临界状态,接着用黑线划过传感器,指示灯应该干脆利落地灭掉。
这个"临界状态"是关键。很多新人不知道,直接把电位器拧到最灵敏,结果传感器对着白色区域都乱闪,小车在直道上疯狂摆头。反过来拧太保守,黑线稍微反光就识别不到,过弯必冲出去。正确的做法是让翻转点卡在白和黑的中间附近,留一点余量又不要余量过大。
还有一个环境光的坑必须提醒:TCRT5000再怎么说也是红外反射传感器,强阳光下或者对着窗边日光灯时,环境红外会叠加到接收管上,导致原本校准好的阈值全部失效。所以验收时我一律要求新车先去赛道跑一圈试试,如果教室里灯光和实际跑道的照明条件不一样,当场重校。后面正式比赛时,赛场的灯光条件千奇百怪,这个习惯越早养成越好。
3. 实测现场的高频翻车点:三条完整排查链路
3.1 电机"咔咔"抖动但不转:死区、电压、使能三个嫌疑
汇报当天最热闹的场面,就是一台车上了赛道,按下开关后电机发出"咔咔咔"的高频抖动,但轮子纹丝不动。这种情况我让新队员按下面这条链路一步步查,也建议你们以后遇到直接照抄:
第一步,量电机两端电压。把电池充满,程序里把PWM开到最大(255或者100%),用万用表直接测电机端子。如果电压接近电池电压,说明驱动板到电机这一路是通的,问题在控制信号;如果电压只有2~3V,那问题出在驱动板供电或者驱动板本身。
第二步,检查使能脚。TB6612的AIN1/AIN2控制方向,PWMA控制速度,但如果STBY(待机)脚没拉高,整个芯片处于休眠状态,PWM信号来了也白来。L298N的ENA/ENB跳线帽没插或者接触不良,也会出现这种"动一下又停"的现象。这些脚位问题比芯片烧毁常见得多。
第三步,考虑PWM死区。直流电机从零转速到开始转动之间存在一个死区,某个占空比以下电机根本转不起来,只是通电产生力矩在那抖。这不是故障,是物理特性。解决办法很粗暴:程序里给一个基础占空比(我们常用30%左右作为起步值),在这个基础上再叠加转向调节量。顺便说一句,以后做PID闭环时,这个死区补偿是必须要做的,否则积分项会一直累计导致抖动。
3.2 出弯甩出赛道:差速转向的力度分配
第二类高频翻车是"进弯还行,出弯必飞"。观察录像你会发现,这些车都是内轮反转,也就是转向时内侧电机不但不减速,反而反转。三轮差速底盘上这样做不是不行,但新人掌握不好反转的时机和幅度,结果就是车在弯道上原地画圈或者突然甩尾冲出去。
我给的标准转向策略是:直线全速,弯道降速,转向靠"减速一侧"而不是"反转一侧"。五路传感器对应五个状态:正中、偏左、偏左多、偏右、偏右多。偏左时,右轮保持当前速度,左轮降到右轮的60%;偏左多时,左轮降到30%,同时整体车速降到直道的一半。除非遇到U型急弯,否则不推荐反转内轮。这样处理之后,车虽然过弯不快,但姿态非常稳,新队员也好理解。
出弯恢复直道的时机也有讲究。很多车的问题是:过了弯心,传感器明明已经压到中线上了,车还在按弯道状态打方向,结果出弯瞬间猛地摆向另一侧。正确逻辑是:当中间那一路传感器检测到黑线后,先维持当前转向一小段时间(比如50毫秒),再复位到直道状态。这个"滞后复位"的细节,是区分"能跑"和"跑得稳"的重要标志。
3.3 传感器误判:阈值、高度、环境光的三角关系
还有一类车症状很诡异:直道上跑得好好的,突然在某一个固定位置猛打方向,好像看见了幽灵弯道。第一次遇到这种情况,新队员的第一反应往往是怀疑程序逻辑有bug,然后疯狂改代码,但问题根本不在代码。
排查这类问题,我教的顺序是:先物理后逻辑。拿一张白纸,依次在每个传感器下面划过,看对应指示灯是否干脆翻转。如果某一路在纸上划过时指示灯闪烁不定,先把电位器重新校准一遍;校准后还闪,就调传感器高度;高度调完还闪,再用手机慢动作拍模块附近,看是不是铜柱反射、杜邦线挡光之类的外力干扰。这一套下来,90%的"幽灵误判"都能解决。
剩下的10%是环境光。我们的实验室有一侧靠窗,下午三点的阳光斜射进来,刚好打在赛道白底上,红外反射率飙升,传感器阈值整个失效。处理办法有两层:一是物理遮挡,给传感器阵列加一个遮光罩,用黑色ABS板在传感器上方做个屋檐;二是软件容错,连续采样三次,两次以上一致才认为是有效状态。遮光罩这东西看着丑,但在赛场灯光复杂的场地里,它会救你一命。
4. 新队员代码里最典型的问题:不是不会写,而是没想清楚
4.1 GPIO初始化与去抖:逐位读取还是快速扫描
翻代码的时候,我发现新手最典型的错误集中在GPIO配置上。红外循迹模块的数字输出脚接到单片机,有人忘了把对应引脚设为输入模式,结果读到的永远是一个随机值;有人用的是内部上拉,但模块输出的是推挽信号,两者一冲突,电平逻辑全乱。
我的建议是:所有传感器引脚在初始化时统一写清楚,输入模式、无上下拉或者外部上拉,然后读值前先做一个简单的软件去抖。所谓去抖,不需要什么高深算法,连续读三次取多数就行。TCRT5000模块输出本身是干净的,但赛道上偶尔的灰尘、胶带反光会让信号瞬间抖动,三次采样能把绝大部分毛刺滤掉。采样间隔不要用delay慢慢等,放在主循环里每轮顺手读一下,循环自然就有去抖效果。
4.2 控制策略:五档离散控制起步,PID先别急着碰
每次看到新人一上来就抄一个PID库,我都想按住他。不是说PID不好,而是你连"传感器状态→转向命令"的基本映射都没建立起来,直接上PID只会得到一台疯狂抽搐的车。第一轮的正确做法是离散状态控制:五个传感器对应五个转向档位,每个档位配一组左右轮速度。这种控制策略逻辑直观、便于调试、出问题一眼就能看出来是哪个档位设置错了。
等你把离散控制的轨迹跑稳了,再谈PID也不迟。而且PID的顺序有讲究:先做速度环,给两个驱动轮装上编码器(霍尔编码器或光电编码器都行),让轮速在负载变化时也能稳在设定值;速度环稳了,再做转向环。一下子上双闭环,新队员大概率调一个晚上都找不到合适的Kp、Ki、Kd,然后心态崩了。循序渐进,别贪。
我这里给一个五档控制的初始参数模板,新队员可以直接当起点用(单位是PWM占空比,0~100):
| 传感器状态 | 左轮 | 右轮 | 适用场景 |
|---|---|---|---|
| 正中 | 75 | 75 | 直道 |
| 偏左 | 45 | 75 | 缓左弯 |
| 偏左多 | 25 | 75 | 急左弯 |
| 偏右 | 75 | 45 | 缓右弯 |
| 偏右多 | 75 | 25 | 急右弯 |
这套参数的核心思路是"外侧轮不动,内侧轮减速",先保证不冲出赛道,再慢慢把直道速度往上推。
4.3 主循环:千万别用 delay() 卡死采样频率
代码检查中我最想敲黑板的地方是主循环。十个人里有八个写的是这种结构:while(1){ 读传感器; 判断状态; 输出PWM; delay(100); }。逻辑没错,但delay(100)意味着每秒采样10次,小车直线速度稍微拉起来,每秒走半米,一个采样周期就走5厘米——赛道黑线才多宽?碰到稍微急一点的弯,传感器阵列根本来不及反应,车已经冲出去了。
正确做法是把主循环空转周期压到5~10毫秒,读传感器、判断、输出一气呵成,然后循环回来继续读。如果需要做延时,用定时器标志位,别用堵塞式delay。另外,强烈建议新队员从第一天就在代码里加串口输出功能:把五路传感器的原始值通过串口打到电脑上,用串口助手观察。很多"幽灵问题"其实就是传感器阈值问题,数据一打出来立刻现原形。调试时肉眼看不见的东西,串口全告诉你。
5. 现场检测怎么组织:流程、评分和点评的尺度
5.1 我们的验收流程:静态检查→空载测试→赛道实测→专项追问
这次进度汇报,我们按每人30分钟的时间窗口来做,流程固定为四段,省得混乱:
第一段静态检查(10分钟):按第2节的清单过机械、电路、传感器。这里有个经验,静态检查一定要在赛道实测之前做,因为很多"跑不好"问题的根因其实在静态阶段就能发现,先排除硬件隐患,后面赛道实测才有意义。
第二段空载测试(5分钟):把车架空,轮子悬空,用手推动传感器挡板模拟黑线位置,观察左右轮转速响应是否符合五档逻辑。这一步是纯逻辑验证,能排除掉机械和地面摩擦的干扰。
第三段赛道实测(10分钟):上标准赛道跑,每人给3次机会,取最好成绩。我们用的赛道是白色KT板贴18mm黑色电工胶带,包含两个直角弯和一个S弯,难度适中。实测时老队员全程录像,回放时逐帧讲问题。
第四段专项追问(5分钟):随机问两三个问题,"你的传感器阈值是怎么标定的""过弯时内侧轮速度和外侧轮分别多少""如果电池电压从8.4V降到7.2V,你的车会怎样"。这一步不考背诵,考的是他是否真的理解自己的车。
5.2 打分维度与权重:完成度不是唯一标准
打分表我列在这里,供其他车队参考:
| 维度 | 权重 | 评分要点 |
|---|---|---|
| 赛道完成度 | 40% | 能否完整跑一圈,压线次数,是否冲出赛道 |
| 运行稳定性 | 30% | 直道是否走S形,过弯是否甩尾,有无明显抖动 |
| 代码质量 | 20% | 是否有结构化的状态判断,采样频率是否合理,有无串口调试习惯 |
| 结构工艺 | 10% | 布线是否整齐,螺丝是否紧固,传感器支架是否牢靠 |
完成度只给40分,是因为我见过一台车跑圈特别漂亮,但一问三不知,代码全是队友给的,这种人在车队里留不长。真正的考核核心是稳定性和代码质量,它们决定了这个人在下一阶段做更快更复杂的车时,有没有独立解决问题的能力。
5.3 点评尺度:既不打击也不放水
点评这环节,老队员容易犯两个极端:要么只说"不错不错"敷衍过去,要么劈头盖脸一顿挑毛病。我的原则是"三明治":先肯定一个具体做得好的点,再指出一个最致命的问题并给出可操作的改法,最后给一个小的进阶建议。
举个例子,有个队员的车跑完了全程,但直道上一直在小幅摆头。我的点评是:"你能独立调试到跑完全程,说明链条是通的,这个基础很扎实。但你的摆头问题不是传感器的事,是你的转向档位间距太大——从正中状态到偏左状态,左轮速度一下掉了30%,车当然会晃。你把直道速度降到60,或者把偏左状态的左轮速度从45改成55,马上就能看到改善。下次可以把五档改成七档试试。"
还有一个所有人都要听的话:这次没过,不代表淘汰。我们给没跑完的人一周时间,下周再测一次,通过的继续留队。第一轮的目的是让大家建立调试方法论,不是刷人。实际上,第二次补测通过的人,往往比第一次就通过的人更理解整个系统,因为他们经历过完整的"出问题→排查→修复"过程。
6. 第一轮之后我们立刻调整的事:组织和技术路线的复盘
6.1 从"每人一辆车"改成"两三人一组"
这次检查暴露了一个组织问题:单兵作战效率太低了。新队员独立装车过程中遇到问题,往往卡一两个小时才敢来问,有的甚至卡两天。而老队员不可能随叫随到。第一轮结束后我们立刻改组,按"一个老队员带两三个新队员"的分组方式,让新人之间互相查线、互相调阈值,老队员只做最后把关。
这个调整立竿见影。第二周的时候就有人主动拿着逻辑分析仪帮队友抓传感器毛刺了,还有人把自己调的PID参数分享给组里其他人当初始值。比赛本身就是团队作战,从第一轮就培养协作习惯,后面打全国赛时省下的沟通成本不可估量。
6.2 下一阶段技术路线:编码器速度闭环与赛道识别升级
第一轮通过的人,下一阶段的任务开始分层。基础层是给驱动轮加编码器,做增量式PID速度闭环。有了速度环,电池电压变化、轮胎打滑导致的左右轮速度差都会被自动修正,车的直线稳定性会上一个大台阶。进阶层是把传感器阵列升级到八路,并改用模拟量输出(直接读ADC灰度值),通过加权平均算出黑线的精确位置偏差,把离散五档控制升级成连续的p控制甚至pd控制。再往上,才开始考虑十字路口识别、环形赛道处理这些竞赛科目。
这条路线是经过验证的:第一轮红外五路离散控制打底,第二轮八路灰度加PID,第三轮就可以跑全场地图了。千万不要倒过来,一上来就追求高精传感器和复杂算法,地基没打好,上层全是空中楼阁。
6.3 几个省钱省事的土办法
最后分享几个我们自己踩坑后总结出来的土办法,照着做能少走很多弯路:
- 车底盘别去买成品,去广告材料店要一块亚克力边角料,用勾刀划出形状,铜柱一撑就是底盘。强度够用,还便宜。
- 传感器支架用3D打印最方便,没有打印机就用铝条加扎带,重点是保证五个传感器一字排开且高度一致。
- 赛道DIY:白色KT板拼起来,黑线用18mm电工胶带贴,别买赛道纸,那个太反光。KT板接缝处要贴平,不然传感器过接缝会误判。
- 调试时用手机慢动作拍车过弯,240帧那种,机械抖动、轮子打滑、传感器支架晃动,全都能看得清清楚楚。很多问题肉眼真看不出来。
这次第一轮进度汇报,我感触最深的一点是:合格的循迹小车不是"写"出来的,是"调"出来的。新队员里最后跑得最稳的,不是代码写得最漂亮的,而是那个愿意蹲在地上反复调传感器高度、一遍遍拿白纸测试阈值的人。车队这条路,比的从来不是起点谁高,而是谁更有耐心把每一个细节抠到位。第一轮检查完,把录像存好,等三个月后再翻出来看,你会看到这批新人到底成长了多少。