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

Nunchaku-FLUX.1-devWebUI高级功能:图像重绘/局部重绘/图生图扩展能力

Nunchaku-FLUX.1-dev WebUI高级功能:图像重绘/局部重绘/图生图扩展能力 1. 从文生图到创意编辑:解锁WebUI的进阶玩法 如果你已经用Nunchaku-FLUX.1-dev玩过基础的文生图,看着那些根据文字描述生成的精美图片,可能会想:能不能在现有图片上做点修改?比如给照片换个背景、给人物换个发型,或者只修改图片的某个局部? 好消息是,Nunchaku-FLUX.1-dev的WebUI不只是个简单的文生图工具。它内置了强大的图像编辑能力,让你能像专业设计师一样,对图片进行各种创意修改。今天我就带你深入探索这些高级功能,看看如何用它们解决实际创作中的难题。 想象一下这些场景: * 你生成了一张不错的风景图,但天空部分不太满意,想换成晚霞 * 电商产品图需要换个背景,让商品更突出 * 人物肖像的某个细节需要调整,比如眼睛颜色或衣服款式 * 想把一张普通照片转换成特定艺术风格 这些需求,用传统的图片编辑软件可能需要复杂的操作,但用Nunchaku-FLUX.1-dev的WebUI,几个简单的步骤就能搞定。下面我就带你一步步掌握这些进阶技巧。

By Ne0inhk
【Java Web学习 | 第1篇】前端 - HTML

【Java Web学习 | 第1篇】前端 - HTML

文章目录 * Java Web概览 * HTML核心知识点总结 * 一、HTML基础概念🥝 * 1.1 HTML文档基本结构 * 1.2 HTML标签特点 * 二、常用HTML标签🧾 * 2.1 文本标签 * 2.2 链接与图像 * 综合示例 * 2.3 列表标签 * 2.4 表格标签 * 2.5 表单标签 * 三、HTML5新增特性🤔 * 3.1 语义化标签 * 3.2 媒体标签 * 3.3 其他新增特性 * 四、学习资源推荐🐦‍🔥 Java Web概览 HTML核心知识点总结 一、HTML基础概念🥝 1.1

By Ne0inhk
前端多语言别再硬编码!3步搞定i18n让老外也夸你代码香

前端多语言别再硬编码!3步搞定i18n让老外也夸你代码香

前端多语言别再硬编码!3步搞定i18n让老外也夸你代码香 * 前端多语言别再硬编码!3步搞定i18n让老外也夸你代码香 * 开篇先吐槽:还在用if-else判断语言?Out啦 * 到底啥是i18n,别被缩写吓住 * 选对工具真的能少加班,主流方案大乱斗 * i18next:老牌劲旅,生态丰富到怀疑人生 * vue-i18n:Vue亲儿子,丝滑得像德芙 * react-i18next:React界的扛把子 * formatjs:Google出品,必属精品? * 到底怎么选? * 撸起袖子干:从零搭建多语言架构的骚操作 * 文件目录怎么摆?强迫症患者的终极抉择 * JSON资源文件编写规范:key的命名艺术 * 动态加载语言包:别让首屏慢得像蜗牛 * 检测用户语言的几种姿势 * 切换语言时的"瞬移"问题 * 那些让人头秃的深水区:复数、性别和日期格式化 * 复数地狱:俄语和阿拉伯语教你做人 * 性别相关的文案处理 * 时间和数字

By Ne0inhk

【前端高频面试题】 - TypeScript 篇,零基础入门到精通,收藏这篇就够了

【前端高频面试题】 - TypeScript 篇 1. 请解释 TypeScript 是什么?它与 JavaScript 的核心区别是什么? 面试回答需突出 TS 的核心价值(类型安全)和与 JS 的关键差异,结构清晰: * TypeScript 定义:TS 是 JavaScript 的超集(Superset),在 JS 语法基础上增加了静态类型系统,最终会编译为纯 JS 运行(支持所有 JS 环境),核心目标是提升代码可维护性、减少运行时错误。 * 与 JavaScript 的核心区别(分点对比): 1. 类型系统:TS 有静态类型(编译阶段检查类型,变量声明时需指定/推断类型);JS 是动态类型(

By Ne0inhk