学习STC51单片机37(芯片为STC89C52RCRC)智能小车4(循迹小车、优化循迹小车解决转弯不平滑)
每日一言
压力是成长的催化剂,扛过去,你会遇见更坚韧的自己。
案例:循迹小车(末尾附上视频)
硬件:TCRT500红外传感器
这边我就要发表一下自己的感言了,我之前没有学习嵌入式的时候一直认为小车怎么会跟着地面上的黑线一直走,循迹,哇好神奇啊,一个个都是大佬,是人类吗??这么厉害....
现在好好好,那我就默默不说话....
我们循迹呢,需要用到TCRT500红外传感器,这个模块会使用了,那么循迹就可以实现了
仔细介绍:TCRT5000传感器的红外发射二极管不断发射红外线 ,当发射出的红外线没有被反射回来或被反射回来但强度不够大时, 红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态 ,被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和, 此时模块的输出端为低电平,指示二极管被点亮
简单粗暴介绍:总结就是一句话,有感应到黑线,D0输出高电平 ,灭灯,(我不想以后回过头来坑自己)这个就是模块的使用方法,对的就是那么的简单
那么我们模拟一下赛道
所以我们需要两个这个模块,进行装备
就是我黄圈圈出来的,这个是我们的模块
那么我们既然知道了原理:有感应到黑线,D0输出高电平 ,灭灯,那我们就可以根据这个特性我们来写代码,目的是将黑色轨道给他控制在两个传感器中间,这样就实现了循迹
代码很简单
main.c文件
我们是直接用的电机驱动分文件的代码,这个可以直接改一下就成为我们循迹小车的代码,不懂得回去翻笔记,
因为循迹就只需要电极转动就可以了,也不需要差速什么的,想要实现怎么样的效果取决于需求,但是在这我只是单纯为了循迹,一根线的循迹,而且是2路模块的千万不要忘了,不能做挑选路线的操作,因为那个需要视觉模块,我们还不会视觉模块并且目前51单片机做不到,32还可以玩玩
因为D0输出高电平 ,灭灯
所以我们的逻辑是当哪一边灭灯的时候就往哪一边转向
举例1:左模块灭灯,说明左模块检测到黑线,那么就向左转向,反之道理也是一样的
这个代码是如果两个都灭灯,那么是不是可能小车在黑色的区域了,或者场地布置的因素,当然概率很小,但是我们还是要将这种情况写出来
这个代码是如果两个都是低电平,说明得到了正常的红外线反射,那么是不是可能小车在黑线的正中间行驶,那么我们就只需要设置小车前进就好了
左转右转的大家都会写.....
motor.c文件
motor.h文件
案例:解决循迹小车转弯不平滑问题
经过循迹小车代码的实际操作,我们发现小车的转向很抽象,每当要转向的时候,小车的车身幅度会非常大,有点像一抽一抽的掉帧了一样,所以啊我们需要进行优化
怎么优化?
其实到这边我就已经可以根据之前的经验,都不用想,软件层面我们就用差速呗
因为我们之前的逻辑是没有用差速进行控制小车的,之前是左转的时候我们直接让左轮停止,右轮也是全速前进,那这个转向角度就非常大了
因此我们的优化逻辑是当左转或者右转的时候,让左转的时候一个轮子快一点,一个轮子慢一点,就是让两个轮子都要动,这样不就实现了转弯比之前平滑了吗。Good
开始编写代码
Main.c
有经验的我们知道肯定要进行调用他2个定时器的初始化,然后我们将之前循迹小车main函数的代码块进行改装一下就好了,就是前进、停止、向左前进、向右前进都改成用差速的方法,来进行配置
比如我单纯前进那么我设置speedLeft=40 和 speedRight=40那么就是全速前进了,然后左转右转的数值换一下就好了,不需要讲解,说白了就是之前的差速小车的代码,我们直接拿来改就是了
Motor.c文件
Motor.h头文件声明函数
Time0.c文件
Time0.h文件
这些之前代码都讲过,一模一样的代码
循迹小车
具体参数我是这样调的哈,基本上出不了赛道20次出1次吧,关于参数可以自己根据自己的实际状况来,要是怕自己的小车经常出赛道的话,多买两个TCRT5000传感器,这样就稳妥了