1、机器人实训总结机器人实训总结学 院: 专业班级: 姓名学号: -指导教师: 2013年7月为期一周的机器人实训转眼就过去了,个人认为这是我上大学以来参加的最有意思的 一次课程设计了,在实训期间,同学们亲自动手组装机器人小车并通过修改调试程序使自 己的小车完成要求的任务,将平时学习的 C语言和单片机知识运用到了实际操作中,极大地调动了我们学习的积极性并提高了动手能力,是我们受益匪浅!任务一:组装小车并完成基本调试实训第一天我们的主要任务便是将实训机器人小车按要求组装好,这看似简单的任务 是极其需要耐心与细致的,每一个螺丝都要拧紧,每一个电子元件都要安装于指定位置, 特别要注意左右轮的接线,如果反
2、接将会使小车反向运行。经过半小时的摸索,我们的小 车终于成形,但当给它录入一个前行程序时,小车竟然莫名其妙的在原地打转,我们仔细 查阅了实训指导书,才发现问题所在,原来,每一个新组装的机器人都需要进行调零检测 才能保证其运行的准确,调零程序如下:#in clude#in cludeint main(v oid)uart_I ni t();prin tf(The LED conn ected to P1_0 is bli nkin g!n);while(1);P1_0=1;delay_nus(1500);P1_0=0;delay_nus(20000); _将程序录入小车并运行,旋转车轮旁的旋钮直
3、至车轮停转便达到了调零的目的。接下 来,我们便要完成实训要求的第一个程序:控制小车 LED灯的亮灭。通过参考指导书的已有程序,我们比较顺利的完成了该任务,任务程序如下: (在试验中需要注意LED灯的正负极)#include#includeint main(void)uart_Init();printf(The LED connected to P1_0 is blinking!n);while(1)P1_0=0;P1_1=1;delay_nms(500);P1_0=1;P1_1=0;delay_nms(500);任务二:机器人触觉导航该任务要求机器人碰到障碍物时,接触开关会有所察觉,通过编程让
4、机器人避开障碍 物。在安装胡须时,需要注意胡须距传感立柱既不能太远也不能太近,太远会导致机器人 碰到障碍物后反应过慢,太近则会使机器人在前方没有障碍物的情况下进行避障操作,影 响小车正常行进。胡须机器人避障程序如下:#include#includeint P1_4state(void) 获取P1_4的状态,右胡须return (P1&0x10)?1:0;int P2_3state(void) 获取P2_3的状态,左胡须return (P2&0x08)?1:0;void Forward(void)P1_1=1;delay_nus(1700);P1_1=0;P1_0=1;delay_nus(130
5、0);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+)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
6、;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)uart_Init();printf(Program Running!n);while(1) if(P1_4state()=0)&(P2_3state()=0)Backward(); / 向后Left_Turn();/ 向左Left_Turn();/ 向左else if(P1_4state()=0)Backward();/ 向后 Left_Turn();/ 向左else if(P2_3state()=0)
7、Backward();/ 向后Right_Turn();/ 向右elseForward();/ 向前任务三:机器人红外线导航任务二触须接触导航是依靠接触变形来探测物体,而本任务是依靠红外线探测机器人 前进路线,然后确定何时有光线从被探测物体反射回来,通过检测反射回来的红外光就可 以确定前方是否有物体。在本次任务中,我们需要使用三极管 9013 ,这是因为C51的10驱动能力较弱,这里我 们加入三极管使其工作在开关状态。三极管是一种控制元件,主要用来控制电流大小,简 单地说,是用小电流去控制大电流。红外导航避障程序如下:#include#include#include#define LeftIR
8、 P1_2 / 左边红外接收连接到 P1_2#define RightIR P3_5 / 右边红外接收连接到 P3_5#define LeftLaunch P1_3 / 左边红外发射连接到 P1_3#define RightLaunch P3_6 / 右边红外发射连接到 P3_6void IRLaunch(unsigned char IR)int counter;if(IR=L)for(counter=0;counter38;counter+) LeftLaunch=1;_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_();
9、_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); LeftLaunch=0;_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); if(IR=R) for(counter=0;counter38;counter+)/ 右边发射 RightLaunch=1;_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _
10、nop_(); _nop_(); _nop_(); _nop_(); RightLaunch=0;_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); void 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
11、=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+)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_
12、0=1; delay_nus(1700);P1_0=0; delay_nms(20);int main(void)int irDetectLeft,irDetectRight; uart_Init();printf(Program Running!n); while(1)IRLaunch(R); / 右边发射 irDetectRight = RightIR;/ 右边接收IRLaunch(L); / 左边发射irDetectLeft = LeftIR;/ 左边接收两边同时接收到红外线if(irDetectLeft=0)&(irDetectRight=0)/ Backward(); Left_Tu
13、rn(); Left_Turn();只有左边接收到红外线else if(irDetectLeft=0)/Backward();Right_Turn();只有右边接收到红外线else if(irDetectRight=0)/Backward();Left_Turn();elseForward();任务四:尾随小车该任务的设计线路与任务三相同,故完成较为简单,试验程序如下:#include#include#include左边红外接收连接到 P1_2右边红外接收连接到 P3_5左边红外发射连接到 P1_3右边红外发射连接到 P3_6#define LeftIR P1_2 / #define Righ
14、tIR P3_5 / #define LeftLaunch P1_3 / #define RightLaunch P3_6 / void IRLaunch(unsigned char IR) int counter;if(IR=L)/ 左边发射for(counter=0;counter38;counter+)LeftLaunch=1;_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();LeftLaunch=0;_nop_(); _nop
15、_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); if(IR=R)/ 右边发射 for(counter=0;counter38;counter+)RightLaunch=1;_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); RightLaunch=0;_nop_(); _nop_(); _no
16、p_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();int main(void)int pulseLeft,pulseRight;int irDetectLeft,irDetectRight;uart_Init();printf(Program Running!n);doIRLaunch(R); / 右边发射 irDetectRight = RightIR;/ 右边接收 IRLaunch(L); / 左边发射 irDetectLeft = LeftIR;/ 左边接收 if(i
17、rDetectLeft=0)&(irDetectRight=0)/ pulseLeft=1300;pulseRight=1700;else if(irDetectLeft=0)&(irDetectRight=1)/pulseLeft=1700;pulseRight=1700;else if(irDetectLeft=1)&(irDetectRight=0)/pulseLeft=1300;pulseRight=1300;else / 前进pulseLeft=1700;pulseRight=1300;P1_1=1;delay_nus(pulseLeft);P1_1=0;P1_0=1;delay_n
18、us(pulseRight);P1_0=0;delay_nms(20);while(1);任务五:机器人的距离检测向后退右转左转用同样的IR LED探测电路检测距离,高灵敏度的频率可以探测远距离的物体,低灵敏 度的频率可以探测距离较近的物体。这使得距离探测就简单了。选择 5个不同频率,从最低 灵敏度到最高灵敏度进行测试,依赖于探测器不能再检测到物体的红外线频率,就可以推 断物体的大概位置。测试扫描频率程序如下:#include #include #define LeftIRP1_2 / 左边红外接受连接到 P1_2/#define RightIRP3_5 / 右边红外接收连接到 P3_5#de
19、fine LeftLaunchP1_3 / 左边红外发射连接到 P1_3/#define RightLaunch P3_6 / 右边红外发射连接到 P3_6unsigned int time;int leftdistance;/左边的距离/int rightdistance;/右边的距离int distanceLeft, irDetectLeft;/int distanceRight,irDetectRight;unsigned int frequency5=29370,31230,33050,35700,38460;void timer_init(void)IE=0x82;/开总中断EA允许
20、定时器0中断ET0TMOD |= 0X01; / 定时器0工作在模式 1:16位定时器模式time = 256 - (500000/Freq); / 根据频率计算初值void FreqOut(unsigned int Freq)TH0 = 0XFF;/ 高八位设 FFTL0 = time;/ 低八位根据公式计算TR0 = 1;/ 启动定时器delay_nus(800); / 延时TR0 = 0;/ 停止定时器void Timer0_Interrupt(void) interrupt 1 LeftLaunch = LeftLaunch; /RightLaunch= RightLaunch; TH
21、0 = 0XFF;TL0 = time;void Get_lr_Distances()unsigned int count; leftdistance = 0; /rightdistance = 0;for(count = 0;count5;count+) FreqOut(frequencycount); irDetectLeft = LeftIR; / /irDetectRight = RightIR;/printf(f=%dn,time);/ 取反/ 重新设值初始化左边的距离/ 初始化右边的距离左边接收/ 右边接收printf(irDetectLeft = %dn,irDetectLeft
22、); /printf( irDetectRight = %dn ,irDetectRight); if(irDetectLeft = 1)leftdistance+;/if (irDetectRight = 1) /rightdistance+;int main(void)uart_Init(); timer_init(); printf(Progam Running!n);printf(FREQENCY ETECTEDn);while(1)Get_lr_Distances();printf(distanceLeft = %dn,leftdistance);/printf( distanceR
23、ight=%dn,rightdistance);printf( n);delay_nms(1000); 在进行串口调试时,应注意串口的接线位置,安装符合自己电脑的串口调试助手。任务六:寻线搬运机器人 可能是前几个任务完成太轻松的原因,是我们对实训产生了懈怠的想法,但最后的任 务再一次提醒了我需要学习的东西还有很多,永远都不能骄傲自满。经过一天多的调试,在机器人的运行和编程中,出现了以下几方面的问题:一、转弯出现问题。在一些路口中转弯出现了问题。所以提倡用自定义转弯,提高成 功率。二、在运行机器人前要检查螺丝,检查机器人的性能是否良好,以免在运行过程中发 生意外。三、遇到错误时,要耐心,细心检查
24、问题,分析问题,要互相讨论出解决方案。四、电池的电量对小车运行影响极大最好选用质量较好的电池。五、伺服电机的角度没有调好,导致机器人在运行过程中影响程序的运行。六、熟悉自己的机器人,了解一些运行、编程的小技巧。寻线搬运机器人编程如下:#include #include #include#define uint unsigned int#define uchar unsigned charuchar QTIState ;void Time1_init(void)EA = 1;/硬件串口使用定时器1,供AT89S5与P(机通信使用TMOD |= 0x20; /SCON = 0x50; / TH1
25、= 0xFD; /TL1 = 0xFD;TR1 = 1; /TI = 1;定时器1方式2.8位自动重装模式模式1 ,8位数据波特率为 9600起动定时器void Forward(void)/ 向前行走子程序P1_1=1;delay_nus(1700);P1_1=0;P1_0=1; delay_nus(1300);P1_0=0; delay_nms(20);void Pivot_Left(void)/P1_1=1;delay_nus(1500);P1_1=0;P1_0=1; delay_nus(1350);P1_0=0;delay_nms(20);void Pivot_Right(void)/P
26、1_1=1;delay_nus(1650);P1_1=0;P1_0=1;delay_nus(1500);P1_0=0;左转子程序右转子程序delay_nms(20);void Rotate_right(void)P1_1=1;delay_nus(1650);P1_1=0;P1_0=1;delay_nus(1650);P1_0=0;delay_nms(20);void Rotate_Left(void)P1_1=1; delay_nus(1350);P1_1=0;P1_0=1; delay_nus(1350);P1_0=0; delay_nms(20);void Backward(void) /
27、 向后行走子程序P1_1=1; delay_nus(1300);P1_1=0;P1_0=1; delay_nus(1700);P1_0=0; delay_nms(20);void Get_QTI_State(void)QTIState = P2&0x0e ;void Follow_Line(void)Get_QTI_State(); switch(QTIState)case 0x04 : Forward(); break;case 0x06 : Pivot_Right();break; case 0x02 : Rotate_right();break;case 0x0c : Pivot_Lef
28、t(); break;case 0x08 : Rotate_Left();break; /*case 0x0e : Forward(); break;*/default : break;void main(void)int counter;Time1_init();printf(program run ok!); for(counter=0;counter350;counter+)/ Follow_Line(); /*for(counter=0;counter20;counter+)/ Forward();*/for(counter=0;counter33;counter+)/ Pivot_Left();for(counter=0;counter65;counter+)/ Forward();for(counter=0;counter55;counter+)/ Rotate_Left();for(counter=0;counter38;counter+)/
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1