




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机控制小车走迷宫项目介绍本项目采用ATMEL公司的AT89S52芯片为核心设计,实现小车在计算机控制下走出迷宫的功能。实验设备包括实验用小车一台和惠普笔记本电脑一台,外带摄像头,利用摄像头采集迷宫和小车图像,在计算机端计算出路线,实时判断小车位置并通过串口发送指令控制小车动作,使之在最短的时间内离开迷宫 历史进度 分组确定,KC3-M25成立 上交1-9周进度报告 上交中期检查PPT,并领取小车 中期已完成项目: A.迷宫制作 B.图像处理 C.路径生成 领取小车,开始进实验室进行调试。 我组本学期科创3完成检测。详见 视频 (点击播放) 上交8-14周进度报告完成情况&自我评价小
2、组成员与分工 组长:陈云路班级:F0703013学号:50703094专业:计算机科学与技术主要工作:OpenCV迷宫图像及小车位置采取;迷宫路径算法生成;单片机编程;计算机控制小车按指定路线行走; ppt内容编写;网页内容编写;小车综合调试;小车模型制作 组员:李德元班级:F0703013学号:50703094专业:自动化主要工作:OpenCV迷宫图像及小车位置采取计算机控制小车按指定路线行走单片机编程网页内容编写小车综合调试小车模型制作组员:张欣刚 班级:F0703013学号:50703094专业:计算机科学与技术主要工作:OpenCV迷宫图像及小车位置采取p
3、pt美化制作网站框架美化制作网页内容编写小车综合调试小车模型制作硬件介绍硬件材料 89S52单片机控制的小车、RS232有线收发模块、USB转RS232串口线、计算机、摄像头硬件介绍 (a)小车 小车分为三个部分,主板部份、车体部份和控制芯片部份。 主板部分负责接受8V直流电源,并向小车的
4、电机提供电压,向电路板上的芯片提供工作电压。 车体部份主要为上层芯片和整体提供支撑,它的电机为小车提供动力前进。 控制芯片部份负责识别并处理收到的信号,并输出控制信号,控制小车电机的运转 (b)信号收发模块 信号收发模块分为收发两部分,即发送部分与串口连接,接受串行通讯标准的TTL高低电平,将其调制后发送出去。
5、 接受部份将发出的信号转化成标准串行通讯信号发送给小车。小车收到信号后返回一个值发送到PC端。 (c)USB转RS232线 此串口线将增加电脑一个COM口,根据电脑的不同,初始被赋予的COM口地址也不同,可以在设备管理器中对端口地址进行修改。 对于电脑与小车进行串行通信来说该线是透明的。其USB端接电脑,TxD
6、接无线发送模块的数据端,Vcc与发送模块Vcc相连,GND与发送模块GND连接。 (d)电脑及摄像头 使用电脑为DELL STUDIO XPS 16,电脑自带摄像头。 (e)控制芯片 本次实验主要用到两块控制芯片,一块是CMOS8位微控制器,其主要功能是: (1)兼容MCS-51指令系统 (2)8k可反复擦写(>1000
7、次)ISP FLASH ROM (3)1000次擦写周期 (4) 32个双向I/O口 (5)工作电压 (6) 3个16位可编程定时/计数器 (7)时钟频率0-33MHz (8)全双工UART串行中断口 (9) 128x8bit内部RAM (10) 低功耗空闲和省电模式 (11) 中断唤醒省电模式 (12)3级加密位 (13)看门狗(WDT)电路 (14)软件设置空闲和省电功能 (15)灵活的ISP字节和分页编程 (16)双数据寄存器指针
8、0; AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。 AT89S52使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,AT89S52拥有灵巧的8 位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:
9、; 8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。 其PDIP图如下: 硬件原理图如下: 另一块芯片是L298N,用它来控制两个电机,和它的管脚图。硬件原
10、理图如下:硬件调试开始做科创三的时候,以为任务仅仅是写代码,不会涉及硬件的问题,但这样想就大大错了。硬件恰恰又是课程中比较麻烦,需要不断调整的环节。花了很久从一堆小车的尸体中翻到一个还算完整的,拿回去仔仔细细对照了一遍电路图,发现除了无线部分和USB连线以及电源连线之外其他元件没有缺失。因为我们是用USB线控制的,所以不再考虑无线部分,将残缺的部分都焊接好后,载入调试程序,发现右驱动轮总是有异常情况发生,常常在给出信号后不转动,检查电路后发现是电机驱动芯片与电路板接触不良,将其重新焊好后,问题得到解决。在检查电路板时发现焊接的焊点不好,有些地方很容易短路,尤其是51的焊接处,而且我们的加长US
11、B线等地也容易出现短路。为此,我们将不好的焊点重新焊过,将易短路的导线用透明胶包裹。经过以上的修整后,小车基本上每次都可以正常运行了。还有就是接线问题,由于我们领到的小车上USB线非常的短,所以我们决定将USB线一剪为二,当中自己拿了两条导线把两头接了起来,而另外两条5V线被我们屏蔽了。这样变引起了我们多次小车不能接受命令的问题,因为两头的USB线虽然外表看起来是用透明胶粘了起来,但事实上里面的电线未有连接起来。所以我们的USB线拆了又焊,好几次。所以我们最后也就死死地把两头导线给焊上了。还有值得一提的是,就是小车的电源线很短,我们用了很多导线拼拼凑凑了起来才勉强能够将电源传输过去。在此,我也
12、很想谢谢,实验室的两位助教给与我们的支持,又是帮我们找导线,又是帮我们找电源。实在是太感谢助教了,谢谢。轮子问题其实我们已经提了不要再提了,轮子打滑是个非常严重,非常实际,也是非常难处理和克服的不是问题的问题。总的来说,我们不光在前轮粘上了一圈透明胶减小摩擦力,还在后轮上贴了双面胶,加大摩擦力。可能还达不到最满意的效果,但是在我们的试验下,小车还是能够尽量不打滑地“动起来”。软件介绍1.迷宫图像采取调用cvCaptureFromCAM(0)函数打开摄像头,然后调用cvSetCaptureProperty函数修改摄像头相关参数,如帧数之类。然后进行窗口初始化,定义窗口名称和大小,并使窗口显示摄像
13、头采集的实时图像。等待鼠标事件,采点4个,并做了防抖处理,即:过于相邻的点忽略。想让采得的4点变换成预设图的顶点,须由cvWarpPerspectiveQMatrix函数获取变换矩阵,再将变换矩阵代入cvWarpPerspective函数的参数,得到迷宫俯视图。新建窗口,初始化,并在其中显示迷宫俯视图。接着鼠标事件采两点分别是起点和终点,然后是迷宫二值化操作。先用cvSmooth函数平滑处理图像,运用cvCvtColor和cvThreshold函数即可实现二值化。最后将黑白迷宫图显示出来,并且还生成一张比例缩小后的黑白迷宫图,便于后面数据处理。2.迷宫路径生成 获得二值化数组,即用01表示出整
14、幅迷宫的情况。由于只是比列的缩小采取得到的迷宫,非常不完整,有时候还不得不考虑到灯光的因素。所以我们采取了一种算法来修迷宫。然后通过已经大致修好的迷宫生成路径存到数组path中最后按照正确的路径(数组Right),计算得出关键点(数组KeyPoint),即需要打弯的点.3.小车图像采取新开窗口,初始化,并实时采集小车和迷宫图像,通过鼠标事件圈出小车,通过直方图计算得小车颜色参数,来识别小车,并运用cvCamShift函数实现小车的实时跟踪,由cvEllipseBox作椭圆形来直观的锁定小车目标。4.控制小车按指定路线行走利用状态转移树的思想,每取一次小车的位置,便更新当前的状态,按照状态的比对
15、向单片机发出指令。程序如下:if (KeyPoint_i = G) break; if(Car_x = 0 && Car_y = 0) aaa = "5" send(aaa); else cout << "DeGe GG-State: " << State << " DesDirction:" << DestDirction << " Dirction:" << Dirction << " KeyPoint
16、:" << KeyPoint_i<< endl; switch (State) case 0: if( (Dirction = 0 && abs(Car_x - KeyPointKeyPoint_i+10) <= 6 && Car_y - KeyPointKeyPoint_i+11 <= -1 ) | (Dirction = 2 && abs(Car_x - KeyPointKeyPoint_i+10) <= 6 && Car_y - KeyPointKeyPoint_i+11
17、>= 1 ) | (Dirction = 1 && Car_x - KeyPointKeyPoint_i+10 >= 0 && abs(Car_y - KeyPointKeyPoint_i+11) <= 6 ) | (Dirction = 3 && Car_x - KeyPointKeyPoint_i+10 <= 0 && abs(Car_y - KeyPointKeyPoint_i+11) <= 6 ) ) aaa = "5" send(aaa); if(KeyPoint_i=G
18、-1) exit(0); if(KeyPointKeyPoint_i+10-KeyPointKeyPoint_i+20 = 0 && KeyPointKeyPoint_i+11-KeyPointKeyPoint_i+21 > 0)DestDirction = 0; if(KeyPointKeyPoint_i+10-KeyPointKeyPoint_i+20 = 0 && KeyPointKeyPoint_i+11-KeyPointKeyPoint_i+21 < 0) DestDirction = 2; if(KeyPointKeyPoint_i+10
19、-KeyPointKeyPoint_i+20 > 0 && KeyPointKeyPoint_i+11-KeyPointKeyPoint_i+21 = 0)DestDirction = 3; if(KeyPointKeyPoint_i+10-KeyPointKeyPoint_i+20 < 0 && KeyPointKeyPoint_i+11-KeyPointKeyPoint_i+21 = 0) DestDirction = 1; if(DestDirction = Dirction) aaa = "3" send(aaa); co
20、ut << "!STATE: " << State << " " << "Send: 3n" else State = 1; else aaa = "3" send(aaa); cout << "!STATE: " << State << " " << "Send: 3n" break; case 1: dataT = "6" switch
21、(Dirction) case 0: if (DestDirction = 1) dataT = "2" Dirction = 1; if (DestDirction = 2) dataT = "2" Dirction = 1; if (DestDirction = 3) dataT = "4" Dirction = 3; break; case 1: if (DestDirction = 2) dataT = "2" Dirction = 2; if (DestDirction = 3) dataT = &quo
22、t;2" Dirction = 2; if (DestDirction = 0) dataT = "4" Dirction = 0; break; case 2: if (DestDirction = 3) dataT = "2" Dirction = 3; if (DestDirction = 0) dataT = "2" Dirction = 3; if (DestDirction = 1) dataT = "4" Dirction = 1; break; case 3: if (DestDircti
23、on = 0) dataT = "2" Dirction = 0; if (DestDirction = 1) dataT = "2" Dirction = 0; if (DestDirction = 2) dataT = "4" Dirction = 2; break; default: break; if (dataT0) != '6') angle_start = abs(track_box.angle); aaa = dataT; send(aaa); cout << "!STATE: &
24、quot; << State << " " << "Send: " << *dataT << "n" State = 2; else State = 0; break; case 2: if (abs(angle_start)>=55 && abs(track_box.angle)<=6) | (abs(angle_start)<=35 && abs(track_box.angle)>=77) aaa = "5
25、" send(aaa); cout << "!STATE: " << State << " " << "Send: 5n" if (Dirction = DestDirction) State = 0; KeyPoint_i+; else State = 1; else send(aaa); cout << "!STATE: " << State << " " << "Send:
26、" << *aaa << "n" break; default: break; 系统使用说明书一. 系统要求 系统内需要VC的运行库,OpenCV库。并且还需要一个摄像头。 硬件上小车有线收发与机械控制应完好。二 .准备工作 小车接8V电源。USB摄像头与串口通讯线也应接好。摄像头在迷宫上方,俯角60度左右,能拍摄到整个迷宫。三 .使用过程1. 启动程序,在出来的动态图像中用鼠标将迷宫的四个角点出,顺序必须是逆时
27、针或者顺时针。完成后回车。2. 在新出来的窗口中先点出小车起点位置,在点出终点位置。完成后回车。(此时迷宫上不能有其他物品)3.检查新弹出的窗口,迷宫二值化是否有问题,没有则回车4.弹出新窗口后,将小车放置在之前确定的起点处,然后用鼠标拖出一个矩形区域将小车框中。5.小车将自动走出迷宫后停止。系统的不足及改进不足:小车在迷宫上易打滑,导致难以控制,并偏离方向。改进:车轮上黏上双面胶,增加小车与迷宫的摩擦;降低小车的移动速度;在程序中把判断是否到达的关键节点的范围以及转弯达到后的角度范围调整的大些。不足:二值化的迷宫边缘不齐,有些迷宫的墙二值化出来会有断点,影响路径生成。改进:加上迷宫修正程序,
28、将迷宫二值化中的小断点补上,详细方法请参见程序部分。不足:测试小车时发现运行不理想,不能按照预定方式运动。改进:参照小车电路图,检查小车元件,并将可能有问题的元件重新焊接后,问题解决。心得体会科创3实验中,我很荣幸成为了M25的组长,这无论是从人际交流方面还是技术方面,都是对于我个人能力的锻炼和考验。在科创3实验的过程中,网上,图书馆,活动室,实验室和办公室都没少跑,虽然说劳累的奔波给了我们一种痛苦的感觉,但是我们知道了很多以前不知道的东西,学会了如何去调试、如何去网上搜索相关的知识。科创为我们带来的不仅仅是知识上的升华,更是自主学习能力的一种磨练,一种自我完善和进步的过程。想想刚刚选择科创3
29、实验的时候,我就听同学说:科创三很难啊,没有几个小组能够成功走出迷宫的。心里虽然有些后怕,但是一咬牙,就挺了下来,管他三七二十一,先自己做起来看看。于是,我怀着这样一种挑战自我的心情,开始了科三的征程。很快就找到了我们班的其他两位同学,一起组成了M25。在学期初,我们就抓紧点滴时间,很快就通过各种渠道完成了迷宫图像的采取。正当我们开始庆幸的时候,我们发现,事情一下子开始变了多了起来。从作业考试到志愿者,一件件事情都如潮水般涌来。就这样我们以缓慢的进度拖到了期中检查。虽然说是完成了老师布置得任务,但是其中还是留下了不少的BUG。接下来过了期中检查之后,我们几个一横心,决定不要再拖着了,我们就下定
30、决心猛攻了一个星期。那段时间现在还记得清清楚楚,几乎是没日没夜,废寝忘食的去调试和编写程序。虽然说我翘了几节课,但是终于在我们不断的尝试下,完成了很多预计的目标,这样就只差最后的环节了实际调试。看似简单的调试,却让我们几乎崩溃。很显然,头几天,小车一点都不理会我们发出的信号。直到某一个下午,小车神奇般地自己走了起来,才让我们舒了一口大气。我们乘胜追击,不久小车便能够按照我们给定的路线进行行走,期间的硬件调试就不在详说了,那崩溃的程度已经不能用文字来形容了。摆在我们面前唯一的问题已经很明显了,那就是小车的轮子打滑。在这我也只是想建议一下张老师,小车的轮子可以换的好一点。如此小的摩擦力会使小车很容
31、易就打滑,我们为此问题的研究不知道浪费了多少时间,我们不断地尝试,最后决定用双面胶加大轮子的摩擦力,这样虽然打滑的现象好了很多,但是小车打弯的结果还是不是令人满意的。最最后,通过大家的齐心协力,我们流畅地通过了张老师的检查,小车成功走出了迷宫。这次科创实验大家都做的很苦,可是在大家心中,总是抱着这样一个坚定不移的信念,“在哪儿跌倒不重要,重要的是在那儿爬起来”。过程是一种磨练,结果只是一种形式。无论天气有多差,环境有多恶劣,饿我们都会一如既往勇往直前,结果在我们眼中已经成为了一种必然,我们享受的是过程中的甜酸苦辣陈云路科创三是一个通过团队合作,学生自己完成的创新类课程。选择之前我就听说过很多有
32、关科三是多么多么的难,多么的耗费时间的议论。但同时完成科三小车走迷宫,又是一个很具趣味的挑战。带着这份兴趣以及对编程,控制的热爱,我选择了科三。时间转眼即逝,一个学期,科三也就这么结束了,现在想想,一切都证明这样的经历是美好,有颇多收获的。1000多行的代码,虽然很少,虽然是由三个人完成的,但是这其中蕴含了许多我们通过自学而获得的知识,许多我们的奇思妙想,许多书本上学不到的经验教训。同时,本课程也培养了我们团队合作,通过自己的思考和学习从而解决问题的能力,让我们在体验自主实验过程的同时也体会到了研究的乐趣。这其中的许多努力回忆起来也是那么的美好多少个晚上,我们三个人泡在宿舍的阅览室里,为了实现
33、某个功能熬夜到2,3点;为了试验程序,为了更好的改进系统,我们光通过摄像头拍摄迷宫就不下百次(摄像头要防止在高处,每次我们都要用手举着一动不动)。当然,这其中也充满了许多欢笑每次很顺利的实现某一功能;每一次想到新奇的办法来解决问题;每一次别人来为我们可爱的小车拍照;每一次小车走出了迷宫;每一次我们累了一天的聚餐。这些都是多么美好的点滴,一种开心,而又充实的美好。科三,完成后回头想想其实也没那么的难。因为有历届留下来的宝贵资料可以参考,有各种推荐的参考资料,有opencv网站上全面,详细的例程,有老师助教的热心指导,有其他小组的帮助。这些都为我们完成课程提供了不可或缺的帮助,在此我要感谢所有为我
34、们提供帮助的人,感谢小组里的每一个成员,谢谢!李德元“万恶”的科创3终于结束了!虽然这么说,但是回头来看看,我还是很怀念那段激情燃烧的岁月的。呵呵,毕竟自己付出过,所以容易怀念。其实通过科创3,我还是学到了很多的东西。从一开始接到任务 一头雾水,到后来渐渐的明确分工,知道自己该做什么,直到最后好不容易完成了项目,整个过程让我学会如何去思考,尤其是当面对一个难题时。科创的一个重要方面就是锻炼了我科研的精神,期间我自学了些必要的东西,并现学现用于我们的项目中;有问题时我们小组会一起讨论,虽然也吵过小架,但是我们的目标始终还是一致,所以不久还是能一起并肩作战;我们有钻研精神,每天的任务必须完成,否则
35、就熬夜,我想正是有着这样的思想,我们才能坚持到最后。其实这些精神更应该适用于以后的学习中。另外科创还让我们结下深深友谊。我们小组三人曾经一起熬夜至两三点,一起饿肚子,一起快乐,一起愁苦,我们闹过,吵过,笑过,愁过 正因为科创,我们一起经历了这么多,我们彼此信任,可谓是铁哥们了。我还有很想感谢张老师,他是我遇见过的老师中脾气最好的,很和蔼,很好说话。因为我们晚交过一些报告之类的,感谢你的宽容,还有就是我们最终测试时,头几次都不成功,但是您还是耐心的呆在一边看。后来我们终于搞好了,其实已经过了您的下班时间,感谢您还是帮我们评完再走。另外就是实验室的助教们,他们也给过我们些建议。张欣刚附录1. VC6下编译环境设置A. 从 下载OpenCV安装程序。假如要将Ope
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宁波期中考试真题及答案
- 静物模拟考试题目及答案
- 衡安入学考试题目及答案
- 旱地冰壶考试题库及答案
- 宝葫芦的秘密课件模板
- 航生路中学择校考试卷及答案
- 郑州中考考试题目及答案
- 中江中学教师考试真题及答案
- 声乐专业知识考试题库及答案
- 宝宝舞蹈课件拍摄方案
- 商家智能体产品手册和操作指南
- DB31∕T 1543-2025 快速公交(BRT)支持自动驾驶的车路协同架构与技术要求
- 渣土车制度上墙管理制度
- 调试工上岗证考试题库及答案
- 电力营销考试题库及答案
- 监察法专题培训课件
- 人证网约车考试题目及答案
- 宗教法律法规课件
- 钣金冷冲压激光切割折弯检验作业指导书
- 综合安防管理平台操作手册
- 2025秋部编版(2024)八年级上册历史 【教学课件】第1课《鸦片战争》
评论
0/150
提交评论