2008-2009-1科技创新3——计算机控制小车走迷宫M12设计报告

1.概述

2.项目整体情况

2.1项目介绍

2.2完成情况

2.3自我评价

3.项目具体说明

3.1整体结构

3.2项目组成

3.3硬件部分

3.3.1硬件材料

3.3.2硬件介绍

3.3.3硬件调试

3.4软件部分

3.4.1主要流程

3.4.2上位机程序

3.4.3下位机程序

3.5系统测试情况

3.6系统的不足及改进

4.感受及收获

4.1张弓

4.2刘悟冲

4.3吕品

4.4凌太宇

5.致谢

6.参考文献

7.附录

姓名

班级

学号

分工情况

联系方式

备注

 

张弓

F0703034

5070309867

总体组织和设计,芯片程序,硬件调试,串口调试。

zgzyzg@sina.com

组长,下图一左

刘悟冲

F0703034

5070309856

硬件调试,串口调试,撰写报告。

saintwc@sjtu.edu.cn

下图二

吕品

F0703033

5070309834

图像处理,迷宫算法,路径算法。

lvpin_lvpin@163.com

下图三

凌太宇

F0703034

5070309855

材料收集,迷宫制作,硬件调试。

teen1989@sjtu.edu.cn

下图一右

     图一 张弓(左)和凌太宇在调试小车                  图二  刘悟冲在查看串口程序

              图三 吕品在编写程序                          图四   作品静态图

1. 概述

本文档为M12小组于20082009学年第一学期参加电院科技创新[3]课程(计算机控制小车走迷宫)的实验报告。电院科技创新[3]既是一门极具挑战性的课程,也使一项急需团队合作的较大型实验。本小组在研究和调试的过程中积累了一些经验教训,并以此为基础写下这篇实验报告。报告归纳总结了我们组的大致思路以及实施过程,并附有组员的心得体会。本文档可供参与本课程的同学参考。

2. 项目整体情况

2.1 项目介绍

本项目采用ATMEL公司的AT89S52芯片为核心设计,实现小车在计算机控制下走出迷宫的功能。有一台小车和一个pc端,利用计算机处理采集到的图片判断小车及迷宫的相对位置,迷宫信息,在计算机端计算并选择路线,通过无线指令控制小车动作,使之在最短的时间内离开令控制小车动作,使之在最短的时间内离开迷宫。

2.2 完成情况
 

1)图像处理、最短路径生成、控制算法及串口通信基本完成;

2)能实时采集小车位置及方向;

3)能通过所获得的小车位置信息生成合适的走法,并顺利走出迷宫。

2.3 自我评价

我们组采纳了大三学长的建议,使用Matlab完全控制小车(上位机程序),并最终成功使小车走出迷宫,基本达到本次科创课程的要求。我们的亮点在于利用matlab强大的数字图像处理能力,对于迷宫和迷宫图片的要求不是很大,预处理能够滤掉很大一部分噪声。

以下为个人自我评价:

1)张弓:较好地完成了组长的职责,使组员明确各自任务,能够制定出合理的时间表,按计划有步骤地完成了自己的任务,是一名合格的组长。

2)刘悟冲:较好地完成了组长分配的任务,是一名合格的组员。

3)吕品:较好地完成了组长分配的任务,是一名合格的组员。

4)凌太宇:较好地完成了组长分配的任务,是一名合格的组员。

 

3. 项目具体说明

3.1 整体结构


 

http://eelab.sjtu.edu.cn/kc/2008/M12/xmsm.jpg

1)由摄像头(建议使用USB接口)捕捉迷宫的信息以及迷宫内内小车的位置情况,通过串口线传送至电脑里编写的上位机软件,软件通过图像识别找出当前小车的位置信息及迷宫的信息,经过计算,作出控制决策,生成控制信号,并经通讯模块发送至小车。

2)小车上的控制电路对控制信号作出相应反应,驱动电机。

 

3.2 项目组成

3.2.1 图像处理

摄像头监小车位置,通过图像处理的手段发布指令。其中的具体项目包括图像实时采集,图像处理——预处理,形状检测,小车跟踪,摄像机标定及最优线路生成。

3.2.2 串行通信

计算机与小车之间的通信为串行通信(有线),实现PC与单片机的通信。由摄像头(USB接口)实时捕捉迷宫内小车的位置情况,通过USB线缆传送至电脑里编写的上位机软件,软件通过图像识别找出当前小车的位置信息及迷宫的信息,经过计算,作出控制决策,生成控制信号,并经通讯模块发送至小车。

3.2.3 单片机部分

具体包括闭环控制算法,小车电机控制。

 

3.3 硬件部分

3.3.1 硬件材料

89S52单片机控制的小车、RS232有线收发模块、USBRS232串口线、计算机、摄像头

3.3.2 硬件介绍

小车分为三个部分,主板部份、车体部份和控制芯片部份。

主板部分负责接受8V直流电源,并向小车的电机提供8V电压,向电路板上的芯片提供工作电压。

车体部份主要为上层芯片和整体提供支撑,它的电机为小车提供动力前进。

控制芯片部份负责识别并处理收到的信号,并输出控制信号,控制小车电机的运转。

信号收发模块

信号收发模块分为收发两部分,即发送部分与串口连接,接受串行通讯标准的TTL高低电平,将其调制后发送出去。

接受部份将发出的信号转化成标准串行通讯信号发送给小车。接收模块的Vcc89S52上层版的Vcc连接,GND接电路板的任一接地端。

信号输出端与89S52上层版的RxD连接,由于主板三极管通常是坏的,可将上层板RxD与底板分开。

USBRS232线

此串口线将增加电脑一个COM口,根据电脑的不同,初始被赋予的COM口地址也不同,但一般为COM4,可以在设备管理器中对端口地址进行修改。

对于电脑与小车进行串行通信来说该线是透明的。其USB端接电脑,TxD接无线发送模块的数据端,Vcc与发送模块Vcc相连,GND与发送模块GND连接。

电脑及摄像头

电脑有两个以上USB口,摄像头使用普通USB摄像头。

本次实验主要用到两块控制芯片,一块是CMOS8位微控制器

AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。AT89S52使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,AT89S52拥有灵巧的8 CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

AT89S52具有以下标准功能:

8k字节Flash256字节RAM32 I/O 口线,看门狗定时器,2 个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

PDIP图如下

另一块芯片是L298N,用它来控制两个电机。    管脚图如下:

 

 

3.3.3 硬件调试

小车的调试我们花了较多的功夫,也是我们较为头疼的地方。

刚领来时,由于硬件方面的问题,小车接上电源时马达根本不工作,输出电流也不对。一个元件一个元件检验过去,最终确定是小车自身问题,换了辆车之后,顺利通过了selftest

接下来的问题在于如何使小车按指令行走。调试过程中,我们发现虽然计算机显示小车正在接收指令而且也有反馈,但车轮就是不转。检查了一个下午后,我们终于发现是小车底部红黑白三根导线的焊接有问题。调整后,小车终于按照指令行动了。

为了使小车的行走控制部分能够与小车图像处理系统更好地匹配,以便最终能够顺利让小车跑完全程,需要对小车控制部分的行走方式做一番调整。考虑到小车在走迷宫时遇到的主要问题是在迷宫的转弯处卡住,从而造成小车无法完成转向动作,我们给小车分别设定了两种不同的前进、倒退幅度,即在长直道里让小车以全速大幅度前进倒退;在小车接近转弯处让小车以半速前进倒退;转弯时全力转弯并利用墙壁保证转向正确。这样能够使小车在弯道里进行方位微调,大大降低了小车在弯道卡住的可能性。

在实际行走时,我们发现小车摩擦力不够,致使转弯困难,原因在于小车的前进动力不足以及车轮与地面的摩擦系数不够。因此我们采用了其他某组的策略,在轮子上捆绑皮筋,以使小车顺利转向,效果很好。

在调试过程中我们还遇到了许多各种各样的问题,在我们的耐心努力下最终都一一得到了解决。

 

3.4 软件部分

工具Matlab

3.4.1 主要流程

1.通过摄像头获取初始迷宫图片;

2.算出迷宫路径

  (1)迷宫图片处理(包括二值化,尺寸缩小,腐蚀,滤除噪声等);

  (2)手工确定路径起始点;

  (3)寻找最短路径;

3. 选取控制点

  1)用堆栈找出全部路径点序列,隔一定步长选出控制点;

  2)在每个控制点根据前后点关系确定控制指令值;返回特征点坐标和相应指令值;

4.隔一定时间按指令值顺序给小车发命令;

5.小车最终到达出口。

3.4.2 上位机程序

放置好摄像头,连接好各硬件接口,在command窗口中运行kc3(),在弹出的迷宫图(预处理后)中选择合适的起始点即可。

1调试摄像头位置可以运行以下代码:

imaqhwinfo;

vid=videoinput('winvideo');    %根据摄像头实际名字

preview(vid);

start(vid);

f=getdata(vid,1);

这里我们就已经获得了照片,等待进一步处理,分析及命令。

读入图片后运行程序,这时先得到二值化图像,如截图1

                                              截图1   二值化图像

调试中,对于上个二值化图像,手工确定初末坐标,分析处理后生成路径,如截图2

                                                截图2    生成路径图像

                            截图3   二值化图像与生成路径对比

2)调试串口可运行:

scom=serial('com6','BaudRate',1200,'parity','none','DataBits',8,'StopBits',1);

fopen(scom);

这里确信串口的存在并与之链接,调试串口可运行,已建立计算机与小车的通信,等待向小车发命令。

3)直接执行kc3(f,scom),即可运行。

这里对获得的迷宫图像进行了二值化,腐蚀等处理。随即手工确定初末位置,然后分析计算迷宫路径,隔一定步长选出控制点,在每个控制点根据前后点关系确定控制指令值,并向小车发出相应指令,使之走迷宫。

以下为可能需要改动的参数:

A 摄像头名称;

B 迷宫路径和墙壁的颜色特征阈值;

C 根据路径和墙壁的宽度比,以及迷宫的破损状况确定墙壁膨胀系数;

D 特征指令点步长。

CD都是在实验中通过不断调试,试出来的)

3.4.3 下位机程序

芯片中程序思路简单,小车通过USB转串口线从计算机接受信号,处理后通过控制两个电机的速度和方向做出相应的反应。

程序中,包含控制小车前、后、左、右、半速向前及半速向后的指令(分别A,B,E,F,C,D)。通过switch函数,对应设定好这些命令,再根据前、后、左、右、半速向前及半速向后的需要,设定好左右轮的速度,即可达到按照自己的要求让小车行进的目的。在调试过程中,利用UartAssist调试软件,向小车发出以上指令,就可以看到相应小车的行进。然后在matlab中,调试串口可运行后,直接输入这些命令,也可控制车的行进。从而,保证了通信及硬件的可运行性。

 

3.5 系统测试情况

对小车的测试主要包括两个方面。一是图像处理结果与小车之间的串口通信;二是对于小车控制的调试。

3.5.1 图像处理结果与小车的串口通信

测试结果良好,在测试过程中基本没有遇到什么困难。在串口通讯完成以后,小车能够按照图像处理的结果进行左右拐弯、前进、停止等基本行动。

3.5.2 小车控制

小车参数的设置是个复杂的问题,可能需要改动的参数包括摄像头名称、迷宫路径和墙壁的颜色特征阈值;根据路径和墙壁的宽度比,以及迷宫的破损状况确定墙壁膨胀系数;特征指令点步长。步长的设定是十分麻烦的事情,需要不断的实验,一次一次的改变,才能恰合当前的图像比例。另外,我们发现8V电源使小车转速偏快,我们将其调为5.5V,效果很好,刚好小车以适宜速度行进。

 

3.6 系统的不足及改进

我们的不足在于实时控制的实现不够成熟,导致走的越远偏差可能越大。

可以不断摄取图像,实现时时控制小车。大致思路如下:不断摄取迷宫照片,并处理。不断重复下列控制循环:实时读出小车位置,换算到原始路径途中,当小车的位置足够接近下一个控制点时,提取该点指令,发给小车。

 

4. 感受及收获

4.1 张弓

    科技创新终于落下了帷幕,我也长长地叹了一口气。回首科创所经历的点滴,有太多的感慨要抒发,有太多的快乐要分享,有太多的挫折要倾诉。

    很难说科技创新是一门课还是一项需要通力合作的团队实验。说它是门课,不仅因为张士文老师给我们提供了大体方向上的讲解,更因为每当我们困难时,老师和助教们都会通过发帖和及时的回帖来鼓励我们和解答我们的疑惑;说它是项团队实验,毋庸置疑,没有我们全体组员以及周围同学的热心帮助,科创的成功就无从说起。

    当我上完张老师第一堂讲解课时,我懵了,这都什么跟什么啊,一堆闻所未闻的东西。更为恐怖的是,当我们四个组好队时,他们竟一致推举我为组长。说实话,当初我一点底也没有,就咱这实力,能让小车动起来我们就能笑得一蹦三尺高了。事情往往都是这样,当你不计后果的投入时,收获在慢慢积累,成功也离你不远了。

    身为组长,我可能更深切体会到协作的重要性。组长必须制定出清晰的时间表,必须使每位组员明确好各自的任务,必须以身作则,在团队最困难而濒临放弃的情况下积极想办法,鼓励大家。

    从个人角度出发,首先参与了图像处理以及迷宫算法的设计,我们组采用Matlab进行程序的编写,这也使我对Matlab的掌握经历了从无到有的过程,相信对以后的专业学习也有较大的帮助;其次,参与了全部的硬件调试过程,一开始我们的小车输出电流总是不对劲,为此我没少费功夫,将同学的好车拆了又拆,用万用电表一个元件一个元件测试过去,比较发现哪儿除了问题,当小车通过selftest那一刹那,心中的喜悦无以言表。在编写路径算法时,我们遇到了瓶颈,多亏了上届学长徐松同学的热心帮助和指导,成功解决了小车的步长问题,并在最后的验收过程中提出了作为一个过来人的建议,使我们顺利通过。

    最后,非常感谢老师助教们的热心帮助,感谢同组弟兄们的精诚合作,感谢周围同学们的建议和启发,也感谢徐松学长对我们的指导,在此一并表示感谢。

4.2 刘悟冲

    说实话,写这篇感想时,我有点汗颜,感觉我是我们组里出力最少的一个,所负责的板块也较为轻松,只是硬件调试和串口调试部分,比起张弓作为组长的付出,吕品为程序的“呕心沥血”,凌太宇的时时牵挂,我的工作就显得有点微不足道了。即便如此,一个如此“庞大”的工程也让我有太多的感慨。

    先说说硬件调试吧。我们组一开始领的小车一度让我们崩溃,看着别人的车接上电源跑得正欢,我们的车愣是像生锈了一样,连丁点马达的响声都听不到,输出的电流更是高的惊人。为此我们整晚泡在实验室,拆开同学的好车,一个个元件测过去。最后当我们确认是小车自身的问题时,每个人都彻底无语。最后我们更换了小车,也顺利通过了selftest。虽然我们的努力看似无用,却培养了我们严谨的实验态度,更让我们明白了实验中切忌“眼高手低”。

    再说说串口调试吧。通过selftest之后,我们的小车由于“不明”原因在接收计算机发出的串口指令后毫无作为。并在调试时我们惊奇地发现,当用螺丝刀将某两个芯片管脚连起来时,车轮就能转动,而用螺丝刀接触另外两个管脚时,车轮便能停止,这个有趣的发现也使我们乐此不疲了一个下午。最后在又一次“残忍”地解剖了同学的好车后,发现原来是小车底部红黑白三根导线的接线错误,调整之后“奇迹”终于出现,小车居然听话了。这里插入一段花絮。当我们调试好串口指令后,兴冲冲跑去吃饭了。饭后,我们又兴致勃勃地想再一次欣赏小车的“神奇”表演,却惊愕地发现小车居然歇菜了。在对小车进行全方位的检查后,我们没有发现一丝错误,这时坐我们对面实验台的同学诡秘地向我们笑了笑,告诉我们他借用了一下我们小车的芯片……

    令我感到遗憾的是,在最后验收的要紧关头,我因为通选课的考试而没能欣赏到我们小车的华丽演出,但当张弓告诉我验收通过时,我积压了一个学期的情绪,有紧张,有迷茫,有无奈,有激动,有兴奋,一下子喷薄而出。

    最后,感谢老师助教们的指导,感谢全体组员的无私奉献,感谢同学们特别是屡次为我们奉献好车的蒋文超同学的帮助,最后特别感谢徐松学长对我们关键技术的指导,谢谢你们!

4.3 吕品

    此次科技创新课程中,我被“不幸”地分配到主攻算法部分。虽说大一学了一年的程序设计,面对如此的“庞然大物”我难免感到心虚。摸着石子过河,在大三学长的帮助下,我最终较为圆满地完成了任务。

    在编写算法过程中,体会如下:

   (1)不要被未知事物所吓倒。得到学长的建议,我们组决定采用Matlab进行编程。之前我对Matlab的了解仅限于在大一上学期上线性代数课时教材有所涉猎过,基本上是块盲点。不会不要紧,学呗!而就在学习过程中,我对Matlab的兴趣越来越大,现在已经能够较为熟练地操作。

   (2)要善于请教别人。程序这东西,有时候一个人闭门造车思维容易僵化,有时便会陷入死结。这时,不妨看看他人对这类问题的想法,往往有较大的启发作用。比如,在这次的路径算法编写中,得到了上届学长徐松同学的指导,成功解决了小车的步长问题。

   (3)注重团队。正如第二点所说的,复杂算法的实现不是靠一个人就能解决的。在编写时,我们组齐心协力,共同讨论,很好地完成任务。

    挑战越大,收获越大。不畏困难,勇于拼搏,善于请教,注重团队,我想这些东西能在我以后的学习和工作中给予莫大的帮助。

4.4 凌太宇

    也许很多人的心情跟我一样,从一开始后悔选这门课,到最终爱上它,因为科创教给我们的东西太多太多。

    首先,科创不同于其他的课程,它同时强调动脑和动手。动脑包括张弓的芯片程序和吕品的算法编写,动手包括刘悟冲的串口调试以及我的迷宫制作等。我想,这种完美的结合是在纯粹的课堂上学不到的。

    其次,做事要有毅力,不能被暂时的挫折所击败。在算法编写毫无头绪时,在小车迟迟不动时,在小车的步长难以调整时,我们都想到了放弃,但是一股信念支撑着我们走到最后,这股信念就是:不管做成怎样,我们都一定要将它做下去,尝试过了,即使失败也问心无愧。

最后我想说的想必我的队友以及其他所有做科创的同学都深有感触,那就是团队的作用。没有团队的精密配合,科创将会变成Mission Impossible

至今我仍然记得1229号的下午,当我们的小车最终通过验收并拍下视频时,我激动地难以自已,这是发自内心的喜悦,一种“历经苦寒始到春”的庆幸和自豪。

科创三,你将永远铭记于我心中!

5. 致谢

感谢上海交通大学电子信息与电气工程学院提供实验室和实验工具!

感谢电院科技创新[3]张士文老师和各位助教给予的指导和鼓励!

感谢给本组提供帮助和建议的所有同学!

特殊说明:我们在上届学长徐松的帮助下,参考他们的设计,并在他的指导下完成了本次科创,特此深表感谢!

 

6. 参考文献

[1] 科技创新[3]网站:http://eelab.sjtu.edu.cn/Course/course/view.php?id=8

[2] 2008年科技创新[3]M15组的网页报告,毛达晟、徐松等。我们从中学习了如何使用Matlab实现串口通信以及步长调整等。

[3] 2008年科技创新[3]M06组的设计报告.doc唐健刚王羲中等。

[4] 百度搜索:www.baidu.com

[5] 谷歌搜索:www.google.cn

 

7. 附录

完整版的设计报告

系统使用说明

小车走迷宫视频

上位机程序

下位机程序

系统电路图