引 言 1、 系统方案设计、比较与论证 1.1、寻迹线探测模块 1.2、电动机及其驱动模块的选择 1.3、信息显示模块 1.4、电源选择 2、系统总体设计方案 3、系统硬件电路设计 3.1、单片机最小系统 3.2、寻迹线探测电路设计 3.3、声控检测电路设计 3.4、光电检测乒乓球位置电路设计 3.5、 电动机驱动电路设计 4、系统软件设计 4.1、系统流程图 5 系统测试 5.1测试条件 5.2测试参数 参考文献
简易射门机器人
摘要:本设计采用了STC89C52单片机作为电动车的检测和控制核心,通过光电探头检测路面黑色寻迹线,使小车按预定轨道行驶,由光电传感器检测乒乓球位置,并进行射门。通过键盘控制和LCD12864液晶显示电路对小车的运动轨迹进行记录和显示切换,最后通过软件设计,实现了小车按轨道行驶、射门等功能。
引 言为使机器人能在设定的场地范围内行动,能在指定区域内寻找到乒乓球,并进行射门动作,按题目要求准确运行,故采用了单片机STC89C52最小系统作为电动车的检测和控制系统。通过光电探头检测路面黑色寻迹线,使小车按预定轨道行驶。 1、 系统方案设计、比较与论证根据题目要求分以下部分进行方案设计与论证
1.1、寻迹线探测模块 探测路面黑色寻迹线的原理:光线照射到路面并反射,由于黑线和白纸的反射系数不同,可根据接受到反射光强弱由传感器产生高低电平并最终通过单片机判断是否到达黑线偏离跑道。 方案一:由可见光发光二极管与光敏二极管组成的发射-接收电路。该方案成本较低,易于制作,但其缺点在于周围环境光源会对光敏二极管的工作产生很大干扰,一旦外界光亮条件改变,很可能造成误判和漏判;如果采用超高亮发光管和高灵敏度光敏管可以降低一定的干扰。 图1 光电检测电路 方案二:自制红外探头电路。此种方法简单,价格便宜,灵敏度可调,但易受到周围环境影响,特别是较强光照对检测信号的影响,会造成系统不稳定。再加上时间有限,制作分立电路较繁琐。 基于上述考虑,为了提高系统信号采集检测的精度,我们采用方案一。 1.2、电动机及其驱动模块的选择根据题目中小车行驶全程的时间要求,可知小车的行驶速度很慢,普通的电机很难满足此速度要求,而伺服电机可以满足此要求,伺采用脉冲控制比较容易实现起跑停,并且其具有很大的转动力矩,不会在倾斜面出现堵转情况。故我们采用伺服电机。 在选用驱动模块方面由以下两种方案:采用专用驱动芯片。该芯片集成度高,占用空间小,主要应用于电机调速场合。采用分立三极管驱动电路。经分析此机器人小车所要求的功能比较简单,不需复杂的调速,采用脉冲控制。故我们最后决定用后方案。 1.3、信息显示模块 采用LED,缺点是占用单片机接口太多,显示信息量少,需要循环显示,占用太多程序资源。采用LCD12864,占用11个单片机接口,同时显示信息量大,灵活多变显示多种信息。因此,我们拟采用后者。 1.4、电源选择方案一:所有器件采用单一电源(6节五号电池)。这样供电比较简单,但是由于电动机启动瞬间电流很大,会造成电压不稳、有毛刺等干扰,严重时可能会造成单片机系统掉电,使之不能完成预定行程。 方案二:单电源两路供电。电动机驱动电源采用6节五号电池无稳压供电,单片机及其外围电路电源采用5V稳压电源供电,这样两路互不影响。 根据以上综合考虑,故拟采用方案二。 经过一番仔细的论证比较,我们最终确定的系统详细方框图如下: 图2 系统方案设计图 2、系统总体设计方案根据题目的基本要求,设计任务主要完成机器人在规定时间内按规定路径稳定行驶,并能进行射门,同时对行程中的有关数据进行处理显示。整个系统的模块框图如图1所示。 图3 系统总体设计框图 该系统主要由电动机驱动模块、寻迹线探测模块、红外避障碍、信息显示模块几个部分组成。由89C52单片机为系统控制的CPU对小车寻迹、乒乓球检测和LED显示进行控制,使小车在规定的时间内完成规定的路线,并检测乒乓球送入球门,完成题目的要求。 3、系统硬件电路设计
3.1、单片机最小系统 图4 单片机最小系统
该最小系统主要采用STC89C52用为电路的控制芯片。 3.2、寻迹线探测电路设计采用光电探测器,该探头输出端只有三根线(电源线、地线、信号线),只要将信号线接在单片机的I/O口,然后不停地对该I/O口进行扫描检测,当其为低电平时则检测到白纸,否则为高电平时则检测到黑线区域。小车前进(倒退)时,始终保持黑线在车头二个传感器之间,当小车偏离黑线时,探测器一旦探测到有黑线,单片机就会按照预先编定的程序发送指令给小车的控制系统,控制系统再对小车路径予以纠正。当小车回到了轨道上时,车头两个探测器都只检测到白纸,则小车继续直线行走,否则小车会持续进行方向调整操作,直到小车恢复正常。 3.3、声控检测电路设计电路采用LM358作为比较器。当有响声时,话筒将声音信号转换为电信号,经三极管放大,运放比较输出。因为输出信号有抖动,对单片机的接收有所干扰。考虑到I/O口接收的问题,电路多加了延时电路,能更好的防止抖动。 图5 声控检测电路 3.4、光电检测乒乓球位置电路设计
图6 光电乒乓球检测电路 乒乓球检测电路与寻迹电路相原相同,只是乒乓球检测电路光电传感器灵敏度不要寻迹那么灵敏。 3.5、 电动机驱动电路设计该电路电机采用脉冲击驱动,根据脉PWM不同进而控制电机的前进和后退以及左右转向。 4、系统软件设计
4.1、系统流程图 图7 系统流程图
当开机时,系统上电复位,各项初始化,系统等待1秒钟,检测声控,然后进入自动运行状态。 为机器人小车运行及方向调整程序,使小车按预定路线运行,并且在小车偏离轨道后自动调整走向使小车自动返回预定路线,当检测到兵时,停两秒并声音提示,然后进行射门,并且控制LCD实时显示运行时间,轨迹,距离。 5 系统测试5.1测试条件在指定区域内测试,指定区域用白纸铺设,黑线宽度为2cm,防守者为易拉罐,直径为5.5cm,高度为13.2cm,防守者为黑色。 乒乓球为白色,内填充物重量为45克。 5.2测试参数5.2.1电机转速测试 5.2.2小车行驶过程测试 5.2.3系统误差测试
参考文献【1】 吴少军、刘光斌 编著《单片机实用低功耗设计》 人民邮电出版社 【2】周航慈 编著 《单片机应用程序设计》 北京航空航天大学出版社 【3】谭浩强. C语言程序设计(第二版). 北京:清华大学出版社,2000
附录:
单片机源程序如下:
- #include<reg51.h> //库函数
- #include<delay_12t.h>//调用延时函数
- #include<Interrupt.h>//中断函数
- #include"12864.h" //显示程序
-
- unsigned char code pic2[]; //定义地图表格
-
- uchar tr_num[]={243,245,240,249,252,241,239,247};
-
- /********特殊功能位定义********/
- sbit SE_right=P3^6; //右电机
- sbit SE_left=P3^7; //左电机
-
- sbit Road_IR_right=P1^2; //右光电接收
- sbit Road_IR_center=P1^1; //中光电接收
- sbit Road_IR_left=P1^0; //左光电接收
-
- sbit key1 =P3^4; //按键1
- sbit key2 =P3^5; //按键2
-
- sbit Voice_IR=P1^7; //声控接收
- sbit Speaker=P2^4; //声光报警控制
-
- sbit Ball_IR1=P1^3; //球检测到位2
- sbit Ball_IR2=P1^4; //球检测到位1
- /************end******************/
-
- /***********位定义***************************/
- bit Cross_flag=0; //十字交点检测标志位
- bit Ball_OK=0; //球找到
- bit Ball_turn=0; //带球
- bit Start_flag=0; //启动标志位
- bit End_flag =0; //结束标志位
- bit Ball_detection=0; //启动检测球 标志位
- bit Sub_flag=0; //减速标志位
- bit key_flag=0; //
- bit key_start=0;
- /*************end***************************/
-
- /******全局变量声明************/
- uchar motor_num=0; //小车速度控制
- uchar road_miao=0; //小车行走的时间 秒
- uchar road_fen=0; //小车行走的时间 分
- uchar Cross_num=0; //十字交点计数
- uint Ex_num=0; //进入中断次数
- uint Travel_num=0; //路程计算
- uchar End_num=0; //忙区距离检测距离数
-
- /************end*******************/
-
- /************函数声明******************/
- void forward(void); //小车向前行走
- void backward(void); //向后走
- void left_turn(uchar z); //左转
- void right_turn(uchar z); //右转
- void Tracing_forward(void); // 寻迹检测向前
- void Turn_control(void); //转弯控制
- void Find_ball(void); //寻找球
- void Start_tract(); //出发函数
- void display_init(void); //显示初始化
- void display_end(void) ; //最后数据综合显示
- void cease(); //小车停止
- void display_end_dispose(void); //最后显示处理优化
- void keyboard();//按键扫描
-
- /*************end*********************/
-
- //******定时器0中断入口*****
- void to() interrupt 1
- {
- static unsigned char T0_num1,T0_num2,T0_num3;
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
-
- /*********行走时间计算 *****************/
- if(End_flag==0)
- {
- T0_num1++;
- if(T0_num1==100) //行走时间计算
- {
- T0_num1=0;
- road_miao++;
- if(road_miao==60)
- {
- road_miao=0;
- road_fen++;
- }
- }
- }
- /*********十字路口计数***********/
- if(Cross_flag==1) //十字路口计数
- {
- T0_num2++;
- if(T0_num2==25)
- {
- Cross_num++; //十字路口计数加1
- picture(Cross_num);
- Turn_control();
- Cross_flag=0;
- T0_num2=0;
- }
- }
- /***************检测到球停止两秒************************/
- if(Ball_OK==1&&Ball_turn==0)
- {
- T0_num3++;
- if(T0_num3==200)
- {
- T0_num3=0;
- Ball_turn=1; //准备运球
- Speaker=1;
- }
- }
- }
-
- /**********************************
- 函数名称:EX1() interrupt
- 功能 :外部中断1入口 ,用来测行
- 参数 :无
- 返回值 :无
- ***** ******************************/
- void ex2() interrupt 2 using 2
- {
- // Travel_num+=11;
- Ex_num++;
- if(Ex_num==8)
- {
- Ex_num=0;
- }
- }
-
- /****************************************/
- /* 主函数 */
- /****************************************/
- void main()
- {
- display_init(); //显示初始化,启动默认模式初始化
- EX_init(); //外部 中断初始化
- _delay_ms(1000);
- while(!Voice_IR);
- Start_tract();
- Timer_init(); //定时器初始化
- while(1)
- {
- if(End_flag==0)
- {
- Find_ball(); //避开障碍,找到球射门
- }
- else
- if(End_flag==1&&key_start==0)
- {
- display_end_dispose();//最后显示处理优化
- _delay_ms(10);
- key_start=1;
- }
- if(key_start)
- {
- keyboard();
- }
- }
- }
-
- /**********************************
- 函数名称:Forward(void)
- 功能 :小车向前行走
- 参数 :无
- 返回值 :无
- ***********************************/
- void forward(void)
- {
- SE_left=1;
- _delay_us(1700);
- SE_left=0;
- SE_right=1;
- _delay_us(1300);
- SE_right=0;
- _delay_ms(20);
- }
-
- /**********************************
- 函数名称:Forward(void)
- 功能 :小车向前行走减速
- 参数 :无
- 返回值 :无
- ***********************************/
- void forward_s(void)
- {
- SE_left=1;
- _delay_us(1680);
- SE_left=0;
- SE_right=1;
- _delay_us(1320);
- SE_right=0;
- _delay_ms(20);
- }
-
- /**********************************
- 函数名称:backward(void)
- 功能 :小车向后行走
- 参数 :无
- 返回值 :无
- ***********************************/
- void backward(void)
- {
- SE_right=1;
- _delay_us(1700);
- SE_right=0;
- SE_left=1;
- _delay_us(1300);
- SE_left=0;
- _delay_ms(20);
- }
-
- /**********************************
- 函数名称:Left_turn
- 功能 :小车左转
- 参数 :z:设定旋转量
- 返回值 :无
- ***********************************/
- void left_turn(uchar z)
- {
- uchar i;
- for(i=z;i>0;i--)
- {
- SE_left=1;
- _delay_us(1300);
- SE_left=0;
- SE_right=1;
- _delay_us(1300);
- SE_right=0;
- _delay_ms(20);
- }
- }
-
- /**********************************
- 函数名称:cease()
- 功能 :小车停止
- 参数 :无
- 返回值 :无
- ***********************************/
- void cease()
- {
- SE_left=1;
- _delay_us(1500);
- SE_left=0;
- SE_right=1;
- _delay_us(1500);
- SE_right=0;
- _delay_ms(20);
- }
-
- /**********************************
- 函数名称:Right_turn
- 功能 :小车右转
- 参数 :z:设定旋转量
- 返回值 :无
- ***********************************/
- void right_turn(uchar z)
- {
- uchar i;
- for(i=z;i>0;i--)
- {
- SE_left=1;
- _delay_us(1700);
- SE_left=0;
- SE_right=1;
- _delay_us(1700);
- SE_right=0;
- _delay_ms(20);
- }
- }
-
-
- /**********************************
- 函数名称: Tracing_forward
- 功能 :走黑线
- 参数 :无
- 返回值 :无
- ***********************************/
- void Tracing_forward(void)
- {
- if(Road_IR_right==0&&Road_IR_center==1&&Road_IR_left==0)
- {
- if(Sub_flag)
- {
- forward_s();//减速
- }
- else
- forward();
- }
- else
- if(Road_IR_right==1&&Road_IR_center==1&&Road_IR_left==1)
- {
- forward();
- Cross_flag=1;
- }
- else
- if(Road_IR_right==1&&Road_IR_center==1&Road_IR_left==0)
- {
- forward();
- }
- else
- if(Road_IR_right==0&&Road_IR_center==1&&Road_IR_left==1)
- {
- forward();
- }
- else
- if(Road_IR_right==1&&Road_IR_center==0&&Road_IR_left==0)
- {
- right_turn(2);
- }
- else
- if(Road_IR_right==0&&Road_IR_center==0&&Road_IR_left==1)
- {
- left_turn(2);
- }
- }
-
- /**********************************
- 函数名称:Start_tract
- 功能 :出发
- 参数 :z:设定旋转量
- 返回值 :无
- ***********************************/
- void Start_tract()
- {
- uchar i;
- while(Start_flag==0)
- {
- if(Road_IR_right==0&&Road_IR_center==0&&Road_IR_left==0)
- {
- forward();
- }
- else
- if(Road_IR_right==1&&Road_IR_center==1&&Road_IR_left==1)
- {
- for(i=0;i<12;i++)
- {
- forward();
- }
- Start_flag=1;
- }
- }
- left_turn(25);
- motor_num=100;
- }
-
- /**********************************
- 函数名称:Turn_control
- 功能 :转弯控制
- 参数 :无
- 返回值 :无
- ***********************************/
- void Turn_control(void)
- {
- if(Cross_num==4)
- {
- right_turn(22);
- }
- else
- if(Cross_num==6)
- {
- left_turn(22);
- Ball_detection=1;
- Sub_flag=1; //减速标志位
- }
- }
-
- /**********************************
- 函数名称:Find_ball
- 功能 :寻找球
- 参数 :无
- 返回值 :无
- ***********************************/
- void Find_ball(void)
- {
- uchar i=0;
- if(Ball_OK==0)
- {
- Tracing_forward();
- if(Ball_detection==1)
- {
- if(Ball_IR1==0||Ball_IR2==0) //检测到球
- {
- Sub_flag=0;
- Cross_num++;
- picture(Cross_num);
- Speaker=0;
- Ball_OK=1;
- cease(); //停止两秒
- }
- }
- }
- if(Ball_turn==1&&End_flag==0)
- {
- for(i=0;i<30;i++) //后退
- {
- backward();
- }
- _delay_ms(1000); //后退延时,准备射门
- for(i=0;i<180;i++)
- {
- Tracing_forward(); //再次检测黑线,对正
- }
- for(i=0;i<125;i++)
- {
- forward(); //向前
- }
- cease(); //射完门,车停
- Cross_num++;
- picture(Cross_num); //显示坐标
- End_flag=1;
- for(i=0;i<6;i++)
- {
- display_twinkle();//球进,球门闪烁15次
- Speaker=~Speaker;
- }
- Speaker=1;
-
- display_basiccls(); //显示初始化
- display_expandcls();
- init_12864_1();
- }
- }
-
-
- /**************************************
- 函数名:display_init()
- 功能 :初始化显示,显示默认模式,地图+坐标
- ***********************************/
- void display_init(void)
- {
- Speaker=0;
- _delay_ms(500);
- Speaker=1;
- LCD_BK=0; //开背光
- init_12864_1(); //lcd初始化
- display_basiccls(); //清屏
- init_12864_2(); // 画图初始化
- display_picture(pic4); //初始显示
- _delay_ms(4000);
- init_12864_1(); //lcd初始化
- display_basiccls(); //清屏
- init_12864_2(); // 画图初始化
- display_picture(pic2); //显示地图 (默认显示)
- }
-
- /*********************************************
- 函数名:display_end
- 功能 :显示最后数据
- **********************************************/
- void display_end(void)
- {
- display_char(0X80,"行驶路程:");
- display_char(0X90,"行驶时间:");
- display_char(0X88,"行驶速度:");
- display_baishige(0x80+5,(tr_num[Ex_num])); //路程显示
- display_shige(0x90+5,road_fen); //分显示
- display_char(0X90+6," :");
- display_shige(0x90+7,road_miao); //秒显示
- display_qianbaishige(0x98+2,(tr_num[Ex_num]*10)/road_miao);
-
- }
-
- /**************************************
- 函数名:display_end_dispose()
- 功能 :结束显示优化处理
- ***********************************/
- void display_end_dispose(void)
- {
- display_end();
- }
-
- void keyboard()
- {
- uchar i;
- if(key1==0)
- {
- _delay_ms(5);
- if(key1==0)
- {
- while(!key1);
- key_flag=~key_flag;
- }
- if(key_flag==1)
- {
- init_12864_1(); //lcd初始化
- display_basiccls(); //清屏
- init_12864_2(); // 画图初始化
- display_picture(pic2);
- for(i=0;i<9;i++)
- {
- picture(i);
- }
- }
- else
- if(key_flag==0)
- {
- display_basiccls(); //清屏
- init_12864_1(); //lcd初始化
- display_end();
- }
- }
- }
-
- /*********行走地图****************/
- unsigned char code pic2[]=
- {
- 0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFF,
- 0x80,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,
- 0x98,0x61,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,
- 0x90,0x41,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,
- 0x9F,0xF1,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
简易射门机器人论文.doc
(1.05 MB, 下载次数: 15)
|