GP2Y0E03夏普红外测距传感器简单使用
夏普红外测距传感器规格书引脚如下
一共七个引脚,如果要改地址的话还需要用到第八个引脚(当时改地址试了半天,仔细一看数据手册还有第八个引脚),第八个引脚Vpp如下图所示
和GP2Y0E03通讯是用IIC协议,数据手册上具体协议格式如下
笔者使用STM32F103系列单片机IIC通讯代码如下
void GP2_SDA_Mode(GPIOMode_TypeDef sdagpio_mode)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = sdagpio_mode;GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void delay_us_us(u16 time)
{ u16 i=0; while(time--){i=10; while(i--) ; }
}
void GP2_IIC_Start(void)
{GP2_IIC_SCL=0;GP2_SDA_Mode(GPIO_Mode_Out_OD); GP2_IIC_SDA=1; GP2_IIC_SCL=1;delay_us_us(4);GP2_IIC_SDA=0;delay_us_us(4);GP2_IIC_SCL=0;
}void GP2_IIC_Stop(void)
{GP2_IIC_SCL=0;GP2_SDA_Mode(GPIO_Mode_Out_OD); GP2_IIC_SCL=0;GP2_IIC_SDA=0;GP2_IIC_SCL=1; delay_us_us(4);GP2_IIC_SDA=1;delay_us_us(4); GP2_IIC_SCL=0;
}
uint8_t GP2_IIC_Wait_Ack(void)
{uint8_t ucErrTime=0;GP2_SDA_Mode(GPIO_Mode_IN_FLOATING); delay_us_us(4); GP2_IIC_SCL=1;delay_us_us(4); while(GP2_READ_SDA){ucErrTime++;if(ucErrTime>250){GP2_IIC_Stop();return 1;}}GP2_IIC_SCL=0;//ʱÖÓÊä³ö0 return 0;
}
void GP2_IIC_Ack(void)
{GP2_IIC_SCL=0;GP2_SDA_Mode(GPIO_Mode_Out_OD); GP2_IIC_SDA=0;delay_us_us(4);GP2_IIC_SCL=1;delay_us_us(4);GP2_IIC_SCL=0;
}
void GP2_IIC_NAck(void){GP2_IIC_SCL=0;GP2_SDA_Mode(GPIO_Mode_Out_OD); GP2_IIC_SDA=1;delay_us_us(4);GP2_IIC_SCL=1;delay_us_us(4);GP2_IIC_SCL=0;
}
void GP2_IIC_Send_Byte(uint8_t txd){ uint8_t t; GP2_SDA_Mode(GPIO_Mode_Out_OD); GP2_IIC_SCL=0;for(t=0;t<8;t++){ if(txd&0x80)GP2_IIC_SDA=1; else GP2_IIC_SDA=0; txd<<=1; delay_us_us(4); GP2_IIC_SCL=1;delay_us_us(4); GP2_IIC_SCL=0; delay_us_us(4);}
}
uint8_t GP2_IIC_Read_Byte(void){unsigned char i,receive=0;GP2_SDA_Mode(GPIO_Mode_IN_FLOATING); delay_us_us(4);for(i=0;i<8;i++ ){receive<<=1; GP2_IIC_SCL=1;delay_us_us(4);if(GP2_READ_SDA)receive |= 0x01; delay_us_us(4); //1GP2_IIC_SCL=0; delay_us_us(4); //1} return receive;
}
uint8_t GP2_IIC_Write_1Byte(uint8_t SlaveAddress,uint8_t REG_Address,uint8_t REG_data)
{GP2_IIC_Start();GP2_IIC_Send_Byte(SlaveAddress);if(GP2_IIC_Wait_Ack()){GP2_IIC_Stop();//ÊÍ·Å×ÜÏßreturn 1;//ûӦ´ðÔòÍ˳ö}GP2_IIC_Send_Byte(REG_Address);GP2_IIC_Wait_Ack(); delay_us_us(5);GP2_IIC_Send_Byte(REG_data);GP2_IIC_Wait_Ack(); GP2_IIC_Stop();return 0;
}
uint8_t GP2_IIC_Read_1Byte(uint8_t SlaveAddress, uint8_t REG_Address)
{uint8_t REG_data; GP2_IIC_Start();GP2_IIC_Send_Byte(SlaveAddress);if(GP2_IIC_Wait_Ack()){GP2_IIC_Stop();//ÊÍ·Å×ÜÏßreturn 1;//ûӦ´ðÔòÍ˳ö} GP2_IIC_Send_Byte(REG_Address);GP2_IIC_Wait_Ack();GP2_IIC_Stop();//ÊÍ·Å×ÜÏßdelay_us_us(5);GP2_IIC_Start(); GP2_IIC_Send_Byte(SlaveAddress|0x01);GP2_IIC_Wait_Ack();REG_data = GP2_IIC_Read_Byte();GP2_IIC_Stop();return REG_data;
}uint8_t GP2_I2C_Read_nByte(uint8_t SlaveAddress, uint8_t REG_Address, uint8_t *buf, uint16_t len)
{GP2_IIC_Start();GP2_IIC_Send_Byte(SlaveAddress);if(GP2_IIC_Wait_Ack()) {GP2_IIC_Stop();//ÊÍ·Å×ÜÏßreturn 1;//ûӦ´ðÔòÍ˳ö}GP2_IIC_Send_Byte(REG_Address);GP2_IIC_Wait_Ack();GP2_IIC_Stop();//ÊÍ·Å×ÜÏßdelay_us_us(5);GP2_IIC_Start(); GP2_IIC_Send_Byte(SlaveAddress|0x01);GP2_IIC_Wait_Ack();while(len){*buf = GP2_IIC_Read_Byte();if(1 == len){GP2_IIC_NAck();}else{GP2_IIC_Ack();}buf++;len--;}GP2_IIC_Stop();return STATUS_OK;
}
uint8_t GP2_I2C_Write_nByte(uint8_t SlaveAddress, uint8_t REG_Address, uint8_t *buf, uint16_t len)
{GP2_IIC_Start();GP2_IIC_Send_Byte(SlaveAddress);if(GP2_IIC_Wait_Ack()) {GP2_IIC_Stop();return 1;}GP2_IIC_Send_Byte(REG_Address);GP2_IIC_Wait_Ack();while(len--){GP2_IIC_Send_Byte(*buf++);GP2_IIC_Wait_Ack();}GP2_IIC_Stop();return STATUS_OK;
}
PS:使用时请注意镜面反射的影响,如果不改地址使用多个传感器模块,需控制使能脚依次读取数据
GP2Y0E03夏普红外测距传感器简单使用相关推荐
- Arduino与ROS通讯的示例代码HelloWorld改写成夏普红外测距传感器数据传输的代码
改写详情: 其实就是在原来的代码的基础上加了个红外测距传感器的代码,然后把红外测距传感器的double类型的数据用dtostrf函数转换成了char类型的字符串数组.并没有对消息类型进行任何的更改,仅 ...
- 夏普GP2Y0AYK0F红外测距传感器在STM32F103C8T6中的使用及电压转换公式。
夏普GP2Y0AYK0F红外测距传感器在STM32F103C8T6中的使用及电压转换公式. 1.夏普GP2Y0AYK0F红外测距传感器介绍 参数介绍 品牌 夏普SHARP 型号 GP2Y0A21YK0 ...
- Arduino + GP2D12红外测距传感器+LCD1602
一: GP2Y0A21YKIR Sensor是日本夏普公司推出的一款性价比高.最常用的红外测距传感器.其与GP2D12测量射程相同,但探测面积略有增加,可用来对物体的距离进行测量,实现轮式机器人的避障 ...
- 第十七篇、基于Arduino uno,获取cp2d12红外测距传感器的原始值和距离值——结果导向
0.结果 说明:先来看看串口调试助手显示的结果,第一个值是原始的模拟电压值,第二个值是距离值,如果是你想要的,可以接着往下看. 1.外观 说明:虽然红外测距传感器形态各异,但是原理和代码都是适用的,只 ...
- arduino学习笔记十--Arduino 读红外测距传感器
Arduino 读红外测距传感器GP2D12 实例,仅供大家参考! 器材:Arduino 开发板,GP2D12,1602 字符液晶,连接线若干. GP2D12 是日本SHARP 公司生产的红外距离传感 ...
- 红外测距传感器GP2D12与STM32单片机程序,滤波算法
红外测距传感器GP2D12与STM32单片机程序,滤波算法,设计步骤和代码流程清晰非常实用. 是机器人中最常用的红外测距传感器. 程序源码注释详细,非常适合单片机开发人员. ID:7887031794 ...
- 距离感应音乐玩具计算机系统设计,可编程机器人玩具程小奔红外测距传感器测量距离案例...
文:邱老师 上次课程我们学习了用速度乘以时间计算程小奔移动距离的方法.那么,它能否测量还没有走过的路程距离呢?答案是可以的. 程小奔编程机器人集合了多种传感器,今天我们要使用程小奔机器人的红外测距传感 ...
- 红外测距传感器(GP2D12、74HC595、ADC0832)
红外测距传感器GP2D12 应用 要做的项目 原理 仿真效果图 74HC595的作用(串入) 项目目录 ADC0832X.c(延用之前的,但注意CS.CLK.DIO所对应的端口发生了变化) 74HC5 ...
- K210与多个VL53L0X红外测距传感器的iic应用
前言:VL53L0X是个机灵的传感器,有使用手册,但没寄存器手册\狗头,写这篇博客记下,以防止后面再次遇坑. 使用说明 用户手册 引脚说明: IIC_SCL: IIC通信时钟线 IIC_SDA: II ...
最新文章
- 致远M1移动协同软件
- C语言实现数组Array(附完整源码)
- linux我ll查不到usr,Linux学习-文件查寻
- php mysql 写法_php 类的写法
- mysql的查表语句_mysql查表语句_MySQL
- hdu.1254.推箱子(bfs + 优先队列)
- 【实践驱动开发3-006】TI WL1835MODCOM8 在android的移植 - SDIO wifi驱动的注册步骤
- php-fpm的安装与测试
- Java多线程学习九:怎样确定线程数量及CPU 核心数和线程数的关系||如何定制自己的线程池
- Hibernate学习(二)持久化类,主键生成策略、一级缓存、事务
- 【定位问题】基于matlab GUI RSSI无线定位【含Matlab源码 1054期】
- 你不可错过的Java学习资源清单
- 软件评测师备考详细知识点
- Oracle12c设置PDB企业管理器登录端口
- 查询具体到时分秒的时间段数据(查询昨天的下午四点到今天的下午四点的数据)
- 微信小程序开发笔记 进阶篇④——getPhoneNumber 获取用户手机号码(小程序云)
- 这341句话,这么美,那么伤。
- 惊蛰时节,最好看的微信公众号图文排版,全在这里了
- golang的乐观锁与悲观锁
- 为什么学习Linux系统?
热门文章
- Intel RealSense D455 深度相机
- 为何都喜欢喝酱香型白酒,酱香型白酒和浓香型白酒有何区别? - 知乎
- Process: 23905 ExecStart=/usr/bin/kubelet (code=exited, status=1/FAILURE)
- windows安装绿色版Redis
- Copying DNA 复制DNA
- 从开源到众包---写在2015“程序员”节
- 高等数学-对无穷小无穷大的理解
- Android基础知识 - 碎片
- SystemVerilog调度机制与一些现象的思考
- matlab 矩阵旋转变换矩阵,matlab 矩阵与线性变换与计算.ppt