在刚接触51单片机的时候觉得这是很难的事情
记录蓝牙小车的制作过程
一、前言
不要觉得它很难,就像在做一个玩具一样。蓝牙小车对于初学者是道坎,pwm调速这个就难到了很多人,其实这些都不难。
二、什么是pwm调速
网上是这么说的:
PWM(Pulse Width Modulation)控制——脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。
但其实我们只需要记住两个词:
周期和占空比
在调速这方面,控制pwm就相当于控制你多长时间手动按一次按键和你每次按下按键的时长,来控制一只led。pwm的周期就是你按下按键的间隔,占空比就是你按下的时间。
如果你每隔1秒按下一次,并且按下的时间为0.5秒,那么人眼可以看到led是在闪烁的状态。
如果你操作够快,达到ms级别,那么人眼是看不出来你每隔10ms按下一次且每次按下5ms,这时候可以用一个一直通电的led和你控制的led做对比,你会发现你控制的led亮度大约是一直通电的1/2。
如果你改变了按下的时间,周期不变,例如你只有2ms的时间按下,你会发现这比5ms按下更暗,而且大约是一直通电亮度的1/5。
如果把led换成电机,那么你就完成了调速,速度就是亮度,他们都是看你pwm波的有效值。也可以理解成电阻,通电时间也就是按下时间越长,发热量越大。
也就是说你控制的设备输出的功率就是pwm的占空比,占空比为50%的话,输出也就是最大功率的1/2。
1 | #include "reg52.h" |
这里我们可以看到四个输出pwm明显的区别,20%,50%,70%,90%。
三、如何驱动电机
仅仅靠单片机的io口输出的电流来控制电机是远远不够的
51单片机io口输入电流限制在10ma左右,输出电流在10ua左右,加上拉电阻也只能达到20ma左右,这并不足以驱动需要较大电流的电机。
这个时候我们就需要使用电机驱动模块。
电机驱动模块也有很多种,一般驱动小减速电机我们可以使用L298N系列的驱动模块,如果驱动较大的减速电机我们就要使用mos管驱动。
这是我们最常用的L298N电机驱动模块,使用很简单
也有这种体积较小的L298N,但是他的使用比较严格,电压不得超过10V,安装也不是很方便,初学者不建议使用。
我们还是来看第一种体积比较大的L298N
管脚 | 功能 |
---|---|
VCC | 12V电源接口 |
GND | 接地 |
5V | 12V转5V的输出接口,单片机可以用这个5V供电 |
ENA,ENB | 调速管脚,不需要调速时短接 |
IN1-4 | 电机方向控制 |
1.电源和接地
- VCC可以使用12V航模电池或2-3节18650电池供电。
- 5V可以给单片机和其他5V设备供电。
- GND是共地,很多初学者会忘记将单片机和驱动模块共地,导致不能控制
2.方向控制管脚
in1,in2,in3,in4控制两端电机,in1和in2控制其左端输出,in3和in4控制其右端输出。
以控制左端为例,我们可以将in1和in2理解为电动势,如果in1和in2都为0或1,没有产生电势差,此时也就没有电流输出。
如果in1为0,in2为1,产生了电动势,此时输出端输出电流,可以观察电机转向,反之in1为1,in2为0,则电机与刚才相比反转。
右端同理,就是控制输出端电流方向。
3.调速管脚
如果不需要调速,那么就不用拔掉短接冒,此时调速管脚接的是高电平,也就是100%的占空比信号,电机全速转动。
如果需要调速,那么拔掉短接冒,和in1-4同排的管脚是你需要和单片机相连的管脚,此时你可以在ENA或ENB上给予pwm信号,它的速度是百分之几就等于你的占空比。
4.输出
每个L298N有两个输出,能控制两侧电机。如果我们制作四轮小车,个人还是建议使用一个L298N,一侧控制两个电机,这样可以避免因为L298N的性能问题,导致前后轮出现速度不同的现象。
5.为什么要用减速电机
减速电机内部是一个普通的马达,不同减速电机内部构造不同,但都是一个原理:
牺牲距离增加做功
其内部是减速齿轮组,夸张的说,马达转10圈时可能外部才转一圈,这样减速电机的力气更大,更重要的是这样更加容易控制速度,我们控制马达转一周很难,但我们粗略的控制它转100圈左右更加容易,所以我们控制减速电机的行驶速度和距离也就更加的容易。
四、循迹
循迹是作为智能小车的一大重点,在地上铺设白底黑线,小车就能够沿着黑线行驶,这是怎么做到的呢?
我们这里就需要使用循迹模块。
循迹模块也是需要VCC接5V,GND接地,还有两个管脚一个AO一个DO,我们使用DO管脚就可以,AO是AD输出暂时用不到。
原理:利用了在不同的颜色下红外反射强度不同,比如在白色条件下,红外线很容易就反射回来,黑色条件下,红外线会被黑色吸收而无法返回,这样就区分出了两种颜色。
蓝色电位器是用来调节检测的颜色,在比赛前的调试过程中必不可少的就是调节电位器,让其明显区分出循迹线和底板。
循迹模块的数量可以根据实际情况而定。
1.二路循迹
二路循迹比较简单,有两种编程思路。
第一种:鬼畜式纯电路循迹(自己起的名字)
不常用性能也不好,不需要芯片控制
这种循迹只需要控制左右转或者差速转向,也就是两侧车轮没有同速直线行驶的情况。
本人做的第一个循迹小车就是这种循迹方式,简答纯电路就可以驱动。
常常适用于两个后轮驱动,前方一个万向轮的三轮小车。
** 思路**:前方两个循迹模块,控制继电器即可。一旦左侧检测到黑线,证明车体方向偏右,就需要向左转,这时候左轮不动,右轮前进。一旦右侧检测到黑线,证明车体方向偏左,就需要向右转,右轮不动左轮前进。这时候我们看到的结果就是小车在左右摇摆着沿着黑线行驶。
第二种:简单二路的循迹
这是我们最常用的一种二路循迹,性能较好,适用于全部车型。
两个循迹模块之间的距离稍稍大于循迹线宽即可。
- 当左侧检测到黑线,车体左转。
- 当右侧检测到黑线,车体右转
- 当左右都没有检测到黑线时,证明黑线在两个模块之间,车体前进(暂不考虑冲出轨道的情况)
2.三路循迹
三路循迹与二路相比更加准确,一般用于直角转弯或者精度较高的情况。
和二路循迹一样,两侧模块用来检测车体偏左还是偏右,可以当中间的模块检测到黑线时才开始前进。
直角转弯时,黑线不会在两侧的模块以内,这时候就需要在黑线接近时,可用中间模块判断车体是否准确的对准了黑线。
3.直角弯循迹
有些时候我们需要走一个直角弯,这个时候我们就需要在车体两侧加装循迹模块。
两侧模块用来检测是否到达了直角弯,一旦检测到黑线,就原地转向。
4.差速行驶
循迹的过过程中,要想保证速度或经过S弯等情况下,就需要使用差速。
差速就是两侧车轮同向转动但是速度不同,这样的效果就是小车实现S形走位,也可以实现在高速行驶的情况下微调方向。
5.PID算法
比较高级的循迹可以用到PID算法,使用差速来校准方向,但这种方法比较难用。
1 | struct _pid |
五、扩展功能
1、遥控
遥控可以有很多方案:
- 蓝牙串口
- JDY-40
- nrf2401
- WIFI
用51单片机的就可以使用蓝牙和JDY-40。
蓝牙模块可以实现手机控制,手机下载蓝牙串口调试软件,和蓝牙模块配对即可。
JDY-40,可以使用另一个51芯片来控制。
注意:JDY-40供电电压严格要求3.3V,可以使用稳压芯片转换电压。
使用串口遥控时,单片机要注意更换11.0592M晶振,尽量使用9600或115200的波特率,例如JDY-40的初始波特率为9600。
如果在调试过程中出现了乱码,那么首先就要确认两个设备的波特率是否相同,以及RXD和TXD是否连接正确。
发送的数据使用十六进制即可,例如0x01。
2、舵机
舵机可以搭载超声波,摄像头等。可以在车辆上制作一个二轴云台,并实现控制。
我们比较常用的sg90,相比金属舵机肯定是微不足道,但是它的性能足以让我们做一些小型的开发。
它的控制原理和pwm调速相似,但是它的周期是固定的。
舵机驱动的周期是20ms,占空比为0.5-2.5ms,也就是0-180度。
时间(ms) | 角度 |
---|---|
0.5 | 0 |
1.0 | 45 |
1.5 | 90 |
2.0 | 135 |
2.5 | 180 |
当然它的角度是线性变化的,并非固定只有5个角度。
3、同时使用串口和定时器
这里需要将TMOD改为0X21
例:
1 | void TimeInit()//定时器和串口同时初始化 |
4、超声波避障等
可以看本站关于超声波的文章
超声波模块HC-SR04四针通用延时驱动:
https://square0097.github.io/2020/02/18/HC-SR04/
超声可以实现避障和倒车自停功能。
5、常见故障问题解决
1.在进行停车或起步等一些动作时,出现重启现象**
这里是因为电机在启动或停止瞬间电流消耗过大,引起的单片机电流不足断电,导致重启。
解决方法:在单片机的VCC和GND之间加一个电容即可,容值越大效果越好。
2.舵机运行时导致重启
同样是耗电的原因,舵机的耗电相比电机要高,所以这里建议单独为舵机供电。
解决办法:外加3.7V电池为舵机供电,注意共地。
六、END
暂时就总结这么多,希望能对大家有所帮助!