欢迎光临
我们一直在努力

夏普红外距离传感器 示例教程 适用于Arduino平台

1. 产品图片

2. 产品购买地址点我购买

3. 产品概述
GY2Y0A02红外距离传感器是一款距离测量传感器。它由PSD(position sensitive detector) 和IRED (infrared emitting diode) 以及信号处理电路三部分组成。由于采用了三角测量方法,被测物体的材质、环境温度以及测量时间都不会影响传感器的测量精度。传感器输出电压值对应探测的距离。通过测量电压值就可以得出所探测物体的距离,所以这款传感器可以用于距离测量、避障等场合。

4. 产品参数
信号类型:模拟输出
探测距离:20-150cm
工作电压:4.5-5.5V
标准电流消耗:33 mA
接口类型:PH2.0-3P
最大尺寸:40x22x20 mm

5. 接口定义
Vo:信号端(黄色)
GND:接地端(黑色)
VCC:电源端(红色)

6. 工作原理
夏普红外测距仪的工作原理是三角测量。光脉冲(波长范围850nm +/- 70nm)被发射然后反射回来(或根本不反射)。当光线返回时,它将以一个与反射物体距离有关的角度返回。三角测量通过检测这个反射光束的角度来工作 – 通过知道角度,可以确定距离。

IR测距仪接收器具有特殊的精密透镜,可根据三角测量角度将反射光传输到封闭的线阵CCD阵列上。然后,CCD阵列确定角度并使测距仪给出相应的*模拟值,供您的单片机读取。除此之外,夏普红外测距仪电路将调制频率应用于发射的红外光束。这种测距方法几乎不受环境光的干扰,并且对被检测物体的颜色提供惊人的冷漠。换句话说,该传感器能够在几乎为零的噪音的情况下在全日光下检测到黑色墙壁。

光束宽度
夏普红外测距仪的主要问题/优势是光束宽度。与声纳不同的是,它相当薄 – 意味着检测物体时,传感器必须基本上直接指向该物体。

缺点/问题
夏普红外测距仪存在一个主要问题,即低于最小传感器范围。就是当一个物体如此接近时,传感器不能得到准确的读数,并且它告诉你的机器人一个非常接近的物体真的很远。这很糟糕,因为你的机器人随后开始加速进行混乱的碰撞。 声纳也有这个最小范围问题。解决此问题的方法是不要将传感器与机器人的前部齐平,而是将传感器放回机器人中,以使机器人的前部位于最小传感器范围之前(请参阅图像)

另一个问题是红外光束的狭窄程度。在阅读清晰的细节和获得高精度时,细梁是理想的选择。但是,细梁的问题是,如果它不是完全指向物体,则物体因此不可见。机器人学中的一个普遍的笑话是椅子是小型机器人的主要竞争对手。为什么?因为椅子腿很薄,很容易被传感器遗漏。

7. 接线方式

8. 示例程序一(如果本示例程序误差大,请用示例二)

//中贝斯特UltiRobot夏普红外测距示例教程
//程序效果:打开串口监视器可以看到测到的距离
//淘宝店地址:zhongbest.taobao.com
//专业Arduino资料网站:www.arduino365.com
const int ledPin =13;//连接到LED引脚
const int sensorPin =0;//连接到传感器的模拟引脚
const long referenceMv =5000;//长整型以防止做乘法时溢出
void setup()
{
   Serial.begin(9600);//串口初始化
   pinMode(ledPin,OUTPUT);//定义LED输出引脚
}

void loop()
{
   int val= analogRead(sensorPin);
   int mV =(val*referenceMv)/1023;
   Serial.print(mV);
   Serial.print(",");
   int cm =getDistance(mV);
   Serial.println(cm);
   digitalWrite(ledPin,HIGH);
   delay(cm * 10);//每厘米增加了10毫秒的延迟。
   digitalWrite(ledPin,LOW);
   delay(cm*10);
   delay(100);
}

//以下用于从一个表中进行距离插值
//表项是步长为250毫伏的距离
const int TABLE_ENTRIES =12;
const int firstElement = 250;//每一项是250mV
const int INTERVAL = 250;//每个项之间的毫伏数
static int distance[TABLE_ENTRIES]={150,120,114,83,59,48,40,34,29,24,20,14};

//表值,为我测试的值,如读数错误,请反复输出距离,更改表值,使测量更准确。
//模块读数存在一定的误差,一般控制在1-2CM内为适宜。
int getDistance(int mV)
{
   if(mV > INTERVAL * TABLE_ENTRIES-1)
   return distance[TABLE_ENTRIES-1];
   else
   {
     int index = mV / INTERVAL;
     float frac =(mV %250) / (float)INTERVAL;
     return distance[index] - ((distance[index] - distance[index+1])*frac);
   }
}

**9. 示例程序二 **

//中贝斯特UltiRobot夏普红外测距示例教程
//程序效果:打开串口监视器可以看到测到的距离
//淘宝店地址:zhongbest.taobao.com
//专业Arduino资料网站:www.arduino365.com

#define sharppin A0

void setup () {
         Serial.begin (9600);
         pinMode (sharppin, INPUT);
}
//模拟值转换成电压,输出距离。
void loop () {
         uint16_t value = analogRead (sharppin);
         uint16_t range = get_gp2y0a02yk0f (value);
         Serial.println (value);
         Serial.print (range);
         Serial.println (" cm");
         Serial.println ();
         delay (500);
}

//距离算法
uint16_t get_gp2y0a02yk0f (uint16_t value) {
         if (value < 70)  value = 70;
         return 12777.3/value-1.1;        //(cm)
}

10. 示例程序一重要补充资料
来自红外距离传感器的输出是非线性的,换句话说,从analogRead读取的值与距离不成正比。程序通过查找表中的最接近条目,使用表对实际距离进行插值,并基于所测量的值与下一个表项的比率调整内插的实际距离,(此技术被称为插值)。你可能需要针对传感器调整你的表值,你可以根据数据手册或通过反复试验做到这一点。
在表中的值可以反复试验(测量电压,直到它变化所需的量,然后测量距离)找到,该技术还可以用于你没有一个方程来解释数值的时候,例如,当你所使用的设备没有数据手册。
从电压到距离的转换在这个函数里完成:

int getDistance(int mV)

该函数首先检查该值是否在表中给定的范围内。如果不在范围内,则返回最短的有效距离:

if( mV > INTERVAL * TABEL_ENTRIES )
    return distance[TABLE_ENTERIES-1];//TABLE_ENTRIES-1是最后一个有效输入

如果该值是在表的范围内,整数除法用来计算哪个条目是最接近但低于读数:

int index = mV / INTERVAL;

模运算符在读数落在两个项之间时用来计算一个分数值:

float frac = (mV % 250) / (float)INTERVAL;
return distance[index] + (distance[index]* (frac / interval));

在getDistance函数的最后一行使用索引和分数来计算并返回一个距离值。它从该表中读取值,然后在frac值的基础上,加一个该值的比例。这最终的项是一个近似值,但是,因为是在结果的一个很小的范围内,它给出可接受的结果。如果对你来说不够精确,你需要制作一个数值更密的表。
如果计算需要很长的时间来完成,或者只针对几个有限数量的数值重复进行,一个表还可以用来提高性能。计算特别是浮点计算可能会很慢,用表来替代计算可以加快速度。
这些值可以被硬编码到程序中,或者在setup()里计算出来。这可能使程序需要更长的时间来启动,单由于这只是在每次Arduino通电的时候发生一次,的你随后会从每次的主循环loop()得到一个速度补偿。在权衡速度时,表占用内存,表越大,就占用更多的RAM内存。
如果你使用的是长导线,你可能需要添加一个电容到+5V和GND线的两端以稳定传感器的电源。如果你得到错误读数,连接一个10uF的电容到传感器。
注:模块固定的角度会影响模块的测量。建议:将模块固定住,并保持直线平视。

11. 如何进一步增加精确度
关于表值的修改问题:
1、可以通过更改程序一种的表值来,达到准确读数。如图所示

2、不同模块,建议先进行表值校准调试,再测量实际数值。

12. 其他说明
1、要有效使用您的夏普红外测距仪,您必须有一个电压输出与距离图表供参考。技术手册通常带有一个“典型响应曲线”图表供您使用,但您应该检查一下以确保它是准确的。如果您没有图表,或者您想验证图表,请运行一个测量距离与输出模拟值的实验。为此,请在传感器前放置一个物体,测量距离,然后查看printf输出读数。记录您的数据。我建议阅读我关于高级传感器解释的文章,以帮助您更好地理解数据。通常,人们创建查找表或创建距离函数的代表性方程。
2、关于非线性输出:Sharp IR具有非线性输出。这意味着随着距离线性增加(通过设置增量),模拟输出将非线性增加/减少。上面的图像是测距仪的典型预期输出。注意图表开头的奇怪扭结。这是因为测距仪无法检测到非常短的距离。请参阅您正在使用的特定测距仪来确定您的测距仪能够测量的范围。

13. 相关下载
英文版使用教程:点我查看
百度网盘:点我下载

未经允许不得转载:Arduino-Maker » 夏普红外距离传感器 示例教程 适用于Arduino平台

支付宝扫码打赏 微信打赏

原创文章,若帮到您,欢迎打赏

分享到:更多 ()

评论 抢沙发

评论前必须登录!

 

线上商城

中贝斯特创客空间蘑菇云创客教育