37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百二十六:夏普GP2Y0A02YK0F 红外测距传感器模块 20-150cm 距离传感器
红外
是红外线的简称,它是一种电磁波。它可以实现数据的无线传输。自1800年被发现以来,得到很普遍的应用,如红外线鼠标,红外线打印机,红外线键盘等等。红外的特征:红外传输是一种点对点的传输方式,无线,不能离的太远,要对准方向,且中间不能有障碍物也就是不能穿墙而过,几乎无法控制信息传输的进度;IrDA已经是一套标准,IR收/发的组件也是标准化产品。
红外线(Infrared)
红外线是太阳光线中众多不可见光线中的一种,由英国科学家赫歇尔于1800年发现,又称为红外热辐射,热作用强。他将太阳光用三棱镜分解开,在各种不同颜色的色带位置上放置了温度计,试图测量各种颜色的光的加热效应。结果发现,位于红光外侧的那支温度计升温最快。因此得到结论:太阳光谱中,红光的外侧必定存在看不见的光线,这就是红外线。也可以当作传输之媒介。 太阳光谱上红外线的波长大于可见光线,波长为0.75~1000μm。红外线可分为三部分,即近红外线,波长为(0.75-1)~(2.5-3)μm之间;中红外线,波长为(2.5-3)~(25-40)μm之间;远红外线,波长为(25-40)~l500μm 之间。
红外线是波长介于微波与可见光之间的电磁波,波长在1mm到760纳米(nm)之间,比红光长的非可见光。高于绝对零度(-273.15℃)的物质都可以产生红外线。现代物理学称之为热射线。医用红外线可分为两类:近红外线与远红外线。含热能,太阳的热量主要通过红外线传到地球。我们把红光之外的辐射叫做红外线(紫光之外是紫外线),肉眼不可见。
红外线的发现:公元1800年英国科学家"威廉·赫歇尔"发现太阳光中的红光外侧所围绕著一种用肉眼无法看见的光源,波长介于5.6-1000μm的「远红外线」,经过这种光源照射时,会对有机体产生放射、穿透、吸收、共振的效果。美国太空总部(NASA)研究报告指出,在红外线内,对人体有帮助4-14微米的远红外线,从内部发热,从体内作用促进微血管的扩张,使血液循环顺畅,达到新陈代谢的目的,进而增加身体的免疫力及治愈率。 但是根据黑体辐射理论,一般的材料要产生足够强度的远红外线,并不容易,通常必须藉助特殊物质作能量的转换,将它所吸收的热量经由内部分子的振动再发放较长波长的远红外线出来。
红外测距
随着科学技术的不断发展,在测距领域也先后出现了激光测距、微波雷达测距、超声波测距及红外线测距等方式。作为一种应用广泛、测量精度高的测量方式,红外测距利用红外线传播时不扩散、折射率小的特性,根据红外线从发射模块发出到被物体反射回来被接受模块接受所需要的时间,采用相应的测距公式来实现对物体距离的测量。红外测距最早出现于上世纪60年代,是一种以红外线作为传输介质的测量方法。红外测距的研究有着非比寻常的意义,其本身具有其他测距方式没有的特点,技术难度相对不大,系统构成成本较低、性能良好、使用方便、简单,对各行各业均有着不可或缺的贡献,因而其市场需求量更大,发展空间更广。其工作原理是,利用红外信号遇到障碍物距离的不同反射的强度也不同的原理,进行障碍物远近的检测。红外测距传感器具有一对红外信号发射与接收二极管,发射管发射特定频率的红外信号,接收管接收这种频率的红外信号,当红外的检测方向遇到障碍物时,红外信号反射回来被接收管接收,经过处理之后,通过数字传感器接口返回到机器人主机,机器人即可利用红外的返回信号来识别周围环境的变化。
GP2Y0A02YK0F
是夏普的一款距离测量传感器模块。它由PSD(位置灵敏探测器)和IRED 红外发射二极管)以及信号处理电路三部分组成。由于采用了三角测量方法,被测物体的材质、环境温度以及测量时间都不会影响传感器的测量精度。传感器输出电压值对应探测的距离。通过测量电压值就可以得出所探测物体的距离,所以这款传感器可以用于距离测量、避障等场合。
三角测量法
是通过测量目标点与固定基准线的已知端点角度来测量观测目标的距离。三角测量运用到天文测距时,可以根据地球自转一天或一周时与观测目标产生的视觉差距,也称作“周日地平视差”,来计算地月距离,此方法因地球半径长度限制,只适合测量太阳系内天体间的距离。光学三角测量法是一种最常用的一种光学三维测量技术,以传统的三角测量为基础,通过待测点相对于光学光学基准线偏移产生的角度变化计算该点的深度信息。根据具体的照明方式的不同,三角法可以分为被动三角法和主动三角法。
红外传感器基于三角测量原理。红外发射器按照一定的角度发射红外光束,当遇 到物体以后,光束会反射回来,如图所示。反射回来的红外光线被 CCD 检测器检测到以后,会获得一 个偏移值 L,利用三角关系,在知道了发射角度 a,偏移距 L,中心矩 X,以及滤镜的焦距 f 以后,传感器 到物体的距离 D 就可以通过几何关系计算出来了。
非线性输出
该系列的传感器的输出是非线性的。每个型号的输出曲线都不同。所以,在实际使用前,最 好能对所使用的传感器进行一下校正。对每个型号的传感器创建一张曲线图,以便在实际使用中获得真实 有效的测量数据。下图是典型的输出曲线图。
可以看到,当 D 的距离足够近的时候,L 值会相当大,超过 CCD 的探测范围,这时,虽然物体很近,但 是传感器反而看不到了。当物体距离 D 很大时,L 值就会很小。这时 CCD 检测器能否分辨得出这个很小 的 L 值成为关键,也就是说 CCD 的分辨率决定能不能获得足够精确的 L 值。要检测越是远的物体,CCD 的分辨率要求就越高。
从上图中,可以看到,当被探测物体的距离小于 10cm 的时候,输出电压急剧下降,也就是说从电压读数 来看,物体的距离应该是越来越远了。但是实际上并不是这样的,想象一下,你的机器人本来正在慢慢的 靠近障碍物,突然发现障碍物消失了,一般来说,你的控制程序会让你的机器人以全速移动,结果就是," 砰"的一声。当然了,解决这个方法也不是没有,这里有个小技巧。只需要改变一下传感器的安装位置,使 它到机器人的外围的距离大于最小探测距离就可以了。如下图所示。
红外测距传感器特点
1)远距离测量,在无反光板和反射率低的情况下能测量较远的距离;
2)有同步输入端,可多个传感器同步测量;
3) 测量范围广,响应时间短;
4) 外形设计紧凑,易于安装,便于操作。
红外测距传感器应用
近期来全球自然灾害频发,像近期的四川、智利的大地震、日本海啸,严重影响人类生命安全,而二次灾难又对营救者带来了极大的风险,这时搜救机器人就可以很好的代替营救者来搜救被困人群。传感器是搜救机器人不可缺少的器件,机器人上有很多种传感器,其中就有红外测距传感器。
运动能力、感知能力、通讯能力和作业能力等几个方面能力是搜救机器人必须具备的。搜救机器人的通讯作业能力需要依靠机器人良好的运动能力和感知能力,而机器人的运动能力和感知能力是建立在传感器的有效发挥上的。红外传感器在搜救机器人上的应用相当于人眼的功能,利用的红外测距传感器发射出一束红外光,在照射到物体后形成一个反射的过程,反射到传感器后接收信号,然后利用图像处理接收发射与接收的时间差的数据。经信号处理器处理后计算出物体的距离。这不仅可以使用于自然表面,也可用于加反射板。测量距离远,很高的频率响应,适合于恶劣的工业环境中。
机器人一只是近年来的热点,机器人能做许多人所不能的事,尤其是在面临大灾难后的搜救工作时,机器人就发挥出巨大的作用,机器人的功能是在传感器的基础上发展出来的,所以只有先进的传感器技术才能制作出高性能的机器人。
●光学建议
•该设备的镜头需要保持清洁。有灰尘、水或油等变质的情况,这个装置的特性。请在实际应用中考虑。
•请不要洗。清洗会使光学系统的性能恶化等。
请确认在实际使用中对化学品的耐受性,因为本产品不是针对洗涤而设计的。
●特性建议
•如果在发射器和探测器部分前面设置了光学滤波器,则具有发光二极管发射波长范围(λ=850±70nm)的有效透过率应为推荐使用。滤光片的两面应为镜面抛光。而且,在某些情况下,根据防护罩与本产品之间的距离或防护罩,请在实际使用中充分确认操作后使用。如果传感器和检测对象之间的传感器的发射极附近有一个物体,请使用这个设备在充分确认该传感器的特性不会被物体改变之后。
•当探测器暴露在阳光、钨灯等的直射光下时,有些情况下它不能精确测量距离。请考虑探测器的设计,使其不受来自光源。
•有时不能精确测量镜面反射镜的距离。如果改变本产品的安装角度,可以精确测量距离。
•如果反射物体的边界线与材料或颜色等相差过大,以便减小测量距离偏差,建议设置传感器发射中心和探测器中心之间的连线是平行的。
Arduino实验接线示意图
Arduino实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百二十六:夏普GP2Y0A02YK0F 红外测距传感器模块 20-150cm 距离传感器
项目一:测试距离的方案之一
Module UNO
VCC —— 5V
GND —— GND
VO —— A0
*/
int IRpin = 0; // analog pin for reading the IR sensor
void setup() {
Serial.begin(9600); // start the serial port
}
void loop() {
float volts = analogRead(IRpin) * 0.0048828125; // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
float distance = 65 * pow(volts, -1.10); // worked out from graph 65 = theretical distance / (1/Volts)
Serial.println(distance); // print the distance
delay(100); // arbitary wait time.
}
实验串口返回情况
Arduino实验开源代码之二
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百二十六:夏普GP2Y0A02YK0F 红外测距传感器模块 20-150cm 距离传感器
项目:测试距离的方案之二
Module UNO
VCC —— 5V
GND —— GND
VO —— A0
*/
#define pin A0
void setup () {
Serial.begin (9600);
pinMode (pin, INPUT);
}
void loop () {
uint16_t value = analogRead (pin);
uint16_t range = get_gp2y0a02 (value);
Serial.println (value);
Serial.print (range);
Serial.println (" cm");
Serial.println ();
delay (500);
}
//return distance (cm)
uint16_t get_gp2y0a02 (uint16_t value) {
if (value < 70) value = 70;
return 12777.3/value-1.1; //(cm)
//return (62.5/(value/1023.0*5)-1.1); //(cm)
//return ((67870.0 / (value - 3.0)) - 40.0); //gp2d12 (mm)
}
实验串口返回情况
Arduino实验开源代码之三
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百二十六:夏普GP2Y0A02YK0F 红外测距传感器模块 20-150cm 距离传感器
项目:测试距离的方案之三
说明;参考V-cm图, 用查表法, 连接Vout到Arduino的A0引脚, 测量频率20Hz
需要进一步校对与调整参数
Module UNO
VCC —— 5V
GND —— GND
VO —— A0
*/
float distance[] = {20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150};
float voltage[14] = {2.5, 2, 1.55, 1.25, 1.1, 0.85, 0.8, 0.73, 0.7, 0.65, 0.6, 0.5, 0.45, 0.4};
typedef struct {
float maxDistance; //cm
float minDistance; //cm
float offset; //cm
float distance; //cm,
int frequency; //Hz
int pin;
}SHARP;
SHARP Sharp = {150, 20, 0, 0, 20, A0};
void getDistance(SHARP* Sharp) {
float v = analogRead(Sharp->pin);
v = v / 1024.0 * 5;
int index = 0;
for(index = 0; index < 14; index++) {
if(v >= voltage[index]) {
break;
}
}
if(index == 0) {
Sharp->distance = 20;
} else if(index == 14) {
Sharp->distance = 150;
} else {
Sharp->distance = map(v, voltage[index], voltage[index-1], distance[index], distance[index-1]);
}
}
void setup() {
Serial.begin(115200);
}
void loop() {
static unsigned long lastTime = millis();
if(millis() - lastTime > 1000/Sharp.frequency) {
lastTime = millis();
getDistance(&Sharp);
Serial.println(Sharp.distance);
// int v = analogRead(Sharp.pin);
// Serial.println(v);
}
}
实验串口返回情况
实验开源图形编程(Mind+、编玩边学)
实验开源仿真编程(Linkboy V4.62)