STM32__红外避障模块的使用

news2025/7/10 9:03:36

目录

一、红外避障模块 概述

二、直接读取OUT引脚电平

三、使用中断方式触发


一、红外避障模块 概述

引脚解释:

VCC接3.3V 或 5.0V
GND接开发板的GND
OUT数字量输出(0或1); 低电平时表示前方有障碍 ; 通过可调电阻调整检测距离 

产品特点:

工作电压推荐3.3V, 也可以5V
模块功耗23mA~40mA
检测距离<=30cm ; 通过可调电阻调整检测距离 
指示灯电压灯 + 障碍指示灯

模块描述:

1、可以广泛应用于机器人避障、避障小车、流水线计数、黑白线循迹 等众多场合。

2、采用3.3V 或 5V 直流电源对模块进行供电。当电源接通时,电源指示灯点亮;

3、该传感器模块对环境光线适应能力强,其具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收,经过比较器电路处理之后,绿色指示灯会亮起,同时OUT端口持续输出低电平信号(0);

4、检测距离2~30cm,检测角度35°; 检测距离可以通过电位器进行调节,顺时针调电位器,检测距离增加;逆时针调电位器,检测距离减少。

5、传感器是主动红外线反射探测, 因此目标的反射率和形状是探测距离的关键。其中黑色探测距离最小, 白色最大; 小面积物体距离小,大面积距离大。

6、输出端口OUT可直接与单片机IO口连接,使用代码读取OUT电平,或使用中断触发的方式;  另外, OUT引脚也可以直接驱动一个5V继电器;

7、使用前,建议先用螺丝刀调节好需要的触发距离 (绿灯亮),再接入单片机进行开发调试。

8、具有3mm的螺丝孔,便于固定、安装;


二、程序直接读取OUT引脚电平

OUT接口在闲时(没有发现障碍物),是持续的高电平状态;高电平的电压值是供电电压值;

当发现障碍物时,OUT接口将持续地输出低电平,直到障碍物消失时再输出高电平;

因此,我们可以在STM32工程中,直接用代码读取OUT接口的电平,即可知道是否遇到障碍物。

  • 这里以OUT接口,连接PC12引脚为示例;(哪个引脚都可以,只要是空闲的引脚即可)
  • PC12引脚工作模式,无需初始化、设置。因为读电平,不管哪种模式状态下都可以直接读。

在main的while中,编写以下代码即可:

HAL_Delay(500);                                            // 延时间隔

uint8_t state = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_12);      // 读取OUT引脚电平; 只是读引脚电平,用哪个引脚都可以,无需提前初始化
if (state == 0)                                            // 判断 OUT 引脚是否是低电平(闲时高电平,遇到障碍物时持续输出低电平)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);  // 点亮蓝色LED; 引脚PB2, 低电平通路点亮;
    printf("发现障碍物!\r\n");                            // 打印提示信息; printf需要预先使能UART1,并重定向到UART1输出
}
else
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);    // 熄灭蓝色LED; 引脚PB2, 高电平断路熄灭;
}

完成后,位置如下图:

上面的代码,当PC12为低电平时(遇到障碍物):亮灯、printf输出提示信息;


三、使用中断方式触发

上面的读取方式,操作简单、容易理解。

但这种方式有一个潜在隐患:处理可能不及时。

如,当小车高速开跑中,遇到了障碍物,但程序却正在运行其它功能的代码, ......。

小车翻车没啥事,但如果用在工业现场,如电机、导轨等, 那就严重了!

我们可以使用中断触发的方式,发现障碍物,立即进入执行处理!

下面,还是以OUT接口连接PC12作示例,示范CubeMX的中断触发配置、编写回调函数代码。

1、配置引脚的工作模式

  • 点击需要使用的引脚,选择:GPIO_EXTI,即 外部中断模式

2、配置触发方式

  • 根据OUT接口的工作特点,配置为: Interrupt  Falling ,即下降沿触发中断;
  • 设置为上拉,即 闲时引脚电平保持在高电平状态;

3、使能中断线

  • 在 NVIC 中断控制器页面中,打勾对应的中断线,令中断控制器能够响应该中断线,从而使芯片能够接收并处理引脚的电平跳变事件。

引脚编号与中断线对应的关系是:

GPIO_PIN_0EXTI_Line0
GPIO_PIN_1EXTI_Line
GPIO_PIN_2EXTI_Line
GPIO_PIN_3EXTI_Line
GPIO_PIN_4EXTI_Line
GPIO_PIN_5    至  GPIO_PIN_9    共用一个中断线EXTI_Line[9:5]
GPIO_PIN_10  至  GPIO_PIN_15  共用一个中断线EXTI_LineEXTI_Line[15:10]

至此,引脚的中断触发,配置完成,重新生成。

4、编写中断回调函数

CubeMX配置上述中断后,将自动生成底层的初始化、中断服务函数等代码。

当引脚发生了配置中的电平跳变时,将触发硬件自动调用程序里的中断服务函数,继而调用程序里的EXTI中断回调函数:HAL_GPIO_EXTI_Callback ( );

这个回调函数在CubeMX生成时,在stm32xx_hal_gpio.c中已生成了弱定义;

我们在适合的、喜欢的位置,自行重新编写HAL_GPIO_EXTI_Callback函数,即能被中断函数调用到。

我们在main.c的下方,/* USER CODE BEGIN 4 */之下,编写此回调函数:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == GPIO_PIN_12)                               // 由PC12触发
    {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);  // 点亮蓝色LED; 引脚PB2, 低电平通路点亮;
        printf("发现障碍物!\r\n");                            // 打印提示信息; printf需要预先使能UART1,并重定向到UART1输出
    }

}

完成后,位置如下图:

如上,即可实现遇到障碍物时,实时地执行处理。

这里的亮灯、printf,只是示范,你可以替换成需要的执行,如刹车、关闭设备电源等。

5、多次触发的解决思路

当使用中断触发,可能会有一个使用上明显的bug:连续多次触发!

这个bug的产生,是OUT接口输出低电平信号过程中的振铃现象所导致的。

测试了三个不同店家的红外避障模块,有两家模块存在多次触发现象。

物理解决方案:

        在 OUT接口与GND间,并联一个1uF左右的小电容(1uF只是建议,具体得根据现场而定);

代码解决方案:

        在中断回调函数里,增加5ms延时,即HAL_Delay(10ms),让程序刻意“错过”振铃导致的多次触发。这种方式有点像按键的消抖处理。但是,不建议使用这种方式,因为在中断里延时死等,有可能导致其它通信的中断无法及时执行,数据丢包! 如果确定要使用这种方式(在中断里使用HAL_Delay),  注意会产生中断嵌套冲突。需要在CubeMX里修改NVIC的Time base响应优先级,默认是15 (最低),把它修改为0 (最高),然后,把引脚中断线的优先级,默认是0 (最高),修改为大于0的值,如1、6等。这样处理后,在EXTI的中断回调函数里才能使用HAL_Delay函数。

操作如下图:


如有错漏,望指正,将及时更新修改~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis JSON 用id读取content总结(sendCommand())

Redis JSON 读取总结&#xff08;方法 2 - sendCommand()&#xff09; &#x1f4a1; 背景 在 Redis 中&#xff0c;我们存储了 JSON 数据&#xff0c;并希望通过 Jedis sendCommand() 方式读取 JSON 里的 "content" 字段。由于 jedis.jsonGet() 可能在旧版本不支持…

基于3DMax与Vray引擎的轻量级室内场景渲染实践

欢迎踏入3DMAX室内渲染的沉浸式学习之旅!在这个精心设计的实战教程中,我们将携手揭开3DMAX与Vray这对黄金搭档在打造现实室内场景时的核心奥秘。无论您是渴望入门的3D新手,还是追求极致效果的专业设计师,这里都将为您呈现从场景蓝图构建到光影魔法施加的完整技术图谱。我们…

QT Quick(C++)跨平台应用程序项目实战教程 2 — 环境搭建和项目创建

目录 引言 1. 安装Qt开发环境 1.1 下载Qt安装包 1.2 安装Qt 1.3 安装MSVC编译器 2. 创建Qt Quick项目 2.1 创建新项目 2.2 项目结构 2.3 运行项目 3. 理解项目代码 3.1 main.cpp文件 3.2 Main.qml文件 引言 在上一篇文章中&#xff0c;我们介绍了本教程的目标和结…

登山第二十梯:无人机实时自主探索——我是一只小小小鸟

文章目录 一 摘要 二 资源 三 内容 一 摘要 自主探索是无人机 &#xff08;UAV&#xff09; 各种应用的基本问题。最近&#xff0c;基于 LiDAR 的探索因其能够生成大规模环境的高精度点云地图而受到广泛关注。虽然点云本身就为导航提供了信息&#xff0c;但许多现有的勘探方…

word插入Mathtype公式居中和自动更新

word插入公式自动更新 前提&#xff1a;安装Mathtype 1.word中查看页的宽度 出现如下 2.设置样式 出现这个窗口 给样式随便起个名字 3.修改样式 3.1 设置两个制表位 第二个 3.2 修改公式字体 如下所示 4. 修改公式格式 4.1在word中打开 Mathtype 4.2 修改公式的格式 变成…

网络层之IP协议

在讨论传输层时, 我们都只讨论了发送方和接收方的问题, 而没有讨论中间的网络形态的问题. 也就是数据包如何从主机传送到主机的? 如图, 主机B发送数据到主机C, 发送报文需要进行路径选择, 主机B-> F-> G-> H-> C-> D -> 主机C 这条路径是如何被选择出来的?…

基于springboot的旅游网站(013)

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;旅游网站当然也不能排除在外&#xff0c;随着旅游网站的不断成熟&#xff0c;它彻底改变了过去传统的旅游网站方式&#xff0c;不仅使旅游管理…

人工智能 - 在 Spring Boot 中调用 AnythingLLM+DeepSeek 的知识库获取消息接口

整体逻辑: 自建系统的web UI界面调用接口: 1.SpringBoot接口&#xff1a;/anything/chatMessageAnything 2.调用anythingLLM - 调用知识库deepseek r1 . 部署 AnythingLLM DeepSeek 本地知识库 的环境要求如下&#xff1a; 一、硬件要求 CPU 最低&#xff1a;4核&#x…

体育直播模板nba英超直播欧洲杯直播模板手机自适应

源码名称&#xff1a;体育直播模板nba英超直播欧洲杯直播模板手机自适应帝国cms 7.5模板 开发环境&#xff1a;帝国cms7.5 空间支持&#xff1a;phpmysql 带软件采集&#xff0c;可以挂着自动采集发布&#xff0c;无需人工操作&#xff01; 模板特点&#xff1a; 程序伪静态…

STM32-ARM

一、体系架构 ARM里有37个寄存器ALU算数逻辑单元PC程序计数器&#xff1a;指向哪里执行哪里SP栈指针寄存器LR链接寄存器&#xff1a;保存函数入口地址CPSR(current program status register)当前程序状态寄存器&#xff1a;SOSR(CPSR的备份)MMU(内存管理单元)Cache高速缓冲(iCa…

ripro 主题激活 问题写入授权Token失败,可能无文件写入权限

ripro 主题激活 问题 写入授权Token失败&#xff0c;可能无文件写入权限 找到主题下面的functions.php文件&#xff0c;给其他写入权限。就好了。

计算机网络——通信基础和传输介质

物理层任务&#xff1a;实现相邻节点之间比特&#xff08;0或1&#xff09;的传输 到了数据链路层之后&#xff0c;它会以帧为单位&#xff0c;把若干个比特交给物理层&#xff0c;物理层需要把这些比特信息转化成信号&#xff0c;在物理传输媒体上进行传输 通信基础基本概念 信…

python-selenium 爬虫 由易到难

本质 python第三方库 selenium 控制 浏览器驱动 浏览器驱动控制浏览器 推荐 edge 浏览器驱动&#xff08;不容易遇到版本或者兼容性的问题&#xff09; 驱动下载网址&#xff1a;链接: link 1、实战1 &#xff08;1&#xff09;安装 selenium 库 pip install selenium&#…

Execution failed for task ‘:path_provider_android:compileDebugJavaWithJavac‘.

What went wrong: Execution failed for task ‘:path_provider_android:compileDebugJavaWithJavac’. Could not resolve all files for configuration ‘:path_provider_android:androidJdkImage’. Failed to transform core-for-system-modules.jar to match attributes {…

T113-i开发板的休眠与RTC定时唤醒指南

​​在嵌入式系统设计中&#xff0c;休眠与唤醒技术是优化电源管理、延长设备续航的关键。飞凌嵌入式基于全志T113-i处理器开发设计的OK113i-S开发板提供了两种休眠模式&#xff1a;freeze和mem&#xff0c;以满足不同应用场景下的功耗与恢复速度需求。本文将详细介绍如何让OK1…

基于Spring Boot的公司资产网站的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

基于CVX优化器的储能电池调峰调频算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 原理概述 4.2 CVX工具箱概述 5.完整工程文件 1.课题概述 基于CVX优化器的储能电池调峰调频算法matlab仿真。CVX 是一种用于求解凸优化问题的强大工具。凸优化问题具有良好的数学性质&#xff0c;能…

SpringBoot3+Vue3开发学生成绩管理系统

系统介绍 此系统功能包含&#xff1a;首页、课程管理、成绩查询、成绩详情、班级管理、专业管理、用户管理等功能。用户管理又细分为账号管理、学生管理、教师管理、管理员管理。 基础功能包含&#xff1a;登录、退出、修改登录人信息、修改登录人密码。 分为4种角色&#x…

正则魔法:解码 return /^\d+$/.test(text) ? text : ‘0‘ 的秘密

&#x1f680; 正则魔法&#xff1a;解码 return /^\d$/.test(text) ? text : 0 的秘密 &#x1f31f; 嘿&#xff0c;技术探险家们&#xff01;&#x1f44b; 今天我们要破解一段看似简单的代码&#xff1a;return /^\d$/.test(text) ? text : 0。它藏在一个 Vue 前端组件中…

基于BClinux8部署Ceph 19.2(squid)集群

#作者&#xff1a;闫乾苓 文章目录 1.版本选择Ceph版本发布历史目前官方在维护的版本 2.部署方法3.服务器规划4.前置配置4.1系统更新4.2配置hosts cat >> /etc/hosts << EOFssh-keygenssh-copy-id ceph01ssh-copy-id ceph02ssh-copy-id ceph034.5 Python34.6 Syst…