智能循迹小车制作方法详解分析Word格式文档下载.docx
《智能循迹小车制作方法详解分析Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《智能循迹小车制作方法详解分析Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
5.5BF-1机器人程序框图……………………………………………………16
5.6BF-1程序…………………………………………………………………17
致谢……………………………………………………………………………24
参考文献………………………………………………………………………24
第一章绪论
1.1机器人在当今的重要性
随着社会的发展,工业生产量越来越大,单单靠人来工作是不行的,机器人的出现从一定程度上解决了这一问题。
尤其在中国,社会正在进入老龄化,除了生产之外还需要有很大一部分人力来照顾老人,但是如果有机器人来替我们完成部分工作,就可以缓解社会压力。
机器人研究涉及的学科涵盖机械、电子、传感器、驱动与控制等多个领域,过去,对机器人行业有过重大贡献的人数不胜数。
不过,从简单的时间线已经能够看出,从第一代工业机器人、第二代带有“感觉”的机器人到第三代智能机器人,机器人的体积越来越小,与PC结合得越来越紧密。
说不定,个人机器人就快成为现实了。
1.2机器人的发展与现状
1920年捷克斯洛伐克作家卡雷尔·
恰佩克在他的科幻小说《罗萨姆的机器人万能公司》中,根据Robota(捷克文,原意为“劳役、苦工”)和Robotnik(波兰文,原意为“工人”),创造出“机器人”这个词。
之后机器在短短的几十年间飞速发展,到今天,机器人技术在一些发达国家已经相当成熟。
1954年美国人乔治·
德沃尔制造出世界上第一台可编程的机器人,并注册了专利。
这种机械手能按照不同的程序从事不同的工作,因此具有通用性和灵活性。
1968年美国斯坦福研究所公布他们研发成功的机器人Shakey。
它带有视觉传感器,能根据人的指令发现并抓取积木,不过控制它的计算机有一个房间那么大。
Shakey可以算是世界第一台智能机器人,拉开了第三代机器人研发的序幕。
1999年日本索尼公司推出犬型机器人爱宝(AIBO),当即销售一空,从此娱乐机器人成为目前机器人迈进普通家庭的途径之一。
2002年丹麦iRobot公司推出了吸尘器机器人Roomba,它能避开障碍,自动设计行进路线,还能在电量不足时,自动驶向充电座。
Roomba是目前世界上销量最大、最商业化的家用机器人。
2006年6月,微软公司推出MicrosoftRoboticsStudio,机器人模块化、平台统一化的趋势越来越明显,比尔·
盖茨预言,家用机器人很快将席卷全球。
在中国近几年机器人研究也有所发展,但是与发达国家的技术还有相当大的差距,机器人知识在民间的普及还不够全面。
作为当今大学生,我们应该学着接触科学前沿,努力学习,丰富自己的知识储备,为我国的机器人发展做出自己的贡献。
1.3我与机器人
在很小时候就喜欢看类似于《铁臂阿童木》之类有关机器人的动画片,后来在电视上看到大学生机器人比赛,总幻想有一天自己也可以拥有一个属于自己的机器人。
有这个梦想很多年了,大学给我了一个接触机器人的机会,使得我可以在这方面努力。
虽然距离正真意义上的机器人还有很长的路要走,但是目前的小制作还是给我在追求梦想多的道路上很大的动力。
我会坚持自己的梦想,刻苦钻研,使自己在这方面的道路上可以走的更远。
第二章实验报告
2.1实验名称
BF-1机器人的设计与制作
2.2实验目的
验证BF-1机器人的可实现性,学习相关的电路和编程知识,对机器人有些基本的认识,扩展自己的思维方式,强化自己的动手能力。
2.3实验器材
1.主要元件列表:
序号
元件
规格
数量
备注
1
单片机
STC89C52
21
三极管
8050
2
电机驱动
L298n
22
蜂鸣器
有源
3
电压比较器
Lm339
23
数码管
八段一位
4
稳压管
L7805CV
24
排针
40P
宽体
5
电阻1
220
25
杜邦线
10cm
20
6
电阻2
330
12
26
IC座1
14P
7
电阻3
5.1k
8
27
IC座2
电阻4
10k
28
电池盒
六节5号
9
电容1
30pF
29
万用板1
5*7cm
10
电容2
0.1uF
30
万用板2
7*9cm
11
电容3
10uF
31
万用板3
9*1cm
电容4
100uF
32
减速电机
13
电容5
470uF
33
轮子
6cm
14
电位器
34
电机固定架
配套电机
15
二极管
IN4007
35
万向轮
16
晶振
11.0592MHz
36
铜柱1
M3*10mm
17
红外对管
TCRT5000
37
铜柱2
M3*30mm
18
自锁开关
38
螺丝
M3*5mm
19
按键开关
39
螺母
M3
发光二极管
40
排线
布线用
2.主要工具:
电烙铁、锡丝、螺丝刀、剪刀、钳子、电钻。
2.4实验原理
单芯片计算机可以像电脑一样写入程序发出指令。
(原理图见第五章_附件_5.4_BF-1机器人电路原理图。
)
2.5实验步骤
1.在网上搜集相关资料,设定整个方案的大致轮廓。
学习电路、单片机的基本知识,熟悉相关软件的使用方法。
2.根据掌握的知识和BF-1要实现的具体功能,绘制出机器人的机械图和原理图。
通过仿真软件对各部分电路做出大致的评估。
3.根据制定好的图纸完成机器人的硬件部分,包括机械和电路,对电路进行简单的测试,完善电路。
4.根据BF-1要实现的具体功能,编写程序,反复调试,完成最终程序。
2.6数据分析
BF-1机器人最终可以在特定的环境中(第五章_附件_5.4_BF-1机器人餐厅)完成规定动作:
在厨房放上菜后设定桌号,然后机器人将饭菜送到指定的餐桌,当客人取下饭菜之后,机器人可以自行返回厨房。
2.7结论
实验验证了BF-1餐饮服务性机器人的可行性,对于我来说是一个小小的鼓励。
在完成整个实验的过程中,我学到了很多新的知识,其中在微控制原理这一方面有很大的收获,因为以前从没有接触过,现在懂了不少。
此外在机器人的制作过程中,除了熟悉KeilC51等单片机开发环境外,我还掌握了AutoCAD、Protel、Proteus等计算机软件的基本操作,这些对以后的电路设计都是很好的基础。
最主要的是在实验中我更加体会到了探索的乐趣,加深了我对机器人的兴趣爱好,坚定了我要继续在这方面学习的信心。
并且在探索的过程中我还认识了很多志同道合的同学,大家都有着一样的兴趣,在一起共同学习共同进步,这是一件非常美好的事情。
但是即使对于这种简单的机器人来说,我还有很多东西无法解决,所以以后要努力学习,丰富自己的知识,为自己的梦想奋斗。
2.8误差讨论
机器人在直线处不能总是沿直线行进,偶尔会出现左右摇摆的情况,这可能是循迹程序不完善的因素。
在整个电路中,有关电阻和电容的使用并没有经过精致地计算。
以上几条以我现在的知识水平暂且无法解决,需要以后相关知识完备后在做完善。
BF-1本来装有人体释热传感器,用来防止机器人在送饭过程中撞上道路上的行人,但是在实际中此功能不能实现,后测试发现是传感器损坏,在没有找到新的传感器的情况下,此功能暂时去除。
第三章方案设计与论证
3.1移动平台
对于BF-1机器人来说,只需要进行简单的前后左右移动就可以,无需复杂的机械臂。
所以在平台的选择上就简单了很多。
方案一:
用四通道玩具遥控车的底盘。
优点:
容易找到,不需要太多的改造,且价格便宜。
缺点:
速度不容易掌控,转向迟钝。
方案二:
在网上购买机器人专用的平台。
容易上手,可以直接使用,各个方面相对稳定。
价格较贵,失去了动手制作的意义。
方案三:
使用减速电机,自己制作移动平台。
费用少,感受制作过程。
平台的坚固度和稳定性相对较弱。
图3.1减速电机
综合以上,结合我自身的经济能力和知识水平,我决定采用方案三,从网上购买了两个减速电机,安装在万用板上作为机器人的移动平台。
之所以选择用万用板,是因为万用板上容易打洞,便于电机和相关器件的安装。
3.2控制模块
对于BF-1机器人来说,并没有太过复杂的程序,对控制器的CPU、RAM、ROM都没有太高的要求,所以我采用单片机作为机器人的核心。
直接用电压比较器作为核心,通过比较不同传感器的变化从而输出高低电平控制电机驱动模块,达到循迹的目的。
但是对于BF-1机器人来说要做到循迹行走、停止、键盘输入、显示、运算等工作,所以没有计算机来控制是不能实现的。
故此方案不可行。
选用一片CPLD(如EPM7128LC84-15)作为系统的核心部件,实现控制与处理的功能。
CPLD具有速度快、编程容易、资源丰富、开发周期短等优点,可利用VHDL语言进行编写开发。
但CPLD在控制上较单片机有较大的劣势。
同时,CPLD的处理速度非常快,而小车的行进速度不可能太高,那么对系统处理信息的要求也就不会太高,在这一点上,MCU就已经可以胜任了。
若采用该方案,必将在控制上遇到许许多多不必要增加的难题。
为此,我们不采用该种方案,进而提出了第三种设想。
采用单片机作为整个系统的核心,用其控制行进中的小车,以实现其既定的性能指标。
充分分析我们的系统,其关键在于实现小车的自动控制,而在这一点上,单片机就显现出来它的优势——控制简单、方便、快捷。
这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。
因此,这种方案是一种较为理想的方案。
针对本设计特点——多开关量输入的复杂程序控制系统,需要擅长处理多开关量的标准单片机,而不能用精简I/O口和程序存储器的小体积单片机,D/A、A/D功能也不必选用。
根据这些分析,我选定了C51单片机作为本设计的主控装置,51单片机具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是51单片机价格非常低廉。
由于51单片机的普遍性,所以在市面很容易买到51单片机的开发板,编写烧录程序都相对方便。
图3.2C51单片机开发板
在综合考虑了传感器、两部电机的驱动等诸多因素后,我决定采用一片单片机,充分利用STC89C52单片机的资源。
3.3驱动模块
采用继电器对电动机的开或关进行控制,通过开关的切换对小车的速度进行调整.此方案的优点是电路较为简单,缺点是继电器的响应时间慢,易损坏,寿命较短,可靠性不高。
采用功率三极管作为功率放大器的输出控制直流电机。
线性型驱动的电路结构和原理简单,加速能力强,采用由达林顿管组成的H型桥式电路(如图3.3.1)。
图3.3.1H桥式电路
使用现市面上有很比较成熟的H桥集成芯片,这些芯片工作稳定,用单片机控制达林顿管使之工作在占空比可调的开关状态下,精确调整电动机转速。
这种电路由于工作在管子的饱和截止模式下,效率非常高,集成芯片保证了简单的实现转速和方向的控制,电子管的开关速度很快,稳定性也极强,是一种广泛采用的PWM调速技术。
这种调速方式有调速特性优良、调整平滑、调速范围广、过载能力大,能承受频繁的负载冲击,还可以实现频繁的无级快速启动、制动和反转等优点。
经过反复地比较,我选用了L298n(如图3.3.2)。
图3.3.2L298n
3.4循迹模块
采用简易光敏电阻结合外围电路探测,但实际效果并不理想,对行驶过程中的稳定性要求很高,且误测几率较大、易受光线环境和路面介质影响。
在使用过程极易出现问题,而且容易因为该部件造成整个系统的不稳定。
故最终未采用该方案。
采用四只红外对管(如图3.4),分别置于机器人车身前轨道的两侧,根据四只光电开关接受到白线与黑线的情况来控制小车转向来调整车向,测试表明,只要合理安装好,只用中间的两只光电开关就可以很好的实现循迹的功能。
图3.4红外对管
用激光传感器来循迹。
外界环境的影响对激光传感器干扰很小,并且通过单片机来分时点亮激光管,可以实现多个激光发射管对一个激光接收管。
但是激光管在安装过程中要求较高,一旦遇到静电就容易衰减。
并且激光发射管和激光接收管相对与红外对管是非常昂贵的。
综合利弊,我最终选用第二种方案。
用LM399作为电压比较器,将采集到模拟信号转换为数字信号,直接供单片机的I/O口。
3.5稳压模块
BF-1机器人的控制板需要5V的电压为单片机供电,但是由于L298N降压严重,所以5V电压对于电机驱动模块是不行的,至少需要7V左右的电压才能保证电机可以接收到5V的工作电压。
用6节充电镍氢电池(电压1.2V)串联,前四节引出两根导线(电压4.8V)为控制模块和循迹模块供电,总电池组两端接两根导线(电压7.2V)为电机驱动模块供电。
但是在电池的饱和状态和过放状态之间,电池的电压变化较大,对于需要稳定电压来工作的单片机来说,此方案不能达到要求。
用6节充电镍氢电池(电压1.2V)串联成7.2V的电池组,直接为电机驱动模块供电。
用三个二极管串联,将电压将至5.1V为控制模块和循迹模块供电。
此方案与方案一有着相同的弊端,随着电池电量的改变,加压后的电压波动较大。
所以我放弃此方案。
采用L7805稳压元件将7.2V电压降压到5V为控制模块和循迹模块供电。
稳压电路很简单,转换后的电压比较稳定,并且L7805的价格也不算贵,所以我采用此方案。
第四章程序与调试
4.1有关C51单片机
在BF-1机器人中使用的是STC89C52单片机。
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口。
另外STC89X52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35Mhz,6T/12T可选。
图4.1单片机
4.2开发环境
在程序的编写中有汇编语言和C语言,C语言相对于汇编语言更容易理解,门槛低,容易学习。
所以我选择用C语言来编写BF-1的程序。
KeilC51软件是目前功能最强大的单片机C语言集成开发环境(图4.2)。
图4.2KeilC51界面
4.3程序框图
因为机器要完成将饭菜送达指定的餐桌,所以在机器人运行之后首先要有先有键盘输入相应的桌号,当BF-1接到接到命令后就会根据指定将饭菜送到指定位置,在送饭的过程中,机器人要做到沿指定路线行进(即循迹),还要通过计算判断是否到达指定餐桌。
当到了餐桌后,如果客人将饭菜端下之后,机器人还要在返回厨房,等待下一次命令。
(详细程序见第五章_附件_5.5_程序框图。
4.4调试过程
在机器人的机械调试过程中,本来我是打算将BF-1的底盘制作成思路驱动的,因为在我们的印象中四个轮子的车子比较常见,当然四个个轮子的稳定性也要好些。
但是在实际的制作中我发现四轮驱动的底盘并不好控制,尤其是在转弯时,四轮底盘的会显得很迟钝。
后来我改用两个驱动轮加一个万向轮作为小车的底盘,(详细视图见第五章_附件_5.3.1_移动平台),靠后面两个轮子的速度差转向。
在这样的情况下,移动平台的灵活性增强很多,可以实现原地任意角度转向。
机器人的电路调试中过程中并没有遇到太多问题,因为我事先搜集过大量有关电路,做了一定分析和筛选之后绘制了BF-1的原理图,并且在焊接板子之前做好了PCB图,重要部分也做过Porteus仿真。
所以在整个过程中仅仅是遇到了两个问题。
第一个问题是我先前在每一个模块的电路的电源处都接了一个整流二极管来防止电源反接对电路造成危害,但是后来发现控制模块和循迹模块的电压都偏低。
经过检查才发现,原来经过7805稳压后的电压已经是5V了,在经过二极管时会有0.7V的压降。
为此我将各模块的整流二极管除去,将防止反接电路提至稳压管之前,这样就既保证了各模块电路不会受到电源反接的危害,又保证了整个系统电压的稳定。
第二个问题就是滤波电容位置,我先前实在控制板的电源排阵附近安装了104电容,但事实上系统在运行中偶尔还会因为高频干扰出错。
查了相关资料后,我将104电容接在MCU的VCC管脚附近,有效的解决了这一问题。
由于刚接触嵌入式不久,所在程序调试中遇到不少问题。
就键盘检测而言,进入检测的双重循环以后开始设置桌号,但是却不知道如何再跳出这双重循环进行下一步操作。
在和学长的共同讨论后,我们决定采用一个For循环定义变量a,在内部循环中一旦a被赋值就用Braek语句跳出,在外部循环中a值改变打破For循环条件,故自然跳出外围循环。
还有就是在桌号检测的程序中,为了能使机器人准确地判断桌号,我用了检测后延时再检测来防止误检,但是延时的时间长度就是一个难题了,短了会重复检测同一桌号,长了会丢掉桌号。
经过反复地调试,最终确定下来的延时时间能使桌号检测的准确率达到80%,这是因为机器人在行进的过程中速度并不是恒定。
后来我将程序改为检测后延时检测,确定检测到桌子之后再延时走过这个桌号,这样的程序就相对稳定很多,基本不会出现桌号判断失误的可能。
(详细程序见第五章_附件_5.6_BF-1程序。
)
第五章附件
5.1BF-1机器人实图
5.2BF-1机器人餐厅
5.3BF-1机器人部分硬件图
5.3.1移动平台
5.3.2电机驱动模块
5.4BF-1机器人电路原理图
5.4.1控制模块
5.4.2循迹模块
5.4.3驱动模块
5.5BF-1机器人程序框图
5.6BF-1程序
/******BF-1机器人程序******/
/******河南工业大学***电气学院***周伟伟******/
/******头文件******/
#include<
reg51.h>
//BF-1的单片机是STC89C51
/******宏定义******/
#defineuintunsignedint//宏定义
#defineucharunsignedchar//宏定义
#defineshumaguanP0//数码管
/******硬件连接定义******/
sbitbuzz=P2^0;
//蜂鸣器
sbitma0=P2^2;
//电机A控制口
sbitma1=P2^3;
//电机A控制1
sbitma2=P2^4;
//电机A控制2
sbitmb0=P2^5;
//电机B控制口
sbitmb1=P2^6;
//电机B控制1
sbitmb2=P2^7;
//电机B控制2
sbitkey1=P1^0;
//设置按键
sbitkey2=P1^1;
//+按键
sbitkey3=P1^2;
//-按键
sbitkey4=P1^3;
//确定按键
sbitzhongli=P1^7;
//重力传感器
sbithw1=P3^0;
//红外传感1
sbithw2=P3^1;
//红外传感2
sbithw3=P3^2;
//红外传感3
sbithw4=P3^3;
//红外传感4
sbitshire=P3^7;
//人体释热传感器
/******全局变量******/
ucharcircs,n,t,num,s;
/******电机A控制函数******/
voidgo_ma()//电机A前进
{
ma0=1;
ma1=1;
ma2=0;
}
voidback_ma()//电机A后退
voidstop_ma()//电机A停止