您的当前位置:首页正文

智能循迹小车的设计实现

2020-04-26 来源:易榕旅网
智能循迹小车的设计与实现

(北京邮电大学,北京市 100876)

摘要:本实验通过设计焊接电路板然后利用单片机编程并控制基本电路实现一个自动循迹行走的机器人。机器人能够自动按指定路线运行,并且实现灵活前进、转弯、倒退、停车等功能,另外还可以自动记录和显示时间、里程和速度等信息。

关键词:智能车;单片机;C语言编程;集成电路;自动控制 中图分类号: O0213 文献标识码:A

Intelligent tracking car design and implementation

(BUPT,BeiJing 100876,China)

Abstract: In this study, the welding circuit board design and control using microcontroller programming and basic circuit to implement an auto tracking walking robots. Robot can automatically run at a specified route, and flexible forward, turn, reverse, parking and other functions, also can automatically record and display time, distance and speed information.

Keywords: intelligent car; SCM; C programming language; IC; Automatic Control

随着单片机等微型计算机的发展,智能控制技术不仅相应地开拓出了更为广阔的发展空间并且越来越被大量重视利用起来。本实验为智能控制的一个简单基础的应用,让我们提前认识感受一下智能控制的奇妙之处,同时动手DIY自己的程序,控制自己焊接好的小车顺畅的通过预先画好的赛道。

1实习任务与要求

本实验的任务与要求是在给定的12天时间内设计一个自动循迹行走的机器人。机器人能够自动按指定路线行驶,并且实现前进、转弯、倒退、停车等基本功能,还可以现自动记录和显示时间、里程和速度等高级功能。 2设计思路与详细实现过程 2.1设计思路

小车主要分两部分组成,即硬件电路部分和实现所需功能而必备的程序。对于硬件部分,按照所给定的电路原理图和焊接的实物图将所需的元器件仔细焊接到印刷电路板上。焊好之后对电路进行简单的通电调试,确保硬件部分的正常无误;对于软件部分,先对小车输入最简单的测试程序,测试小车能否按照要求前进后退,如果成功则开始编写自动循迹所需的程序。将编译好的程序输入小车,将小车放在赛道上进行尝试。若不能按要求循迹,继续调源程序,直到小车能按要求自动循迹。

2.2详细实现过程

2.2.1小车基本电路的焊接与调试

第一步:将电器元件按照实习教程所罗列的焊接顺序仔细焊接; 第二步:焊好后对照焊接实物图,检查是否出现明显的焊接错误; 第三步:检查无误后将芯片、驱动模块和USB下载模块插好; 第四步:测量VCC与GND之间是否短路;

第五步:在电脑上安装好驱动程序,插上USB线,按下自锁开关观察能否检测到小车; 第六步:下载测试程序,观察指示灯是否亮,小车是否前进后退,若都没有检查电路焊接。 2,2,2程序的编写

第一步:熟悉单片机STC90C52RC的编译环境KeilC51; 第二步:对测试程序进行改造,使小车能够加速或转弯;

第三步:按照赛道的路况对小车进行传感器、驱动电机的控制部分用C语言编程; 第四步:将编译好的程序烧入单片机,拿到赛道上测试小车; 第五步:重复“三”、“四”两步直到小车在赛道上顺畅行驶。

3具体工作

我个人在本次实践中与队友刘懿锋合作。我的任务主要是实验进度的详细安排,硬件的焊接与调试,程序的辅助设计调试,小车的赛道适应性调校。其余的事项一部分由队友负责,一部分由我们两个共同完成。

4实现功能与测试数据

4.1实现功能

小车能在赛道上自动顺畅地行驶,实现灵活的转弯、前进加速等必备功能。除此之外,小车的数码管还能正确地显示数字,左右转弯时的指示灯也能在合适的时间点亮或闪烁。 4.2测试数据

对程序改造前测试小车跑两圈用时29.62秒; 对程序改造后小车在赛道上跑两圈用时为22.3秒; 最后参加决赛时的最好成绩是20.38秒,拿了第一名。

5问题与解决办法

问题一:小车的测试程序烧入以后前进后退不能走直线 解决办法:微调左右车轮或者装上传感器在赛道上调测

问题二:输入程序后发现小车在赛道上不能动,但拿起来能动 解决办法:调节传感器的离地高度,直到最佳 问题三:小车在赛道上能循迹但速度太慢

解决办法:通过调整时延函数调整控制电机的调制脉宽占空比 问题四:速度太快又会冲出赛道

解决办法:将转弯情况的判断增加,并使转弯的幅度适当调大 问题五:直线行走时左右摇摆,影响速度 解决办法:将后轮适当固定即可有效避免

6心得体会与总结

6.1心得体会

首先,这是一次既有趣又有挑战性的实践。这次实践给我留下了深刻的印象,作为以后的美好回忆。

通过这次实验,我个人在焊接技术上又得到了一个较大的提升,掌握了快速高质量的手动焊接技术。对于基本的电子电路知识,我个人又有了一个较为深入的认识。但这都不是最重要的。最关键的是我在这次实践中学不仅到了很多诸如单片机,单片机的C编程,传感器的应用等新知识,而且学到了如何快速高效地学习新东西的能力。

这次实验中有太多东西需要我们自己去尝试去挑战,当然也离不开与队友的默契合作。虽然实践的过程中遇到了太多困难,但只要仔细考虑一下,与队友慢慢琢磨琢磨都能将其解决掉。还有就是作为一个工程性的项目,最主要的还是实践,通过动动手将自己的想法如实展现出来,尽管途中会遇到各种坎坷与困难,因为工程本身就要解决实际问题! 6.2总结

在本次设计中,我学到了很多没有接触到的电子知识,使我的知识有了进一步提升,这次的实践,对我今后的继续学习是受益匪浅的,特别是老师们的精心指导,以及同学和队友的耐心帮助。正是这些正能量的外部环境加上我们自己的努力与进取,我们最终取得了可喜的成绩。同时我觉得这次实践对我的态度也是一次磨练,在我今后的学习中能发扬我做这次实践的这种精神,互相帮助,做事细心细致。在此,我也感谢电路中心实验室的老师在实践中对我们的指导和帮助,以及你们的辛勤付出,十分感谢!

参考文献

[1]电子工程学院电路中心.电子工艺实习教程[M].北京.北京邮电大学出版社.2013. [2]杨国田.51单片机使用C语言程序设计[M].北京.中国电力出版社.2009. [3]周国雄.单片机应用系统精讲[M].北京.中国铁道出版社.2011.

附:部分源程序

#include #include #define uchar unsigned char #define uint unsigned int #define t 1

uchar code seg_data[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//0~9的段码表,0x00灭符 uchar data disp_buf[7] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00};//显示缓冲区 sbit IN1=P1^0;//电机控制端 sbit IN2=P1^1; sbit IN3=P1^4; sbit IN4=P1^5; sbit LED1=P2^6; sbit LED2=P2^7; sbit ENA=P1^2; sbit ENB=P1^3; double i;

sbit start=P0^0; //小车启动信号

sbit stop=P0^1; //小车停止信号

sbit S1=P3^2; //此处是传感器 管脚位声明 sbit S2=P3^3; sbit S3=P3^4; sbit S4=P3^5; sbit S5=P3^6;

uint count1,count2; //用于中断计数 /********以下是延时函数********/ void Delay(uint z) { }

/********以下是显示函数********/ display() {

P0=seg_data[0]; P2=0xfe; Delay(t); P2=0xfd; Delay(t); P2=0xfb; Delay(t); P2=0xf7; Delay(t); P2=0xef; Delay(t); P2=0xdf; Delay(t); P2=0xff; }

/*********************第二部分 电机控制子函数****************************/ qianjin() {

LED1=1;LED2=1; IN1=0;IN2=1; IN3=1;IN4=0; Delay(3);

IN1=0;IN2=0;IN3=0;IN4=0; //Delay(1);

//显示毫秒十位

//延时10ms

//开十位显示(开第2只数码管)

//开个位显示(开第1只数码管)

//显示毫秒百位

//延时10ms

uint i, j;

for(i=z;i>0;i--) // i=z,即延时z, z由实际参数传入一个值

for(j==7;j>0;j--);

//此处分号不可少 //延时程序,z是形式参数

P0=seg_data[1];

P0=seg_data[2]; //显示秒个位

//延时10ms

//开个位显示(开第4只数码管)

//开百位显示(开第3只数码管)

//显示秒十位

//延时10ms

P0=seg_data[3];

P0=seg_data[4]; //显示分个位

//延时10ms

//开个位显示(开第6只数码管)

//开十位显示(开第5只数码管)

//显示分十位

//延时10ms

P0=seg_data[5];

}

tingzhi() { IN1=0; }

zuozhuan() { }

youzhuan() { }

dazuozhuan()

{ LED1=0;LED2=1;

IN1=0;IN2=1;IN3=0;IN4=1; }

dayouzhuan() { }

LED1=1;LED2=0;

//Delay(1); //Delay(1); //IN3=1;IN4=1; //Delay(1);

IN1=1;IN2=0;IN3=1;IN4=0; //IN1=1;IN2=1;

//Delay(1); //Delay(1); //IN1=1;IN2=1; //Delay(1);

//IN3=1;IN4=1;

LED1=1;LED2=0; Delay(1); //Delay(2); //Delay(1);

IN3=1;IN4=0; IN1=1;IN2=1;

//IN3=1;IN4=1;

LED1=0;LED2=1; Delay(1); //Delay(2); //IN1=1;IN2=1; //Delay(1);

IN1=0;IN2=1; IN3=1;IN4=1;

IN2=0; IN3=0; IN4=0; //Delay(1);

/*********************第三部分 主函数****************************/ void main() { while(1) { display();

/*------------switch------------*/

if(S5==0&&S1==1&&S2==1&&S3==1&&S4==1) {youzhuan();} //10111111 左一

else if(S5==1&&S4==0&&S1==1&&S2==1&&S3==1)

{youzhuan();} //10011111 左一和左二 else if(S5==0&&S4==0&&S3==1&&S2==1&&S1==1) {youzhuan();}

else if(S5==1&&S4==0&&S3==0&&S2==1&&S1==1)

北京邮电大学实习报告

实习名称 学生姓名 实习时间 电子工艺实习 班 级 学 院 学 号 实 习 内 容 7月1日到7月12实习地点 日 1日到2日:基本焊接技术的练习; 3日:悍一个二极管交替发光的电路; 4日到5日:焊接小车,调测测试程序,完成中期阶段验收; 6日到7日:熟悉开发环境; 8日到11日:购买传感器,开发并调试循迹程序; 12日:最终验收并比赛 见附件 学生 实习 总结 遵照实习大纲并根据以下三方面按五级分制(优秀、良好、中等、及格、不及格)综合评定成绩: 1、思想品德、实习态度、实习纪律等 2、技术业务考核、笔试、口试、实际操作等 3、实习报告、分析问题、解决问题的能力 实 习 成 绩 评 定 实习评语: 实习成绩: 指导教师签名: 实习单位公章 年 月 日

因篇幅问题不能全部显示,请点此查看更多更全内容