用光敏电阻进行导航1.docx

上传人:b****5 文档编号:7667624 上传时间:2023-01-25 格式:DOCX 页数:15 大小:64.29KB
下载 相关 举报
用光敏电阻进行导航1.docx_第1页
第1页 / 共15页
用光敏电阻进行导航1.docx_第2页
第2页 / 共15页
用光敏电阻进行导航1.docx_第3页
第3页 / 共15页
用光敏电阻进行导航1.docx_第4页
第4页 / 共15页
用光敏电阻进行导航1.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

用光敏电阻进行导航1.docx

《用光敏电阻进行导航1.docx》由会员分享,可在线阅读,更多相关《用光敏电阻进行导航1.docx(15页珍藏版)》请在冰豆网上搜索。

用光敏电阻进行导航1.docx

用光敏电阻进行导航1

用光敏电阻进行导航

(一)

一、实验要求

了解光敏电阻的工作原理,会搭建简单的电路实现感知光线强弱的功能,对出现的问题进行思考,总结,并试验不同环境下的感光性能;

掌握定时计数器的使用;

实现机器人避开阴影行走;

二、实验概要

1.搭建和测试光敏电阻电路

了解光敏电阻的特性,搭建光敏电阻测试电路,进行简单的光的明暗测试。

2.行走和躲避阴影

由于光敏电阻分压器的表现类似于前面的胡须,因而只需对触须导航的程序作少许修改就可以使其适用于光敏电阻分压器。

验证当用手在光敏电阻上投一个阴影时,宝贝车机器人是否避开阴影。

试验无阴影,遮住右边的光敏电阻,遮住左边的光敏电阻,同时遮住两个光敏电阻的情况下小车的反应,是否和预期的一样?

触须导航时,碰到障碍物一般先后退,然后转弯,左转或右转,在光敏电阻导航时是否也需要先后退再转弯呢?

可以修改程序,使得小车反应更加灵敏。

思考:

小车追着阴影走该怎么实现?

3.对光敏电阻的进一步研究

从光敏电阻电路得到的仅有的信息是光的强度高于还是低于阀值。

本实验将介绍一个不同的电路,微控制器能够通过该电路监测并收集足够的信息以确定相对光强。

微控制器从电路得到的值范围从小到大,小值表明光比较强,大值表明光比较弱。

这就意味着基于不同光强不用手工替换不同阻值的电阻,只需调整程序来寻找不同范围的值。

如何做到这一点呢?

利用RC充放电电路就可以实现。

那么,这个RC电路的特性如何?

你需要先测试一下。

三、实验内容

光在机器人和工业控制领域有很广泛的应用。

比如在纺织工业中感应织物转筒的边沿,确定一年中不同时期什么时候打开街灯,什么时候拍照或者什么时候给许许多多的庄稼灌溉。

有许多不同光传感器能提供各种独特功能。

宝贝车集成套件中的光传感器用来探测可见光,并且可以检测不同的光亮度水平。

这样,可以编程使宝贝车识别周围环境的明暗,报告探测到的明暗水平,并且可以寻找手电筒光束或从门口射进黑暗的屋子的光这样的光源。

1.搭建和测试光敏电阻电路

1)光敏电阻介绍

前面章节所用到的电阻都有固定值,例如220欧,10千欧。

另一方面,光敏电阻是一种其电阻值依赖于光强的光传感器,即其阻值由照射到光检测表面的光的亮度或强度决定(LDRLightDependentResistor)。

图6-1是光敏电阻的示意图和元件图,你将用光敏电阻让宝贝车检测不同的光亮度水平。

光检测表面

本实验中,你将用光敏电阻来搭建并测试光的亮度感应

电路。

光的亮度感应电路能够探测出阴影和非阴影的区别。

判断光敏电阻是否感应到阴影和用来判断胡须是否碰到物

体非常相似。

图6-1光敏电阻示意图和元件

元件清单:

(1)光敏电阻

(2)2kΩ电阻(红-黑-红)

(3)220Ω电阻(红-红-棕)

(4)跳线

(5)470Ω电阻–(黄-紫-棕)

(6)1kΩ电阻–(棕-黑-红)

(7)4.7kΩ电阻–(黄-紫-红)

(8)10kΩ电阻–(棕-黑-橙)

2)搭建感光眼

图6-2所示是光敏探测电路

原理图,这些在本节和后面两个

实验中都要用到。

断开主板和伺服系统的电源

参考图6-2,搭建光探测线路。

图6-2光探测电路原理图

TIPs:

光探测电路是如何工作的

设定为输入的I/O口实际上并不需要5V来使其输入寄存器的值为1,任何大于1.5V的电压都会使其寄存器的值为1。

同样的,I/O口也不是需要0V来使其输入寄存器的值为0,任何小于1.5V的电压都会使其寄存器的值为0。

当微控制器的I/O口是输入口时,图6-4是其等效电路。

光敏电阻的阻值用字母R来表示。

如果光特别亮,电阻值非常小,如果是在完全黑暗的环境中,电阻值接近50kΩ。

在一个带荧光天花板的光线好的屋子里,电阻值可能小到1kΩ(光线没有任何遮挡)或大到25kΩ(阴影遮住了光敏电阻)。

由于光敏电阻的阻值随着光照的强弱而改变,Vo点的输出

电压也随之改变:

当R增大时,Vo会减小;当R减小时,

Vo会增大。

Vo正是当微控制器的I/O口作为

输入口时检测到的电压。

如果电路连接到P1_5,当Vo的值

大于1.5V时,P1寄存器的第6位为1,当Vo的值小于

1.5V时,P1寄存器的第6位为0。

3)探测阴影图6-3分压电路

阴影使光敏电阻的电阻值R增大,反过来使电压Vo减小。

在一个灯光比较好的屋子里,2kΩ电阻使Vo的值刚好大于1.5V。

如果用手投一个阴影,Vo会小于临界值1.5V。

在一个灯光比较好的屋子里,P1寄存器的第6位(P1_5)、第7位(P1_6)都为1,如果在连接到P1_5的分压器的光敏电阻上投一个阴影,P1寄存器的第6位(P1_5)变为0。

同样的,如果在连接到P1_6的分压器的光敏电阻上投一个阴影,P1寄存器的第7位(P1_6)变为0。

例程:

TestPhotoresistorsDividers.c

本例程适用于光敏电阻分压器的检测。

我们现在监测连接到光敏电阻分压器的P1_5和P1_6。

在一个光线比较好的屋子里,程序在两边都显示1。

当用手在一个或两个光敏电阻上投一个阴影时,它们所对应的值变为0。

d重新接通主板的电源。

d输入、保存并运行程序TestPhotoresistorDividers.c。

d验证没有阴影时,是否显示都为1。

d验证当用手在每个光敏电阻上投一个阴影时,所对应的值是否会变为0。

d如果投阴影使输入寄存器变为0,或者如果无论你是否投一个阴影,输入寄存器的值总是0,请参考程序后面的光敏电阻分压器排错部分。

继续实验直到你用手投一个阴影,输入寄存器的值可靠地变为0为止。

#include

#include

intP1_5state(void)

{

return(P1&0x20)?

1:

0;

}

intP1_6state(void)

{

return(P1&0x40)?

1:

0;

}

intmain(void)

{

uart_Init();

printf("PHOTORESISTORSTARTES\n");

while

(1)

{

printf("L=%d\n",P1_5state());

printf("R=%d\n",P1_6state());

delay_nms(150);

}

}

TIPs:

光敏电阻分压器排错

一般性检查:

d检查你的接线和程序。

d确保每个元件牢固的插在插座里。

d检查你的电阻颜色。

连接GND和光敏电阻的电阻阻值是2kΩ(红-黑-红)。

连接P1_5和P1_6到光敏电阻的阻值是220Ω(红-红-棕)。

如果无论你是否投一个阴影,显示的都值为0:

如果房间微暗,建议增加灯的亮度。

也可以把2kΩ电阻换成4.7kΩ电阻(黄-紫-红)。

这将给你的电阻在较低光亮环境下分得高的电压。

在光线相当暗的情况下,你甚至可以用10kΩ电阻(棕-黑-橙)。

如果无论你是否投一个阴影,显示的都值为1:

如果相当亮,你发现你必须把手捂住光敏电阻的采光面来让寄存器从1变为0,你可以用低阻值的电阻替代2kΩ电阻。

试试1kΩ电阻(棕-黑-红),如果在室外试试470Ω电阻(黄-紫-棕)

4)试验不同的电压分压器

依据你的机器人周围的环境,选用较大或较小的电阻代替2kΩ的电阻可能会提高阴影探测器的性能。

d记住每次修改电路时断开连接主板的电源。

d试着用你收集的电阻470Ω,1kΩ,4.7kΩ,10kΩ来代替2kΩ的电阻。

d用程序TestPhotoresistorDividers.c测试每个电压分压器的组合,决定哪个电阻最适

合你周围的环境,最好的组合是既不会过度敏感,又不需要你用手捂住光敏电阻。

d在下面实验中使用你觉得工作最好的电阻组合。

2.行走和躲避阴影

1)编写程序

由于光敏电阻分压器的表现类似于前面的胡须,因而只需对程序RoamingWithWhiskers.c中作少许修改就可以使其适用于光敏电阻分压器。

例程:

RoamingWithPhotoresistorDividers.c

d打开程序RoamingWithWhiskers.c,另存为RoamingWithPhotoresistorDividers.c.

d由于他们的工作原理和I/O口的接线一样,故不需要做很大修改。

d重新打开主板和伺服电机的电源。

d运行并测试程序。

d验证当用手在光敏电阻上投一个阴影时,宝贝车机器人是否避开阴影。

试验无阴影,

遮住右边的光敏电阻,遮住左边的光敏电阻,同时遮住两个光敏电阻。

d修改注释部分比如名称、胡须触动等,使注释符合光敏电阻器分配器的行为。

你修

改完后,这些注释应该与下面的程序类似。

程序略。

2)提高性能

你可以通过把注释掉一些子函数调用来提高宝贝车机器人的性能。

这些子函数帮助机器人在遇到障碍物时后退并躲避障碍物。

下面程序是当两个光敏电阻都探测到阴影时,if…else语句中调用的两个Left_Turn()子函数被注释的例子。

当只有一个光敏电阻探测到阴影时,Backward()子程序调用被注释,使宝贝车机器人仅仅旋转来响应探测到的阴影。

if((P1_5state()==0)&&(P2_3state()==0))

{

Backward();//向后

//Left_Turn();//向左

//Left_Turn();//向左

}

elseif(P1_5state()==0)

{

//Backward();//向后

Right_Turn();//向右

}

elseif(P2_3state()==0)

{

//Backward();//向后

Left_Turn();//向左

}

else

Forward();//向前

d修改程序RoamingWithPhotoresistorDividers.c。

d运行程序并比较性能。

3)更易于响应阴影控制的宝贝车

通过去掉导航子程序中的for循环,可以使机器人响应更迅速。

这对触须导航来说是不可能的,因为宝贝车机器人已经接触到物体,在转向之前必须后退。

当用阴影来引导宝贝车时,无论宝贝车在向前移动或者做其他动作,它都会在每个脉冲之间探测是否仍有阴影。

简单的阴影控制宝贝车

一个有趣的远程控制机器人的方法是让机器人处在正常的光亮环境中,然后让它跟随你在光敏电阻上方制造的阴影行走。

这是引导宝贝车运动的一种简便方法。

例程――ShadowGuidedBoeBot.c

当运行下面的程序时,如果没有阴影遮住光敏电阻,宝贝车机器人会静止不动,当同时遮住两个光敏电阻时,宝贝车机器人会向前移动,当只遮住一个光敏电阻时,机器人会向探测到阴影的光敏电阻一侧转动。

d输入、保存并运行程序ShadowGuidedBoeBot.c。

d用手投阴影到光敏电阻上。

d仔细研究这个程序,充分理解程序是怎样工作的。

它非常简单但功能非常强大。

#include

#include

intP1_5state(void)//获取P1_5口的状态

{

return(P1&0x20)?

1:

0;

}

intP2_3state(void)//获取P2_3口的状态

{

return(P2&0x08)?

1:

0;

}

intmain(void)

{

intcounter;

uart_Init();//串口初始化

printf("ProgramRunning!

\n");

for(counter=1;counter<=1000;counter++)//开始/复位信号

{

P1_4=1;

delay_nus(1000);

P1_4=0

delay_nus(1000);

}

while

(1)

{

if((P1_5state()==0)&&(P2_3state()==0))//都探测到阴影,向前运动

{

P1_1=1;

delay_nus(1700);

P1_1=0;

P1_0=1;

delay_nus(1300);

P1_0=0;

}

elseif(P1_5state()==0)//只有左边的探测到阴影,向左转

{

P1_1=1;

delay_nus(1500);

P1_1=0;

P1_0=1;

delay_nus(1300);

P1_0=0;

}

elseif(P2_3state()==0)//只有右边的探测到阴影,向右转

{

P1_1=1;

delay_nus(1700);

P1_1=0;

P1_0=1;

delay_nus(1500);

P1_0=0;

}

else//没有探测到阴影,静止不动

{

P1_1=1;

delay_nus(1500);

P1_1=0;

P1_0=1;

delay_nus(1500);

P1_0=0;

}

}

delay_nms(20);

}

TIPs:

程序ShadowGuidedBoeBot.c是如何工作的

while循环中的if…else语句判断四个可能的阴影条件中的一个:

两个都探测到阴影,左侧探测到阴影,右侧探测到阴影,都没探测到阴影。

依据探测到的阴影条件,给下面的其中一个动作发出脉冲:

向前,右转,左转,静止。

无论阴影条件如何,在while循环中四组脉冲中的一个会发送。

在if…else语句后,记住要执行delay_nms(20)来保证每对伺服脉冲之间的低电平。

4)压缩程序

可以尝试去掉最后的else语句,删除或注释下面的代码块:

else

{

P1_1=1;

delay_nus(1500);

P1_1=0;

P1_0=1;

delay_nus(1500);

P1_0=0;

}

d运行修改后的程序。

d你能发现机器人运动的任何不同吗?

3.对光敏电阻的进一步研究

从光敏电阻电路得到的仅有的信息是光的强度高于还是低于阈值。

本实验将介绍一个不同的电路,微控制器能够通过该电路监测并收集

足够的信息以确定相对光强。

微控制器从电路得到的值范围从小到大,

小值表明光比较强,大值表明光比较弱。

这就意味着基于不同光强

不用手工替换不同阻值的电阻,只需调整程序来寻找不同范围的值。

1)电容器介绍

电容是存储电荷的器件,它是许多电路的基本元素。

电容存储了

多少电荷用法拉来表示,1法拉是一个非常大的值,在宝贝车机器人

电路中不实用。

本节中所使用的电容存储的电荷量是百万分之几法拉。

1法拉的百万分之一叫做微法,用µF表示。

这个练习中你所使用的电

容是0.47µF。

我们学过电容的基本公式Q=CU,Q是电量,C是电容

图6-4电容的示意图和零件图

容量,U是电容两端的电压,我们可以看到当C越大时,电容的存储

能力就越强。

同时你还可以看到我们这个实验所使用的电容是电解电容,

注意图中的接法,这种电容是有极性的,通常有白色标记的一则为负。

图6-4所示是0.47uF电容的电路符号和你的宝贝车机器人元件中所用电容的零件图,电容上的0.47表示它的值。

50V表示它的最大耐压值。

 

图6-5两个光敏RC电路示意图

元件清单:

(1)光敏电阻(LDR)

(2)0.47uF电解电容

(3)220Ω电阻(红-红-棕)

(4)跳线

重新搭建感光眼电路

微控制器能够用来决定光强度的电路叫做阻容电路(RC),图6-5所示是宝贝车机器人的RC光探测电路原理图。

d断开连接主板和伺服电机的电源。

d参考图6-5,搭建RC电路。

TIPs:

RC衰减时间和光敏电阻电路原理

把图6-6所示电路中的电容看作一个微小的可充电电池。

当P1_5发送一个低电平信号时,电容两端将有接近5V的压差,此时电容的正极接近0V,负极为5V。

当P1_5发送一个高电平信号时,电容两端的电压差应接近0V,但是这并不是一下就能实现的,而是

 

有一个过程,即电源VCC和P1_5对C1充电的

过程,这是由电容的特性决定的,电容两端

的电压不能突变。

P1_5对电容的充电作用与

VCC比起来影响很小,因为高电平时P1,P2,

P3口所能提供的最大电流为40uA。

所以VCC的

充电将起主要作用。

VCC通过R1对电容充电,

当R1的电阻不同时,充电时间也不一样。

如果

由于外界光线比较弱,光敏电阻的阻抗值大,

图6-6连接到P1_5口的RC电路

电容就需要更长的时间放电。

如果外界光线非常强,

光敏电阻的阻抗值小,它阻止电流的能力很弱,电容就会很快失去电荷一段时间之后,电容的电压几乎达到5V。

如果微控制器的程序边充电边监测电压,我们就可以测量出充电时间。

2)测量RC充电时间

可以编程使微控制器给电容充电然后测量电容电压充到5V所用的时间。

测量到的充电时间可以用来表征光敏电阻的阻值。

阻值反过来又表示光敏电阻探测到的光的强弱。

这个测量需要使用定时器。

在下一个例子中,我们将测量连接到P1_5的光敏电阻电路的RC充电时间,这只光敏电阻在宝贝车机器人左侧。

测量RC充电时间之前,要做的第一件事是确保已经定义一个存储计数器计数值的变量和一个存储测量时间的变量。

unsignedintcount;

unsignedinttimeLeft;

下面代码是给电容充电,测量RC充电时间并存储在1timeLeft变量中

TH0=TL0=0;//给定时器附初值

TMOD=TMOD|0x01;//设置定时器T0为16位定时器

P1_5=0;//置P1_5口等于0

delay_nms(300);//延时给电容器放电

P1_5=1;//给电容充电

TR0=1;;//启动定时器

while((P1&0x20)==0);//查询P1_5口是否是高电平,是,就执行下面语句,反之,一直查询

count=TH0;

count=count<<8;

count=count+TL0;//读取计数值

timeLeft=count;//计算放电时间,并存在timeLeft变量中

代码执行分面两步:

1.给电容放电。

2.电容器充电,让计数器计数,并计算充电时间,并把结果存在timeLeft中。

例程:

TestP1_5Photoresistor.c

d打开主板的电源。

输入、保存并运行程序TestP1_5Photoresistor.c。

d投一个阴影在连接到P1_5的光敏电阻上,验证随着外界光线逐渐变黑,时间是否增大。

d将光敏电阻的采光面指向一个光源或用手电筒照射它,测量的时间应该是非常小。

当逐渐将光敏电阻的采光面偏离光源,测量值会增大。

如果投一个阴影或关掉光源,测量值会更大。

#include

#include

intmain(void)

{

unsignedintcount;

unsignedinttimeLeft;

uart_Init();

while

(1)

{

TH0=TL0=0;

TMOD=TMOD|0x01;

P1_5=0;

delay_nms(300);

P1_5=1;

TR0=1;

while((P1&0x20)==0);

count=TH0;

count=count<<8;

count=count+TL0;

timeLeft=count;

printf("%dus\n",timeLeft);

delay_nms(100);

}

}

3)该你了

d将程序TestP1_5Photoresistor.c另存为TestP2_3Photoresistor.c。

d修改程序测量小车右边的光敏电阻即连接到P1_6的光敏电阻的RC充电时间。

d用P2_3的RC电路重复上面的阴影和强光测试,验证其工作是否正常。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1