智能循迹探障小车测控系统

第1章 设计目的与设计要求

1.1 设计目的

基于智能小车散件平台,以微处理器为控制核心,LabVIEW上位机为信息监控平台,自主装配、焊接、编程实现具备循迹、速度控制、串口通信、液晶显示功能的智能循迹小车测控系统。巩固在“汽车电子综合设计入门”和“汽车电子综合设计基础A”课程中所学的理论知识和实训技能,加深对STM32单片机知识的学习,进一步提高自身工程项目设计以及代码编写能力。

1.2 设计要求

基于智能小车散件平台,以微处理器为控制核心,LabVIEW上位机为信息监控平台,自主装配、焊接、编程实现具备以下功能的智能循迹小车测控系统。

任务要求:

(1)要求在LabVIEW上设计通过蓝牙串口,利用自定义通信协议获取数据,能够监测小车车速、红外循迹传感器状态、电池电压等信息,并能对小车进行启动与停止控制的软件;

(2)焊接好一台具备寻迹、两轮驱动、按键、液晶显示、蓝牙串口通信、电池供电的小车。

(3)利用小车上的红外循迹传感器实现循黑线功能;

(4)编写电机驱动程序,可以实现小车的前进、后退、转弯、原地打转、停止等功能。

(5)在H形的跑道中,找到终点,并以最短路径和最快速度返回;(具体跑道参数和要求见H形跑道循迹项目要求)

(6)调试系统并进行结果分析。

扩展任务:

(1)显示电池电压;

(2)蓝牙或者WIFI串口无线控制小车

(3)其他功能,比如摄像头循迹、手机遥控等,自由发挥。

第2章 系统总体方案设计

2.1系统框图及总体工作原理描述

系统总体框图:

图2.1

小车循迹总体工作流程图:

图2.2

小车循迹方案的总体思路:

通过判断U3、U4红外传感器传回的黑线数据从而判断小车车身状况,当小车左右偏离赛道时,通过控制小车左右车轮转速的不同进行车身左右调整来让小车走直。然后根据四个传感器传回的数据再次判断小车到达的位置,然后做出相应的动作(右转90度或者掉头180度)。同时本次程序设计的右转90度以及掉头180度是通过延时函数延时一定时间实现的。小车车身的调整运用了延时函数以及控制PWM占空比进而控制小车两个车轮的方法进行设计。

2.2方案比较

本次小车循迹的方案设计总体而言是围绕PWM占空比控制小车两个车轮转速,并且通过延时函数延时一定时间控制小车掉头180度、右转90度以及车身方向修正这两个关键点而进行设计的。在进行实验验收时,发现到了这种方案设计的缺点所在:虽然掉头或者右转的延时时间是一定的,但是由于小车电池电量的不稳定,继而会对小车掉头180度或者右转90度的转向效果产生影响,从而会致使小车掉头或者右转不成功,然后冲出指定路线。在江老师的点评和指导下,得知了另一种更加优越的方案:通过测量小车车轮转速,然后根据车轮转速以及四个红外传感器传来的数据,进行判断小车位置和状态,然后再根据这些状态指挥小车掉头或右转的完成。这种方案相比我们小组的方案而言,由于不再采用延时函数,使得小车掉头和右转不再受小车电量的影响而更加精确也更加稳定。

第3章 系统硬件设计

3.1 模块设计原理分析

(1)L239D电机驱动及编码器模块:

图3.1 L239D电机驱动及编码器模块电路图

L239D电机驱动原理:

L239D电机驱动模块为一个典型的直流电机控制电路。电路得名于“H桥驱动电路”是因为它的形状酷似字母H。4个三极管组成H的4条垂直腿,而电机就是H中的横杠(注意:图4.12及随后的两个图都只是示意图,而不是完整的电路图,其中三极管的驱动电路没有画出来)。

如图所示,H桥式电机驱动电路包括4个三极管和一个电机。要使电机运转,必须导通对角线上的一对三极管。根据不同三极管对的导通情况,电流可能会从左至右或从右至左流过电机,从而控制电机的转向。

图3.2 H桥驱动电路

要使电机运转,必须使对角线上的一对三极管导通。例如,如图4.13所示,当Q1管和Q4管导通时,电流就从电源正极经Q1从左至右穿过电机,然后再经Q4回到电源负极。按图中电流箭头所示,该流向的电流将驱动电机顺时针转动。当三极管Q1和Q4导通时,电流将从左至右流过电机,从而驱动电机按特定方向转动(电机周围的箭头指示为顺时针方向)。

图3.3 H桥电路驱动电机顺时针转动

图4.14所示为另一对三极管Q2和Q3导通的情况,电流将从右至左流过电机。当三极管Q2和Q3导通时,电流将从右至左流过电机,从而驱动电机沿另一方向转动(电机周围的箭头表示为逆时针方向)。

图3.4 H桥驱动电机逆时针转动

电机编码器介绍:

编码器是将信号或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。码器能够将电机的机械几何位移转化为脉冲信号或数字量。也就是说,有了编码器,我们通过检测编码器输出的脉冲信号,就能获取电机转动角度、转速等相关信息。这样我们不但能定性的控制电机的转向、转速,还能定量的测量。

编码器的模式共有三种TIM_EncoderMode:

当模式选为TIM_EncoderMode_TI1时,计数器仅在TI1的边沿处计数

当模式选为TIM_EncoderMode_TI2时,计数器仅在TI2的边沿处计数

当模式选为TIM_EncoderMode_TI12时,计数器在TI1和TI2边沿处均计数

模式1,我只以A相的脉冲信号为我的检测信号,TI2我就不管了。(B只是相对A滞后了90度,其它都是一样的,所以检测A就够了),其它同理。

模式3涉及编码器软件四倍频技术:

图3.5 A、B两相正交信号图

A、B两相正交信号,如果根据模式1或模式2对脉冲信号进行检测,假设我们上升沿捕获一次,那么图中的信号我们只检测到3个上升沿,也就是三个脉冲。但是如果采用模式3,对TI1和TI2检测上升沿,那么同一段时间我们检测到6个上升沿。如果下降沿也检测,那么一共就是12个边沿跳变。每个实际来的脉冲会被检测4次,同样是12/4=3个脉冲,但是这样的话精度大大提高了。

(2)红外传感器模块:

图3.6 红外传感器模块电路图

反射式红外光电传感器是把红外线发射器和接收器装入同一个装置内,在其前方装一块反光板,利用反射原理完成光电控制作用的光电传感器。可以用来检测地面明暗和颜色的变化,也可以探测有无接近的物体。本次课程实验是用四个红外探测模块探测赛道黑线以及确定小车状态。

第4章 系统软件设计

4.1 软件整体流程图及软件方案介绍

图4.1

LabVIEW实现:

通过波特率、奇偶校验位、停止位等串口配置,进行LabVIEW程序与循迹小车之间的数据通信。一方面,循迹小车进行串口通信的工程代码是通过将数据逐个字节通过PA9、PA10引脚进行的传送接收的。另一方面,LabVIEW程序将接收到的数据进行字符转化后,显示在车速以及转速仪表盘上,并且将小车开关数据通过布尔转化后发送给单片机,从而实现控制小车的启停。

寻迹的实现及寻迹策略:

图4.2小车修正方向流程图

小车通过判断U2、U3两个红外传感器传回的数据,从而判断小车车身状况,继而根据小车偏离方向适当修正小车行驶方向,使小车在直行路段能够走直,不偏离航线。

图4.3控制小车转向流程框图

我们由红外传感器传回到单片机的数据,根据探测到红外传感器的个数以及次数,判断此时小车是做掉头180度动作、右转90度动作还是到达终点小车停止动作。从而实现小车在循迹过程中的动作控制。

电机控制的实现:

图4.4 PWM波控制电机转速

我们通过控制PWM波占空比的输出,继而控制电机的转速。通过控制左右车轮电机转速的不同,使小车实现转向的功能;通过控制小车车轮电机转速的相同,使小车以一定的速度直线行驶。然后配合红外传感器传回的数据,使小车完成整个循迹过程。

第5章 系统软件测试及结果分析

5.1 系统功能测试步骤

(1)测试环境的搭建。

(2)系统基本功能的测试。

(3)系统功能稳定性的测试。

(4)系统功能测试的结论总结。

5.2 系统测试环境搭建

(1)Virtual Serial Port Driver 7.2软件物理串口与虚拟串口的连接。

(2)LabView中串口波特率、停止位以及奇偶校验位等的设置。

(3)Keil 5软件将程序烧录进核心板。

(4)赛道铺设。

5.3 系统功能测试

5.3.1 基本功能测试

(1)LabView程序功能测试

图5.1串口通信

通过建立虚拟串口COM1和COM2,以及调整串口的波特率等串口参数能够实现串口助手与LabView程序进行通信。但是由于我们编写单片机与LabView通信程序不成功的的原因,我们最终没有能够实现小车与LabView的通信。

(2)小车循迹H赛道测试

图5.2H循迹赛道测试

在整个H循迹赛道测试过程中,我们遇到了诸多问题,比如小车由于速度太快,而红外传感器探测到黑线,并将数据传输给单片机,单片机指挥小车修正方向的速度又太慢,导致小车直接冲出赛道的情况时有发生。同时由于delay函数运用的不恰当,导致小车掉头转向时间或长或短,进而小车不能够掉头转向成功。但是通过我们的努力调试,适当降低车速,寻找最佳掉头转向延时时间使得小车循迹成功的概率大幅度提高。

5.3.4 性能测试

小车在15秒完成整个赛道规定路线的行走,并且在小车行进过程中,车身平稳,摆动不剧烈。

课题要求是通过LabView程序客户页面按键,能够控制小车的启停,同时程序页面的仪表盘能够显示从小车接收来的小车转速数据。但是由于我们的问题最终只是实现了LabView程序通过虚拟串口与串口助手之间的串口通信。

5.4 作品效果图及结论

图5.3

图5.4

经过系统功能测试后,系统基本满足课设要求,但是系统功能稳定性较差,容易受电池电量、赛道铺设平整度等其他因素的影响。

第6章 实训体会

6.1 系统软件驱动设计、功能实现与调试遇到的问题

(1)系统设计:

LabView程序设计过程中,由于对软件不熟悉,导致自己需要的一些控件很难找到。小车循迹功能在设计的时候缺少思路。同时对于LabView程序的构建我们是在参考了老师的程序的情况下设计出来的,由于时间的原因我们对于LabView的学习还不是太充分,很难对于LabView有更加充分和详细的学习。

(2)功能实现:

对于将小车得到的车速和转速信息通过串口发送显示到LabView程序的汽车仪表盘上,我们错误的认为是通过虚拟串口软件将小车的物理串口以及LabView程序的汽车仪表盘的虚拟串口相连接,结果导致串口的通信一直未能成功,浪费了大量精力和时间。而对于将小车得到的脉冲信号数值转换为转速以及车速,我们错误的运用了delay函数进行对脉冲信号累加的数值进行处理和转换,而没有运用定时器以及中断将脉冲信号进行处理,导致了汽车仪表盘显示转速以及车速的失败。

对于小车循迹功能的实现,我们做的还是不到位,对于小车转向掉头时间以及小车直线速度的把控,我们由于经验不足,进行了大量的实验。这也是由于我们对于循迹思路错误设计导致的。

(3)调试:

调试小车循迹功能的过程中,由于自身方案存在缺点,导致延时函数延时的时间需要精确调整,很难达到令人满意的程度。同时由于代码编写能力的不足,我们也是运用的比较基础的功能代码,同时也移植了一部分网上的优秀代码。

6.2 问题的解决方法

对于实验过程中存在的知识盲区以及所需资料的缺少,我们在互联网上大量搜寻查找,这个过程中,接触到了许多比较好的论坛,虽然在查找自己所需资料的过程中遇到了许多困难,很难找到自己想要的答案,但是锻炼了我们在互联网上搜寻查找资料的能力。另一方面,我们小组也与其他小组同学进行了讨论,参考了其他同学的意见,也向他们学习到了解决项目问题的办法。

对于自身代码编写能力不足的问题,我的方法是,多多参考学习网上别人的优秀代码,在此基础之上,编写适合自己项目的代码,这样既开阔了自己的思路,也进一步提高了自己的代码编写能力。

对于小车的调试,首先方案的选择是最重要的,这直接影响到小车的调试难度。其次,对于需要调试的参数把握,比如延时时间长度的确定,要先确定一个大致的范围,然后逐渐缩小范围,不要盲目无序的去调试,盲目的调只会浪费大量宝贵的时间,同时也会混乱自己的思维。

对于项目过程中遇到的困难,自己在互联网寻找答案是一方面,另一方面也可以多多向老师和同学虚心请教,这样既节省时间,也能得到自己想要的答案。

当然感觉本次实验课程是在过于短暂,没有能够进一步深入对单片机以及LabView的学习。但是我想互联网上的学习资料十分充分能够满足我的后续学习。

6.3心得体会

学习是一个戒骄戒躁的过程,本次课程设计过程中难免会遇到困难,一个好的心态以及好的解决问题的方法是十分重要的。本次课设进行的过程中最令我痛苦的过程无疑是遇到困难自己又无法解决,需要的资料又难以在互联网上查找到。还好最后在同学的帮助以及老师的指点下我学习到了自己想了解的知识。同时在本次课程设计过程中我深刻体会到了理论与实验的不同。自己的理论构想一定要经过实验的考验才能够成立,也才能够发现自己理论构想中的缺陷。自己的设计思路也一定要多和他人进行交流讨论,这样才能够拓展自己的思路,构思出更好的设计。“纸上得来终觉浅,绝知此事要躬行。”自身亲自的体会是十分深刻的,空泛的思考只会让自己自以为是,在今后的学习和工作中一定要多多动手亲自实践,不断提升自己的实力和能力。

本次课程实验也提高了我工程方案构思设计以及代码实现的能力。对于前期“电子综合设计A”以及“电子综合设计基础课程”我们都只是根据老师的要求,按照老师给出的思路进行设计学习。但是本次实验课程,老师充分给与我们自由,发挥我们的主观能动性,让我们自主设计循迹功能,完成小车的H循迹功能。同时通过本次实验课程设计,观摩和参考了网上大量的优秀代码,使得我的代码编写水平有了一定的提高。

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
循迹越障小车代码如下,仅供参考: ```c #include <reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit ena=P1^2; sbit enb=P1^3; sbit in1=P1^4; sbit in2=P1^5; sbit in3=P1^6; sbit in4=P1^7; sbit ir1=P3^0; sbit ir2=P3^1; sbit ir3=P3^2; sbit ir4=P3^3; sbit ir5=P3^4; sbit ir6=P3^5; sbit ir7=P3^6; sbit ir8=P3^7; uchar ir_value=0;//用于存储红外值 uchar left_speed=0,right_speed=0;//左右电机速 //延时函数 void Delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } //电机控制函数 void MotorControl(uchar left_speed,uchar right_speed) { ena=1; enb=1; in1=1; in2=0; in3=1; in4=0; P0=left_speed;//控制左电机速 P2=right_speed;//控制右电机速 } //红外传感器读取函数 void ReadIrValue() { ir_value=0; if(ir1==0) ir_value|=0x01; if(ir2==0) ir_value|=0x02; if(ir3==0) ir_value|=0x04; if(ir4==0) ir_value|=0x08; if(ir5==0) ir_value|=0x10; if(ir6==0) ir_value|=0x20; if(ir7==0) ir_value|=0x40; if(ir8==0) ir_value|=0x80; } //循迹函数 void RunOnTrack() { ReadIrValue();//读取红外值 switch(ir_value) { case 0x01: left_speed=80,right_speed=120;break;//左偏,右转 case 0x02: left_speed=100,right_speed=120;break; case 0x04: left_speed=120,right_speed=120;break; case 0x08: left_speed=120,right_speed=100;break; case 0x10: left_speed=120,right_speed=80;break;//右偏,左转 default: left_speed=120,right_speed=120;break;//直行 } MotorControl(left_speed,right_speed);//控制电机 } //越障函数 void RunOverObstacle() { if(ir_value==0x04)//前方有障碍物 { left_speed=60,right_speed=60;//减速 MotorControl(left_speed,right_speed);//控制电机 Delayms(1000);//等待1秒 left_speed=120,right_speed=120;//恢复速 MotorControl(left_speed,right_speed);//控制电机 } } //主函数 void main() { while(1) { RunOnTrack();//循迹 RunOverObstacle();//越障 Delayms(50);//延时50ms } } ``` 这段代码实现了循迹越障小车的基本功能,包括红外传感器读取、循迹控制、越障控制等。在实际的应用中,可以根据具体需求进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值