2025电赛E题开源:二维云台激光打靶系统全解析(基于STM32F407+K230)

2025电赛E题开源:二维云台激光打靶系统全解析(基于STM32F407+K230)

2025电赛E题:二维云台激光打靶系统全解析——基于STM32F407的视觉伺服控制

本文详细介绍2025年全国大学生电子设计竞赛E题《二维云台激光打靶系统》的完整实现方案。项目基于STM32F407微控制器,结合视觉追踪、PID控制、步进电机驱动等技术,实现高精度的激光自动瞄准与发射功能。

🎯 项目背景与意义

在自动化控制领域,视觉伺服系统是实现高精度定位与追踪的关键技术。本次分享的项目,源自 2025 年全国大学生电子设计竞赛的赛题,题目要求设计一套二维云台系统,需具备自动识别目标、控制激光精准命中的功能。
该项目历经多重挑战,最终斩获了广东省赛区的省一等奖。由于我在此次比赛中主要负责二维云台激光打靶系统的设计,因此仅针对 25 年电赛 e 题的瞄准模块部分进行解说,自动循迹小车的内容会略过。
这个项目的成功落地,既为电子设计竞赛提供了一套完整的参考方案,也为嵌入式视觉伺服系统的教学与研究提供了宝贵的实践案例。

📊 系统总体设计

系统架构图

二维云台激光打靶系统 ├── 感知层(视觉模块) │ ├── 摄像头采集 │ └── 目标坐标提取 ├── 控制层(主控板) │ ├── 数据处理 │ ├── PID控制算法 │ └── 运动规划 ├── 执行层(硬件驱动) │ ├── 步进电机控制 │ ├── 激光发射控制 │ └── 状态反馈 └── 人机交互层 ├── 按键控制 ├── 状态指示灯 └── 调试输出 

工作流程

  1. 目标识别:视觉模块实时采集图像,提取目标坐标
  2. 误差计算:计算目标坐标与激光准星的像素误差
  3. PID控制:根据误差生成电机控制信号
  4. 电机驱动:控制双轴步进电机调整云台角度
  5. 激光发射:当目标稳定在允许误差范围内时触发激光
  6. 状态反馈:通过指示灯和串口输出系统状态

🔧 硬件选型与配置

1. 主控板:嘉立创天空星

  • 核心芯片:STM32F407VET6 (ARM Cortex-M4)
  • 主频:25MHz晶振,PLL倍频至系统时钟
  • 外设配置
    • 5路UART串口
    • 多路GPIO控制
    • DMA数据传输
    • TIM定时器

2. 步进电机:张大头步进电机(Emm42_V5.0 PLC套餐)

  • 型号:Emm42_V5.0 PLC套餐
  • 控制方式:UART串口通信
  • 地址配置
    • X轴电机:地址0x01,UART2通信
    • Y轴电机:地址0x02,UART4通信
  • 性能参数
    • 最大速度:2000 RPM
    • 高精度位置控制
    • 内置闭环反馈

3. 视觉模块:亚博K230视觉模块

  • 平台:CanMV K230
  • 功能:实时图像采集与矩形识别
  • 输出格式origin:(x,y)\r\n 坐标数据
  • 性能:全角度圆形校正,高精度坐标提取

4. 激光笔:10mw蓝紫色可调焦激光笔

  • 功率:10mw
  • 颜色:蓝紫色
  • 特性:可调焦,光束清晰可见
  • 安全等级:适合室内使用

5. 继电器:1路5伏、支持高低电平触发

  • 控制方式:低电平触发激光笔开关
  • 电压:5V
  • 功能:实现激光的电子开关控制
  • 安全性:电气隔离,防止干扰

硬件连接示意图

摄像头模块(UART3) → STM32F407 步进电机X轴(UART2) → STM32F407 步进电机Y轴(UART4) → STM32F407 激光控制(PA8) → 继电器 → 激光笔 按键输入(PE9/PE11/PB6) → STM32F407 LED指示灯(PA3/PA5) → STM32F407 调试串口(UART1) → 上位机 

硬件实物照片

以下为系统各关键硬件的实物照片,供参考:

系统整体组装图

在这里插入图片描述

继电器模块:1路5V高低电平触发继电器

继电器:1路5伏、支持高低电平触发

激光笔:10mw蓝紫色可调焦激光笔

10mw蓝紫色可调焦激光笔

视觉模块:亚博K230视觉模块(01Studio CanMV K230)

亚博K230视觉模块

步进电机:张大头步进电机(Emm42_V5.0 PLC套餐)

张大头步进电机(Emm42_V5.0 PLC套餐)

主控板:嘉立创天空星(STM32F407VET6)

立创梁山派·天空星开发板

*注:这是刚组装好的,线有些凌乱,后面有优化

💻 软件架构设计

模块化软件架构

├── Core/ # STM32核心驱动 │ ├── Inc/ # 头文件目录 │ └── Src/ # 源文件目录 ├── Drivers/ # STM32 HAL驱动库 ├── bsp/ # 板级支持包 │ ├── bsp_system.h # 系统配置 │ ├── schedule.c # 任务调度器 │ ├── key_bsp.c # 按键处理 │ ├── uart_bsp.c # 串口通信 │ ├── step_motor_bsp.c # 步进电机控制 │ ├── pi_bsp.c # PI控制算法 │ └── laser_bsp.c # 激光控制系统 ├── app/ # 应用程序层 │ ├── Emm_V5.c # 步进电机驱动库 │ ├── Emm_V5.h │ ├── mypid.c # PID控制器 │ └── mypid.h └── ringbuffer/ # 环形缓冲区组件 

任务调度系统

系统采用基于时间片的任务调度机制,确保关键任务及时执行:

// 调度器初始化voidschedule_init(void){// 初始化任务列表 task_list[TASK_ID_LASER_CONTROL]=&Laser_Process; task_list[TASK_ID_KEY_SCAN]=&Key_Scan_Process; task_list[TASK_ID_VISION_PROC]=&pi_proc;// ... 其他任务初始化}// 调度器主循环voidschedule_run(void){uint32_t current_time =HAL_GetTick();// 检查并执行各任务for(int i =0; i < TASK_COUNT; i++){if(current_time - task_last_run[i]>= task_interval[i]){ task_list[i](); task_last_run[i]= current_time;}}}

视觉数据处理模块

// 摄像头坐标解析函数intpi_parse_data(char*buffer){int parsed_x, parsed_y;int parsed_count;// 解析origin坐标格式if(strncmp(buffer,"origin:",7)==0){ parsed_count =sscanf(buffer,"origin:(%d,%d)",&parsed_x,&parsed_y);if(parsed_count !=2)return-2;// 解析失败// 更新目标坐标 latest_red_laser_coord.x = parsed_x; latest_red_laser_coord.y = parsed_y; latest_red_laser_coord.isValid =1;my_printf(&huart1,"Origin: (%d,%d)\r\n", parsed_x, parsed_y);return0;}return-3;// 未知格式}

🔬 关键技术实现

1. 分段式 PID 设计逻辑

由于激光点在画面中的像素误差与电机转角是非线性关系(近处误差 10 像素与远处 10 像素对应的物理偏转角不同),我们设计了分段式自适应 PID:
超远距离 (Error > 100px):采用大 KpK_pKp​ (2.0) 快速趋近。
中近距离 (Error < 15px):切换至小 KpK_pKp​ (1.0 - 0.5) 并减小输出限幅,防止在目标点附近产生高频震荡。
积分策略:引入积分分离,仅在近距离时保留微弱积分项,以消除静差并防止过冲。

// PID控制器结构体typedefstruct{float kp;// 比例系数float ki;// 积分系数 float kd;// 微分系数float iout;// 积分输出float last_err;// 上次误差float out_max;// 输出最大值} PID_Controller;// 自适应PID控制函数floatadaptive_pid_control(PID_Controller *pid,float target,float current,float error_distance){float err = target - current;// 根据误差距离自适应调整参数if(error_distance >100.0f)// 超远距离{ pid->kp =2.0f; pid->out_max =25.0f;}elseif(error_distance >60.0f)// 远距离{ pid->kp =1.8f; pid->out_max =20.0f;}elseif(error_distance >40.0f)// 中远距离{ pid->kp =1.5f; pid->out_max =16.0f;}elseif(error_distance >25.0f)// 中距离{ pid->kp =1.2f; pid->out_max =12.0f;}elseif(error_distance >15.0f)// 中近距离{ pid->kp =1.0f; pid->out_max =5.0f;}elseif(error_distance >10.0f)// 近距离{ pid->kp =0.8f; pid->out_max =3.0f;}else// 极近距离{ pid->kp =0.5f; pid->out_max =1.0f;}// 积分分离:近距离时减少积分累积if(error_distance <15.0f) pid->ki =0.0001f;else pid->ki =0.00015f;// 计算PID输出float pout = pid->kp * err; pid->iout += pid->ki * err;// 积分限幅if(pid->iout > pid->out_max) pid->iout = pid->out_max;elseif(pid->iout <-pid->out_max) pid->iout =-pid->out_max;float dout = pid->kd *(err - pid->last_err); pid->last_err = err;float output = pout + pid->iout + dout;// 输出限幅if(output > pid->out_max) output = pid->out_max;elseif(output <-pid->out_max) output =-pid->out_max;return output;}

2. 步进电机精确控制

通过UART串口与张大头步进电机驱动器通信,实现精确的角度控制:

// 步进电机控制函数voidStep_Motor_Set_Speed_my(float x_rpm,float y_rpm){uint8_t x_dir, y_dir;uint16_t x_speed_scaled, y_speed_scaled;// 方向判断 x_dir =(x_rpm >=0.0f)?0:1;// 0:CW, 1:CCW y_dir =(y_rpm >=0.0f)?0:1;// 速度换算(0.1RPM单位) x_speed_scaled =(uint16_t)(fabs(x_rpm)*10+0.5f); y_speed_scaled =(uint16_t)(fabs(y_rpm)*10+0.5f);// X轴电机控制Emm_V5_Vel_Control(&MOTOR_X_UART, MOTOR_X_ADDR, x_dir, x_speed_scaled, MOTOR_ACCEL, MOTOR_SYNC_FLAG);// Y轴电机控制Emm_V5_Vel_Control(&MOTOR_Y_UART, MOTOR_Y_ADDR, y_dir, y_speed_scaled, MOTOR_ACCEL, MOTOR_SYNC_FLAG);}// 角度旋转控制voidStep_Motor_Rotate_X_Angle(int16_t angle){uint8_t dir;uint32_t pulses;// 角度限制if(angle >180) angle =180;if(angle <-180) angle =-180;// 方向判断:CW(右转)为1,CCW(左转)为0if(angle >=0){ dir =1;// CW pulses =(uint32_t)(angle *150);// 角度转脉冲数}else{ dir =0;// CCW pulses =(uint32_t)((-angle)*150);}// 发送位置控制命令Emm_V5_Pos_Control(&MOTOR_X_UART, MOTOR_X_ADDR, dir, MOTOR_MAX_SPEED, MOTOR_ACCEL, pulses, false, MOTOR_SYNC_FLAG);}

3. 激光控制系统

实现多模式激光发射策略,包括定时发射、按键触发和自动追踪:

// 激光控制主处理函数voidLaser_Process(void){uint32_t current_time =HAL_GetTick();// 模式1:Y轴复位后1.5秒自动发射if(laser_control.system_mode == SYSTEM_MODE_1 && laser_control.system_started &&!laser_control.mode1_fired &&!laser_control.manual_override){uint32_t elapsed_time = current_time - laser_control.system_start_time;if(elapsed_time >= MODE1_AUTO_FIRE_DELAY_MS){ laser_control.state = LASER_STATE_AUTO_FIRING; laser_control.fire_start_time = current_time; laser_control.mode1_fired =1;my_printf(&huart1,"LASER: Mode 1 - Auto fire started after 1.5s!\r\n");}}// 模式3:目标识别立即发射,持续20秒if(laser_control.system_mode == SYSTEM_MODE_3 && laser_control.system_started &&!laser_control.manual_override){if(laser_control.target_locked &&!laser_control.mode3_tracking){ laser_control.mode3_start_time = current_time; laser_control.mode3_tracking =1; laser_control.state = LASER_STATE_AUTO_FIRING; laser_control.fire_start_time = current_time; laser_control.mode3_fired =1;my_printf(&huart1,"LASER: Mode 3 - Target detected, immediate laser firing started (20s continuous duration)\r\n");}}// 自动发射超时检查if(laser_control.state == LASER_STATE_AUTO_FIRING && laser_control.system_mode != SYSTEM_MODE_3 &&!laser_control.manual_override){if(current_time - laser_control.fire_start_time >= laser_control.fire_duration_ms){ laser_control.state = LASER_STATE_OFF;my_printf(&huart1,"LASER: Auto fire completed - OFF\r\n");}}}

🎮 系统工作模式

系统工作状态照片

系统工作状态照片
  • 此为模式1下的效果演示图

模式0:待机模式

  • 状态:电机未使能,激光强制关闭
  • 指示灯:LED1和LED2均灭
  • 操作:按下START键启动系统
  • 适用场景:系统初始化与安全检查

模式1:定时发射模式

  • 功能:Y轴复位后自动定位发射
  • 特点:无目标追踪,X轴不运动
  • 指示灯:LED1亮,LED2灭
  • 触发条件:Y轴回零完成后
  • 适用场景:固定目标打靶与基础测试

模式2:按键角度模式

  • 功能:先通过角度按键预设启动后的转动角度,按下START键后自动转动并发射
  • 特点:支持目标追踪,双轴运动
  • 指示灯:LED1灭,LED2亮
  • 触发条件:按下START键开始计时
  • 适用场景:移动目标静态打靶

模式3:增强稳定模式

  • 功能:识别目标立即发射,持续20秒
  • 特点:高级滤波算法,抗干扰性强
  • 指示灯:LED1和LED2均亮
  • 触发条件:目标进入稳定区域
  • 适用场景:复杂环境下高精度动态追踪打靶

🔍 防摆动优化策略

系统采用多层防摆动机制,确保高速追踪过程中的稳定性:

1. 渐进式积分管理

// 平衡的积分管理 - 保持响应性同时防止过冲if(error_distance <15.0f)// 只在很近距离才管理积分{// 渐进式积分减少,保持响应性float integral_factor = error_distance /15.0f;// 0 to 1if(integral_factor <0.3f) integral_factor =0.3f;// 最少保留30%积分 pid_x.iout *= integral_factor;// 适度减少积分 pid_y.iout *= integral_factor;}// 只在极近距离才大幅减少积分if(error_distance <8.0f){ pid_x.iout *=0.5f;// 保留50%积分 pid_y.iout *=0.5f;}

2. 自适应变化率限制

// 简化的变化率限制,提高响应速度if(error_distance <15.0f){float max_change_x, max_change_y;if(error_distance <6.0f){ max_change_x =1.0f;// 允许较大变化率 max_change_y =1.0f;}else{ max_change_x =3.0f;// 允许更大变化率 max_change_y =3.0f;}float change_x = smooth_x - last_smooth_x;float change_y = smooth_y - last_smooth_y;// 独立应用变化率限制if(change_x > max_change_x) smooth_x = last_smooth_x + max_change_x;if(change_x <-max_change_x) smooth_x = last_smooth_x - max_change_x;if(change_y > max_change_y) smooth_y = last_smooth_y + max_change_y;if(change_y <-max_change_y) smooth_y = last_smooth_y - max_change_y;}

3. 智能摆动检测与抑制

// 摆动检测与抑制逻辑if(error_distance <35.0f){staticfloat last_error_x =0.0f, last_error_y =0.0f;staticuint8_t direction_changes_x =0, direction_changes_y =0;float current_error_x = latest_green_laser_coord.x - latest_red_laser_coord.x;float current_error_y = latest_green_laser_coord.y - latest_red_laser_coord.y;// 检测X轴方向变化if((current_error_x * last_error_x <0)&&(fabs(current_error_x)> oscillation_threshold_x)){ direction_changes_x++;// 根据摆动严重程度采取不同抑制措施if(direction_changes_x >3){my_printf(&huart1,"X-AXIS SEVERE OSCILLATION - Emergency damping\r\n"); pid_x.iout *=0.005f;// 激进抑制}elseif(direction_changes_x >2){my_printf(&huart1,"X-AXIS MODERATE OSCILLATION - Strong damping\r\n"); pid_x.iout *=0.02f;// 强力抑制}}}

📈 性能测试与优化

测试场景照片

在这里插入图片描述
  • 系统在实际测试环境中工作,摄像头对准目标区域,激光云台已就位

1. 追踪精度测试

在不同距离条件下测试系统追踪精度,均可在满足基础部分(2)、(3)时间限制要求的前提下,基本命中靶心(误差仅在1cm左右)

2. 稳定性提升

针对机械振动和视觉噪声,系统采用多重滤波策略:

// 自适应坐标滤波floatadaptive_filtering(float raw_value,float filtered_value,float movement_magnitude){float filter_alpha;if(movement_magnitude >50.0f) filter_alpha =0.4f;// 大运动,快速响应elseif(movement_magnitude >20.0f) filter_alpha =0.25f;// 中等运动,平衡响应elseif(movement_magnitude >10.0f) filter_alpha =0.15f;// 小运动,较强滤波else filter_alpha =0.1f;// 微小运动,强滤波return filtered_value *(1.0f- filter_alpha)+ raw_value * filter_alpha;}

💡 创新点总结

1. 软硬件协同优化

  • 硬件层面:选用嘉立创天空星+张大头步进电机+亚博K230视觉模块,实现高性能硬件基础
  • 软件层面:自适应PID+防摆动优化+多模式控制,提供智能控制策略

2. 多模式工作系统

  • 4种工作模式适应不同应用场景
  • 灵活的人机交互设计
  • 状态可视化反馈

3. 高效防摆动策略

  • 多层防摆动机制
  • 自适应变化率限制
  • 智能摆动检测与抑制

4. 模块化系统设计

  • 清晰的软件架构
  • 可复用的功能模块
  • 易于扩展和维护

🚀 使用体验与效果

实际使用表现

该项目可完成基础部分(2)(3)项,只要操作得当,基本满分;但在发挥部分有时会出现在转弯时脱靶,这个问题可以进一步优化PID参数,但更重要的是自动寻迹小车模块的调整,即在每次转弯时都要放慢速度转弯,而在走直线时可加快速度,这样的设计可以在转弯时给二维云台瞄准模块充分的时间进行调整。遗憾的是,由于我们的全程匀速循迹的小车未使用陀螺仪模块,所以难以判定何时小车转弯,故这个方案最后未能实现。

竞赛应用价值

  1. 完整性:提供从硬件选型到软件实现的完整方案
  2. 参考性:代码注释详细,便于学习和复现
  3. 实用性:系统设计考虑实际应用场景,具有较高实用价值

📂 项目开源与资源共享

开源地址

  • 工程文件开源地址:[https://gitee.com/haisheer/laser-target-system]
  • 主控板拓展版地址:[https://oshwhub.com/yumo2003/sky-star-extension-board]

资源包含

  1. 完整源代码:STM32工程文件,Python视觉处理脚本
  2. 开发文档:系统设计说明,API接口文档
  3. 3D打印文件:适配张大头步进电机的二维云台3D结构

使用建议

  1. 初学者:建议先阅读README.md,了解系统架构
  2. 开发者:可直接使用现有代码框架进行二次开发

📝 总结

本项目成功实现了基于STM32F407的二维云台激光打靶系统,融合了视觉识别、运动控制和实时调度等多项关键技术。
通过本项目的实践,不仅为电子设计竞赛提供了完整解决方案,也为嵌入式视觉伺服系统的开发积累了宝贵经验。希望本项目能为相关领域的开发者提供有益的参考。


版权声明:本文及所涉及代码、文档均遵循MIT开源协议,欢迎学习、使用和修改,但请保留原作者信息。

作者:2025年全国大学生电子设计竞赛参赛团队
更新日期:2025年1月12日
版本:v1.0.0

Read more

OpenClaw Webhook 详解:完整指南

Webhook 是将 OpenClaw 从“聊天助手”快速转变为“响应式系统”的最佳方式。无需等待您主动发送消息,GitHub 可以在 PR 提交时通知 OpenClaw,Stripe 可以在支付失败时通知 OpenClaw,n8n 也可以按计划通知 OpenClaw。OpenClaw 会接收这些传入事件,并将其转换为代理运行或轻量级唤醒操作,然后将结果路由回您实际使用的任何渠道。 本文重点介绍 OpenClaw 网关上的 HTTP Webhook。OpenClaw 中还有另一种东西,在一些文档和配置中也被称为“钩子”。这些是网关内部的事件钩子,当本地生命周期事件触发时运行。它们也很有用,但 Stripe 或 GitHub 与服务器通信的方式并非通过它们。 如果您的 OpenClaw 实例是刚刚部署在 VPS 上,并且您仍然使用 SSH 进行基本操作,那么首先要确保网关稳定,

By Ne0inhk
Bing网站收录教程:Bing Webmaster工具添加及验证步骤

Bing网站收录教程:Bing Webmaster工具添加及验证步骤

分类:科学与技术 摘要 在Bing Webmaster工具添加网站并验证所有权,提交网站地图,可提升内容在Bing/Edge搜索中的展示,助力流量获取,国内可直接访问。 内容 让你的网站被Bing看见——Bing Webmaster工具使用指南 搭建好个人网站或博客后,如何让更多人通过Bing搜索引擎找到它?将网站接入Bing Webmaster工具是关键一步,这就像给搜索引擎搭了一座直达桥梁。 什么是Bing Webmaster工具? 它是微软提供的免费平台,类似谷歌的Search Console,主要帮站长管理网站在Bing、Edge等搜索引擎中的表现。通过它,你能监控抓取情况、分析流量来源,还能优化内容在特定平台的展示效果。 为什么要使用它? 虽然Bing的市场份额不及谷歌,但全球仍有数亿用户依赖它搜索信息。接入后,能加速新内容收录、诊断技术问题(比如爬虫抓取失败),还能获取搜索数据,帮助你调整内容方向。对国内用户来说,直接访问操作页面是一大便利。 准备工作 1. 网站已上线并能正常访问(建议启用HTTPS) 2. 生成了sitemap.xml文件

By Ne0inhk
【前端】使用Vue3过程中遇到加载无效设置点击方法提示不存在的情况,原来是少加了一个属性

【前端】使用Vue3过程中遇到加载无效设置点击方法提示不存在的情况,原来是少加了一个属性

🌹欢迎来到《小5讲堂》🌹 🌹这是《前端》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!🌹 目录 * 前言 * 提示报错 * 问题分析 * 1. **Options API vs Composition API 风格差异** * ✅ **Options API 写法(方法直接放在外面)** * ✅ **Composition API 写法(方法必须在 setup 中定义)** * ✅ **`<script setup>` 语法糖(最简洁的 Composition API)** * 2. **为什么你的代码会报错?** * 3. **解决方案** * 方案 1:改用 **Options API**(适合从 Vue

By Ne0inhk
在线招投标系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

在线招投标系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着信息技术的快速发展,传统招投标模式逐渐暴露出效率低下、信息不对称和流程繁琐等问题。在线招投标系统的出现为企业和政府机构提供了高效、透明和公平的竞争平台,能够显著降低交易成本并提高资源配置效率。该系统通过数字化手段整合招投标全流程,包括公告发布、投标文件提交、评标和中标结果公示等环节,确保信息的实时性和可追溯性。同时,系统采用严格的权限管理和数据加密技术,保障用户隐私和交易安全。关键词包括:在线招投标、信息管理、流程优化、数字化、安全性。 本系统采用SpringBoot作为后端框架,结合Vue.js前端技术,实现前后端分离开发模式,提升系统的可维护性和扩展性。数据库选用MySQL,通过合理的表结构设计确保数据的高效存储和查询。系统核心功能包括用户权限管理、招投标信息发布、投标文件上传与审核、在线评标及结果公示等。此外,系统支持多角色登录,如管理员、招标方和投标方,各角色拥有不同的操作权限,确保业务流程的规范性和安全性。技术关键词包括:SpringBoot、Vue.js、MySQL、权限管理、前后端分离。 数据表设计 招投标项目信息表 招投标项目信息表用于存储项目的基本

By Ne0inhk