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

Python开篇:撬动未来的万能钥匙 —— 从入门到架构的全链路指南

Python开篇:撬动未来的万能钥匙 —— 从入门到架构的全链路指南

Python:撬动未来的万能钥匙——从入门到架构的全链路指南 在技术的星空中,Python 是那颗永不陨落的超新星——它用简洁的语法点燃创造之火,以庞大的生态铺就革新之路。无论你身处哪个领域,这把钥匙正在打开下一个时代的大门。2024 年 TIOBE 指数显示,Python 连续五年稳居编程语言榜首,其开发者社区规模同比增长 42%,成为全球技术变革的核心驱动力。 前言     Python以其简洁优雅的语法和强大的通用性,成为当今最受欢迎的编程语言。本专栏旨在系统性地带你从零基础入门到精通Python核心。无论你是零基础小白还是希望进阶的专业开发者,都将通过清晰的讲解、丰富的实例和实战项目,逐步掌握语法基础、核心数据结构、函数与模块、面向对象编程、文件处理、主流库应用(如数据分析、Web开发、自动化)以及面向对象高级特性,最终具备独立开发能力和解决复杂问题的思维,高效应对数据分析、人工智能、Web应用、自动化脚本等广泛领域的实际需求。 🥇 点击进入Python入门专栏,Python凭借简洁易读的语法,是零基础学习编程的理想选择。本专栏专为初学者设计,系统讲解Python核

By Ne0inhk
深入理解 Python HTTP 请求:从基础到高级实战指南

深入理解 Python HTTP 请求:从基础到高级实战指南

目录 * 深入理解 Python HTTP 请求:从基础到高级实战指南 * 章节1:HTTP 协议基础与 Python 生态概览 * HTTP 的核心概念 * Python HTTP 库生态 * 章节2:Requests 库实战:从简单的 GET 到复杂的 API 交互 * 2.1 发送 GET 请求与参数处理 * 2.2 处理 POST 请求与数据提交 * 2.3 必不可少的 Headers 与 Session * 章节3:高级话题:异常处理、超时控制与性能优化 * 3.1 异常处理 (Error Handling) * 3.

By Ne0inhk
全网最全!Python、PyTorch、CUDA 与显卡版本对应关系速查表

全网最全!Python、PyTorch、CUDA 与显卡版本对应关系速查表

摘要:搞深度学习,最痛苦的不是写代码,而是配环境! “为什么我的 PyTorch 认不出显卡?” “新买的显卡装了旧版 CUDA 为什么报错?” 本文提供一份保姆级的版本对应关系速查表,涵盖从 RTX 50 系列 (Blackwell) 到经典老卡的软硬件兼容信息。建议收藏保存,每次配环境前查一下,能省下大量的排坑时间! 🗺️ 核心逻辑图解 在看表格前,先理清显卡架构的代际关系与 CUDA 版本的强绑定逻辑。 📊 一、PyTorch 版本对照表 (推荐) PyTorch 是目前兼容性最好的框架,只要 CUDA 驱动版本 足高,通常都能向下兼容。对于使用最新硬件(如 RTX 50 系)的用户,请务必使用 2.4 或更高版本。 PyTorch 版本Python 版本推荐 CUDA适用显卡建议2.

By Ne0inhk