基于STM32+超声波+舵机雷达测距可视化系统
哈喽大家好,本次分享本人近期完成的嵌入式超声波雷达测距可视化项目。该项目是典型的嵌入式软硬件结合实战案例,融合了传感器采集、舵机伺服控制、串口数据传输、上位机数据可视化等核心知识点,实用性极强,非常适合嵌入式入门进阶学习。
下面我将从项目概述、整体设计思路、硬件搭建、核心代码解析、Python上位机可视化、项目效果与总结几个维度,完整复盘本次项目开发全过程。
一、项目需求与功能概述
1.1 核心需求
本项目旨在实现一套小型简易雷达测距系统,模拟工业雷达障碍物扫描检测功能,具体需求如下:
测距功能:采用超声波模块,实现0.5m ~ 5m精准距离测量,规避近距离盲区与远距离测量失效问题
角度扫描功能:通过舵机水平旋转,完成水平90°范围自动扫描,检测该角度区间内所有障碍物分布情况
数据传输功能:单片机通过串口向上位机实时上报「角度+对应距离」测距数据
可视化功能:Python上位机接收串口数据,实时绘制雷达扫描图并保留扫描轨迹,直观展示障碍物方位与距离
1.2 最终实现效果
设备上电后,舵机带动超声波模块在90°范围内匀速往复扫描,每一个角度对应输出一组精准测距数据,通过串口实时上传。Python上位机动态刷新雷达扇形扫描画面不仅可以清晰显示不同角度、不同距离的障碍物位置,还能全程留存扫描轨迹,完美实现微型雷达的检测可视化效果。
二、项目整体设计思路
本项目采用下位机采集控制 + 上位机可视化的分层架构,整体逻辑清晰、解耦性高,整体流程如下:
2.1 整体架构流程
下位机(STM32单片机):舵机角度精准控制 → 超声波模块触发测距 → 过滤无效测距数据(0.5-5m有效区间)→ 串口打包上传「角度-距离」数据
上位机(Python):串口实时接收数据 → 数据解析校验 → 极坐标转换绘图 → 叠加绘制扫描轨迹 + 实时刷新雷达扫描界面
2.2 核心设计难点与解决方案
难点1:超声波测距不稳定、数据跳动:采用多次测距取平均值+阈值过滤,仅保留0.5-5m有效数据,剔除盲区和超量程无效数据
难点2:舵机扫描卡顿、角度偏移:精准配置PWM波参数,细分角度步进,控制舵机匀速缓慢扫描,避免抖动导致测距偏差
难点3:串口数据乱码、解析错误:采用固定数据帧格式打包上传,上位机按帧解析,做数据校验,保证传输稳定
难点 4:新增轨迹绘制后画面卡顿、轨迹重叠杂乱、刷新闪烁:优化 Python 绘图逻辑,增加轨迹缓存列表,区分实时测距点与历史轨迹线条,采用局部刷新模式,控制轨迹保留时长,兼顾轨迹显示与画面流畅度
三、硬件选型与电路搭建
3.1 硬件清单
主控:STM32F103C8T6
测距模块:HC-SR04超声波测距模块(测距范围2cm-6m)
舵机:SG90微型舵机(0-180°可控)
辅助设备:USB转TTL模块、杜邦线、5V电源
3.2 硬件连接逻辑
1. HC-SR04模块:Trig、Echo引脚分别连接单片机普通GPIO口,用于触发测距和接收回波信号
2. SG90舵机:信号线连接单片机PWM输出引脚,通过定时器PWM输出控制旋转角度
3. 串口电路:单片机USART1串口连接USB转TTL,与电脑上位机建立通信,波特率统一配置为115200
四、下位机核心逻辑解析(STM32)
下位机程序核心实现三大功能:舵机精准角度扫描、超声波稳定测距、串口数据打包上传,下面拆解核心逻辑。
4.1 舵机扫描逻辑
项目需求为水平90°范围扫描,程序中设置舵机从0°~90°正向扫描,扫描完成后反向回扫,循环往复。为保证测距精度,设置较小的角度步进值,每转动一个角度延时稳定后再进行测距,避免舵机抖动导致数据误差。
通过定时器PWM输出控制SG90舵机,不同占空比对应不同旋转角度,精准映射0-90°角度区间,保证扫描角度均匀、无偏移。
4.2 超声波测距逻辑
HC-SR04测距原理:单片机触发Trig引脚输出10us高电平触发信号,模块自动发射8个40KHz超声波信号,遇到障碍物回弹后,Echo引脚输出高电平,高电平持续时间即为超声波往返时间。
测距公式:距离 = 高电平时间 × 声速(340m/s) / 2
为满足项目0.5-5m测距要求,程序中增加数据过滤机制:
距离 < 0.5m:判定为近距离盲区,丢弃无效数据
距离 > 5m:判定为超量程,丢弃无效数据
有效区间内数据:多次采样取平均值,降低数据波动误差
4.3 串口数据上传协议
为方便上位机解析,自定义简单稳定的数据帧格式,避免串口乱码、数据错位问题,帧格式如下:
帧格式:$角度,距离#
示例:$30,1.25# 代表:30°方向,障碍物距离1.25米
单片机每完成一个角度的测距,就通过串口发送一帧数据,保证角度与距离数据一一对应,为上位机可视化提供精准数据源。
五、Python上位机雷达可视化实现
上位机基于Python开发,依赖pyserial实现串口通信,matplotlib实现极坐标雷达绘图,核心功能:实时接收下位机数据、解析角度和距离、动态刷新90°扇形雷达图,同时新增扫描轨迹绘制功能。
5.1 上位机核心流程
初始化串口,匹配下位机波特率115200,打开串口设备
循环读取串口缓冲区数据,按照自定义帧格式解析、校验数据
筛选有效角度(0-90°)和有效距离(0.5-5m)数据
将直角坐标数据转换为极坐标,缓存历史坐标点并绘制连续扫描轨迹,同时绘制扇形雷达扫描图
实时局部刷新画布,动态展示障碍物扫描效果
5.2 可视化效果说明
雷达界面为90°扇形区域,对应硬件扫描范围,画布中不同颜色、亮度区分障碍物距离远近:近距离障碍物显示醒目,远距离障碍物弱化展示,无障碍物区域保持空白,系统会自动记录每一个扫描点位,用线条串联形成完整扫描轨迹,轨迹跟随舵机往复运动动态延伸、刷新,完美还原雷达扫描检测效果。同时界面实时刷新,跟随舵机扫描轨迹动态绘制,动态感极强。
六、项目问题排查与优化方案
开发过程中遇到的典型问题及优化方案,分享给大家避坑:
6.1 测距数据跳动严重
问题原因:超声波单次采样受环境干扰大,噪声数据多
优化:采用5次采样取平均值算法,同时严格过滤0.5m以下、5m以上无效数据,数据稳定性大幅提升
6.2 舵机扫描角度不准、画面错位
问题原因:舵机转动后未延时稳定,立即测距导致角度偏移
优化:每切换一个角度,增加10-20ms延时,等待舵机完全稳定后再触发测距,保证角度与距离一一对应
6.3 上位机画面卡顿、刷新闪烁
问题原因:全局刷新画布,重复绘制冗余内容;新增轨迹功能后,历史点位不断堆积进一步加剧卡顿、轨迹重叠混乱
优化:开启局部刷新模式,设置轨迹缓存队列限制最大点位数量,自动清理老旧轨迹数据,区分实时测距点和历史轨迹图层,既保留扫描路径,又保证画面流畅不闪烁
6.4 串口偶尔丢包、乱码
优化:增加数据帧头帧尾校验,不合法数据直接丢弃,不参与绘图解析,提升系统抗干扰能力
八、项目实操
方便大家复刻项目、对照调试,这里整理了本次项目全程使用的开发软件、各类实操实拍图,包括CubeMX配置界面、核心代码片段、上位机雷达运行效果、开发调试过程素材,直观还原完整开发流程。
8.1 项目开发所用软件工具
本项目全程采用主流嵌入式开发工具,兼容性强、上手简单,新手可直接复刻环境:
STM32CubeMX:STM32图形化配置工具,用于引脚初始化、定时器PWM配置、串口参数配置、时钟树配置,一键生成底层工程代码,无需手动编写底层寄存器配置,大幅降低开发难度。
Keil MDK5:嵌入式编译调试工具,用于编写超声波测距、舵机控制、串口传输的业务代码,实现程序编译、下载、在线调试、日志查看等功能。
Python:上位机开发工具,安装pyserial、matplotlib库,完成串口数据接收、数据解析、雷达极坐标绘图功能开发。
串口助手:辅助调试工具,用于实时监控下位机上传的「角度+距离」数据,校验数据传输是否正常、排查丢包、乱码等串口问题。
8.2 核心实操展示
8.2.1 STM32CubeMX配置
本次项目所有底层硬件配置均通过STM32CubeMX完成,主要配置内容包含:主控时钟配置、舵机PWM定时器通道配置、超声波GPIO输入输出引脚配置、串口1波特率115200参数配置。通过图形化界面精准配置硬件参数,从根源避免引脚冲突、参数配置错误等问题,是项目稳定运行的基础。
8.2.2 下位机核心代码实拍
包含项目三大核心业务代码片段:SG90舵机角度扫描控制代码、HC-SR04超声波测距采集与数据过滤代码、串口数据帧打包上传代码。代码严格遵循模块化开发思路,逻辑清晰,包含数据滤波、无效值剔除、角度延时稳定等优化逻辑,完美适配0.5-5m测距、90°扫描的项目需求。
8.2.3 Python上位机雷达效果展示图
实拍上位机实时运行的雷达可视化界面,完整呈现90°扇形扫描区域。界面可动态跟随舵机扫描轨迹刷新,精准标注不同角度的障碍物距离信息,近距离、远距离障碍物区分清晰,无障碍物区域空白显示,完全复刻微型雷达的扫描可视化效果,数据同步实时、无延迟、无画面闪烁问题。
8.2.4 项目调试答疑
项目开发过程中,针对测距数据跳动、舵机角度偏移、串口乱码、上位机画面卡顿等疑难问题,实操踩坑+针对性解决,快速积累项目调试经验,规避同类问题。
例如解决多根线需要五伏的问题:将link的五伏的线接在面包板上的正极,其他需要五伏的线就可以接在那一条正极的位置上3。
七、项目总结与拓展方向
7.1 项目总结
本项目完整实现了90°水平超声波雷达扫描测距+Python上位机可视化的全部需求,成功达成0.5-5m精准测距、障碍物方位检测、雷达图动态显示的核心功能。
项目覆盖嵌入式开发高频知识点:GPIO输入输出采集、定时器PWM舵机控制、超声波传感器驱动、串口通信协议自定义、Python串口开发、数据可视化绘图,是非常优质的嵌入式软硬件综合实战项目,适合课程设计、期末项目、入门进阶练手。
7.2 功能拓展方向
拓展1:可增加报警功能,检测到近距离障碍物触发蜂鸣器报警
拓展2:可将90°扫描升级为180°全角度扫描,实现全方位雷达检测
拓展3:可增加数据存储功能,保存扫描记录,实现历史数据回看
拓展4:可优化上位机界面,增加距离数值显示、扫描速度调节、量程切换功能
拓展5:可移植至ESP32,实现无线串口传输,摆脱有线束缚
九、写在最后
这个项目整体难度适中,逻辑清晰,没有复杂的算法,重点在于软硬件时序配合、数据过滤优化、串口协议解析,非常适合新手理解嵌入式“下位机采集+上位机展示”的经典开发模式。
小伙伴可以点赞收藏关注,有任何项目问题、代码调试问题欢迎评论区交流,一起学习进步!
本项目由章怡然与何依依共同完成,其中章怡然负责核心代码实现,3D外壳打印,何依依负责需求分析与文档攥写,参与代码设计。
