红外跟随避障模块详解

在智能车、机器人和自动化等领域避障技术是确保安全和高效运行的关键。红外避障模块作为一种常见的避障解决方案,因其非接触、响应速度快和抗干扰能力强等优点而备受青睐。本文将详细介绍红外避障模块的特点、工作原理、以及应用案例,帮助您更好地了解这一技术。

我们在之前的教程中还介绍了红外避障模块的“兄弟”——循迹模块,两者相似,大家可以一起看看【循迹模块连接】

1. 源码下载及前置阅读

本文首发 良许嵌入式网 :https://www.lxlinux.net/e/ ,欢迎关注!

本文所涉及的源码及安装包如下(由于平台限制,请点击以下链接阅读原文下载):

https://www.lxlinux.net/e/stm32/ia-tutorial.html

如果你是嵌入式开发小白,那么建议你先读读下面几篇文章。

  • 手把手让你掌握MDK的使用方式和技巧,助你更高效地进行开发:【一文教你使用MDK开发工具:https://www.lxlinux.net/e/stm32/mdk-development-tool-tutorial.html】
  • 通俗易懂的 GPIO 介绍与实践:【如何快速成为点灯大师?:https://www.lxlinux.net/e/stm32/stm32-gpio-hal.html】
  • 了解不同的下载程序方法,为你的嵌入式开发提供更多选择:【STM32下载程序的五种方法:https://www.lxlinux.net/e/stm32/five-ways-to-flash-program-to-stm32.html】

往期教程,有兴趣的小伙伴可以看看。

  • 让你轻松掌握温湿度传感器:【手把手教你玩转DHT11(原理+驱动):https://www.lxlinux.net/e/stm32/dht11-tutorial.html】
  • ESP8266详解,助你成为物联网应用的专家:【手把手教你玩转ESP8266(原理+驱动):https://www.lxlinux.net/e/stm32/esp8266-tutorial.html】
  • 蓝牙模块详解,轻松掌握一种无线通信技术:【手把手教你玩转蓝牙模块(原理+驱动):https://www.lxlinux.net/e/stm32/bluetooth-turorial.html】
作者简介
大家好,我是良许,博客里所有的文章皆为我的原创。
下面是我的一些个人介绍,欢迎交个朋友:
· 211工科硕士,国家奖学金获得者;
· 深耕嵌入式11年,前世界500强外企高级嵌入式工程师;
· 书籍《速学Linux作者》,机械工业出版社专家委员会成员;
· 全网60W粉丝,博客分享大量原创成体系文章,全网阅读量累计超4000万;
· 靠自媒体连续年入百万,靠自己买房买车。

我本科及硕士都是学机械,通过自学成功进入世界500强外企。我已经将自己的学习经验写成了一本电子书,超千人通过此书学习并转行成功。现在将这本电子书免费分享给大家,希望对你们有帮助:

电子书链接:https://www.lxlinux.net/1024.html

2. 模块介绍

2.1 型号介绍

红外避障模块不断发射红外信号,当红外信号:

  1. 有反射回来,OUT 输出低电平,输出指示灯(绿灯)亮。
  2. 没反射回来,OUT 输出高电平,输出指示灯(绿灯)灭。

红外避障模块常见用途:

  1. 机器人避障
  2. 小车避障、跟随
  3. 流水线计数
  4. 黑白线循迹

2.2 工作参数及引脚介绍

红外避障模块工作参数:

  • 工作电压:DC 3.3 ~ 5V
  • 工作温度:-10°C ~ +50°C
  • 检测角度:35°
  • 检测距离:2 ~ 30 CM可调(不同厂家略有差异),距离越近性能越稳定。

模块中蓝色的电位器用于调节灵敏度,顺时针旋转,灵敏度变高,检测距离变长;逆时针越小,灵敏度变低,检测距离变短。

上电后电源指示灯(绿灯)亮。

当红外反射回来,OUT 输出低电平,输出指示灯(绿灯)亮。

接线如下:

红外避障模块STM32备注
VCC3.3/5V电源正极
GNDGND电源负极
OUT任意 GPIO 口数字输出

3. 红外避障模块工作原理

红外避障模块上的一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物时,红外线反射回来被接收管接收,经过比较器(LM393)电路处理之后,信号输出接口输出低电平信号,同时绿色指示灯会亮起。

因为黑色能够吸收红外线(红外线不反射),而白色不行(红外线反射),所以除了避障外可用作黑白线循迹、光电开关等等。

4. 通信示意图

实现目标:我们有一个三色 LED 灯,当模块面前出现障碍物时,红灯亮,绿灯灭;没有障碍物时,红灯灭,绿灯亮。

这个小案例的应用场景可以应用在工业自动化,当物体或人在禁止区域或危险区域时,红灯亮起以提醒离开此区域。

5. 编程实战

5.1 硬件接线

本教程使用的硬件如下:

  • 单片机:STM32F103C8T6
  • 红外避障模块
  • 小灯:三色 LED 灯模块
  • 烧录器:ST-LINK V2

接线如下:

红外避障模块STM32
VCC5V
GNDG
OUTA4

烧录的时候接线如下表,如果不会烧录的话可以看我之前的文章【STM32下载程序的五种方法:https://www.lxlinux.net/e/stm32/five-ways-to-flash-program-to-stm32.html】。

ST-Link V2STM32
SWCLKSWCLK
SWDIOSWDIO
GNDGND
3.3V3V3

接好如下图:

开发板使用的是我们自绘的板子。大家也可以用自己的板子,只要是 STM32F103C8T6 主控芯片就行。

5.2 LED初始化

LED 灯,我们的老朋友了,不多介绍了。

void led_init(void)
{GPIO_InitTypeDef gpio_init_struct;LED1_GPIO_CLK_ENABLE();                                 /* LED1时钟使能 */LED3_GPIO_CLK_ENABLE();                                 /* LED3时钟使能 */gpio_init_struct.Pin = LED1_GPIO_PIN;                   /* LED1引脚 */gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */HAL_GPIO_Init(LED1_GPIO_PORT, &gpio_init_struct);       /* 初始化LED1引脚 */gpio_init_struct.Pin = LED3_GPIO_PIN;                   /* LED3引脚 */HAL_GPIO_Init(LED3_GPIO_PORT, &gpio_init_struct);       /* 初始化LED3引脚 */LED1(0);                                                /* 关闭 LED1 */LED3(0);                                                /* 关闭 LED3 */
}

LED 的 .h文件:

#ifndef _LED_H
#define _LED_H
#include "sys.h"/******************************************************************************************/
/* 引脚 定义 */#define LED1_GPIO_PORT                  GPIOA
#define LED1_GPIO_PIN                   GPIO_PIN_5
#define LED1_GPIO_CLK_ENABLE()          do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)             /* PA口时钟使能 */#define LED3_GPIO_PORT                  GPIOA
#define LED3_GPIO_PIN                   GPIO_PIN_7
#define LED3_GPIO_CLK_ENABLE()          do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)             /* PA口时钟使能 *//******************************************************************************************/
/* LED端口定义 */
#define LED1(x)   do{ x ? \HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_SET) : \HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET); \}while(0)#define LED3(x)   do{ x ? \HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_SET) : \HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_RESET); \}while(0)/* LED取反定义 */
#define LED1_TOGGLE()   do{ HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_GPIO_PIN); }while(0)        /* 翻转LED1 */
#define LED3_TOGGLE()   do{ HAL_GPIO_TogglePin(LED3_GPIO_PORT, LED3_GPIO_PIN); }while(0)        /* 翻转LED3 *//******************************************************************************************/
/* 外部接口函数*/
void led_init(void);                                                                            /* LED初始化 */#endif

5.3 红外模块初始化

初始化一下循迹模块的 OUT 引脚。

我们采用中断的方式亮灯,需要初始化和使能一下 EXTI。

void ia_init(void)
{GPIO_InitTypeDef gpio_initstruct;IA_CLK();                                               /* IO口时钟使能 */gpio_initstruct.Pin = IA_PIN;                           /* OUT引脚 */gpio_initstruct.Mode = GPIO_MODE_IT_RISING_FALLING;     /* 中断沿触发 */gpio_initstruct.Pull = GPIO_NOPULL;                     /* 无电阻 */HAL_GPIO_Init(IA_GPIO, &gpio_initstruct);               /* 初始化OUT引脚 */HAL_NVIC_SetPriority(EXTI4_IRQn,2,0);                   /* 抢占优先级2,响应优先级0 */HAL_NVIC_EnableIRQ(EXTI4_IRQn);                         /* 使能EXTI4 */
}

5.4 红外模块控制灯

复写「HAL_GPIO_EXTI_Callback」函数,检测中断沿,下降沿表示循迹模块感受到有障碍,「iaflag」置1;上降沿表示循迹模块感受到无障碍,「iaflag」置0。

uint16_t iaflag;uint16_t get_iaflag(void)
{return iaflag;
}void set_iaflag(uint16_t value)
{iaflag = value;
}void EXTI4_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);         /* 调用中断处理公用函数 清除中断线 的中断标志位 */__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);         /* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == IA_PIN){if(HAL_GPIO_ReadPin(IA_GPIO, IA_PIN) ==  GPIO_PIN_SET)                  //如果无障碍{set_iaflag(0);}if(HAL_GPIO_ReadPin(IA_GPIO, IA_PIN) ==  GPIO_PIN_RESET)                //如果有障碍{set_iaflag(1);}}
}

5.5 主函数

主函数如下:

依据「iaflag」,为1时表示有障碍,红灯亮,绿灯灭;为0时表示无障碍,绿灯亮,红灯灭。

int main(void)
{HAL_Init();                         /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();                         /* LED初始化 */ia_init();                          /* 红外模块初始化 */while(1){if (get_iaflag())                                                           //有障碍时,红灯亮,绿灯灭{HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_SET);HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_RESET);}else{                                                                      //无障碍时,绿灯亮,红灯灭HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_SET);HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET);}}
}

5.6 运行效果

当模块面前没有障碍物时,红灯灭,绿灯亮。

出现障碍物时,红灯亮,绿灯灭。

6. 小结

随着科技的不断进步,红外避障模块将继续创新和发展,为自动化等领域带来更多可能性。未来,我们期待红外避障模块在智能交通、医疗机器人、智能家居等领域发挥更大的作用,提升生活的便捷性和安全性。希望本文能够帮助您对红外避障模块有更全面的了解,并激发您对该技术的兴趣。感谢各位看官,peace and love!

另外,想进大厂的同学,一定要好好学算法,这是面试必备的。这里准备了一份 BAT 大佬总结的 LeetCode 刷题宝典,很多人靠它们进了大厂。

刷题 | LeetCode算法刷题神器,看完 BAT 随你挑!

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

推荐阅读:

  • 程序员必备编程资料大全
  • 程序员必备软件资源

欢迎关注我的博客:良许嵌入式教程网,满满都是干货!

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

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

相关文章

【0x3D】HCI_Remote_Host_Supported_Features_Notification事件详解

目录 一、事件概述 二、事件格式及参数说明 2.1. HCI_Remote_Host_Supported_Features_Notification事件格式 2.2. BD_ADDR 2.3. Remote_Host_Supported_Features 三、事件作用 3.1. 设备特性沟通与理解 3.2. 功能协商与性能优化 3.3. 设备管理与配置更新 四、应用场…

开发中使用UML的流程_08 PIM-4:定义操作及方法

目录 1、序列图概述 2、序列图调用方式 3、创建消息与销毁消息 4、几项建议 1、序列图概述 在PIM-4中,系统分析员可以用序列图来表达,系统内部一群对象合力完成某一个系统用例时,执行期间的交互情形。之后,序列图可能通过设计…

Unity 设计模式-策略模式(Strategy Pattern)详解

策略模式(Strategy Pattern)是一种行为型设计模式,定义了一系列算法,并将每种算法封装到独立的类中,使得它们可以互相替换。策略模式让算法可以在不影响客户端的情况下独立变化,客户端通过与这些策略对象进…

空间异质性数据分析不再复杂:地理加权回归分析、主成分分析、判别分析、分位数回归分析、线性回归等

目录 专题一 地理加权回归下的描述性统计学 专题二 地理加权主成分分析 专题三 地理加权回归 专题四 高级回归与回归之外 更多了解 在自然和社会科学领域有大量与地理或空间有关的数据,这一类数据一般具有严重的空间异质性,而通常的统计学方法并不能…

【spring mvc】全局处理请求体和响应体

目录 说明实现效果逻辑图 实现步骤创建公共处理的请求和响应的类api接口测试前端请求响应结果 扩展Response响应格式实体ResponseCode 响应状态码RSA工具类 RequestBodyAdvice 介绍使用场景 ResponseBodyAdvice 介绍使用场景 说明 由于项目中需要进行加密传输数据提高项目安全…

【计算机网络】实验8:聚合了不存在的网络导致的路由环路问题

实验 8:聚合了不存在的网络导致的路由环路问题 一、 实验目的 聚合了不存在的网络导致的路由环路问题。 网络故障导致的路由环路问题。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、聚合了不存在的网络导致的路由环路问题 (1) 第一步&am…

【Leetcode】189.轮转数组

题目链接: 189.轮转数组 题目描述: 解题思路: 要想实现数组元素向右轮转k个位置,可是将数组三次反转来实现 以 nums [1,2,3,4,5,6,7], k 3 为例,最终要得到[5,6,7,1,2,3,4]: 第一次反转:将整个数组反转…

设计模式c++(二)

文章目录 十三、门面模式_Facade十四、代理模式_Proxy十五、适配器_Adapter十六、中介者_Mediator十七、状态模式_State十八、备忘录_Memento十九、组合模式_Composite二十、迭代器_Iterator二十一、职责链_Chain Of Resposibility二十二、命令模式_Command二十三、访问器_Vist…

shell 3 脚本参数传递与数字运算(泷羽sec)

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面,了解网络安全领域的见闻,了…

jvm优化策略都有哪些

1. 堆内存(Heap Memory)优化: • 调整堆大小:通过-Xms和-Xmx参数设置JVM初始堆大小和最大堆大小,以确保JVM在启动时拥有足够的内存,并在需要时能够扩展到最大容量。 • 堆分区调整:调整年轻代&a…

使用ensp搭建内外互通,使用路由跨不同vlan通信。

1.网络拓扑图 2.规则 (1)允许 (自己)ping通内外网,内外网随便一个pc就可以. (2) 允许(电信)ping通内外网,内外网随便一个pc就可以 (时间问题不做…

Flink 中维表 Join 的实现方式与优化策略

目录 一、维表介绍 二、预加载维表 (一)实现方式 (二)优缺点 (三)改进尝试与局限 三、使用本地缓存(HashMap)加载维表 (一)实现方式 第一版 第二版 …

详解八大排序(六)------(三路划分,自省排序,归并排序外排序)

文章目录 1. 快排之三路划分1. 1 三路划分的诞生由来1. 2 三路划分的具体思路1. 3 代码实现 2. 快排之自省排序2. 1 自省排序的目的2. 2 自省排序的思路2. 3 自省排序的实现代码 3. 归并排序外排序3. 1 外排序介绍3. 2 归并排序外排序的思路3. 3 归并排序的实现代码 1. 快排之三…

【Redis篇】 List 列表

在 Redis 中,List 是一种非常常见的数据类型,用于表示一个有序的字符串集合。与传统的链表结构类似,Redis 的 List 支持在两端进行高效的插入和删除操作,因此非常适合实现队列(Queue)和栈(Stack…

计算机视觉——相机标定(Camera Calibration)

文章目录 1. 简介2. 原理3. 相机模型3.1 四大坐标系3.2 坐标系间的转换关系3.2.1 世界坐标系到相机坐标系3.2.2 相机坐标系到图像坐标系3.2.3 像素坐标系转换为图像坐标系3.2.4 世界坐标转换为像素坐标 3.3 畸变3.3.1 畸变类型3.3.1.1 径向畸变(Radial Distortion&a…

【C++】刷题强训(day12)--删除公共字符、两个链表的第一个公共节点、mari和shiny

目录 1、删除公共字符 1.2 思路 1.3 代码实现 2、两个链表的公共节点 2.1 题目 2.2 思路 2.3 代码实现 方法一:对齐 方法二:公共端点法 3、mari和shiny 3.1 题目 3.2 思路 3.3 代码实现 刷题汇总:传送门! 1、删除公共…

运费微服务和redis存热点数据

目录 运费模板微服务 接收前端发送的模板实体类 插入数据时使用的entity类对象 BaseEntity类 查询运费模板服务 新增和修改运费模块 整体流程 代码实现 运费计算 整体流程 总的代码 查找运费模板方法 计算重量方法 Redis存入热点数据 1.从nacos导入共享redis配置…

汽车IVI中控开发入门及进阶(三十六):QML调用蓝牙sdk的架构

Qt/QML本身在做GUI界面工程时,除了各种界面上的按钮、图片、工具条等元素之外,最方便的就是可以通过C++实现界面各种复杂逻辑,而实现上不可避免就需要一些外部库的支持,不管是静态库.a还是动态库.so,比如蓝牙模块。 而QML/C++启动一个蓝牙协议栈SDK作为一个进程,然后启动…

Hbase整合Mapreduce案例1 hdfs数据上传至hbase中——wordcount

目录 整合结构准备java API 编写pom.xmlMain.javaMap.javaReduce 运行 整合结构 准备 上传hdfs data.txt数据 data.txt I am wunaiieq QAQ 123456 Who I am In todays interconnected world the role of technology cannot be overstated It has revolutionized the way we …

OpenVas安装步骤及报错问题

安装步骤 1、更新系统 apt update && apt upgrade && apt dist-upgrade 2、安装openvas apt-get install openvas 3、初始化 gvm-setup 报错问题 一、安装gvm-setup报错 ERROR: The default postgresql version(14) is not 17 req…