文章结尾有移植好的文件可以直接下载
2.4 红外测距传感器
GP2Y0A02YKOF是夏普的一款距离测量传感器模块。它由PSD(position sensitive detector)和IRED(infrared emitting diode)以及信号处理电路三部分组成。由于采用了三角测量方法,被测物体的材质、环境温度以及测量时间都不会影响传感器的测量精度。传感器输出电压值对应探测的距离。通过测量电压值就可以得出所探测物体的距离,所以这款传感器可以用于距离测量、避障等场合。
2.4.1 模块来源
采购链接:
GP2Y0A02YK0F 红外激光测距传感器 避障测距20-150cm
资料下载链接:
2.4.2 规格参数
工作电压:3.3-5V
工作电流:33MA
模块尺寸:37 x 21.6mm
输出方式: 模拟量输出
读取方式:ADC
管脚数量:3 Pin
2.4.3 移植过程
我们的目标是在【立创开发板GD32E230C8T6】上能够判断前方障碍物的功能。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。
2.4.3.1 查看资料
红外测距传感器的输出是非线性的。每个型号的输出曲线都不同。所以,在实际使用前,最好能对所使用的传感器进行一下校正。对每个型号的传感器创建一张曲线图,以便在实际使用中获得真实有效的测量数据。下图是测距距离为20-150CM型号的输出曲线图。
从上图中,可以看到,当被探测物体的距离小于大约 15cm 的时候,输出电压急剧下降,也就是说从电压读数
来看,物体的距离应该是越来越远了。但是实际上并不是这样的,想象一下,你的机器人本来正在慢慢的
靠近障碍物,突然发现障碍物消失了,一般来说,你的控制程序会让你的机器人以全速移动,结果就是,"
砰"的一声。当然了,解决这个方法也不是没有,这里有个小技巧。只需要改变一下传感器的安装位置,使
它到机器人的外围的距离大于最小探测距离就可以了。
红外测距传感器的输出数据线是通过电压的变化来确定距离,我们可以使用ADC功能获取传感器的电压变化,将其转换为实际距离即可。电压距离转换公式见官方代码库链接:https://github.com/zoubworldArduino/ZSharpIR
找到我们20-150CM型号的传感器,在下方有换算公式。
2.4.3.2 引脚选择
2.4.4 移植验证
在自己工程中的main主函数中,编写如下。
/******************************************************************************
* 测试硬件:立创开发板·GD32E230C8T6 使用主频72Mhz 晶振8Mhz
* 版 本 号: V1.0
* 修改作者: www.lckfb.com
* 修改日期: 2023年11月02日
* 功能介绍:
*****************************************************************************
******************************************************************************/
#include "gd32e23x.h"
#include "systick.h"
#include "bsp_usart.h"
#include "stdio.h"
#include "bsp_irdistance.h"
int main(void)
{
systick_config(); //滴答定时器初始化 1ms
usart_gpio_config(115200U);
ADC_DMA_Init();
printf("ADC+DMA demo start\r\n");
while(1)
{
printf("Distance = %.2f\r\n", Get_IRdistance_Distance() );
delay_1ms(1000);
}
}
上电效果:
移植成功案例: