从零开始,学做智能小车【4-程序初级篇】
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
比如图中的方波,占空比为 20%。当然,图中只能看出来占空比的大小,其他信息不能看到。 对于直流电机,比较形象的解释: 假如说,以 10 秒钟 1 个周期,这 10 秒钟里面,电机有 X 秒钟,也就是(X/10)*100 %的时间是通电 的,剩下的(1-X/10)*100%的时间断电。当 X 越大(当然不能超过周期的值了) ,明显的,电机的总体转 速就越快了,因为停歇的时间少了。但是这个时候,周期很长,10 秒钟啊,很明显的可以看出电机停停走 走。假如把周期变到了 1 秒钟,0.1 秒钟,0.01 秒钟,0.001 秒钟,0.0001 秒钟,再去改变通电的时间, 这样子,就明显感觉不出来电机停停走走了。而总体的效果,则是 X 越大,电机的转速越快,X 越小,电机 的转速越慢。当 X 为零的时候,电机完全不转,当 X 大于一定的值的时候,电机开始慢慢转动起来,当 X 值到达最大的时候,就是占空比接近 100%的时候,电机的速度达到最快。 不过,对于巡线小车用的电机,推荐使用带了减速箱的直流电机,而非普通直流电机。杠杆原理告 诉我们,省力了就不省距离,省距离了就不省力。对于电机也是一样的,减速直流电机经过减速箱的一大 堆齿轮,把飞快转动的电机的速度降低了几百倍,由此减速直流电机的力气就很大了。不带减速箱的直流
如图所示。 现在假设前面的红外传感器有 12 个,黑线宽度为 2.5cm,红外传感器等间距分布,相邻的两个红外传感 器间距为 1.7cm 小于黑线的宽度。 所以当巡线小车跑在直线上的时候的状态应该是这样子的
电子科技大学
CXY-STUDIO
Write By cpholr
图中,两个红点之间距离是 17 毫米,黑线的宽度是 25 毫米。图片中展示了小车刚好毫无偏差的压在黑线 正上面,中间两个红外传感器刚好全部被黑线覆盖。 我们需要先给红外传感器编号,从左边开始到右边,编码为 1-2-3-4-5-6-7-8-9-10-11-12 注意了,开始讲控制算法了。 首先引入偏差的概念,当黑线在上图中的那种状态,称为偏差为零。 考虑到物理学中的相对运动理论的正确性,原本黑线是不动,小车的红外巡线传感器在动,现在我以 黑线在动,而小车不动来讨论偏差的数字化。 当黑线往左边移动 8.5 毫米, 就是红外巡线传感器的第 6 个传感器刚好完全压在黑线上面的那种情况。 这时候,跟之前相比,出现了不为零的偏差了。我们约定:黑线偏向左边时候,偏差为负,偏向右边时候, 偏差为正。上一次恰好压在正中间(6 号和 7 号正上方)时候偏差为 0,现在的这种情况,我们约定偏差 为“-1” 。 同理,当黑线往左边移动 8.5x2 毫米,就是刚好移动 17 毫米的时候,就是刚好压在 5 号和 6 号的正 上方的时候,偏差就为“-2“。 同样,黑线从正中间往右边移动 17 毫米的时候,偏差就是“+2“。 这样的话,偏差就可以编码: -11 --黑线在 -9 -8 -7 -6 -5 -4 -3 -2 -1 --黑线在 --黑线在 --黑线在 --黑线在 --黑线在 1 2 3 4 5 6 7 8 9 10 11 12 正上方,与中心偏差 -8.5*11 mm mm -10 --黑线在 1-2 正上方,与中心偏差 -8.5*10
--黑线在 2-3 正上方,与中心偏差 -8.5*8 mm --黑线在 3-4 正上方,与中心偏差 -8.5*6 mm --黑线在 4-5 正上方,与中心偏差 -8.5*4 mm --黑线在 5-6 正上方,与中心偏差 -8.5*2 mm
0 --黑线在 6-7 正上方,与中心偏差 0 1 --黑线在 3 --黑线在
正上方,与中心偏差 -8.5*9 mm 正上方,与中心偏差 -8.5*7 mm 正上方,与中心偏差 -8.5*5 mm 正上方,与中心偏差 -8.5*3 mm 正上方,与中心偏差 -8.5*1 mm mm 正上方,与中心偏差 8.5*1 mm 正上方,与中心偏差 8.5*3 mm 正上方,与中心偏差 8.5*5 mm 正上方,与中心偏差 8.5*7 mm 正上方,与中心偏差 8.5*9 mm 正上方,与中心偏差 8.5*11 mm
电子科技大学
CXY-STUDIO
Write By cpholr
假如出现这样的情况,从上面列表中可以获得压线在 4 号传感器的正上方,偏差就是“-5”了。 而通常情况没有那么刚好,也可能出现下图的那样子的情况:
7 号传感器到底检测到了黑线了吗,这就不一定了,具体情况要看从传感器读回的数据。 从前面电路篇可以知道,当压到黑线的时候,相应的压到黑线的 LED 是要发光的,说明,当压到黑 线的时候,红外传感器输出低电平,为 0,当在正常的白线上的时候,红外传感器是输出高电平的,为 1。 而对于单片机,假如我们用了 12 个 I/O 口去读回传感器的数值。假如是用 AVR 单片机,我们用了 PA 口的 8 个和 PB 口的 4 个,凑成了 12 个 I/O 口来读取 12 路传感器的数据。 比如像下面这样子对应 红外 编号 I/O 口 1 PA3 2 PA2 3 PA1 4 PA0 5 PB7 6 PB6 7 PB5 8 PB4 9 PB3 10 PB2 11 PB1 12 PB0
电子科技大学 上面的代码与前面的列表一一对应。
CXY-STUDIO
Write By cpholr
到现在为止, 完成了红外巡线探头数据的采集。 上面的内容, 暂时先藏着, 最重要的就是那个函数了, 而那个函数还是需要根据实际硬件来改动, 有些人喜欢红外传感器中间密两边疏, 有些人喜欢等间距分布, 有些人喜欢用 8 个红外巡线传感器,有些人则用 7 个,还有些人用 4 个。 我之前参加巡线机器人大赛的时候,用了 14 个红外传感器,非等间距分布,那是因为当时手头上有 现成的 PCB 模块,用两片中间密两边疏的拼起来,就变成完全没有规律的非等间距分布。虽然最后我的小 车拿了第六届巡线机器人的冠军。但是我还是提倡大家使用 12 个红外传感器以及等间距分布,因为非等 间距的时候每个红外传感器的偏差值很难确定,需要用尺子去测量每个红外传感器与中间的偏差值,然后 再一个个算出权重,处理起来相当麻烦。 原本看上去 8 个红外传感器,刚好对应一组 I/O 口,刚好 8 位,处理起来更加方便,但是算一下,当 黑线在中心的时候,200/7mm=28.57mm>25mm=黑线宽度,显然并不是非常合适了。因为当一个传感 器都没有检测到的时候,无法确定是在哪两个红外传感器之间,只能通过程序的记忆的方法来确定,精度 不高,又复杂。 能用硬件轻松解决的事情,就用硬件解决,不要去为难写程序的同学。他毕竟是你的队友啊。 。 。 通常我们会使用 LM339 集成四通道比较器来组装红外巡线模块电路, 为了让全部的 12 个通道都用上, 使用 12 个红外传感器就非常合适了。 假如再增加一个红外, 变成 13 个红外传感器, 就多浪费了一个芯片, 浪费了三个比较器的通道,又多增加了许多电路,麻烦的很。 接着继续讲解,PWM。 PWM 的全称是:pulse width modulation 。简称是脉宽调制。简单的来说,就是频率恒定,占空 比可以改变的方波了。
电子科技大学
CXY-STUDIO
Write By cpholr
PORTA&0x0f 将读回来的 PA7,PA6,PA5,PA4 这四位屏蔽掉,不管它们是什么值,读回来后相 应的位都是 0,而保留了 PA3,PA2,PA1,PA0 原来的值。 (PORTA&0x0f) <<8 是讲上面得到的值右移 8 位,使之成为 PORT 的高 8 位。 最后与 PORTB 按位或运算,就把 PORT 的低 8 位补上了。最后呢: PORT 红 外 编 号 接着呢,就可以把全部的偏差都在 C 语言中体现出来了: 需要在定义一个变量,叫做当次得到的偏差: int x1; //当次偏差,用 x1 表示 完整代码如下: 15 X 14 X 13 X 12 X 11 1 10 2 9 3 8 4 7 5 6 6 5 7 4 8 3 9 2 10 1 11 0 12
在程序中呢,假如要读回 I/O 的电平状态: 需要先定义一个 16 位的变量: unsigned int PORT; 然后读取端口的数据: PORT=PORTB | ( (PORTA&0x0f) <<8 ); (以 AVR 单片机为例,其他单片机也类似) 上面这句话呢,对 C 语言位运算比较熟悉的同学一眼就能看懂了。如果不懂 C 语言的位运算,请翻阅 谭浩强的《C 程序设计》 ,再回来看这篇文章。
Hale Waihona Puke Baidu 电子科技大学
CXY-STUDIO
Write By cpholr
电机,用手轻轻一捏住,就停下来了,不管转的多块多牛逼。但是带了减速箱的直流电机,在负重情况下 还是可以轻松的爬坡,吊起重物等等。 所以相比于普通不带减速的直流电机, 减速直流电机的线性度非常好, 相同周期下不同占空比的 PWM, 可以得到不同的转速,受负载的影响相比普通电机而言小了很多。
2 --黑线在 7-8 正上方,与中心偏差 8.5*2 mm 4 --黑线在 8-9 正上方,与中心偏差 8.5*4 mm 5 --黑线在 7 --黑线在 9 --黑线在 11 --黑线在 6 --黑线在 9-10 正上方,与中心偏差 8.5*6 mm 8 --黑线在 10-11 正上方,与中心偏差 8.5*8 mm 10 --黑线在 11-12 正上方,与中心偏差 8.5*10 mm 这样的话,巡线的精度就锁定在 8.5 毫米了,这样的精度对于巡线小车是足够的。 我们再继续验算一下上面的偏差编码:
电子科技大学
CXY-STUDIO
Write By cpholr
从零开始,学做智能小车【4-程序初级篇】
Write By cpholr
本文假设读者已经有了那么一点点单片机的基础。当然,如果连单片机是什么都不知道,做起智能小 车简直是比登天还难。要登天买张飞机票就上去了,但是学习单片机还是需要一点时间的。建议懂得了单 片机的工作方式再来看这篇文章比较合适。 本文只讨论制作一个能够沿着黑线奔跑的智能小车的控制算法,只讲控制算法,而并不针对某种单片 机来谈。 单片机的选择很随意了, 不管是 51 (AT89S52,STC89C52 等) , AVR (ATmega16, ATmega128) , MSP430,还是 STM32,或者飞思卡尔某款单片机,再或者高级到 DSP。
左图是减速直流电机,右图是不带减速箱的普通直流电机。 而单片机输出的可变占空比的 PWM,并不是直接连接到电机的。因为电机需要的 PWM 电压很高, 电流很大,所以,需要一个叫做“电机驱动”的东西。经过电机驱动的 PWM,不改变占空比也不改变周 期。只是改变(增大)了幅度和负载能力。
这幅图就很形象的表明了电机驱动的作用。 讲到这里,如何得出偏差的问题解决了,如何让电机变速的问题也很明了了。那么对于巡线你们有思 路了吗? 最简单的理解: 当偏差为负的时候,说明说黑线在小车的左边,小车应该向左边拐弯,让黑线回到小车的正下方,这 样子的话,右边的轮子转速应该要比左边轮子快,才能让小车向左拐,回到正确的位置。而让右边的轮子 转速比左边轮子快,只要让右边的电机得到 PWM 占空比比左边大就好了。 当偏差为正的时候,说明说黑线在小车的右边,小车应该向右边拐弯,让黑线回到小车的正下方,这 样子的话,左边的轮子转速应该要比右边轮子快,才能让小车向右拐,回到正确的位置。而让左边的轮子 转速比右边轮子快,只要让左边的电机得到 PWM 占空比比右边大就好了。 而具体一边比一边大多少呢?
电子科技大学
CXY-STUDIO
Write By cpholr
最简单的做法就是,偏差越大,就大的越多,偏差越小,就超过的小。偏差为零,左右轮子就给出一 样的占空比,让他们转速一样。 如果读者已经理解到了这个地方, 那么, 只要你硬件弄正确了, 小车是不是已经可以沿着黑线跑了呢? 答案是当然可以,但是,这样子小车的速度只能像蜗牛一样的爬,并不能飙车。这是为什么呢? 欲知原因,请听下回讲解。