一起玩儿物联网人工智能小车(ESP32)——44. 利用红外测距模块GP2Y0E03实现避障小车

摘要:本文介绍使用红外测距模块GP2Y0E03实现避障小车

在前边已经介绍了两种非接触测距的办法,分别是超声波测距和激光测距,在这里,再介绍另一种常用的测距传感器——红外测距传感器。红外测距的工作原理是,利用红外信号与障碍物距离的不同反射强度也不同的原理,进行障碍物远近的检测。红外测距传感器具有一对红外信号发射与接收二极管,发射管发射特定频率的红外信号,接收管接收这种频率的红外信号,当红外的检测方向遇到障碍物时,红外信号反射回来被接收管接收,经过处理之后,通过数字传感器接口返回到检测设备,检测设备即可利用红外的返回信号来识别周围环境的变化。

本次使用的红外测距模块依然是使用的IIC总线通信协议,这个模块的测量范围是4~50厘米,用在避障小车上应该是足够了,但需要注意的是,当与被测物体距离小于4厘米时,红外模块可能会返回一个不正确的结果,因此在设计和使用这个红外测距模块的时候,要避免与被测物体的距离小于4厘米。另外需要注意的是,红外测距的一个缺点就是可能会受环境中的其他红外线的干扰,不适合阳光直射的地方,不过在室内使用的话问题不大。

下图就是这次使用的红外测距模块。

红外测距模块GP2Y0E03的特征如下:

  1. 内置信号处理电路的红外LED和CMOS图像传感器
  2. 测距范围:4到50厘米
  3. 低电压运行:最小2.7V
  4. 紧凑尺寸(16.7×11.0×5.2mm)
  5. 高精度测量
  6. 数字(IIC)/模拟输出类型

其引脚定义如下:

序号

标识

用途

1

VDD

电源正极。2.7V~5.5V

2

Vout(A)

模拟电压输出

3

GND

电源负极。

4

VIN(IO)

IO口供电电压

5

GPIO1

片选信号输入端

6

SCL

IIC时钟线

7

SDA

IIC数据线

这个红外测距模块比之前的PCF8574模块要复杂一些,因此在使用IIC协议驱动红外测距仪进行测距操作时,也要复杂一些了。在GP2Y0E03内部有一系列的寄存器,这些寄存器用来保存着与外部设备相交互的数据,当外部设备需要读写某个寄存器的数据时,需要先发送该寄存器的地址,然后再接收或者发送数据。

在使用GP2Y0E03红外测距模块进行测量的时候,主要涉及到了以下几个寄存器。

地址

名称

寄存器有效位

缺省值

含义

0x35

移位数量

[2:0]

0x02

1:返回结果最大值128cm

2:返回结果最大值64cm

0x5E

测量距离[11:4]

[7:0]

测量结果高位

0x5F

测量距离[3:0]

[3:0]

测量结果低位

最后的测量距离为:(测量结果高位*16+测量结果低位)/16/2^n

其中n为移位数量。

在这里只是列举了与读取测量结果相关的几个寄存器,如果相看更多的寄存器,请参考官方的datasheet文档。

接下来就把这个红外测距模块与ESP32开发板连接到一起,具体的连接方法如下:

序号

GP2Y0E03模块

ESP32开发板模块

1

VDD

+3.3V

2

Vout(A)

3

GND

GND

4

VIN(IO)

+3.3V

5

GPIO1

+3.3V

6

SCL

P22

7

SDA

P21

下面就打开“Arduino IDE”软件,看一下读取红外测距模块测量数据的详细程序。如下所示:

#include <Wire.h>

int distance = 0;                // 保存测量结果 

byte high, low = 0;              // 测量结果的高位和低位

int shift = 0;                   // 移位数量

#define ADDRESS       0x40   // 测距模块IIC地址

#define DISTANCE_REG  0x5E

#define SHIFT         0x35

void setup()

{

  // 初始化

  Wire.begin();

  Serial.begin(115200);

 

  delay(50); 

 

  // 读取移位寄存器的数值

  Wire.beginTransmission(ADDRESS);    

  Wire.write(SHIFT);

  Wire.endTransmission();

 

  Wire.requestFrom(ADDRESS, 1);

  while(Wire.available() == 0);

  shift = Wire.read();

}

void loop()

{

  // 请求2个字节的测量结果

  Wire.beginTransmission(ADDRESS);

  Wire.write(DISTANCE_REG);

  Wire.endTransmission();

 

  Wire.requestFrom(ADDRESS, 2);

 

  while(Wire.available() < 2);

 

  high = Wire.read();

  low = Wire.read();

 

  distance = (high * 16 + low)/16/(int)pow(2,shift); // 计算结果,单位厘米

 

  Serial.print("距离是:");

  Serial.print(distance);

  Serial.println("厘米");

 

  delay(50);

}

在上面的程序中,每次读取GP02Y0E03红外测距模块寄存器内的数据之前,都要先发送多要读取的寄存器的地址,然后再请求相应的数据。

编译、上传程序,运行的结果如下:

好了,关于红外测距模块就介绍到这里了,你是不是可以把读取数据的代码封装到一个函数中,然后替换之前小车的测距函数,然后用红外测距模块实现自动避障功能了呢?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HuoCMS|免费开源可商用CMS建站系统HuoCMS 2.0下载(thinkphp内核)

HuoCMS是一套基于ThinkPhp6.0Vue 开发的一套HuoCMS建站系统。 HuoCMS是一套内容管理系统同时也是一套企业官网建设系统&#xff0c;能够帮过用户快速搭建自己的网站。可以满足企业站&#xff0c;外贸站&#xff0c;个人博客等一系列的建站需求。HuoCMS的优势: 可以使用统一后台…

数学建模--Radar图绘制

1.Radar图简介 最近在数学建模中碰见需要绘制Radar图(雷达图)的情况来具体分析样本的各个特征之间的得分与优劣关系&#xff0c;这样的情况比较符合雷达图的使用场景&#xff0c;一般来说&#xff0c;雷达图适用于展示多个维度的数据&#xff0c;并在一个平面上直观地呈现出不同…

前端每日一练 “文字穿透效果”

前言 我都不知道用什么样的词来描述这个效果&#xff0c;反正你看吧&#xff01;这个效果看上去很简单&#xff0c;但是一旦实现起来你会发现也不复杂&#xff0c;废话不多说直接上源码&#xff0c;喜欢的点个关注、留个免费的 html源码 <!DOCTYPE html> <html>&…

13.8.1异步、异步、异步 Page720~721

#include <iostream> #include <thread> #include <future>using namespace std;///定时炸弹第一波 void sync_sleep(int s) {cout << "sync_sleep----不使用异步" << endl;///启动定时this_thread::sleep_for(chrono::seconds(s)); /…

《WebKit 技术内幕》学习之十(2): 插件与JavaScript扩展

2 Chromium PPAPI插件 2.1 原理 插件其实是一种统称&#xff0c;表示一些动态库&#xff0c;这些动态库根据定义的一些标准接口可以跟浏览器进行交互&#xff0c;至于这个标准接口是什么都可以&#xff0c;重要的是大家都遵循它们&#xff0c;NPAPI接口标准只是其中的一种&a…

FastDFS分布式文件存储

为什么会有分布式文件系统&#xff1f; 分布式文件系统是面对互联网的需求而产生。因为互联网时代要对海量数据进行存储。很显然靠简单的增加硬盘个数已经满足不了我们的要求。因为硬盘传输速度有限但是数据在急剧增长&#xff0c;另外我们还要要做好数据备份、数据安全等。采用…

初识k8s(概述、原理、安装)

文章目录 概述由来主要功能 K8S架构架构图组件说明ClusterMasterNodekubectl 组件处理流程 K8S概念组成PodPod控制器ReplicationController&#xff08;副本控制器&#xff09;ReplicaSet &#xff08;副本集&#xff09;DeploymentStatefulSet &#xff08;有状态副本集&#…

6 时间序列(不同位置的装置如何建模): GRU+Embedding

很多算法比赛经常会遇到不同的物体产生同含义的时间序列信息&#xff0c;比如不同位置的时间序列信息&#xff0c;风力发电、充电桩用电。经常会遇到该如此场景&#xff0c;对所有数据做统一处理喂给模型&#xff0c;模型很难学到区分信息&#xff0c;因此设计如果对不同位置的…

【Linux】常见指令(一)

前言: Linux有许多的指令&#xff0c;通过学习这些指令&#xff0c;可以对目录及文件进行操作。 文章目录 一、基础指令1. ls—列出目录内容2. pwd—显示当前目录3. cd—切换目录重新认识指令4. touch—创建文件等5. mkdir—创建目录6. rmdir指令 && rm 指令7. man—显…

linux源码编译安装llvm

目录 1 建立文件夹llvm 2 下载源码到llvm文件夹 3 解压上述文件 4 将解压后的3个文件夹改名&#xff0c;并移动到llvm-9.0.0.src中&#xff1a; 5 在llvm文件夹内建立build文件夹&#xff0c;并进入该文件夹&#xff1a; 6 执行cmake命令 7 make 8 安装 9 安装成功后…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--机器人、强化学习

专属领域论文订阅 VX 扫吗关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有帮助可以扫吗关注&#xff0c;每日准时为你推送最新论文 分类: 大语言模型LLM视觉模型VLM扩散模型视觉导航…

Git Docker 学习笔记

注意&#xff1a;该文章摘抄之百度&#xff0c;仅当做学习笔记供小白使用&#xff0c;若侵权请联系删除&#xff01; 目录 列举工作中常用的几个git命令&#xff1f; 提交时发生冲突&#xff0c;你能解释冲突是如何产生的吗&#xff1f;你是如何解决的&#xff1f; git的4个…

安全通信网络

1.网络架构 1&#xff09;应保证网络设备的业务处理能力满足业务高峰期需要。 设备CPU和内存使用率的峰值不大于设备处理能力的70%。 在有监控环境的条件下&#xff0c;应通过监控平台查看主要设备在业务高峰期的资源&#xff08;CPU、内存等&#xff09;使用 情况&#xff…

双数据源同步的思考

双数据源同步的思考 目录概述需求&#xff1a; 设计思路实现思路分析1.简单实现 2.Spring mybatis 技术 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wa…

geemap学习笔记053:纹理特征

前言 纹理特征通常描述了遥感影像中像素之间的空间关系和变化&#xff0c;对于地物分类、目标检测以及图像分割等遥感应用非常有价值。本节将会介绍Earth Engine中提供的一些纹理特征计算方法&#xff0c;包括熵和灰度共生矩阵。 1 导入库并显示数据 import ee import geema…

.NET发展如火如荼,这回.Net 8的野心确实不小

随着三天.NET Conf 2023的会议结束了&#xff0c;.Net 8正式发布了。 .Net 8是官方号称有史以来性能最快的一个版本了。 .Net 8 增加了数以千计的性能、稳定性和安全性改进&#xff0c;以及平台和工具增强功能&#xff0c;有助于提高开发人员的工作效率和创新速度。 反正就是快…

【Leetcode 965.】判断单值二叉树

单值二叉树&#xff1a; 示例一&#xff1a; 示例二&#xff1a; 代码&#xff1a; bool isUnivalTree(struct TreeNode* root) {if(rootNULL)return true;if(root->left&&root->left->val!root->val)return false;if(root->right&&root-&…

【2024系统架构设计】案例分析- 1软件架构设计

目录 一 基础知识 二 历年真题 案例分析前文回顾: 【2024系统架构设计】 系统架构设计师第二版-大数据架构理论设计与实践 【2024系统架构设计】 系统架构设计师第二版-云原生架构设计理论与实践

opencv#30 线性滤波

均值滤波原理 均值滤波步骤 Step1:求和。 Step2:计算平均值。 所谓均值滤波&#xff0c;就是求平均值的意思。我们假设在一个3*3的范围内有一个图像&#xff0c;其中这个图像每一个像素可能含有噪声&#xff0c;也可能不含噪声&#xff0c;我们是不知道的&#xff0c;因此通…

力扣1143. 最长公共子序列(动态规划)

Problem: 1143. 最长公共子序列 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 我们先假设已经将两个字符串转换为两个char类型的数组&#xff08;t1,t2&#xff09;便于比较 1.如果t1[i] t2[j],有三种决策&#xff1a;&#xff08;i1&#xff0c;j1&#xff09;&a…