您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > AI人工智能 > 移动机器人设计与制作设计(一)――智能循迹小车
1开放性实验报告智能循迹小车姓名:党树林学号:06124143专业:电气工程及其自动化指导老师:赵勇时间:2013.9.17--2013.12.02智能循迹小车1目录1.系统功能介绍...................................22.设计要求与任务.................................23.系统硬件设计...................................23.1舵机模块...................................23.2数码管计数.................................23.3循迹接收模块...............................33.4避障模块...................................33.5单片机硬件最小系统.........................34.实验演示结果...................................35.实验总结.......................................4附录一...........................................4智能循迹小车21.系统功能介绍本设计采取以单片机为最小系统,小车内部电路结构由舵机模块,数码管计数模块,遥控接收模块,循迹模块、避障这五大部分组成。舵机模块主要是利用脉冲信号控制舵机进行360度旋转。数码管计数模块通过以秒为单位进行计数显示。遥控接收模块通过遥控控制小车进行各个方位的行进。循迹模块主要是小车可以自主沿着黑色的轨迹行进。避障模块当检测到障碍物之后主动改变原来方向,避开障碍物后继续前进。2.设计要求与任务熟悉51系列单片机的使用原理及操作方法。掌握基本电路设计技巧和C程序设计。掌握数码管、舵机等器材的基本使用方法并了解其原理。设计并灵活调试小车的各方面行进功能。3.系统硬件设计3.1舵机模块PWM信号进行控制,获得一个直流偏置压。该输出的PWM波以驱动电机正反转。利用占空比的变化改变舵机的位置。给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号它才会改变输出角度到新的对应的位置上。舵机内部有一个基准电路,产生周期20ms,宽度1.5ms的基准信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。3.2数码管计数数码管分为共阴极和共阳极两种类型,其实共阴极就是将八个LED的阴极连智能循迹小车3在一起,让其接地,这样给任何一个LED的另一端高电平,它便能点亮。而共阳极就是将八个LED的阳极连在一起。3.3循迹接收模块迅即模块主要通过ST188光电传感器,当没有物体反射红外线时,ce之间截止,无电流流过,输出电压为电源电压,高电平。当有物体反射红外线时,be饱和导通ce也就导通了,输出端就相当于接地。输出电压为低电平。设置检测电路,当检测到黑显示输出低电平,否则输出高电平且控制舵机转向,熟悉掌握ST188的引脚功能,设计电路3.4避障模块检测距离可以根据要求进行调节。该传感器具有探测距离远、受可见光干扰小、价格便宜、易于装配、使用方便等特点,可以广泛应用于机器人避障、流水线计件等众多场合。前方无障碍输出高电平(1),有障碍输出口(黄色)电平会从高电平变成低电平(0),工作原理已经标在图上了。背面图有一个电位器可以调节障碍的检测距离。3.5单片机硬件最小系统试验的控制器件是AT89C51系列单片机,它在整个实验中起了核心作用,采用内部时钟方式,给它的引脚外接晶振,这样就构成了自激振荡器并在单片机内部产生时钟脉冲信号,给晶振的每个角又接了一个30PF的电容,让晶振快速起振并可以达到12M稳定频率,给单片机的RST口按键开关使之构成复位电路。4.实验演示结果当开启循迹时,小车放在跑道上,打开电源后,沿着跑道行进,在转弯处能根据跑道拐弯等动作前进。开启遥控时,用遥控指挥小车的各个方向运动及停止行走过程。加上避障后,在距离障碍物20厘米左右小车会自动改变方向,避开智能循迹小车4障碍物后再次沿着原来的方向前进,从而达到集循迹、遥控、避障为一体的智能小车。5.实验总结这次实验完成了循迹遥控避障的功能,我从开始的单片机C程序及相关软件学习到后来的电路设计,在关于实验的学习的过程中,获得一定的实验知识储备。在实验中掌握了一定的知识,也遇到了问题:比如避障模块,当遇到障碍物时,小车回多转动360度后才能沿着原来的方向继续前进,我认为应该是C程序定义之间有冲突,导致运行时发生混淆,从而使显示发生错误。经过反复试验和努力到目前为止也没能解决这个问题,所以只能在以后的时间继续进行思索和改进。在实际实验中才发现,理论和实际有一定的差距,所以在实际中要不断理解深入,只有进行实际的操作才能切实掌握知识的精华和作用所在,并巩固自己的理论知识,在解决问题中深化自己。附录一循迹遥控代码#includereg52.h#defineucharunsignedchar#defineuintunsignedintvoiddelay1(intms);voiddelay2(ucharx);sbitleft=P1^0;//左舵机控制信号sbitp1_1=P1^1;//工作指示灯sbitright=P1^2;//右舵机控制信号sbitleft_s=P1^3;//左传感器信号sbitmiddle_s=P1^4;//中传感器信号sbitright_s=P1^5;//右传感器信号sbiteye=P3^5;//红外接近传感器信号智能循迹小车5sbitIN1=P2^4;sbitIN2=P2^5;sbitIN3=P2^6;sbitge_w=P2^2;sbitshi_w=P2^1;sbitbai_w=P2^3;uinta=2700,c=0;//舵机信号变量uintcount=0,flag=0,ge,shi,bai,num;//计时变量ucharIRCOM[7];ucharcodenumber[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};//数码管编码表voiddelay(uinta){ucharx;uinty;for(y=a;y0;y--)for(x=110;x0;x--);}voidDelay(void)//舵机控制延时函数{uintt=2222;while(t--){}}voidtime1()interrupt3//定时器T1中断{TH1=(65536-50000)/256;TL1=(65536-50000)%256;//50msflag++;if(flag==20){flag=0;num++;if(num==1000)num=0;ge=num%10;shi=num/10%10;bai=num/100;}}智能循迹小车6voiddisplay(ucharge,ucharshi,ucharbai)//数码管显示函数{shi_w=0;P0=number[shi];delay(5);//P0=0x00;shi_w=1;bai_w=0;P0=number[bai];delay(5);//P0=0x00;bai_w=1;ge_w=0;P0=number[ge];delay(5);//P0=0x00;ge_w=1;}voidtimer0(void)interrupt1//定时器T0中断{left=0;right=0;c=10000-c;TH0=-(c/256);TL0=-(c%256);c=a;}voidservo(uintb,uintd)//舵机控制函数{left=b;right=d;c=a;TH0=-(a/256);TL0=-(a%256);ET0=1;//定时器T0中断允许TR0=1;//定时器T0启PT0=0;//定时器T0低优级智能循迹小车7}voidgo_forward(void)//前进函数{servo(1,1);Delay();ET0=0;TR0=0;}voidgo_left(void)//左转函数{servo(0,1);Delay();ET0=0;TR0=0;}voidgo_right(void)//右转函数{servo(1,0);Delay();ET0=0;TR0=0;}voidstop(void)//停止函数{servo(0,0);Delay();ET0=0;TR0=0;}voidturn_head(uintl,uintr)//转向函数,参数为(1,0),左转;为(0,1),右转{uintaa=360;while(aa--){智能循迹小车8servo(r,l);Delay();ET0=0;TR0=0;display(ge,shi,bai);if(middle_s==0){break;}}}voidmain(void)//主函数{uinti=0;p1_1=0;//工作状态显示IN1=1;IN2=1;IN3=1;EA=1;ET1=1;TR1=1;PT1=1;TMOD=0x11;//定时器工作方式为1//IE=0x81;//允许总中断中断,使能INT0外部中断//TCON=0x01;//触发方式为脉冲负边沿触发while(1){display(ge,shi,bai);//调用显示函数,各判断中也或有调用以保持显示的连续性if(eye==0)//检测到障碍物,转向turn_head(1,0);elseif(left_s==0&&middle_s==0&&right_s==0)//遇到障碍物回来后检测到节点,转向{i=6;while(i--){go_forward();智能循迹小车9}turn_head(0,1);}/*elseif(LEFT_S1==1&&RIGHT_S1==0)//前进途中遇到转向节点,转向{turn_head(0,1);}*/elseif((middle_s==0)||(IN1==1&&IN2==0&&IN3==1))//前进go_forward();elseif((left_s==0&&right_s==1)||(IN1==0&&IN2==1&&IN3==1))//左转go_left();elseif((left_s==1&&right_s==0)||(IN1==1&&IN2==1&&IN3==0))//右转go_right();elseif((left_s==1&&middle_s==1&&right_s==1)||(IN1==1&&IN2==1&&IN3==0))//停止go_forward();elseif(IN1==1&&IN2==1&&IN3==1)stop();ET0=0;}//以下为状态清零TR0=0;ET1=0;TR1=0;EA=0;while(1)//显示系统用时{display(ge,shi,bai);}}2数码管代码#includereg52.h#includeintrins.h智能循迹小车10#defineNOP()_nop_()/*定义空指令*/#defineucharunsignedchar#defineuintunsignedint#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};voiddelay(ucharx);//x*0.14MSvoiddelay1(intms);voidbeep(void);sbitIRIN=P3^2;//红外接收器数据线ucharIRCOM[7];sbitIN1=P2^4;sbitIN2=P2^5;sbitIN3=P2^6;voidTurn_left(void){IN1=0;IN2=1;IN3=1;}voidTurn_right(void){IN1=1;IN2=1;IN3=0;}voidGo(void){IN1=1;IN2=0;IN3=1;}voi
本文标题:移动机器人设计与制作设计(一)――智能循迹小车
链接地址:https://www.777doc.com/doc-3131678 .html