基于单片机的巡线小车
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于单片机的巡线小车
————————————————————————————————作者:————————————————————————————————日期:
杭州电子科技大学信息工程学院二分院科技创新大赛
技术报告
作品名称:基于51单片机的巡线小车
参赛队伍:WALLE
参赛队员:周先军
吴添恒
南畅
目录
第一章设计思路以及技术方案 (2)
第二章技术要求 (3)
第三章系统方案比较与论证 (4)
第四章系统电路设计 (6)
第五章系统硬件设计 (8)
第六章系统软件设计 (9)
第七章测试方法与数据 (12)
第八章结论 (13)
第一章、设计思路以及技术方案
智能寻机器人之所以能够寻迹,主要需要三个模块完成。信号采集模块、控制模块、驱动模块。通过信号采集系统将实际路径信号采集以电信号的形式传递给控制系统,控制系统将采集来的信号进行比较分析计算,并给出判断驱动驱动模块,控制小车前进。
基于51单片机的小车迅疾系统,该系统采用四组高灵敏度的光点对管,对路面黑色轨迹进行检测,并利用单片机产生的PWM波,控制两个独立的电机分别以合适的速度转动,使得小车能沿着轨迹前进。
第二章. 技术要求
小车循迹路线为白底黑线KT跑道,轨迹与底板用黑白两色区分。小车能正确的识别其中的黑线,并由STC89C52RC单片机控制处理,驱动两个直流电机转动,使得小车能沿着正确的路径行进。
第三章、系统方案比较与论证
整个电路系统分为检测、控制、驱动三个模块。首先利用关电对
管度路面信号进行检测,通过比较器处理之后,送给控制模块进行实
时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小
车的运动。系统方案如图
检测软件控制驱动电机控制小车
该智能小车在画有黑线的白纸“路面“上行驶,由于黑线和白纸
对光线的反射系数不同,课根据接收的反射光的强度来判断黑线。用
红外检测综合比较是最佳的方案。ST系列的集成红外谈都价格便宜、体积小、使用方便、用途广泛,系统最终选择了ST168反射传感器作
为红外的发射和接收器件,其原理图如下:
ST168采用高发射功率红外光、电二极管和灵敏的光点晶体管组成。采集距离很小。实践检测时加上5V电压时,最佳的检测距离为10mm-15mm.因此在架车时要充分考虑ST168的检测距离,合理设好高度高度。采用如图的方案将4个光点传感器一字排列。两个个点击分别设置在小车的后方,前面用个万向轮导向。通过电子差速控制。
单片机IO口输出的信号无法直接驱动电机转动,因此需要驱动模块来驱动电机。为了简化电路,小车驱动模块采用了两块ULN2003并联组成的驱动电路驱动直流电机转动。直流电机外接齿轮减速器,增大扭力,让小车能顺利前进。
第四章、系统电路设计
1,检测模块
基于ST168光点传感器的检测电路
2,系统控制模块
基于STC89C52单片机的控制电路
信号比较电路
单片机最小系统电路3,驱动模块
ULN2003驱动电路
第五章系统硬件设计
鉴于小车的制作成本和效率等因素,本小车采用了4节5号电池串联供电。6V直接供电电机,驱动小车前进;4.5V供给51单片机,控制小车运行。采样电压有4.5V和6V两个选择,经过对比测试,6V 供电能使小车采集的信号更稳定。
直流电机和减速器制作比较麻烦,这里采用网购这样套件。用薄木板坐车身钻孔固定各种部件模块。两个驱动轮放置小车后方,前部用外向轮协助转向,提高稳定性。最后测试时网购买了来的轮子轮胎与路面摩擦不够,打滑严重,我们采用了网球拍的防滑带用双面胶贴在轮胎上增大摩擦。
第六章、系统软件设计
#include
#define uchar unsigned char
#define uint unsigned int
#define s1 0
#define s0 1
sbit dj0=P2^4;
sbit dj1=P2^5;
sbit qy0=P1^0;
sbit qy1=P1^1;
sbit qy2=P1^2;
sbit qy3=P1^3;
void delayus(uchar n)
{
while(n--);
}
void init() {
P1=0x00;
dj0=dj1=0;
}
void main()
{
init();
while(1)
{
while(qy0==1&&qy1==0&&qy2==0&&qy3==0)
{
dj0=1;
delayus(20);
dj0=0;
delayus(20);
}
while(qy0==0&&qy1==1&&qy2==0&&qy3==0)
{
dj1=1;
delayus(20);
dj1=0;
delayus(20);
}
while(qy0==1&&qy1==1&&qy2==1&&qy3==1) //全白,冲出轨道了
{
dj0=dj1=0;
}
while(qy0==0&&qy1==0&&qy2==0&&qy3==0) //全黑,跑到交叉路口
{
dj0=dj1=1;
}
while(qy0==1&&qy1==0&&qy2==0&&qy3==1) //
{
dj0=dj1=1;
}
while(qy0==1&&qy1==0&&qy2==1&&qy3==1)
{
dj0=1;
delayus(10);
dj0=0;
delayus(2);
}
while(qy0==0&&qy1==0&&qy2==1&&qy3==1)
{
dj0=1;
delayus(10);
dj0=0;
delayus(10);
}
while(qy0==0&&qy1==1&&qy2==1&&qy3==1)
{