拿下国二!2025电赛E题「简易自行瞄准装置」K230+MSPM0视觉伺服全程复盘
拿下国二!2025电赛E题“简易自行瞄准装置”填坑指南与硬核复盘
嗨,大家好,我是苏增烨。
2025年的夏天,大概会是我大学生涯里最难忘的一个夏天。四天三夜的通宵,几百杯冰美式,我们小组终于在今年的全国大学生电子设计竞赛中,凭借E题“简易自行瞄准装置”拿下了全国二等奖!今天刚缓过神来,赶紧趁热打铁,跟兄弟们盘一盘这次的“神仙”技术栈,以及那些让我们差点崩溃的连环大坑。
1. 我们的“神仙”技术栈
这次E题要求做自动瞄准,核心就四个字:“眼毒”、“手稳”。
为了让“眼睛”足够毒,我们果断抛弃了算力孱弱的传统方案,直接上了嘉楠科技的K230 AI开发板。这块板子自带强大的NPU,我们在上面部署了YOLOv5目标检测模型,跑起来简直是降维打击,帧率稳得一批,靶标识别又快又准。
至于控制端“手”的部分,我们选用了TI的MSPM0控制器。整体架构很清晰:K230识别到目标后,计算出视野中心的像素坐标偏差,通过串口甩给MSPM0;MSPM0接收到数据后,跑增量式PID算法,输出PWM波驱动二维云台,实现指哪打哪。
2. 踩坑日记:那些年我们流过的泪
方案听着很美好,但实操起来简直是“面向玄学编程”,四天里有三天都在填坑。
坑一:K230的“幽灵触发” 比赛第一天晚上,我们的板子一上电就莫名其妙反复重启,或者进错启动模式。排查到凌晨三点才发现,是K230的启动引脚在刚上电时电平极其不稳,极易受到干扰。最后我们硬是给几个关键的Boot引脚焊上了10k的上下拉电阻,强制钳位,这只“幽灵”才算被彻底超度。
坑二:杜邦线一生黑与串口丢包 当云台真正动起来的时候,高频振动极大,原本插在板子上的杜邦线成了万恶之源。眼看着K230识别得好好的,云台却像抽风一样乱转。一查串口数据,全是一堆乱码丢包。 对策:全员化身“焊武帝”,把所有通信线全部死死焊在洞洞板上!软件层面,我们在串口通信协议里加了严格的帧头、帧尾和校验和(Checksum),一旦MSPM0校验失败,立马丢弃并请求重传,这才保住了通信的命脉。
坑三:熬了两个大夜的PID整定 瞄准装置要求快、准、狠。为了消除稳态误差、防止积分饱和,我们写了增量式PID。但整定参数(Kp, Ki, Kd)真的是门玄学。我们三个人盯着云台调了两天两夜,从“狂抖不止”调到“龟速移动”,最后才找到那个让云台“丝滑平顺”的黄金参数。
给大家看一眼当时在MSPM0里跑的增量式PID核心逻辑:
// 增量式PID核心逻辑
typedef struct {
float Kp, Ki, Kd;
float error; // 当前误差
float last_error; // 上次误差
float prev_error; // 上上次误差
} PID_TypeDef;
float PID_Calc(PID_TypeDef *pid, float target, float current) {
pid->error = target - current;
// 增量计算公式:Δu = Kp*(e(k)-e(k-1)) + Ki*e(k) + Kd*(e(k)-2e(k-1)+e(k-2))
float increment = pid->Kp * (pid->error - pid->last_error) +
pid->Ki * pid->error +
pid->Kd * (pid->error - 2 * pid->last_error + pid->prev_error);
// 更新历史误差,为下一次迭代做准备
pid->prev_error = pid->last_error;
pid->last_error = pid->error;
return increment;
}
3. 答辩现场:心跳飙到180
综合测评那天,三个专家围着我们的装置。当专家按下随机靶标启动键的那一秒,我连呼吸都停了,整个实验室安静得能听到我狂飙到180的心跳声。
只听见云台舵机“唰”的一声轻响,K230的摄像头瞬间锁定了远处的移动靶。MSPM0精准输出控制量,激光笔的红点在零点几秒内死死咬住了靶心。专家拿干扰板在镜头前挡了一下,撤开后,激光点又像装了巡航导弹一样,瞬间回正,稳稳锁住!
“响应速度不错,很稳。”听到评委老师在评分表上边写边说出这句话,我藏在背后的手才敢松开,手心全都是冷汗。
4. 写在最后
从四天三夜的绝望,到拿下国二的狂喜,电赛教给我的不仅仅是K230怎么跑AI、PID怎么调参数,更是那种“遇到Bug不要慌,只要搞不死,就往死里搞”的极客精神。
如果你明年也要打电赛,听学长一句掏心窝子的话:远离杜邦线,拥抱电烙铁!
我是苏增烨,咱们下篇技术博客见!