智能寻迹小车以及程序
智能循迹避障小车完整程序(亲测好使)
智能循迹避障小车完整程序(亲测好使)/*******************************************//利用51定时器产生PWM波来调节电机速度//速度变化范围从0-100可调//使用三路做寻迹使用,哪一路检测在黑线哪一路为//高电平//没检测到黑线表示有反射对应输出低电平信号*********************************************/#include<>#define uint unsigned int#define uchar unsigned char/*电机四个接口定义*/sbit in1=P0^0;sbit in2=P0^1;sbit in3=P0^2;sbit in4=P0^3;/*计时器*/uchar j,k,i,a,A1,A2,second,minge,minshi;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};void delay(uchar i){for(j=i;j>0;j--)for(k=110;k>0;k--);}void display(uchar sh_c,uchar g_c,uchar min_ge,uchar min_shi) {dula=1;P0=table[sh_c];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(5);dula=1;P0=table[g_c];dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(5);dula=1;P0=table[min_shi];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(5);dula=1;P0=table2[min_ge];dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delay(5);}/*左、中、右三路循迹传感器接口定义*/ sbit zuo=P1^0; sbit zhong=P1^1;sbit you=P1^2;/*避障接口定义*/sbit bz_zuo=P1^3;sbit bz_zhong=P1^4;sbit bz_you=P1^5;uchar count = 0;/*利用定时器0定时中断,产生PWM波*/ void Init_timer() {TH0 = (65535-10)/256;TL0 = (65535-10)%256;TMOD = 0x01;TR0 = 1;ET0 = 1;EA = 1;}/*左轮速度调节程序*/void zuolun(uchar speed){if(count <= speed) //count计数变量{in1 = 1;in2 = 0;}else{in1 = 0;in2 = 1;}}void youlun(uchar speed) //同上{if(count<= speed){in3 = 1;in4 = 0;}else{in3 = 0;in4 = 1;}}void Inline() //检测黑线信号{uchar temp;temp =P1;switch(temp){case 0x01:zuolun(0); youlun(90);break; //左侧循迹传感器压线,小车向左前修正case 0x02:zuolun(100);youlun(100);break; //中间循迹传感器压线,保持直走此处两值使电机速度保持相同case 0x04:zuolun(90); youlun(0);break; //右侧循迹传感器压线,小车向右前修正case 0x08:zuolun(90); youlun(0);break; //左侧避障传感器有信号小车右转case 0x10:zuolun(90); youlun(0);break; //中间避障传感器有信号小车左转case 0x20:zuolun(90); youlun(0);break; //右侧避障传感器有信号小车左转}/*if(zuo==1){zuolun(10);youlun(50);}else if(zhong==1){zuolun(99);youlun(99);}else if(you==1){zuolun(50);youlun(10);} */}void main() //主函数{Init_timer(); //调用函数while(1){Inline();minge=0;minshi=0;second++;if(second==60)second=0,minge++;A1=second/10;A2=second%10;if(minge==10)minge=0,minshi++;for(a=200;a>0;a--){display(A1,A2,minge,minshi);};}}void Timer0_int()interrupt 1 //定时器中断计数{TH0 = (65535-10)/256;TL0 = (65535-10)%256;count ++;if(count >= 100){count = 0;}}。
智能寻迹小车及程序
寻迹小车在历届全国大学生电子设计竞赛中多次出现了集光、机、电于一体的简易智能小车题目。
笔者通过论证、比较、实验之后,制作出了简易小车的寻迹电路系统。
整个系统基于普通玩具小车的机械结构,并利用了小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。
总体方案整个电路系统分为检测、控制、驱动三个模块。
首先利用光电对管对路面信号进行检测,经过比较器处理之后,送给软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。
系统方案方框图如图1所示。
图1 智能小车寻迹系统框图传感检测单元小车循迹原理该智能小车在画有黑线的白纸“路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”—黑线。
笔者在该模块中利用了简单、应用也比较普遍的检测方法——红外探测法。
红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。
在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号。
传感器的选择市场上用于红外探测法的器件较多,可以利用反射式传感器外接简单电路自制探头,也可以使用结构简单、工作性能可靠的集成式红外探头。
ST系列集成红外探头价格便宜、体积小、使用方便、性能可靠、用途广泛,所以该系统中最终选择了ST168反射传感器作为红外光的发射和接收器件,其内部结构和外接电路均较为简单,如图2所示:图2 ST168检测电路ST168采用高发射功率红外光、电二极管和高灵敏光电晶体管组成,采用非接触式检测方式。
ST168的检测距离很小,一般为8~15毫米,因为8毫米以下是它的检测盲区,而大于15毫米则很容易受干扰。
笔者经过多次测试、比较,发现把传感器安装在距离检测物表面10毫米时,检测效果最好。
R1限制发射二极管的电流,发射管的电流和发射功率成正比,但受其极限输入正向电流50mA的影响,用R1=150的电阻作为限流电阻,Vcc=5V作为电源电压,测试发现发射功率完全能满足检测需要;可变电阻R2可限制接收电路的电流,一方面保护接收红外管;另一方面可调节检测电路的灵敏度。
智能寻迹小车实验报告
智能寻迹小车实验报告
实验目的:
设计一个智能寻迹小车,能够依据环境中的黑线自主行驶,并避开障碍物。
实验材料:
1. Arduino开发板
2. 电机驱动模块
3. 智能车底盘
4. 红外传感器
5. 电源线
6. 杜邦线
7. 电池
实验步骤:
1. 按照智能车底盘的说明书将车底盘组装起来。
2. 将Arduino开发板安装在车底盘上,并与电机驱动模块连接。
3. 连接红外传感器到Arduino开发板上,以便检测黑线。
4. 配置代码,使小车能够依据红外传感器检测到的黑线自主行驶。
可以使用PID控制算法来控制小车的速度和方向。
5. 测试小车的寻迹功能,可以在地面上绘制黑线,观察小车是否能够准确地跟随黑线行驶。
6. 根据需要,可以添加避障功能。
可以使用超声波传感器或红外避障传感器来检测障碍物,并调整小车的行驶路线。
实验结果:
经过实验,可以发现小车能够依据红外传感器检测到的黑线自主行驶,并能够避开障碍物。
小车的寻迹功能和避障功能能够实现预期的效果。
实验总结:
本次实验成功设计并实现了智能寻迹小车。
通过使用Arduino 开发板、电机驱动模块和红外传感器等材料,配合合适的代码配置,小车能够准确地跟随黑线行驶,并能够避开障碍物。
该实验展示了智能小车的基本原理和应用,为进一步研究和开发智能车提供了基础。
智能循迹小车程序
智能小车程序(共三个)第一个:#include "reg52.h"#define det_Dist 2.55 //单个脉冲对应的小车行走距离,其值为车轮周长/4#define RD 9 //小车对角轴长度#define PI 3.1415926#define ANG_90 90#define ANG_90_T 102#define ANG_180 189/*============================全局变量定义区============================*/sbit P10=P1^0; //控制继电器的开闭sbit P11=P1^1; //控制金属接近开关sbit P12=P1^2; //控制颜色传感器的开闭sbit P07=P0^7; //控制声光信号的开启sbit P26=P2^6; //接收颜色传感器的信号,白为0,黑为1sbit P24=P2^4; //左sbit P25=P2^5; //右接收左右光传感器的信号,有光为0unsigned char mType=0; //设置运动的方式,0 向前1 向左2 向后3 向右unsigned char Direction=0; //小车的即时朝向0 朝上1 朝左2 朝下3 朝右unsigned sX=50; unsigned char sY=0; //小车的相对右下角的坐标CM(sX,sY)unsigned char StartTask=0; //获得铁片后开始执行返回卸货任务,StartTask置一unsigned char Inter_EX0=0; // 完成一个完整的任务期间只能有一次外部中断// Inter_EX0记录外部中断0的中断状态// 0 动作最近的前一次未中断过,// 1 动作最近的前一次中断过unsigned char cntIorn=0; //铁片数unsigned char bkAim=2; //回程目的地,0为A仓库,1为B仓库,2为停车场,//(在MAIN中接受铁片颜色判断传感器的信号来赋值)unsigned char Light_Flag=0;//进入光引导区的标志(1)unsigned int cntTime_5Min=0;//时间周期数,用于T0 精确定时unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数/*============================全局变量定义区============================*//*------------------------------------------------*//*-----------------通用延迟程序-------------------*//*------------------------------------------------*/void delay(unsigned int time) // time*0.5ms延时{unsigned int i,j;for(j=0;j<time;j++){for(i=0;i<60;i++){;}}}/*-----------------------------------------------*//*-------------------显示控制模块----------------*//*-----------------------------------------------*//*数码管显示,显示铁片的数目(设接在P0,共阴)*/void Display(unsigned char n){char Numb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}; P0=Numb[n];}/*-----------------------------------------------*//*-------------------传感器模块------------------*//*-----------------------------------------------*//*光源检测程序: *//*用于纠正小车运行路线的正确性*/unsigned char LightSeek(){ void Display(unsigned char);bit l,r;l=P24;r=P25;if(l==0&&r==1){//Display(1);return (3); //偏左,向右开}if(r==0&&l==1){//Display(3);return(1); //偏右,向左开}if((l==1&&r==1)||(l==0&&r==0)){//Display(9);return(0); //没有偏离,前进}}/*铁片检测程序: *//*判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场*/ void IornColor(){delay(4000);bkAim=(int)(P26);Display((int)(P26)+2);}/*-----------------------------------------------*//*------------------运动控制模块-----------------*//*-----------------------------------------------*//*====基本动作层:完成基本运动动作的程序集====*//*运动调整程序: *//*对小车的运动进行微调*/void ctrMotor_Adjust(unsigned char t){if(t==0){P2=P2&240|11; //用来解决两电机不对称的问题delay(6);}if(t==3){P2=P2&250; //向左走delay(1);}if(t==1){P2=(P2&245);delay(1); //向右走}P2=((P2&240)|15);delay(10);}/*直走程序: *//*控制小车运动距离,dist为运动距离(cm),type为运动方式(0 2)*/ /*只改变小车sX 和sY的值而不改变Direction的值. */ void ctrMotor_Dist(float dist,unsigned char type){unsigned char t=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)(dist/det_Dist);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(Light_Flag==1) t=LightSeek();if(type==0) //向前走{P2=P2&249;delay(40);ctrMotor_Adjust(t);}if(type==2) //向后退{P2=P2&246;delay(50);ctrMotor_Adjust(t);}P2=((P2&240)|15);if(mType==2) delay(60);//刹车制动0.5mselse delay(75);}}/*拐弯程序: *//*控制小车运动角度,type为运动方式(1 3)*//*只改变小车Direction的值而不改变sX 和sY的值*/void ctrMotor_Ang(unsigned char ang,unsigned char type,unsigned char dir) {unsigned char i=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)((PI*RD*90/(180*det_Dist)*1.2)*ang/90);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(type==1) //向左走{P2=P2&250;delay(100);ctrMotor_Adjust(0);}if(type==3) //向右走{P2=P2&245;delay(100);ctrMotor_Adjust(0);}P2=((P2&240)|15);delay(50);//刹车制动0.5ms}if(!(Inter_EX0==1&&StartTask==0)){Direction=dir;}}/*====基本路线层:描述小车基本运动路线的程序集====*//*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场)*/void rchPlace(){unsigned int time,b,s,g;time=(int)(cntTime_5Min*0.065535);//只有一个数码管时,轮流显示全过程秒数个十百b=time%100;s=(time-b*100)%100;g=(time-b*100-s*10)%10;if(bkAim==2){//到达停车场了,停车EA=0;P2=((P2&240)|15);while(1){Display(10); //Ndelay(2000);Display(cntIorn);delay(2000);Display(11);//Adelay(2000);Display(b);delay(2000);Display(s);delay(2000);Display(g);delay(2000);}}else{if(Inter_EX0==1&&StartTask==1)P10=0; //到达仓库,卸下铁片}}/*无任务模式: *//*设置小车的固定运动路线,未发现铁片时的运动路线*/void BasicRoute(){ //Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_90,1,1);ctrMotor_Dist(100-sX,0);ctrMotor_Dist(125,2);ctrMotor_Dist(73,0);ctrMotor_Ang(ANG_90,1,2);//Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_180,1,0);rchPlace();}/*任务模式: *//*设置小车的发现铁片后的运动路线*/void TaskRoute(){//基本运行路线表,记载拐弯0 向前1 左拐2 向后3 右拐,正读去A区;反读去B区StartTask=1;ctrMotor_Ang(ANG_90_T,1,2);if(bkAim==1) //仓库A{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,2);ctrMotor_Ang(ANG_90_T,1,2);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;// ctrMotor_Ang(208,1,0);}else if(bkAim==0) //仓库B{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,0);ctrMotor_Ang(ANG_90_T,1,0);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;//ctrMotor_Ang(208,1,0);}delay(5000);rchPlace();}/*---------------------------------------------*//*-------------------主程序段------------------*/ /*---------------------------------------------*/void main(){delay(4000);P2=0xff; //初始化端口P07=0;P1=0;TMOD=0x01; //初始化定时器0/1 及其中断TL0=0;TH0=0;TR0=1;ET0=1;ET1=1;IT0=1; //初始化外部中断EX0=1;IT1=1;EX1=1;EA=1;P11=1;while(1){Display(cntIorn);bkAim=2;BasicRoute();if(Inter_EX0==1){TaskRoute();//按获得铁片后的路线运动IE0=0;EX0=1;}Inter_EX0=0;}}/*----------------------------------------------------*//*----------------------中断程序段--------------------*//*----------------------------------------------------*//*定时器0中断程序: *//*当时间过了5分钟,则就地停车并进入休眠状态*/ void tmOver(void) interrupt 1{cntTime_5Min++;TL0=0;TH0=0;if(cntTime_5Min>=4520){Display(5);P2=((P2&240)|15);EA=0; //停车程序P07=1;delay(4000);PCON=0X00;while(1);}}/*外部中断0中断程序: *//*发现铁片,发出声光信号并将铁片吸起,发光二极管和蜂鸣器*//*并联在一起(设接在P07). 0为A仓库,1为B仓库,2为停车场*/ void fndIorn(void) interrupt 0{unsigned char i;P10=1;P2=((P2&240)|15); //停车P07=1;delay(1000);//刹车制动0.5msP07=0;Inter_EX0=1;cntIorn++;Display(cntIorn);for(i=0;i<40;i++){P2=P2&249;delay(2);P2=((P2&240)|15);delay(2);}P2=P2&249;delay(100);P2=((P2&240)|15); //停车IornColor(); //判断铁片黑白,设置bkAimfor(i=0;i<95;i++)P2=P2&249;delay(3);P2=((P2&240)|15);delay(2);}P2=((P2&240)|15); //停车delay(4000); //把铁片吸起来EX0=0;}/*外部中断1中断程序: *//*对霍尔开关的脉冲记数,对小车的位置进行记录,以便对小车进行定位*/ void stpMove(void) interrupt 2{cntTime_Plues--;if(Direction==0) //向上{if(mType==0) sY+=det_Dist;else if(mType==2)sY-=det_Dist;}else if(Direction==1) //向左{if(mType==0) sX+=det_Dist;else if(mType==2)sX-=det_Dist;}else if(Direction==2) //向下{if(mType==0) sY-=det_Dist;else if(mType==2)sY+=det_Dist;}else if(Direction==3) //向右{if(mType==0) sX-=det_Dist;else if(mType==2)sX+=det_Dist;}第二个:#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit moto1=P1^5;sbit moto2=P1^6;sbit moto3=P2^0;sbit moto4=P2^1;sbit en1=P1^7;sbit en2=P2^2;//*循迹口七个红外传感器*///////////////sbit left1=P1^0;//*左边传感器*//sbit left2=P1^1;sbit left3=P1^2;sbit mid=P1^3;//*黑线位置*//sbit right1=P1^4;sbit right2=P2^3;sbit right3=P2^4;//*右边传感器*//////////////// sbit hled=P0^0;sbit bled=P0^1;sbit lled=P0^2;sbit rled=P0^3;sbit bizhang=P2^5;uchar pro_head;uchar pro_back;uchar i;uchar j; //前后占空比标志void delay(uint z){uchar i;while(z--){for(i=0;i<121;i++);}}/********初始化定时器,中断************/ void init(){TMOD=0x01;TH0=(65536-100)/256;TL0=(65536-100)%256;EA=1;TR0=1;en1=1;en2=1;}void time0(void) interrupt 1{i++;j++;if(i<=pro_back){en1=1;}else{en1=0;}if(i==40){en1=~en1;i=0;}if(j<=pro_head){en2=1;}else{en2=0;}if(j==40){en2=~en2;j=0;}TH0=(65536-100)/256;TL0=(65536-100)%256;}void qianjin()//*直行*///////////////////// {pro_back=15;pro_head=5;moto1=0;moto2=0;moto4=0;lled=1;rled=1;bled=1;}void turn_right1()//*右转1函数*//{pro_back=10;pro_head=15;moto1=0;moto2=1;moto3=1;moto4=0;}。
自动循迹小车(附有程序)
大学生电子设计竞赛自动循迹小车目录摘要 (1)1.方案论证 (2)1.1方案描述 (2)1.2单片机方案的比较与论证 (2)1.3编码器选择与论证 (2)1.4 LDC1000与LDC1314选择与论证 (3)1.5 OLED显示方案 (3)1.6蜂鸣器发声方案 (3)2.理论分析与计算 (3)2.1速度增量式PID计算 (3)2.2舵机位置式PID算法 (3)3.电路与程序设计 (4)3.1系统组成 (4)3.2系统流程图 (5)4.测试方案与测试结果 (5)4.1测试方案 (5)4.1.1舵机测试方案 (6)4.1.2电机测试方案 (6)4.2系统测试结果分析 (6)5.结论 (6)6.参考文献 (7)摘要本循迹小车以单片机XS128为控制核心,主要由LDC1314感应模块、稳压模块、液晶显示模块、驱动控制模块、蜂鸣器模块、编码器、舵机以及小车组成。
跑道的标识为一根直径0.6~0.9mm的细铁丝,小车在规定的平面跑道自动按顺时针方向循迹前进。
在任意直线段铁丝上放置4个直径约19mm的镀镍钢芯硬币(第五套人民币的1角硬币),硬币边缘紧贴铁丝。
实验结果表明,在直线区任意指定一起点(终点),小车都能够依据跑道上设置的铁丝标识,能够自动绕跑道跑完一圈,而且时间不超过10分钟,小车运行时始终保持轨迹铁丝位于小车垂直投影之下,小车路过硬币时能够发现并发出声音提示,显示屏上能够实时显示小车行驶的距离和运行时间。
关键词:自动循迹 LDC1314 实时显示自动循迹小车1.方案论证1.1方案描述自动循迹小车依据电磁感应原理,由单片机XS128控制,控制系统是由XS128控制模块、LDC1314感应模块、稳压模块、液晶显示模块、驱动控制模块、蜂鸣器模块、编码器、舵机以及电动小车组成的闭环控制系统。
LDC1314感应模块采集小车在跑道上位置与角度信息,利用XS128单片机处理位置与角度数据后调节舵机打角并通过PID精确算法调整后轮速度。
智能小车的循迹避障行驶说明书
智能小车的循迹避障行驶目录摘要 (III)Abstract (IV)第一章绪论 (1)1.1 课题背景 (1)1.2 研究目的及意义 (1)1.3 本设计完成的工作 (2)第二章总体设计方案 (3)2.1 方案选择及论证 (4)4446662.2 最终方案 (7)第三章硬件设计 (8)3.1 主控器STC89C52 (8)3.2 单片机复位电路设计 (10)3.3 单片机时钟电路设计 (10)3.4 避障模块 (10)3.5 电源设计 (11)3.6 电机驱动模块 (12)3.7 红外循迹模块 (13)3.8 小车车体总体设计 (15)第四章软件设计 (16)4.1 主程序流程图 (16)第五章系统的安装与调试 (18)5.1 系统的安装 (18)5.2 电路的调试 (19) (20)205.3 测试结果与分析 (20)结论 (21)参考文献 (22)致谢........................................................ 错误!未定义书签。
附录1 整机电路原理图.. (22)附录2 部分源程序 (23)智能小车的循迹避障行驶摘要在现代化的生产生活中,智能机器人已经渐渐普及到国防、工业、交通、生活等各个领域。
为了使生产更加有效率更加安全,使生活更加方便、轻松,智能机器人起到了越来越重要的作用。
智能小车属于智能机器人的一种,同样能给生产生活带来极大的便利。
它能够自己判断路面情况,并将各种信息反馈给单片机。
所用到的学科有自动控制原理、传感器技术、计算机和信息技术等多门学科。
智能车能够在一定程度上解放人的双手、减小工作强度从而改善人们的生活,提高生产的质量和效率。
能够自动循迹和避绕障碍物行驶则是智能小车需要的最基本的功能。
小车之所以能够自动避开障碍物并进行循迹是因为它可以感测引导线和行进路上的障碍物,因此这里采用超声波测距模块和红外传感器来实现这些功能。
本文先介绍了选题的背景及发展前景,描述了智能车在生产和生活中发展和应用的情况;接着对硬件部分所用器件的原理和特点进行了介绍;然后对软件设计和机械部分进行说明;在文章的最后就整个过程的体会及智能机器人的发展进行了总结和展望。
单片机的智能循迹小车
调试方法
A
总之,基于 51单片机的 智能循迹小 车是一种简 单实用的智 能控制系统
B
通过合理的 硬件设计和 软件编程, 可以实现小 车的自动循
迹功能
C
在调试过程中, 需要逐步排查 问题,不断优 化程序,以提 高系统的性能
和稳定性
感/谢/聆/听
以及调试方法
1
原理
原理
1Байду номын сангаас
基于51单片机的智能循迹小车通过传感器检测小车与路径之间的距 离,将检测到的信号转换为电平信号,然后通过单片机进行处理
单片机根据接收到的信号控制电机驱动模块,从而控制小车的运动 方向和速度
2
3
通过不断调整小车的运动方向和速度,使得小车能够沿着指定的路 径进行运动
2
硬件组成
51单片机的智能 循迹小车
-
01
原理
02 硬件组成
03 软件设计 04 调试方法
51单片机的智能循迹小车
1
智能循迹小车是一种自动 控制系统,能够沿着指定
的路径进行运动
2
基于51单片机的智能循迹 小车是一种使用51单片机 作为主控制器的智能循迹
小车
3
下面将详细介绍基于51单 片机的智能循迹小车的原 理、硬件组成、软件设计
4
调试方法
调试方法
基于51单片机的智能循迹小车的调试方法主要包括以下几个步骤
硬件调试:检查硬件连接是否正确,确保电源、传感器、电机驱动模块等设备 能够正常工作
软件调试:通过调试器或仿真器对程序进行调试,检查程序是否存在语法错误 或逻辑错误
实际环境测试:将调试好的程序下载到单片机中,然后在实际环境中进行测试 。观察小车的运动情况,如果存在偏差或问题,需要对程序进行调整和优化
智能小车红外循迹原理
智能小车红外循迹原理一、概述智能小车红外循迹是一种基于红外线传感器的自动导航技术。
该技术通过对小车周围环境的监测和分析,实现小车在特定路径上自动行驶。
本文将详细介绍智能小车红外循迹的原理、构成以及工作流程。
二、原理智能小车红外循迹原理基于红外线传感器。
当物体发生温度变化时,会产生不同的红外辐射,而红外线传感器可以检测到这些辐射并转化为电信号输出。
通过对不同位置的红外辐射信号进行分析,我们可以得到一个环境温度分布图。
在智能小车中,我们通常使用两个或多个红外线传感器。
当小车行驶时,这些传感器会不断地检测周围环境的温度变化,并将其转换为电信号输出。
通过对这些信号进行处理和比较,我们可以确定小车当前所处位置以及应该向哪个方向前进。
三、构成智能小车红外循迹系统通常由以下几部分组成:1. 硬件部分:包括主控板、电机驱动模块、红外线传感器、电源等。
2. 软件部分:主要由程序控制,包括数据采集、处理和控制小车运动的算法等。
3. 机械部分:包括车身、轮子、齿轮等。
四、工作流程智能小车红外循迹的工作流程如下:1. 初始化:启动小车系统,进行硬件和软件的初始化操作。
2. 数据采集:通过红外线传感器对周围环境进行温度检测,并将检测到的信号转换为电信号输出。
3. 数据处理:将采集到的信号进行处理和比较,确定小车当前所处位置以及应该向哪个方向前进。
4. 控制运动:根据数据处理结果,控制电机驱动模块使小车向目标方向前进或停止。
5. 循环执行:重复执行上述步骤,使小车能够在特定路径上自动行驶。
五、总结智能小车红外循迹是一种基于红外线传感器的自动导航技术。
它通过对周围环境温度变化的检测和分析,实现了小车在特定路径上自动行驶。
该技术不仅具有较高的准确性和稳定性,而且具有较低的成本和易于实现的优点。
在未来,智能小车红外循迹技术有望被广泛应用于无人驾驶、智能家居等领域。
畅学智能循迹小车实战教程
引言:智能循迹小车是一种结合了技术和的创新产品,它能够在预设的轨迹上行驶,具有较高的自主性和灵活性。
本文将为大家介绍畅学智能循迹小车的实战教程,包括制作、编程和实际应用等方面的内容。
通过学习本文,读者将能够了解智能循迹小车的原理和制作步骤,并掌握其编程和实际应用技巧。
概述:智能循迹小车是一种基于技术和的创新产品。
它通过搭载的传感器和编程控制,能够在预设的轨迹上自主行驶。
智能循迹小车的制作和编程过程涉及多个方面的知识,包括机械结构设计、电子电路连接、编程语言和算法等。
正文:一、制作智能循迹小车的机械结构1.确定小车的尺寸和外观设计2.选择合适的材料和制作工具3.制作小车底盘和轮子系统4.搭建传感器支架和控制装置5.确保机械结构的稳定性和可靠性二、连接电子电路,使小车能够感知环境1.选取合适的传感器和驱动模块2.连接传感器和控制模块的电路3.添加电源供应和保护电路4.调试电子电路的工作状态5.确保电子电路的可靠性和稳定性三、编程智能循迹小车的控制系统1.学习编程语言和算法知识2.设计控制系统的流程和逻辑3.编写控制小车移动的代码4.添加传感器数据的处理和判断逻辑5.调试控制系统的功能和性能四、实际操作:实现智能循迹小车在预设轨迹上行驶1.预先设置循迹轨迹和停止条件2.将编写好的控制代码到小车控制系统3.启动小车,观察其在轨迹上行驶的效果4.调试控制系统和传感器,确保小车的稳定性和准确性5.对小车进行优化和改进,提升其性能和功能五、其他应用领域和进一步研究1.探索其他技术和应用领域2.学习其他智能小车的制作和编程方法3.加深对技术和的理解和应用4.进一步研究和改进智能循迹小车的功能和性能5.将智能循迹小车应用于实际生活和工作中的场景总结:通过本文的介绍,我们了解了畅学智能循迹小车的实战教程。
制作智能循迹小车需要涉及机械结构设计、电子电路连接、编程和实际应用等多个方面的知识。
通过学习和实践,读者将能够掌握智能循迹小车的制作和编程技巧,并能够应用于实际生活和工作中。
智能循迹避障小车设计说明
智能循迹避障小车设计说明
一、前言
智能循迹避障小车是一种使用智能科学技术控制的小型机器人,它可以实现自主循迹路径,避障等功能。
目前,智能循迹避障小车已经成为机器人领域的一个重要研究对象,因为它在工业自动化,服务机器人,教育科研,安防监控等领域具有广泛的应用前景。
本文首先介绍智能循迹避障小车的组成结构以及其主要控制系统,并介绍其核心算法:循迹算法、避障算法以及路径规划算法。
最后,本文还将介绍智能循迹避障小车的应用前景。
二、智能循迹避障小车结构及控制系统
智能循迹避障小车是由电机、接收器、传感器等组成的小型机器人。
它的主要控制系统由微处理器,控制板,传感器,电机驱动器,定位器,电池等组成。
其中,微处理器是智能循迹避障小车的核心控制部件,它负责控制和协调整个系统的工作,是小车实现智能控制的基础。
它可以完成小车自主导航的控制,使小车自行实现向指定点前进,避开障碍物以及避免崩溃。
传感器可以检测所处环境的信息,包括距离、方向、颜色等。
基于STM32的智能循迹避障小车
基于STM32的智能循迹避障小车智能循迹避障小车是一种基于STM32微控制器的智能机器人车,它具有智能避障、循迹导航等功能。
它通过使用红外传感器、超声波传感器等传感器来感知周围环境,并通过STM32微控制器来实现对传感器数据的处理和控制小车的运动。
本文将介绍基于STM32的智能循迹避障小车的原理、设计和制作过程。
一、智能循迹避障小车的原理1.1 系统架构智能循迹避障小车主要由STM32微控制器、电机驱动模块、传感器模块和电源模块组成。
STM32微控制器用于控制小车的运动和感知周围环境;电机驱动模块用于控制小车的电机运动;传感器模块用于感知周围环境,包括红外传感器、超声波传感器等;电源模块用于为整个系统提供电源供应。
1.2 工作原理智能循迹避障小车主要工作原理是通过传感器模块感知周围环境的障碍物和地面情况,然后通过STM32微控制器对传感器数据进行处理,再控制电机驱动模块完成小车的运动。
在循迹导航时,小车可以通过红外传感器感知地面情况,然后根据传感器数据进行反馈控制,使小车能够按照预定路径行驶;在避障时,小车可以通过超声波传感器感知前方障碍物的距离,然后通过控制电机的速度和方向来避开障碍物。
2.1 硬件设计智能循迹避障小车的硬件设计主要包括电路设计和机械结构设计。
电路设计中,需要设计STM32微控制器和传感器、电机驱动模块的连接电路,以及电源模块的电源供应电路;机械结构设计中,需要设计小车的外观和结构,以及安装电机、传感器等模块的位置和方式。
2.2 软件设计智能循迹避障小车的软件设计主要包括STM32程序设计和智能控制算法设计。
STM32程序设计中,需要编写STM32微控制器的程序,包括对传感器数据的采集和处理,以及对电机的控制;智能控制算法设计中,需要设计循迹导航算法和避障算法,以使小车能够智能地进行循迹导航和避障。
2.3 制作过程制作智能循迹避障小车的过程主要包括电路焊接、机械结构装配、程序编写和调试等步骤。
循迹小车(程序)
附录程序目录一、前言------------------------------------------------------------二、小车功能------------------------------------------------------三、元器件选择--------------------------------------------------四、 I/O分配及硬件连接简图---------------------------------五、相关模块、算法---------------------------------------------六、系统框图------------------------------------------------------七、调试过程------------------------------------------------------八、小车图片资料---------------------------------------------------九、讲座所感------------------------------------------------------十、实习总结------------------------------------------------------一、前言感生产实习能给我们这次实现自己想法的机会,虽然实验条件异常简陋、资金投入非常有限,总体感觉我的队友们灰常灰常给力啊,我感觉我是抱到大腿了--王威,夏青、峰哥,团队气氛非常好,大家一起讨论,一起分工研究模块,最后一起解决问题调试程序,而且是不同的组合在不同阶段解决了不同的问题,大家合作,各显身手,在奋战中给大三学年画上了圆满的句号。
之前我们本来商量是不是可以拿往年电子设计大赛的题目过来做,如果难度太大就算只实现一部分功能也算是成功完成了,结果研究一天后发现电子设计大赛的题目需要很长时间的知识积累啊,基本上都是准备一个月以上然后开工的,后来王威提议要不我们做个小车吧,超声波测距实现自动物体追踪,控制核心采用单片机,传感器采用广泛用于避障和测距的超声波传感器,前进和后退用普通伺服电机和电机驱动模块实现。
《2024年自循迹智能小车控制系统的设计与实现》范文
《自循迹智能小车控制系统的设计与实现》篇一一、引言随着科技的飞速发展,智能小车作为智能交通系统的重要组成部分,已经广泛应用于军事、工业、民用等多个领域。
自循迹智能小车控制系统的设计与实现,成为了智能化进程中一个关键环节。
本文旨在阐述自循迹智能小车控制系统的设计原理和实现过程,分析系统结构与功能,为相关研究与应用提供参考。
二、系统设计1. 硬件设计自循迹智能小车控制系统硬件主要包括:电机驱动模块、传感器模块、主控制器模块等。
其中,电机驱动模块负责驱动小车前进、后退、转向等动作;传感器模块包括红外传感器、超声波传感器等,用于检测小车周围环境及路径信息;主控制器模块采用高性能微控制器,负责协调各模块工作,实现小车的自主循迹。
2. 软件设计软件设计包括控制系统算法设计和程序编写。
控制系统算法主要包括路径识别算法、速度控制算法、避障算法等。
程序编写采用模块化设计思想,将系统功能划分为多个模块,如电机控制模块、传感器数据采集模块、路径识别与决策模块等。
各模块之间通过通信接口进行数据交换,实现小车的自主循迹。
三、实现过程1. 传感器数据采集与处理传感器模块负责采集小车周围环境及路径信息,包括红外传感器、超声波传感器等。
这些传感器将采集到的数据传输至主控制器模块,经过数据处理与分析,提取出有用的信息,如障碍物位置、路径边界等。
2. 路径识别与决策路径识别与决策模块根据传感器数据,判断小车当前位置及目标路径,并制定相应的行驶策略。
当小车偏离目标路径时,系统会自动调整行驶方向,使小车重新回到目标路径上。
此外,避障算法也在此模块中实现,当检测到障碍物时,系统会及时调整小车的行驶方向,避免与障碍物发生碰撞。
3. 电机控制与驱动电机控制与驱动模块根据主控制器的指令,控制电机的运转,实现小车的前进、后退、转向等动作。
通过调整电机的转速和转向,可以实现对小车速度和行驶方向的精确控制。
四、实验结果与分析通过实验测试,自循迹智能小车控制系统能够在不同环境下实现自主循迹和避障功能。
智能循迹小车C程序(完美-详尽)
/* ------------------------------------------------- 小车运行主程序 -------------------------简介:@模块组成:红外对管检测模块 ------ 五组对管,五个信号采集端口直流电机驱动模块---- 驱动两个直流电机,另一个轮子用万向轮单片机最小系统------ 用于烧写程序,控制智能小车运动@ 功能简介:在白色地面或皮质上用黑色胶带粘贴出路线路径宽度微大于相邻检测管间距。
这样小车便可在其上循迹运行。
@ 补充说明:该程序采取“右优先”的原则:即右边有黑线向右转,若无,前方有黑线,向前走,若无,左边有黑线,向左转,若全无,从右方向后转。
程序开头定义的变量的取值是根据我的小车所调试选择好的,如果采用本程序,请自行调试适合自己小车的合适参数值。
编者:陈尧,黄永刚(江苏大学电气学院二年级,三年级)1. 假定:IN仁1,IN3=1 时电机正向转动,必须保证本条件2. 假定: 遇到白线输出0,遇到黑线输出1;如果实际电路是:遇到白线输出1,遇到黑线输出0,这种情况下只需要将第四,第五句改成:#define m0 1#define m1 0即可。
3. 说明1:直行 --------- 速度full_speed_left,full_speed_right.转弯, 调头速度 -- correct_speed_left,correct_speed_right.微小校正时 ------- 高速轮full_speed_left,full_speed_right;低速轮correct_speed.可以通过调节第六,七,八,九,十条程序,改变各个状态下的占空比( Duty cycle ) , 以求达到合适的转弯,直行速度4.lenth ---- length 检测到黑线到启动转动的时间间隔5. width ---- mid3 在黑线上到脱离黑线的时间差6. mid3 ----- 作为判断中心位置是否进入黑线的标志,由于运行的粗糙性和惯性,常取其他对管的输出信号作为判断条件7. check_right 若先检测到左边黑线,并且左边已出黑线,判断右端是否压黑线时间拖延------------------------------------ */ #include<STC12C5A60S2.h> #define uchar unsigned char #define uint unsigned int #define m0 1〃 黑线 ml,白线 m0 #define m1 0 #define full_speed_left 40 // 方 便 调 节 各 个 状 态 的 占 空 比 , 可 用 参 数 组:(30,35,6,25,30,68000,27000,500 );#define full_speed_right 45 //(40,45,6,25,30,68000,27000,500 ); #define correct_speed 6 // 校正时的低速轮的占空比 #define turn_speed_left 25 #define turn_speed_right 30 #define lenth 68000 // 测试数据:10000-- 》100-- 》500-- 》2000--80000--76000--68000 #define width 27000 //500-- 》10-->2000-- 》60000--30000--- 》27000 #define check_right 500 //2000-- #define midl left1 #define midr right5 》 20-- 》 200-- 》500uchar Duty_left,Duty_right,i=0,j=0; // 左右占空比标志,取 1--100sbit IN 仁 P2A 0; sbit IN2=P2A1; sbit IN3=P2A2; sbit IN4=P2A3; sbit ENA=P1A0; sbit ENB=P1A1; // 循迹口 五组红外对管,依次对应从左往右第 1,2,3,4,5 五组 sbit left1 =P1A6; sbit left2 =P1A5; sbit mid3 =P1A4; sbit right4=P1A3; sbit right5=P1A2; void line_left(); void line_right(); void line_straight()reentrant ; // ------------------------ void delay(long int Delay_time)// 延时函数{uint t=Delay_time;while(t--);}// -------------------------void init() // 定时器初始化{left1=m0; // 初始化left2=m0; // 白线位置mid3 =m1; // 黑线位置right4=m0;right5=m0;TMOD|=0x01;TH0=(65536-66)/256;TL0=(65536-66)%256;EA=1;ET0=1;TR0=1;ENA=1; // 使能端口,初始化ENB=1;}// ----------------------------void time0(void)interrupt 1 // 中断程序{i++; // 调速在中断中执行j++;if(i<=Duty_left)ENA=1;else ENA=0;if(i>100){ENA=1;i=0;}if(j<=Duty_right)ENB=1;else ENB=0;if(j>100){ENB=1;j=0;}TH0=(65536-66)/256; // 取约150HZ,12M 晶振,每次定时66us, 分100 次,这样开头定义的变量正好直接表示占空比的数值TL0=(65536-66)%256;}// ------------------------------void correct_left()// 向左校正,赋值{Duty_left =correct_speed;Duty_right=full_speed_right;IN1=1;IN2=0;IN3=1;IN4=0;}// ------------------------------void correct_right()// 向右校正,赋值{Duty_left =full_speed_left;Duty_right=correct_speed;IN1=1;IN2=0;IN3=1;IN4=0;}// --------------------------------void turn_left()// 左转,赋值{Duty_left =turn_speed_left; Duty_right=turn_speed_right; IN1=0; // 转弯时一个正转,一个反转,IN2=1;IN3=1;IN4=0;}// --------------------------------void turn_right()// 右转,赋值{Duty_left =turn_speed_left; Duty_right=turn_speed_right; IN1=1; // 转弯时一个正转,一个反转,IN2=0;IN3=0;IN4=1;}// ------------------------------void straight() // 直走,赋值{Duty_left =full_speed_left; Duty_right=full_speed_right; 这组值需要单独写程序取值IN1=1;IN2=0; // 左右电机占空比初始化,调节直线运动速度// 鉴于左右轮电机内部阻力不同,故占空比取不同值,IN3=1;IN4=0;}// ----------------------------------void line_straight()reentrant // 函数名后加reentrant 可以递归调用,// 一直走黑直线时{straight();if(right5==m1){line_right();}elseif(left1==m1){line_left();}elseif(left2==m1) // 防止校正时,小车冲出过大,导致2,4 号检测管屏蔽了两端检测管的检测,避免其走直线时出轨while(left2==m1){correct_left();if(right5==m1){line_right();goto label3;}else if(left1==m1){line_left();goto label3;}}elseif(right4==m1) // 防止校正时,小车冲出过大,导致2,4 号检测管屏蔽了两端检测管的检测,避免其走直线时出轨while(right4==m1){correct_right();if(right5==m1){ line_right(); goto label3;}else if(left1==m1){line_left();goto label3;}}else if((left1==m0)&&(left2==m0)&&(mid3==m0)&&(right4==m0)&&(right5==m0)){straight();//delay(lenth);while(right4==m0) // 本来应该是用mid3, 但是为了提高灵敏度,选择right4 ;向左时,可取left2 对管{turn_right();} if(mid3==m1){line_straight();}}label3: ; // 什么都不做}// -----------------------------------------------void line_right() // 右边有黑线时{straight();// 这里的直走是在不管红外检测结果的直行delay(lenth);if(mid3==m1){turn_right();// 执行向右转的赋值label:delay(width); // 由width 值决定转弯时mid3 经过黑线宽度时所需要的时间if(mid3==m0) while(right4==m0){}elsegoto label;}else if(mid3==m0){turn_right();while(right4==m0){}if(midr==m1){line_straight();}}}// -----------------------------------------void line_left() // 左边出现黑线时{while(left1==m1){if(right5==m1){line_right();goto label2;}}。
智能循迹小车设计方案
智能循迹小车设计方案智能循迹小车设计方案智能循迹小车是一种能够根据预设路径自主行驶的无人驾驶车辆。
本设计方案旨在实现一辆智能循迹小车的设计与制作。
一、方案需求:1. 路径规划与控制:根据预设的路径,小车能够准确、迅速地在指定道路上行驶,并能随时调整方向和速度。
2. 传感器控制与反馈:小车具备多种传感器,能够实时感知周围环境和道路状况,如通过红外线传感器检测道路上的障碍物。
3. 自主导航与避障能力:小车能够自主判断并决策前进、转弯或避让,确保安全行驶。
当感知到障碍物时,能及时做出反应避开障碍。
二、方案设计:1. 硬件设计:a. 小车平台:选择合适的小车底盘,具备稳定性和承重能力,大小和外观可以根据实际需求进行设计。
b. 传感器系统:包括红外线传感器、超声波传感器和摄像头等,用于感应周围环境和道路状况。
c. 控制系统:采用单片机或嵌入式控制器,以实现传感器数据的处理、决策和控制小车运动。
2. 软件设计:a. 路径规划与控制算法:通过编程实现路径规划算法,将预设路径转换为小车可以理解的指令,控制小车的运动和转向。
b. 感知与决策算法:根据传感器获取的数据,实时判断周围环境和道路状况,做出相应的决策,例如避开障碍物或调整行驶速度。
c. 系统界面设计:为方便操作和监测,设计一个人机交互界面,显示小车的状态信息和传感器数据。
三、方案实施:1. 硬件实施:根据设计要求选择合适的硬件部件,并将它们组装在一起,搭建小车平台和安装传感器。
确保传感器按照预期工作稳定。
2. 软件实施:使用合适的编程语言开发控制程序。
编写路径规划、感知与决策算法,并将其与硬件系统绑定在一起。
通过测试和调试确保程序的正常运行。
3. 功能测试:对小车进行现场测试,包括路径规划、感知与决策的功能、反应时间和精度等方面的测试。
根据测试结果进行优化和调整。
四、方案展望:1. 增加智能化功能:进一步发展智能循迹小车的功能,添加更多的传感器和算法,实现更高级的自主导航和避障能力。
智能循迹小车详细源代码程序MSPID
巡线车程序(完整版)1 #ifndef _Macro.h_2 #define _Macro.h_3 #include <msp430x14x.h>4 #include <intrinsics.h>5 #define uchar unsigned char6 #define uint unsigned int7 #define one 11.118 #define LMAX 19999 #define RMAX 399910 #define CPU_F ((double)8000000)11 #define delay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))1213 #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))14 #define PC 20 // 比例放大系数15 #define IC 0 //积分放大系数16 #define DC 85 //大系数17 #define LEFTOUT TACCR118 #define RIGHTOUT TACCR219 #define SensorIn P5IN20 #define F 5000//5000hz21 #define Period (8000000/F)22 #define EnableLeftPos P3OUT|=BIT123 #define UnenableLeftPos P3OUT&=~BIT12425 #define EnableLeftNeg P3OUT|=BIT026 #define UnenableLeftNeg P3OUT&=~BIT02728 #define EnableRightPos P3OUT|=BIT229 #define UnenableRightPos P3OUT&=~BIT23031 #define EnableRightNeg P3OUT|=BIT332 #define UnenableRightNeg P3OUT&=~BIT33334 #define Basic_Left 100//百分之八十35 #define Basic_Right 100//Basic_Left36 #define MAX (100)37 #define MIN (-100)38 #define foreward 139 #define backward 040 #define max_speed 10041 #define min_speed -10042 #define key 0434445 #define left_1 146 #define left_2 247 #define left_3 348 #define left_4 449 #define left_5 550 #define left_6 651 #define left_7 7//右直角5253 #define right_1 -154 #define right_2 -255 #define right_3 -356 #define right_4 -457 #define right_5 -558 #define right_6 -659 #define right_7 -7//左直角60 #endif[cpp]view plaincopy61 #include "Macro.h"62 #include "sensor.h"63 void Motorstop()64 {65 LEFTOUT=0;66 RIGHTOUT=0;67 }68 void MotorLeft(int speed,int direction)69 {70 if(speed>max_speed)speed=max_speed;71 if(direction==backward)//反转72 {73 EnableLeftNeg;74 UnenableLeftPos;75 }76 else if(direction==foreward)//正转77 {78 EnableLeftPos;79 UnenableLeftNeg;80 }81 LEFTOUT=Period/100*speed;82 }83 void MotorRight(int speed,int direction)84 {85 if(speed>max_speed)speed=max_speed;8687 if(direction==backward)//反转88 {89 EnableRightNeg;90 UnenableRightPos;91 }92 else if(direction==foreward)//正转93 {94 EnableRightPos;95 UnenableRightNeg;96 }97 RIGHTOUT=Period/100*speed;98 }99 void MotorDrive(int PIDout)100 {101 int speedleft,speedright;102 speedleft=Basic_Left PIDout;103 speedright=Basic_Right-PIDout;104105 if(speedleft<0)106 MotorLeft(speedleft,backward);//反转107 else MotorLeft(speedleft,foreward);//正转108109 if(speedright<0)110 MotorRight(speedright,backward);//反转111 else MotorRight(speedright,foreward);//正转112 }113 void Rangle(float angle)114 {115 // TBCTL|=TBCLR;116 TBCCR1=LMAX (unsigned int)(angle*one);117 }[cpp]view plaincopy118 //下面是小车的程序。
智能循迹小车详细源代码程序(MSP430,PID)
81 LEFTOUT=Period/100*speed;
82 }
83 void MotorRight(int speed,int direction)
84 {
85 if(speed>max_speed)speed=max_speed;
86
72 {
73 EnableLeftNeg;
74 UnenableLeftPos;
75 }
76 else if(direction==foreward)//正转
77 {
78 EnableLeftPos;
79 UnenableLeftNeg;
17 #define LEFTOUT TACCR1
18 #define RIGHTOUT TACCR2
19 #define SensorIn P5IN
20 #define F 5000//5000hz
21 #define Period (8000000/F)
64 {
65 LEFTOUT=0;
66 RIGHTOUT=0;
67 }
68 void MotorLeft(int speed,int direction)
69 {
70 if(speed>max_speed)speed=max_speed;
71 if(direction==backward)//反转
183 TACCTL2|=OUTMOD_7;//
184 LEFTOUT=0;
185 RIGHTOUT=0;
186 }
187
188 float abs(float a)
189 {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
寻迹小车
在历届全国大学生电子设计竞赛中多次出现了集光、机、电于一体的简易智能小车题目。
笔者通过论证、比较、实验之后,制作出了简易小车的寻迹电路系统。
整个系统基于普通玩具小车的机械结构,并利用了小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。
总体方案
整个电路系统分为检测、控制、驱动三个模块。
首先利用光电对管对路面信号进行检测,经过比较器处理之后,送给软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。
系统方案方框图如图1所示。
图1 智能小车寻迹系统框图
传感检测单元
小车循迹原理
该智能小车在画有黑线的白纸“路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”—黑线。
笔者在该模块中利用了简单、应用也比较普遍的检测方法——红外探测法。
红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。
在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号。
传感器的选择
市场上用于红外探测法的器件较多,可以利用反射式传感器外接简单电路自制探头,也可以使用结构简单、工作性能可靠的集成式红外探头。
ST系列集成红外探头价格便宜、体积小、使用方便、性能可靠、用途广泛,所以该系统中最终选择了ST168反射传感器作为红外光的发射和接收器件,其内部结构和外接电路均较为简单,如图2所示:
图2 ST168检测电路
ST168采用高发射功率红外光、电二极管和高灵敏光电晶体管组成,采用非接触式检测方式。
ST168的检测距离很小,一般为8~15毫米,因为8毫米以下是它的检测盲区,而大于15毫米则很容易受干扰。
笔者经过多次测试、比较,发现把传感器安装在距离检测物表面10毫米时,检测效果最好。
R1限制发射二极管的电流,发射管的电流和发射功率成正比,但受其极限输入正向电流50mA的影响,用R1=150的电阻作为限流电阻,Vcc=5V作为电源电压,测试发现发射功率完全能满足检测需要;可变电阻R2可限制接收电路的电流,一方面保护接收红外管;另一方面可调节检测电路的灵敏度。
因为传感器输出端得到的是模拟电压信号,所以在输出端增加了比较器,先将ST168输出电压与2.5V进行比较,再送给单片机处理和控制。
传感器的安装
正确选择检测方法和传感器件是决定循迹效果的重要因素,而且正确的器件安装方法也是循迹电路好坏的一个重要因素。
从简单、方便、可靠等角度出发,同时在底盘装设4个红外探测头,进行两级方向纠正控制,将大大提高其循迹的可靠性,具体位置分布如图3所示。
图3 红外探头的分布图
图中循迹传感器全部在一条直线上。
其中X1与Y1为第一级方向控制传感器,X2与Y2为第二级方向控制传感器,并且黑线同一边的两个传感器之间的宽度不得大于黑线的宽度。
小车前进时,始终保持(如图3中所示的行走轨迹黑线)在X1和Y1这两个第一级传感器之间,当小车偏离黑线时,第一级传感器就能检测到黑线,把检测的信号送给小车的处理、控制系统,控制系统发出信号对小车轨迹予以纠正。
第二级方向探测器实际是第一级的后备保护,它的存在是考虑到小车由于惯性过大会依旧偏离轨道,再次对小车的运动进行纠正,从而提高了小车循迹的可靠性。
软件控制单元
单片机选型及程序流程
此部分是整个小车运行的核心部件,起着控制小车所有运行状态的作用。
控制方法有很多,大部分都采用单片机控制。
由于51单片机具有价格低廉是使用简单的特点,这里选择了ATMEL公司的AT89S51作为控制核心部件,其程序控制方框图如图4所示。
图4 系统的程序流程图
小车进入循迹模式后,即开始不停地扫描与探测器连接的单片机I/O口,一旦检测到某个I/O口有信号变化,程序就进入判断程序,把相应的信号发送给电动机从而纠正小车的状态。
车速的控制
车速调节的方法有两种:一是用步进电机代替小车上原有的直流电机;二是在原有直流电机的基础上,采用pwm调速法进行调速。
考虑到机械装置不便于修改等因素,这里选择后者,利用单片机输出端输出高电平的脉宽及其占空比的大小来控制电机的转速,从而控制小车的速度。
经过多次试验,最终确定合适的脉宽和占空比,基本能保证小车在所需要的速度范围内平稳前行。
电机驱动单元
从单片机输出的信号功率很弱,即使在没有其它外在负载时也无法带动电机,所以在实际电路中我们加入了电机驱动芯片提高输入电机信号的功率,从而能够根据需要控制电机转动。
根据驱动功率大小以及连接电路的简化要求选择L298N,其外形、管脚分布如图5所示。
图5 L298N管脚分布图
从图中可以知道,一块L298N芯片能够驱动两个电机转动,它的使能端可以外接高低电平,也可以利用单片机进行软件控制,极大地满足各种复杂电路需要。
另外,L298N的驱动功率较大,能够根据输入电压的大小输出不同的电压和功率,解决了负载能力不够这个问题。
结语
此方案选择的器件比较简单,实际中也很容易实现。
经过多次测试,结果表明在一定的弧度范围内,小车能够沿着黑线轨迹行进,达到了预期目标。
不足之处,由于小车采用直流电机,其速度控制不够精确和稳定,不能实现急转和大弧度的拐弯。
程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar pro_left,pro_right,i,j; //左右占空比标志
sbit left1=P2^0;
sbit left2=P2^1;
sbit right1=P2^2;
sbit right2=P2^3;
sbit en1=P1^0;
sbit en2=P1^1;
//循迹口三个红外传感器
sbit left_red=P1^2; //白线位置
sbit mid_red=P1^3; //黑线位置
sbit right_red=P1^4; //白线位置
void delay(uint z)
{
uchar i;
while(z--)
{for(i=0;i<121;i++);}
}
void init()
{
left_red=0; //白线位置
mid_red=1; //黑线位置
right_red=0;
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
en1=1;
en2=1;
}
void time0(void)interrupt 1
{
i++;
j++;
if(i<=pro_right) {en1=1;}
else en1=0;
if(i==40) {en1=~en1;i=0;}
if(j<=pro_left) {en2=1;}
else en2=0;
if(j==40) {en2=~en2;j=0;}
TH0=(65536-100)/256;
TL0=(65536-100)%256;
}
void straight() //走直线函数
{
pro_right=39;
pro_left=39;
left1=0;
left2=1;
right1=1;
right2=0;
}
void turn_left() //左转弯函数{
pro_right=5;
pro_left=39;
left1=0;
left2=1;
right1=1;
right2=0;
}
void turn_right() //右转弯函数{
pro_right=39;
pro_left=5;
left1=0;
left2=1;
right1=1;
right2=0;
}
void turn_back() //后退(反转)函数{
left1=1;
left2=0;
right1=0;
right2=1;
pro_right=39;
pro_left=39;
}
void infrared() //循迹
{
uchar flag;
if(left_red==1)
{flag=1;}
else
if(right_red==1)
{flag=2;}
else
if((left_red==0)&(mid_red==0)&(right_red==0)) {flag=3;}
else flag=0;
switch (flag)
{
case 0: straight();
break;
case 1: turn_left();
break;
case 2: turn_right();
break;
case 3: turn_back();
break;
default:
break;
}
}
void main(void)
{
init();
delay(1);
while(1)
{
infrared();
// straight();
}
}
void int0(void)interrupt 0 {
}。