




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机输入/输出接口与红外导航一、实验要求了解红外传感器的工作原理,动手搭建红外电路,能够探测和避开障碍物;改进程序,实现更可靠的壁障功能,可以尝试避开“悬崖”或者循线的功能;对试验中出现的问题或现象进行总结,给出解释。二、实验概要1搭建并测试IR发射和探测器对了解红外发射与接收器的工作原理,搭建合适的电路,编写程序,对IR发射与探测器进行测试。2探测和避开障碍物IR检测器没有检测到红外光时输出为高电平,这与触须的作用很类似。那么,可以利用红外光的反射,检测有没有从障碍物反射回来的光线,就可以判断前方有无障碍物。修改触须导航的程序,实现以上功能,要求能够检测到一定范围内的较大的障碍物,并避开。
2、3高性能的IR导航红外干扰测试,以及探测距离调整;适当的修改程序,使小车行走过程更加流畅。4俯视的探测器可以做什么事情原理同上,俯视的探测器可以探测前下方或者下方有无物体,这怎么用?可以反着用我要探测“没有物体”这种情况。比如,小车在桌子边缘,为了不掉下去,就需要这做。实验中用黑色绝缘带模拟这一种情况。小车检测到绝缘带即表示到了桌子边缘,然后应该后退,以避免掉下去。三、实验内容如今最热门的产品看起来都有一个共性:无线通信。比如私人用户可以把数据无线传输到便携电脑,我们可以通过遥控自由选择频道。许多远程控制和PDA使用频率低于可见光的红外线进行信号通信。使用一些便宜且应用广泛的部件,MCS-51
3、微控制器也可以收发红外光信号。使用红外线前灯探测道路不接触探测物体并不需要任何就像机器视觉那样复杂的东西。许多机器人使用雷达(RADAR)或者声纳(SONAR)。一个更简单的系统是使用红外光来照射机器人的路线,然后确定何时有光线从目标反射回来。由于红外远程控制技术的发展,红外线发射器和探测器已经很普及并且价格便宜。红外前灯我们在宝贝车机器人上建立的红外物体探测系统在许多方面就像汽车的前灯。当汽车前灯的射出的光从障碍物体反射回来时,你的眼睛发现障碍物体,然后 你的大脑处理这些信息,并据此控制你的身体引导汽车。宝贝车机器人使用红外线两极管LED作为前灯,如图8-1所示。他们发射红外光,在一些情况下
4、,红外线从物体 反射从机器人前进的方向折回。宝贝车机器人的眼睛是红外检测器。红外检测器发出信号来表明它们是否检测 图 8-1用红外光探测障碍物到从物体反射回的红外线。宝贝车机器人的大脑,MCS-51 微控制器据此做出判断并基于这个传感器的输入控制伺服 IR检测器电机。 IR(红外线)检测器有内置的光滤波器,除了需要 IR LED我们用它的内部的光敏二极管传感器检测的980 nm红外线,它几乎不允许其它光通过。红外检测器也有一个电子滤波器,它只允许大约 38.5 kHz的信号通过。换句话说, 检测器只寻找每秒闪烁 38,500次的红外光。这就防止了普通光源像太阳光和室内光对IR的干涉。太阳光是直
5、流干涉(0Hz),室内光依赖于所在区域的主电源,闪烁 IR LED 套管频率接近100或120 Hz。由于120 Hz在电子滤波器的 38.5 kHz通带频率之外,它完全被IR探测器忽略。1搭建并测试IR发射和探测器对 图 8-2本节需要的新部件本实验中,你将搭建并测试红外线发射和检测器对。元件清单:(1)两个红外检测器(2)两个IR LEDs (3)两对IR LED套管(4)两个220 电阻 (红-红-棕)(5)两个1 k电阻 (棕-黑-红)搭建红外线前灯如图83所示,将红外LED插入套管。 图83 将红外 LED 插入套管d确保LED摁入到大的套管中。d将小的套管套在LED上,并摁进大的圈
6、里面。电路板的每个角安装一个IR组 (IR LED和检测器)。图7-4所示是接线图。d断开主板和伺服系统的电源。d建立图8-4所示的电路,参考图7-4接线。图 8-4左侧和右侧 IR 组1)测试红外发射探测器本任务中,你要用P1_4发送持续1秒的 38.5kHz的红外光,如果红外光被小车路径上的物体反射回来,红外检测器将给微控制器发送一个信号,让它知道已经检测到反射回的红外光。让每个IR LED探测器组工作的关键是发送1 ms 频率为 38.5 kHz的红外信号,然后,立刻将IR探测器的输出存储到一个变量中。下面是一个例子,它发送 38.5 kHz信号给连接到P1_4的IR发射器,然后用位变量
7、irDetectLeft存储连接到P15的IR探测器的输出。for( counter=0;counter< 38;counter+)P1_3=1;delay_nus(13);P1_3=0; delay_nus(13);irDetectLeft=P1_5state();当没有IR信号返回时,探测器的输出状态为高。当它探测到被物体反射的 38500 Hz和声时,它的输出为低。当发送红外信号后,IR探测器的输出处于低状态不到1毫秒,因此当发送完后立即将IR探测器的输出存储到变量中是很重要的。这些存储的值会显示在调试终端或被机器人用来导航。例程: TestLeftIrPair.cd打开主板的电源
8、。d输入、保存并运行程序TestLeftIrPair.c。#include<BoeBot.h>#include<uart.h>int P1_6tate(void)return (P1&0x40)?1:0;int main(void)int irDetectLeft;uart_Init();printf("Program Running!");for( counter=1;counter<=1000;counter+)/开始/复位信号 P1_3=1;delay_nus(1000);P1_3=0; delay_nus(1000);while
9、(1)for( counter=0;counter< 38;counter+) P1_5=1;delay_nus(13);P1_5=0;delay_nus(13); irDetectLeft=P1_6state();printf("irDetectLeft=%dn",irDetectLeft);delay_nms(100);保持宝贝车 机器人与串口电缆的连接,因为你将用调式终端来测试你的IR组。放一个物体,比如手或一张纸,距离左侧IR组大约1英寸,参考图8-1。验证当你放一个物体在IR组前时,调试终端是否会显示0,当你将物体移开时,它是否显示1。如果调试终端显示的是预
10、料的值,没发现物体显示1,发现物体显示0,你可以测试另一对红外。如果调试终端显示的不是预料的值,试试排错部分里的步骤进行排错。Tips:排错d如果调试终端显示的不是预料的值,检查电路和输入的程序。d如果你总是得到0,甚至当没有物体在宝贝车前面时也是0,可能是附近的物体反射了红外线。宝贝车前面的桌面是常见的始作俑者。移动小车,使IR LED和探测器不可能受附近物体的影响。d如果宝贝车前面没有物体时绝大多数时间读数是1,但是偶尔是0,这可能是附近的荧光灯的干扰。关掉附近的荧光灯,重新测试2)函数延时的不精确性如果你有数字示波器,或许到这里你已经注意到P1_4产生的方波的频率并不是125.5K,也就
11、是说延时13us并不是真的延时了13us,而是更长。这是为什么么呢,主要是由于函数调用过程产生了延时。函数调用时,CPU会先进行一系列的堆栈操作,这些操作时需要时间的,至少几个us,而我们现在延时也是us级,这就造成了延时的不精确性。怎么办呢,有没有更精确的方法呢?这里介绍一种常用的延时方法,这在实际工程中用的非常广泛:for(i=0;i<1;i+) ; 这是一个for空操作语句,它什么也不做,但能产生延时。我们可以用示波器测量,它能产生约12us延时。 for(i=0;i<2;i+) ; /延时25us for(i=0;i<125;i+) ; / 延时1ms左右 还有很多方
12、法,比如使用中断,汇编等等,不过实现这个功能,不推荐使用中断,太浪费了,而且不理想。因为假设用中断延时的话,在延时过程中,CPU什么也做不了。中断通常用在实时操作RTOS(Real-Time Operating System)系统中。3)右红外测试d将程序TestLeftIrPair.c另存为TestRightIrPair.c。更改名称和注释使适合于右侧IR组。(即把注释for语句变成程序,而delay()变为注释)还有其他一些变量需要修改,自己找出来。2探测和避开障碍物有关IR检测器的一个有趣的事是它们的输出与触须的输出非常相象。没有检测到物体时,输出为高,检测到物体时,输出为低。本任务中,
13、更改程序RoamingWithWhiskers.c使它适用于IR检测器。下一个例子程序开始于RoamingWithWhiskers.c。更改旁边的名称和描述,加入两个位变量来存储IR检测器的状态。int irDetectLeft int irDetectRight调用一个函数IRLaunch()来读IR组的状态。int IRLaunch(unsigned char IR) unsigned int counter;if(IR='L') for(counter=0;counter<1000;counter+) LeftLaunch=1; _nop_(); _nop_();
14、_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); LeftLaunch=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); else for(counter=0;counter<1000;counter+)/右边发射 RightLaunch=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_
15、(); _nop_(); RightLaunch=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 修改ifelse语句检查存储IR检测信息的变量。if(irDetectLeft=0)&&(irDetectRight=0)/两边同时接收到红外线 Backward();Left_Turn();Left_Turn();else if(irDetectLeft=0)/只有左边接收到红外线Backward();Right_Turn();else if(irDetectRight=0)/只有右边接收到红外线Backward(
16、);Left_Turn();elseForward();例程RoamingWithIr.cd打开程序RoamingWithWhiskers.c。d更改程序使它与下面程序相同。d打开主板和伺服电机的电源。d保存并运行程序。d验证宝贝车的行为和运行程序RoamingWithWhiskers.c时除了不需接触是否非常相象。#include<BoeBot.h>#include<uart.h>#include <intrins.h>#define LeftIR P1_6 /左边红外接收连接到P15#define RightIR P2_3/右边红外接收连接到P36#de
17、fine LeftLaunch P1_5 /左边红外发射连接到P14#define RightLaunch P2_4 /右边红外发射连接到P35int IRLaunch(unsigned char IR) unsigned int counter; if(IR='L') for(counter=0;counter<1000;counter+) LeftLaunch=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); Lef
18、tLaunch=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); else for(counter=0;counter<1000;counter+)/右边发射 RightLaunch=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); RightLaunch=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); vo
19、id Forward(void) /向前行走子程序 P1_1=1; delay_nus(1700); P1_1=0;P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20);void Left_Turn(void) /左转子程序 int i; for( i=1;i<=26;i+) P1_1=1; delay_nus(1300); P1_1=0; P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20); void Right_Turn(void) /右转子程序 int i; for( i=1;i<=26;i+)
20、 P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus(1700); P1_0=0; delay_nms(20); void Backward(void) /向后行走子程序int i; for( i=1;i<=65;i+) P1_1=1; delay_nus(1300); P1_1=0; P1_0=1; delay_nus(1700); P1_0=0; delay_nms(20); int main(void) bit irDetectLeft,irDetectRight; int i,counter; uart_Init(); print
21、f("Program Running!n"); for( counter=1;counter<=1000;counter+)/开始/复位信号 P1_3=1; delay_nus(1000); P1_3=0; delay_nus(1000); while(1) IRLaunch('R'); irDetectRight = RightIR; /右边接收 IRLaunch('L'); irDetectLeft = LeftIR; /左边接收 if(irDetectLeft=0)&&(irDetectRight=0)/两边同时接
22、收到红外线 Backward(); Left_Turn(); Left_Turn(); else if(irDetectLeft=0)/只有左边接收到红外线 Backward(); Right_Turn(); else if(irDetectRight=0)/只有右边接收到红外线 Backward(); Left_Turn(); else Forward(); 3高性能的IR导航1)物体检测状态显示本实验中,你将制作并测试LED指示器,它将告诉你是否检测到物体,而不需要调试终端的帮助。如果你不在电脑旁边,这将很方便,你可以用此来排除你的IR检测电路的故障。你需要写一个程序来发现来自荧光灯的红外
23、干涉。许多荧光灯发射的信号类似你的IR LED发射的信号。荧光灯内部控制电压的部件叫镇流器。许多镇流器和你的IR探测器的工作在相同的频率范围, 38.5 kHz左右,这就会导致荧光灯发射同样频率的信号。所以当你用集成的红外线探测器导航时,这些干扰可能导致许多奇异的宝贝车车行为!重新搭建LED指示电路这里用到的是和前面“胡须”中用到的同样的LED指示器。元件清单:(1)红色 LEDs(2) 220 电阻 (红-红-棕)图8-5 左侧和右侧 LEDs指示电路 d断开主板和伺服系统的电源。d参考图8-5,建立接线电路本系统包括许多元件,这就增加了接线错误的可能性。因此有一个测试程序是很重要的。测试程
24、序告诉你红外检测器检测到什么。从串口电缆上拔掉机器人测试其它障碍物体之前,你可以用这个程序来验证所有的电路是否正常工作。例程TestIrPairsAndIndicators.cd接通主板的电源。d输入、保存并运行程序TestIrPairsAndIndicators.c。d可以加入输出语句“printf()”,用调试终端来验证当放一个物体在检测器前面时,微控制器是否仍然从每个IR检测器发出收到信号0。d验证当检测器检测到物体时,每个检测器旁的LED是否会发光。如果一个或两个LED不能工作,检查接线和程序。#include<BoeBot.h>#include<uart.h>
25、int P1_5state(void)return (P1&0x20)?1:0;int P3_6state(void)return (P3&0x40)?1:0;int main(void)int irDetectLeft,irDetectRight;uart_Init();printf("Program Running!");for( counter=1;counter<=1000;counter+)/开始/复位信号 P1_3=1;delay_nus(1000);P1_3=0; delay_nus(1000);while(1)for( counter=
26、0;counter<125;counter+) P1_4=1; P3_5=0;for(i=0;i<1;i+); P1_4=0; P3_5=0; for(i=0;i<1;i+) ; irDetectLeft=P1_5state();irDetectRight=P3_6state();if(irDetectLeft=0) P1_2=1;else P1_2=0;if(irDetectRight=0)P3_4=1;else P3_4=0;delay_nms(100);该你了远程测试和范围测试现在你可以用LED指示器,拿开你的宝贝车并用IR探测器来探测不在你的串口电缆长度范围之内的目标
27、。拔掉连接在宝贝车机器人上的串口电缆,将其放到几个不同的物体之前,以测试IR探测器的范围。测试对不同颜色物体的探测范围,对什么颜色的物体探测的范围最远,什么颜色的物体探测的范围最近?2)探测红外线干扰如果你偶尔注意到即使检测范围内没有任何物体,你的宝贝车机器人指示探测到了物体,这说明附近的灯光正产生频率接近 38.5 kHz的红外光。如果你想在这种灯光下进行机器人比赛或演示,你的红外系统可能会停止工作。每个人最终的想法都是让自己的机器人在公开演示时不要出错,因此在动手做演示之前,用这个红外线干涉探测程序仔细检查任何要演示宝贝车的区域是有必要的。程序的原理很简单,不用IR LED发送任何红外光,
28、只是监控有没有检测到红外光,如果检测到红外光,用扬声器发出警报。例程IrInterferenceSniffer.cd输入、保存并运行程序IrInterferenceSniffer.c。d测试验证当机器人检测到IR干扰时,发出警报声。你可以单独用一个宝贝车来运行程序TestIrPairsAndIndicators.c。如果没有多余的宝贝车,就用TV、VCR、CD/DVD机或放映机的手持式遥控器对着宝贝车机器人按一个键。如果宝贝车发出警报声,就可以知道宝贝车的探探器处于工作状态。#include<BoeBot.h>#include<uart.h>int P1_5state(
29、void)return (P1&0x20)?1:0;int P3_6state(void)return (P3&0x40)?1:0;int main(void)uart_Init();printf("Program Running!n");while(1)if(P1_5state()=0)|(P3_6state()=0) for( counter=1;counter<=150;counter+) P1_3=1;delay_nus(1000);P1_3=0;delay_nus(1000); delay_nms(30);该你了测试荧光灯干扰断开宝贝车和串口
30、电缆的连接,将它指向附近任何荧光灯。如果你听到频繁地警报,在准备使用IR物体检测器之前关掉荧光灯。3)红外检测范围调整(1)串联电阻与LED亮度你可能已经注意到在环境很黑的时候,亮一些的汽车灯可以看到更远一些的物体。通过使宝贝车的前灯更亮,你也可以增加它的检测范围。更小的电阻使通过LED的电流更多。更多的电流使LED更亮。本任务中,你将检测LED和IR LED串不同电阻值的效果。元件清单:本节中需要一些特殊的部件: (1)两个470 电阻 (黄-紫-棕) (2)两个220 电阻(红-红-棕) (3)两个2 k电阻 (红-黑-红) (4)两个4.7 k电阻 (黄-紫-红)前面做过这样的实验,串联
31、不同阻值的电阻,可以观察到LED亮度也不同,阻值大,LED较暗。用自己的语言解释LED亮度和串联电阻之间的关系。(2)串联电阻与IR检测范围现在我们已经知道小的电阻会使LED更亮。我们来做一个合理假设:更亮的IR LED可能检测更远的物体。d打开并运行程序TestIrPairsAndIndicators.c。d验证两个检测器都工作正常。该你了测试IR LED的范围d用1 k的电阻替代原电阻。用一个尺子测量离IR LED最远的可以探测到面对IR LED的一张纸的距离,在表8.1中记录测量数据。d用4.7 k的电阻代替连接P1_4到IR LED阳极的1 k电阻。d确定能够检测到同一张纸的最远距离,
32、记录数据。d用2 k电阻代替。d用470 电阻代替。d用220 的电阻代替。表8.1检测距离与电阻的关系d用程序TestIrPairsAndIndicators.c测试更改后的电路,确保IR LED和检测器工作正常。4)优化程序,使小车更加灵活在触须导航里使用的预编程机动动作很好,但是在使用IR LED和探测器时会造成不必要的迟钝。发送脉冲给电机之前检查障碍物,可以大大改善宝贝车的行走性能。程序可以使用传感器输入为每个瞬间的导航选择最好的机动动作。这样,宝贝车永远不会走过头,它会找到绕开障碍物的完美路线,成功的走过更加复杂的路线。Tips:在每个脉冲之间采样以避免碰撞探测障碍物很重要的一点是在
33、宝贝车撞到它之前给宝贝车留有绕开它的空间。如果前方有障碍物,宝贝车会使用脉冲命令避开,然后探测,如果物体还在,再使用另一个脉冲来避开它。宝贝车能持续使用电机驱动脉冲和探测,直到它绕开障碍物,然后它会继续发向前行走的脉冲。试验完下一个例子程序后,你会认同这对于宝贝车行走是一个很好的方法。例程FastIrRoaming.cd输入、保存并运行程序FastIrRoaming.c。#include<BoeBot.h>#include<uart.h>#include <intrins.h>#define LeftIR P1_5 /左边红外接收连接到 P15#define
34、 RightIR P3_6 /右边红外接收连接到 P36#define LeftLaunch P1_4 /左边红外发射连接到 P14#define RightLaunch P3_5 /右边红外发射连接到 P35int IRLaunch(unsigned char IR) unsigned int counter; if(IR='L') for(counter=0;counter<1000;counter+) LeftLaunch=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(
35、); _nop_(); _nop_(); _nop_(); LeftLaunch=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); else for(counter=0;counter<1000;counter+)/右边发射 RightLaunch=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); RightLaunch=0; _nop_(); _nop_(); _nop_
36、(); _nop_(); _nop_(); _nop_(); int main(void) int counter; int pulseLeft; int pulseRight; bit irDetectLeft, irDetectRight; char IR; uart_Init(); printf("Program Running!n"); for(counter=1;counter<=1000;counter+)/开始/复位信号 P1_3=1; delay_nus(1000); P1_3=0; delay_nus(1000); do IRLaunch('
37、R'); irDetectRight = RightIR; /右边接收 IRLaunch('L'); irDetectLeft = LeftIR; /左边接收 if(irDetectLeft=0)&&(irDetectRight=0) /向前走 pulseLeft=1300; pulseRight=1700; printf("Forwordn"); else if(irDetectLeft=0)&&(irDetectRight=1) /左转 pulseLeft=1700; pulseRight=1500; printf
38、("turn_Leftn"); else if(irDetectLeft=1)&&(irDetectRight=0) /右转 pulseLeft=1500; pulseRight=1300; printf("turn_Rightn"); else pulseLeft=1700; /后退 pulseRight=1300; printf("backn"); P1_1=1; delay_nus(pulseLeft); P1_1=0; P1_0=1; delay_nus(pulseRight); P1_0=0; delay_n
39、ms(15); while(1); Tips:程序FastIrRoaming.c是如何工作的这个程序使用稍微不同的方法来使用驱动脉冲。除了两个存储IR检测器输出的状态以外,它还使用两个16位的无符号数变量来设置发送的脉冲持续时间。 bit irDetectLeft;bit irDetectRight;pulseLeft;pulseRight;在while循环中,发送 38.5 kHz的IR信号给每个IR LED。当1 ms脉冲被发送后,变量立即存储IR检测器的输出状态。这是很有必要的,因为如果你等待的时间太长,无论是否发现物体,将返回没有探测到物体的状态0。 IRLaunch('R
40、39;); irDetectRight = RightIR; /右边接收 IRLaunch('L'); irDetectLeft = LeftIR; /左边接收在ifelse语句中,程序不是发送脉冲或调用导航程序而是设置发送的脉冲持续时间。if(irDetectLeft=0)&&(irDetectRight=0)pulseLeft=1300;pulseRight=1700;else if(irDetectLeft=0)pulseLeft=1700;pulseRight=1700;else if(irDetectRight=0)pulseLeft=1300;pul
41、seRight=1300;elsepulseLeft=1700;pulseRight=1300;在重复while循环之前,要做的最后一件事是发送脉冲给伺服电机。P1_1=1;delay_nus(pulseLeft);P1_1=0;P1_0=1;delay_nus(pulseRight);P1_0=0;delay_nms(20);4俯视的探测器到目前为止,当宝贝车探测到前面有障碍物时,主要使机器人做避让动作。也有一些场合,当没有检测到障碍物时,宝贝车也必需采取避让动作。例如,如果宝贝车在桌子上行走,IR检测器向下监测桌子表面。只要IR探测器都能够“看”到桌子表面,程序会使宝贝车继续向前走。换句话
42、说,只要行走的桌子表面能够被检测到,宝贝车就会继续向前走。d断开主板和伺服系统的电源。d使IR组向外向下,如图8-6所示。图8-6俯视的探测器推荐材料: (1)卷装黑色聚氯乙烯绝缘带 ¾ (19 mm) 宽。(2)一张白色招贴板 22 x 125 in (56 x 71 cm)。用绝缘带模拟桌子的边沿由绝缘带制作边框的白色招贴板能够很容易地模拟桌子的边沿,这对宝贝车没有什么危险。如图87所示,建立一块有绝缘带边界的场地。使用至少3条绝缘带,绝缘带边之间连接紧密,没有纸漏出来。用2 k电阻代替1 k电阻,把P2_3到其所对应的IR LED连接起来。我们希望宝贝车在本任务中看得近一些。d
43、打开主板电源。d运行程序IrInterferenceSniffer.c,确保临近的荧光灯不会干扰宝贝车的IR检测器。用程序TestIrPairsAndIndicators.c,确保宝贝车检测到招贴板但检测不 到绝缘带。边沿探测器编程图 8-7模拟桌面边沿的绝缘带边框 编程使宝贝车在桌面行走而不会走到桌边,只需修改程序FastIrRoaming.c中的ifelse语句。主要的修改是,当irDetectLeft和irDetectRight的值都是0时,表明在桌子表面检测到物体(桌面),宝贝车向前行走。宝贝车也会从一个检测器的那边避开,当这个检测器表明它没有发现物体(桌面)时。例如,如果irDete
44、ctLeft的值是1,宝贝车会向右转。避开边沿的程序的第二个特征是可调整的距离。你可能希望宝贝车在检查两个检测器之间只响应一个向前的脉冲,但是只要发现边沿,在下一次检测之前希望它响应几个对转动有利的脉冲。仅仅因为你在躲避的动作中使用了几个脉冲,它并不意味着你必须返回到触须式的导航。相反,你可以增加变量pulseCount来设置传输给宝贝车的脉冲数。一个向前的脉冲,pulseCount可以是1,10个向左的脉冲,pulseCount可以设为10,等等。例程AvoidTableEdge.cd打开程序FastIrRoaming.c并另存为AvoidTableEdge.c。d修改它使其与下面例程匹配。
45、d打开主板与电机的电源。d在带绝缘带边框的场地上测试程序。#include<BoeBot.h>#include<uart.h>#include <intrins.h>#define LeftIR P1_5 /左边红外接收连接到P15#define RightIR P3_6 /右边红外接收连接到P36#define LeftLaunch P1_4 /左边红外发射连接到P14#define RightLaunch P3_5 /右边红外发射连接到P35int IRLaunch(unsigned char IR) unsigned int counter; if(I
46、R='L') for(counter=0;counter<1000;counter+) LeftLaunch=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); LeftLaunch=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); else for(counter=0;counter<1000;counter+)/右边发射 RightLaunch=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); RightLaunch=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); int main(void) int i,counter; int pulseCount; int pulseL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论