当前位置: 首页 > article >正文

用STM32和HC-SR04做个智能小车避障,代码和接线图都给你准备好了

STM32与HC-SR04构建智能小车避障系统实战指南1. 项目概述与核心组件选型智能小车避障系统是嵌入式开发中极具实用价值的练手项目它能综合考察开发者对传感器数据采集、电机控制和简单算法的掌握程度。这个项目的核心在于如何让小车自主感知环境并做出避障决策而超声波模块HC-SR04正是实现这一功能的经济实惠之选。系统主要组件包括STM32F103C8T6最小系统板Blue Pill性价比极高的ARM Cortex-M3内核控制器L298N电机驱动模块可同时驱动两个直流电机支持PWM调速HC-SR04超声波模块测距范围2cm-400cm精度满足避障需求7.4V锂电池组为电机提供充足动力同时通过降压模块为控制系统供电四轮小车底盘建议选择带有编码器接口的型号以便后期扩展提示初学者常犯的错误是直接使用开发板的5V输出驱动电机这可能导致电源不稳定。正确的做法是单独为电机供电并确保控制信号地线与电机电源地线相连。2. 硬件系统搭建与电路设计2.1 超声波模块布局策略避障效果很大程度上取决于超声波模块的安装位置和数量。对于基础版本建议采用前向双模块布局左模块安装位置小车前部左侧倾斜15°朝外 右模块安装位置小车前部右侧倾斜15°朝外 主模块安装位置小车正前方用于检测正前方障碍物这种布局可以检测约120°范围内的障碍物三个模块的检测范围如下表所示模块位置检测角度最佳检测距离主要用途左前侧15°-45°20-150cm检测左侧障碍正前方-15°~15°10-200cm检测正前方障碍右前侧-45°~-15°20-150cm检测右侧障碍2.2 电路连接详解STM32与各外设的连接需要特别注意信号电平和电流需求。以下是推荐连接方式// GPIO引脚分配示例 #define LEFT_TRIG_PIN GPIO_Pin_0 // PA0 #define LEFT_ECHO_PIN GPIO_Pin_1 // PA1 #define FRONT_TRIG_PIN GPIO_Pin_2 // PA2 #define FRONT_ECHO_PIN GPIO_Pin_3 // PA3 #define RIGHT_TRIG_PIN GPIO_Pin_4 // PA4 #define RIGHT_ECHO_PIN GPIO_Pin_5 // PA5 #define MOTOR_PWM_PIN GPIO_Pin_6 // PA6 (TIM3_CH1)电源部分连接要点使用AMS1117-3.3V为STM32供电L298N的12V输入接锂电池正极HC-SR04的VCC接5V稳压输出所有GND必须共地3. 软件架构与核心算法实现3.1 多超声波模块协同工作传统的单模块轮询方式在避障场景下响应速度不足。我们采用定时器中断触发所有模块同时工作void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3, TIM_IT_Update) ! RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); static uint8_t state 0; switch(state) { case 0: TriggerSensor(LEFT_TRIG_PIN); break; case 1: distance_left GetDistance(LEFT_ECHO_PIN); TriggerSensor(FRONT_TRIG_PIN); break; case 2: distance_front GetDistance(FRONT_ECHO_PIN); TriggerSensor(RIGHT_TRIG_PIN); break; case 3: distance_right GetDistance(RIGHT_ECHO_PIN); ObstacleAvoidance(); state -1; // 重置状态机 break; } state; } }3.2 避障决策算法基于三路超声波数据我们实现了一个带记忆功能的避障算法typedef enum { SAFE, WARNING, DANGER } ObstacleStatus; ObstacleStatus CheckArea(float distance) { if(distance 10.0) return DANGER; else if(distance 30.0) return WARNING; else return SAFE; } void ObstacleAvoidance() { static uint8_t last_direction 0; ObstacleStatus left CheckArea(distance_left); ObstacleStatus front CheckArea(distance_front); ObstacleStatus right CheckArea(distance_right); if(front DANGER) { if(left SAFE right SAFE) { // 随机选择转向方向以避免陷入振荡 if(rand() % 2) TurnLeft(90); else TurnRight(90); } else if(left SAFE) TurnLeft(45); else if(right SAFE) TurnRight(45); else { // 三面都有障碍执行后退转向 MoveBackward(100); Delay_ms(500); TurnLeft(90); } } else if(front WARNING) { ReduceSpeed(50); // 减速通过危险区域 } else { MoveForward(100); // 全速前进 } }4. 系统优化与调试技巧4.1 超声波数据滤波处理原始超声波数据存在波动需要采用合适的滤波算法#define FILTER_WINDOW 5 float MedianFilter(float new_value) { static float buffer[FILTER_WINDOW] {0}; static uint8_t index 0; float temp_buffer[FILTER_WINDOW]; // 更新环形缓冲区 buffer[index] new_value; index (index 1) % FILTER_WINDOW; // 复制到临时数组进行排序 memcpy(temp_buffer, buffer, sizeof(buffer)); // 冒泡排序 for(int i0; iFILTER_WINDOW-1; i) { for(int j0; jFILTER_WINDOW-i-1; j) { if(temp_buffer[j] temp_buffer[j1]) { float temp temp_buffer[j]; temp_buffer[j] temp_buffer[j1]; temp_buffer[j1] temp; } } } // 返回中值 return temp_buffer[FILTER_WINDOW/2]; }4.2 常见问题排查问题1超声波模块偶尔返回极大值解决方案增加超时检测当测量时间超过对应400cm的距离时丢弃该次测量#define TIMEOUT 23200 // 400cm对应的时间值(us) float GetDistance(uint16_t echo_pin) { uint32_t start_time, end_time; // 等待回波信号变高 while(GPIO_ReadInputDataBit(GPIOA, echo_pin) 0); start_time TIM_GetCounter(TIM2); // 等待回波信号变低同时检测超时 uint32_t timeout start_time TIMEOUT; while(GPIO_ReadInputDataBit(GPIOA, echo_pin) 1) { if(TIM_GetCounter(TIM2) timeout) { return 999.9; // 返回无效值 } } end_time TIM_GetCounter(TIM2); return (end_time - start_time) * 0.017; // 换算为cm }问题2电机干扰导致超声波测量不准解决方案在电机电源线上加装104电容滤波测量时短暂停止PWM输出使用独立的5V稳压芯片为超声波模块供电5. 进阶功能扩展5.1 融合红外传感器数据在复杂光照环境下可以增加红外避障传感器作为超声波模块的补充#define IR_LEFT_PIN GPIO_Pin_6 // PA6 #define IR_RIGHT_PIN GPIO_Pin_7 // PA7 void ReadIRSensors() { ir_left GPIO_ReadInputDataBit(GPIOA, IR_LEFT_PIN); ir_right GPIO_ReadInputDataBit(GPIOA, IR_RIGHT_PIN); // 红外传感器通常低电平有效 if(!ir_left) distance_left 5.0; // 强制设为近距离障碍 if(!ir_right) distance_right 5.0; }5.2 实现SLAM基础功能通过记录小车运动轨迹和障碍物位置可以构建简单的环境地图typedef struct { float x; float y; float theta; } Pose; typedef struct { float distance; float angle; uint32_t timestamp; } Obstacle; Pose current_pose {0, 0, 0}; Obstacle obstacles[100]; uint8_t obstacle_count 0; void UpdatePose(float linear, float angular, float dt) { current_pose.theta angular * dt; current_pose.x linear * cos(current_pose.theta) * dt; current_pose.y linear * sin(current_pose.theta) * dt; // 记录障碍物位置 if(obstacle_count 100) { obstacles[obstacle_count].distance distance_front; obstacles[obstacle_count].angle current_pose.theta; obstacles[obstacle_count].timestamp HAL_GetTick(); obstacle_count; } }在实际项目中我发现超声波模块对软质障碍物如窗帘的检测效果较差这时配合红外传感器就能显著提高可靠性。另一个实用技巧是给小车安装一个简单的蜂鸣器在不同避障状态下发出不同频率的提示音这对调试非常有帮助。

相关文章:

用STM32和HC-SR04做个智能小车避障,代码和接线图都给你准备好了

STM32与HC-SR04构建智能小车避障系统实战指南 1. 项目概述与核心组件选型 智能小车避障系统是嵌入式开发中极具实用价值的练手项目,它能综合考察开发者对传感器数据采集、电机控制和简单算法的掌握程度。这个项目的核心在于如何让小车自主感知环境并做出避障决策&…...

G-Helper:华硕笔记本用户的终极轻量级硬件控制方案

G-Helper:华硕笔记本用户的终极轻量级硬件控制方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Exper…...

别再瞎猜了!LaTeX排版时em、ex、pt、px到底该用哪个?一篇讲透所有单位

LaTeX排版单位全指南:从em到px的精准选择策略 在学术写作和科技文档排版领域,LaTeX以其专业精美的输出质量著称。然而,对于初学者而言,面对em、ex、pt、px等多种长度单位时,常常陷入选择困难——图片宽度该用pt还是cm&…...

PX4开环控制避坑指南:为什么你的仿真无人机转圈总失败?从`setpoint_raw`话题到模式切换的深度解析

PX4开环控制避坑指南:为什么你的仿真无人机转圈总失败?从setpoint_raw话题到模式切换的深度解析 当你在Gazebo中启动PX4仿真环境,满怀期待地运行自己编写的开环控制代码,却发现无人机要么拒绝转圈,要么突然坠毁&#…...

3分钟掌握Typora LaTeX主题:用Markdown写出专业学术论文的终极指南

3分钟掌握Typora LaTeX主题:用Markdown写出专业学术论文的终极指南 【免费下载链接】typora-latex-theme 将Typora伪装成LaTeX的中文样式主题,本科生轻量级课程论文撰写的好帮手。This is a theme disguising Typora into Chinese LaTeX style. 项目地…...

AI职业成长地图:软件测试从业者的精准发展路径

在AI技术重塑软件工程生态的当下,软件测试行业正经历从自动化到智能化的范式跃迁。2026年全球AI测试市场规模突破12亿美元,传统测试岗位需求年复合增长率不足2%,而AI测试工程师岗位增幅达45%。对于软件测试从业者而言,构建清晰的A…...

ESP32 OTA升级避坑指南:用Python脚本一键搭建本地服务器,告别手动配置

ESP32 OTA升级实战:Python自动化方案与高频问题破解 当你的ESP32设备部署在难以物理接触的场合——比如嵌入墙体的智能开关、高架桥上的环境监测节点,或是旋转机械内部的振动传感器,固件更新就成了开发者的噩梦。传统烧录器方案需要专人携带设…...

终极科学文库PDF解密完整指南:永久解除CAJViewer限制的3步方案

终极科学文库PDF解密完整指南:永久解除CAJViewer限制的3步方案 【免费下载链接】ScienceDecrypting 破解CAJViewer带有效期的文档,支持破解科学文库、标准全文数据库下载的文档。无损破解,保留文字和目录,解除有效期限制。 项目…...

跨平台流媒体下载神器:N_m3u8DL-RE的完整使用指南

跨平台流媒体下载神器:N_m3u8DL-RE的完整使用指南 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE 你…...

PostgreSQL 13.8 子查询优化实战:手把手教你读懂 `pull_up_sublinks` 源码

PostgreSQL 13.8 子查询优化实战:手把手教你读懂 pull_up_sublinks 源码 数据库查询优化器是数据库系统的核心组件之一,它负责将用户提交的SQL语句转换为高效的执行计划。在PostgreSQL中,子查询优化是查询优化的重要环节,而pull_u…...

C语言变量与运算符详解:从内存管理到高效编程实践

1. 从零到一:为什么C语言是程序员的“内功心法”?如果你刚看完系列的第一篇,对C语言有了一个模糊的印象,觉得它古老、复杂,甚至有点“过时”,那太正常了。我刚开始接触编程时,也这么想。为什么放…...

OpenClaw 中最经典的 6 款skill,真正能进工作流的 skills

2026 开年至今,AI 圈里两个词出镜率最高:龙虾 和 Skill。 龙虾更像一阵风——话题来得快,讨论散得也快;Skill 却在慢慢变成能天天用的东西:装一次,反复省时间。 可惜市面上不少 Skill 推荐文不太耐看&…...

手把手教你用STM32实现国标交流充电桩的CP信号检测(附完整代码)

手把手教你用STM32实现国标交流充电桩的CP信号检测(附完整代码) 在电动汽车充电基础设施快速发展的今天,交流充电桩因其成本优势和广泛适用性成为市场主流。作为嵌入式开发者,理解并实现充电控制导引(CP)信…...

体验 Taotoken 官方价折扣活动对个人开发者月度支出的实际影响

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 体验 Taotoken 官方价折扣活动对个人开发者月度支出的实际影响 作为一名独立开发者,我日常需要调用多种大模型 API 来完…...

【JPCS出版、EI检索稳定】2026年航空航天工程与空天信息国际学术会议(ICAEAI 2026)

2026年航空航天工程与空天信息国际学术会议(ICAEAI 2026)将于2026年6月26-28日在哈尔滨召开。会议旨在为从事航空航天工程与空天信息领域研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术,加强学术研究和探讨&…...

CW32驱动S12SD紫外线传感器:I2C通信、数据解析与嵌入式实践

1. 项目概述与核心需求解析最近在做一个户外环境监测的小玩意儿,需要实时监测紫外线强度,选来选去,最终敲定了S12SD这款紫外线传感器模块。之所以选它,一方面是因为它直接输出数字信号,省去了模拟信号调理的麻烦&#…...

Godot-MCP完整指南:如何用AI助手3倍提升游戏开发效率

Godot-MCP完整指南:如何用AI助手3倍提升游戏开发效率 【免费下载链接】Godot-MCP An MCP for Godot that lets you create and edit games in the Godot game engine with tools like Claude 项目地址: https://gitcode.com/gh_mirrors/god/Godot-MCP Godot-…...

Linux包管理核心:yum机制详解与实战配置指南

1. 项目概述:为什么你需要掌握yum?在Linux的世界里,尤其是以Red Hat、CentOS、Fedora为代表的发行版中,yum(Yellowdog Updater, Modified)是每一位系统管理员和开发者绕不开的核心工具。你可以把它想象成一…...

嵌入式开发调试实战:从内存泄漏到死锁的排查技巧与工具链

1. 项目概述:嵌入式开发的“捉虫”艺术干了十几年嵌入式,从8位单片机玩到多核ARM Cortex-A,从裸机撸到RTOS,我最大的感受就是:嵌入式开发,七分在调试,三分在写码。你代码写得再漂亮,…...

Linux存储管理:块设备与分区表的本质区别及实践指南

1. 项目概述:一次关于存储本质的深度对话“我不是表,我是块设备”——这个标题乍一看有点哲学意味,像是在为某个被误解的实体正名。在Linux的世界里,这恰恰揭示了存储管理中一个最核心、也最容易被混淆的概念关系:分区…...

基于离线语音识别的智能化妆镜DIY:STM32控制与PWM调光调色温实战

1. 项目概述:当化妆镜遇上智能语音作为一名折腾过不少智能家居和嵌入式项目的老玩家,我最近完成了一个特别有意思的改造:把家里那面普普通通的化妆镜,升级成了能听懂人话的智能语音化妆镜灯。这玩意儿听起来好像有点“小题大做”&…...

国产ARM主板实战:从设计选型到性能优化的嵌入式开发指南

1. 项目概述:从“能用”到“好用”的国产ARM主板之路最近几年,如果你关注过硬件开发、嵌入式系统或者国产化替代的圈子,一定会频繁听到“国产ARM主板”这个词。它不再是实验室里的样品,而是越来越多地出现在工业控制、边缘计算、智…...

鸿蒙ArkUI视频播放器开发实战:从AVPlayer到自定义控制与性能优化

1. 项目概述:为什么要在鸿蒙上做视频播放器?最近在捣鼓鸿蒙应用开发,发现社区里关于多媒体处理,特别是视频播放的深度分享还不多。很多开发者拿到Video组件,照着官方Demo跑起来一个播放界面就觉得完事了。但真要把一个…...

STM32F103C8T6驱动BMP280气压模块:从I2C地址纠错到数据转换的完整避坑指南

STM32F103C8T6驱动BMP280气压模块:从I2C地址纠错到数据转换的完整避坑指南 在嵌入式开发中,气压传感器BMP280因其高精度和低成本成为许多项目的首选。然而,当这个看似简单的模块遇上STM32F103C8T6这颗经典的MCU时,不少开发者却踩进…...

Python 中的 @property:像访问属性一样调用方法

# Python 中的 property:像访问属性一样调用方法在写类的时候,我们经常会遇到一个问题: 对象的属性如果可以被随便修改,就可能出现一些不合理的数据。比如一个人的年龄:python class Person:def __init__(self, age)…...

从USB转TTL到RS485:手把手教你用一颗CH342F芯片玩转三种串口通信

CH342F芯片实战指南:一芯三用的串口通信解决方案 在物联网和工业控制领域,串口通信依然是设备间可靠数据传输的基石。面对多样化的接口标准(TTL、RS232、RS485),工程师常常需要准备多种转换模块。而CH342F芯片以其独特…...

企业号码认证服务:实现座机、手机来电显示公司名称+品牌LOGO

在如今的商业环境下,一通没有身份标识的电话,想要敲开客户的大门已经变得越来越难。反诈意识的普及,让人们对陌生呼叫筑起了厚厚的防御墙。许多企业在开展客户回访、售后跟进或业务接洽时,频繁遭遇拒接、秒挂的窘境。投入了大笔的…...

STC15单片机定时器T0配置详解:从1T/12T模式选择到1秒精准定时(附完整代码)

STC15单片机定时器T0配置实战:1秒精准定制的全流程解析 从理论到实践的定时器T0深度探索 在嵌入式系统开发中,定时器功能如同系统的心跳,为各类任务提供精准的时间基准。STC15系列单片机凭借其高性能和丰富的外设资源,成为许多开…...

Windows安卓驱动安装终极解决方案:一键自动化ADB Fastboot工具

Windows安卓驱动安装终极解决方案:一键自动化ADB Fastboot工具 【免费下载链接】Latest-adb-fastboot-installer-for-windows A Simple Android Driver installer tool for windows (Always installs the latest version) 项目地址: https://gitcode.com/gh_mirro…...

3步掌握Open-Lyrics:如何让AI为你的音频自动生成专业字幕

3步掌握Open-Lyrics:如何让AI为你的音频自动生成专业字幕 【免费下载链接】openlrc Transcribe and translate voice into LRC file using Whisper and LLMs (GPT, Claude, et,al). 使用whisper和LLM(GPT,Claude等)来转录、翻译你的音频为字幕文件。 项…...