自动搬运机械人毕业设计.docx
《自动搬运机械人毕业设计.docx》由会员分享,可在线阅读,更多相关《自动搬运机械人毕业设计.docx(20页珍藏版)》请在冰点文库上搜索。
自动搬运机械人毕业设计
自动搬运机械人
成员:
周丽丽刘蕾张长春
时刻:
8月4号----8月8号
摘要
本设计采纳STC89C52单片机作为主操纵器芯片,辅以木块探测模块、液晶显示、电源等模块,以实现对自动搬运机械人的自动操纵。
搬运机械人在移动进程中通过红外线探测技术来感测木块的位置,然后传给STC89C52单片机,通过单片机处置后操纵PWM波来改变机械人的运动方向,然后通过操纵机械手上的舵机来实现对木块的抓取。
另外本设计能够通过显示模块显示每次运行时刻。
Abstract
ThisdesignusesSTC89C52microcontrollerasthemaincontrollerchip,withwooddetectionmodule,liquidcrystaldisplay,powersupplymodule,inordertorealizetheautomaticcontrolofautomaticguidedrobot.Handlingrobotintheprocessofmovingthroughtheinfrareddetectiontechnologytosensetheblockposition,andthentransmittedtotheSTC89C52microcontroller,controlthedirectionofmovementtochangetherobotPWMprocessedbythesinglechip,andthenbycontrollingtheservomanipulatortorealizethecatchblock.Inadditionthedesigncanbedisplayedthroughthedisplaymoduleforeachruntime.
Notableofcontentsentriesfound.7附录.程序.................................................................................................................17
1、系统方案的设计、比较与论证
依照题目的大体要求,设计任务要紧完成自动搬运机械人在规定形成范围内把三个木块运动仓库,并力求所历时刻最短,同时对行程中的有关数据进行处置显示。
为完成相应功能,系统能够划分为几个模块:
电机驱动模块、电源模块、红外避障模块、机械手模块、显示模块。
图1
1.1电源模块
本系统要求6V和5V两种电压供电,应选用7.2V大功率镍镉电池组做电源,经由二端稳压器LM7805和LM7806稳压后输出标准5V和6V电压。
别离向单片机和电机单独供电,实现了操纵电路电源和单片机电源隔离,避由免了电源供电时电机启停产生的大电流对单片机和其他模块的阻碍。
图2
1.2单片机显示操纵系统选择
方案一:
采纳飞思卡尔系列单片机进行操纵。
该系列单片机专用性强,是16位单片机处置速度快,拥有4个按时器,可是价钱昂贵,在短时刻内很难学懂及熟练的利用。
方案二:
采纳8位的STC89C52作为自动搬运机械人的核心操纵器。
STC89C52单片机通用性强,运用比较普遍,容易上手,市场价钱低。
就本设计而言,足以知足要求。
经分析可得,STC89C52单片机不管从完成设计要求仍是性价比上都更优于飞思卡尔系列单片机,应选方案二。
1.3电机驱动模块
依照题目中的要求,电机的速度可不能专门快,普
通的电机很难知足要求,而直流减速电性能够知足此要求。
故咱们选用直流减速电机。
在选用驱动模块方面有以下两种方案:
采纳分立三极管驱动电路。
经分析此电路的焊接比较复杂,而且稳固性差,很难知足要求。
采纳专用驱动芯片。
该芯片集成度高,占用空间小。
要紧应用于电机调速场合。
用电机专用集成驱动电路能够达到预期的目标。
故咱们最后决定用后方案。
图3电机驱动电路
1.4红外避障模块
方案一:
TK-20黑白线检测传感器。
在目标木块和仓库的表面贴上白色胶带,可是,黑白线检测传感器检测距离近,难以调剂,很难达到预期的目标。
方案二:
红外避障传感器。
该集成传感器是专用于障碍物测量模块。
其体积小,灵敏度高,测量距离远,靠得住的工作性能等优势,可高度知足该题的要求。
通过以上两个方案的比较,方案二明显优于方案一,故采纳方案二。
图4
1.5显示模块
方案一:
采纳LCD1602。
占用太单片机IO口显示信息量少,占用太多的程序资源。
方案二:
采纳NOKIA5110。
只占用5个单片机接口,同时显示信息量大,灵活多变显示多种信息。
因此,咱们拟采纳后者。
1.6机械手驱动模块
本模块采纳舵机来完成设计要求,其工作原理是由单片机发出信号给舵机,其内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将取得的直流偏置电压与电位器的电压比较,取得电压差输出。
经由电路板上的IC判定转动方向,在驱动无核心马达开始转动。
透过减速齿轮将动力传至摆臂,同时由位置检测器送回信号,判定是不是已经抵达定位。
鉴于此种舵机摆臂比较长很容易实现本设计要求,因此选用舵机。
通过一番认真的论证比较,咱们最终确信的系统详细方框图如下:
图5
2硬件电路的设计
2.1硬件电路设计原理分析
本设计要求机械人从起始线动身(动身前,机械人任何部份不得超出起跑线,后端不限),自动将木块一一送到库房内(许诺倒车)。
运行时刻应力求最短(从合上电源开关开始计时)。
木块运到库房时,应能堆放到库房挡板20cm线之内;若是不能全数运到库房,记录木块距离20cm线的最大距离。
咱们依照小车走过的路程s和平均速度v来计算小车行驶所用的时刻t。
图6机械手搬运示用意
计算公式如下所示:
v=s/tt总=t1+t2+t3S总=v1t1+v2t2+v3t3
2.2机械手工作模块设计
利用红外避障传感器不断向外发射红外线进行探测。
在小车行进的进程中,当探测到目标时,小车停止前进,进行转向,再利用车体下端的红外避暲传感器进行对物体的定位,并通过单片机驱动小车向目标前进,行进进程中自动校正方位,抵达目标后,舵手夹住目标倒车转向,最终把目标松紧仓库。
2.3红外避障探测电路
本设计采纳类似镜面反射原理来实现对物体的探测的,先通过调试电位器设定好红外探测的距离,红外避障传感器发出红外线后对目标探测,当红外线探测到目标后,依照镜面反射原理,光线返回被接收,传给单片机进行处置。
图7红外探测电路
2.4显示电路设计
该设计采纳Nokia5110液晶来实现的。
该模块采纳串行接口与主处置器进行通信,接口线数量大幅度减少,包括地和电源信号线共有8支,传输速度高达4bps,可全速写入显示数据,无等待时刻。
图8显示电路
3系统软件设计
3.1整体程序流程图
图9系统流程示用意
3.2红外避障传感器软件设计
当小车行进进程中,当红外避障传感器探测到目标后,把数据传给单片机处置,不然小车继续前进。
设计流程图如下(图10)
图10红外避障传感器探测示用意
4系统测试
4.1测试环境
测试日期:
2021-8-8测试时刻:
测试温度:
30OC
4.2测试仪器
秒表,米尺S
4.3测试结果
左右误差
前后误差
搬运所用的时刻
4.4数据分析与总结
由以上数据咱们能够看出,数据测试的成效,达到了题目的要求,尽管还有一点误差,可是通过咱们的多次反复校正,测量的数据是在误差许诺的范围内,且系统性能靠得住稳固。
5总结
通过为期四天的设计,咱们终于成功的实现了题目的大体要求和部份发挥功能。
同时加入了自己的创新部份,通过本次模拟设计大赛能够让咱们学以致用,同时也激发了咱们的创新思维。
在这次模拟设计竞赛中,咱们不但历练了实践能力和协作精神,而且懂了联系实际的重要性,这对咱们以后的学习和生活有专门大帮忙。
另外咱们发觉了红外避障传感器对不同的材质性能有专门大阻碍的特点,固然,咱们的设计也存在一些小问题,还有待改良。
在此恳请列位评委批评指正。
6参看文献
1.华成英【M】模拟电子技术基础(第四版)高等教育出版社
2.阎石【M】数字电子技术基础(第五版)高等教育出版社
3.郭天祥51单片机C语言教程电子工业出版社
7附录程序
/********2021-08-05***************/
/**********PWM波模块操纵电机**************/
/*******头文件和预处置命令*******/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineLeft_moto_pwmENA//接驱动模块ENA使能端,输入PWM信号调节速度
#defineRight_moto_pwmENB//接驱动模块ENB
#defineLeft_moto_go{IN1=1,IN2=0;}//P0^0P0^1接IN1IN2当P3_4=0,P3_5=1;时左电机前进
#defineLeft_moto_back{IN1=0,IN2=1;}//P0^0P0^1接IN1IN2当P3_4=1,P3_5=0;时左电机后退
#defineLeft_moto_stop{IN1=1,IN2=1;}//P0^0P0^1接IN1IN2当P3_4=1,P3_5=1;时左电机停转
#defineRight_moto_go{IN3=1,IN4=0;}//P0^2P0^3P3_7接IN1IN2当P3_6=0,P3_7=1;时右电机前转
#defineRight_moto_back{IN3=0,IN4=1;}//P0^2P0^3接IN1IN2当P3_6=1,P3_7=0;时右电机后退
#defineRight_moto_stop{IN3=1,IN4=1;}//P0^2P0^3接IN1IN2
uchari;
uchart1;//此参数改变占空比
uchart2;
ucharnum1;//计数器
ucharnum2;
ucharPWM1_MAX=100;//此参数调节上限值
ucharPWM2_MAX=100;
/************位概念**************/
sbitLeft_moto_pwm=P0^2;//根据自己板子定义引脚
sbitRight_moto_pwm=P0^5;
sbitIN1=P0^0;//控制左电机
sbitIN2=P0^1;
sbitIN3=P0^3;//控制右电机
sbitIN4=P0^4;
sbitzuochuan=P0^7;//红外避障传感器
sbitxiachuan=P2^0;
sbitchuan=P2^1;
sbitshangchuan=P2^2;
uinta,c;
sbitp10=P0^6;
/*********延时函数************/
voidDelayMS(uintz)
{
uinti,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
/*********前进函数************/
voidrun()
{
t1=40;
t2=40;
Left_moto_go;
Right_moto_go;
}
/*********后退函数************/
voidback()
{
t1=40;
t2=40;
Left_moto_back;
Right_moto_back;
}
/*************左转函数**********************/
voidleft()
{
t1=55;
t2=55;
Right_moto_go;//右电机继续
Left_moto_back;//左电机停走
}
voidleft1()
{
t1=40;
t2=40;
Right_moto_go;//右电机继续
Left_moto_back;//左电机停走
}
/**************右转函数*************************/
voidright()
{
t1=50;
t2=50;
Right_moto_back;//右电机停走
Left_moto_go;//左电机继续
}
voidright1()
{
t1=60;
t2=60;
Right_moto_stop;//右电机停走
Left_moto_go;//左电机继续
}
/*******中断效劳子程序*******/
voidtimer0(void)interrupt1
{
p10=!
p10;
c=20000-c;
TH0=-(c/256);
TL0=-(c%256);
if(c>=500&&c<=2500)c=a;
elsec=20000-a;
}
/*******中断效劳子程序2*******/
voidtime1(void)interrupt3
{
TH1=(65535-100)/256;
TL1=(65535-100)%256;
num1++;
num2++;
if(num1<=t1)Left_moto_pwm=1;//左电机pwm
elseLeft_moto_pwm=0;
if(num1==PWM1_MAX)num1=0;
if(num2<=t2)Right_moto_pwm=1;//右电机pwm
elseRight_moto_pwm=0;
if(num2==PWM2_MAX)num2=0;
}
/********中断初始化函数********/
voidinit()
{
TMOD=0X11;
a=500;//a小角度放开木块,大角度夹紧
c=a;
TH0=-(a/256);
TL0=-(a%256);
EA=1;
ET0=1;
TR0=1;
TH1=(65535-100)/256;
TL1=(65535-100)%256;
ET1=1;
TR1=1;
}
/**************主函数************/
voidmain(void)
{
num1=0;//给计数器赋初值
num2=0;
init();
while
(1)//无限循环
{
run();
if(zuochuan==0)
{
run();while(zuochuan==0);
left1();DelayMS(480);
Left_moto_stop;
Right_moto_stop;
DelayMS(500);
run();DelayMS(200);
Left_moto_stop;
Right_moto_stop;
DelayMS(500);
}
if(xiachuan==0)
{
a=2000;DelayMS(500);//夹紧延时
right1();DelayMS(1000);
Left_moto_stop;
Right_moto_stop;
DelayMS(500);
while(chuan)
{
back();
DelayMS(50);//消抖
}
DelayMS(50);
while(chuan)
{
back();
}
if(chuan==0)
{
Left_moto_stop;
Right_moto_stop;
DelayMS(1000);
left();DelayMS(800);
Left_moto_stop;
Right_moto_stop;
DelayMS(500);
while(shangchuan)
{
run();
DelayMS(50);
}
DelayMS(50);
while(shangchuan)
{
run();
}
}
if(shangchuan==0)
{
run();DelayMS(700);
Left_moto_stop;
Right_moto_stop;
DelayMS(500);
a=500;DelayMS(2000);
//run();DelayMS(700);
back();DelayMS(2150);//此处延不时刻需调整
Left_moto_stop;
Right_moto_stop;
DelayMS(500);
right();DelayMS(365);//buzu390
while(zuochuan&&xiachuan)
{
run();
DelayMS(50);
}
DelayMS(50);
while(zuochuan&&xiachuan)
{
run();
}
}//ifshangchuan
}//ifxiachuan
}//while
}//main