51智能车入门

在刚接触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。

#include "reg52.h"
#include "intrins.h"
sbit out1=P2^0;
sbit out2=P2^1;
sbit out3=P2^2;
sbit out4=P2^3;//四个输出

int n,speed1,speed2,speed3,speed4;
void InitTimer0(void)//定时器初始化,这里设定了1ms定时
{
    TMOD = 0x01;
    TH0 = 0x0FC;
    TL0 = 0x18;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

void main()
{
	InitTimer0();	
	while(1)
	{
		speed1=20;
		speed2=50;
		speed3=70;
		speed4=90;//设定四个输出的占空比
	}
}


void Timer0Interrupt(void) interrupt 1
{
    TH0 = 0x0FC;
    TL0 = 0x18;
    n++;
	if(n==100)//设定周期100ms
		n=0;
	if(n<speed1)
		out1=1;
	else
		out1=0;
	if(n<speed2)
		out2=1;
	else
		out2=0;
	if(n<speed3)
		out3=1;
	else
		out3=0;
	if(n<speed4)
		out4=1;
	else
		out4=0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-97xbzC7G-1591437204971)(https://s1.ax1x.com/2020/03/20/8cWvZV.jpg)]
这里我们可以看到四个输出pwm明显的区别,20%,50%,70%,90%。

三、如何驱动电机

仅仅靠单片机的io口输出的电流来控制电机是远远不够的

51单片机io口输入电流限制在10ma左右,输出电流在10ua左右,加上拉电阻也只能达到20ma左右,这并不足以驱动需要较大电流的电机。

这个时候我们就需要使用电机驱动模块。

电机驱动模块也有很多种,一般驱动小减速电机我们可以使用L298N系列的驱动模块,如果驱动较大的减速电机我们就要使用mos管驱动。

这是我们最常用的L298N电机驱动模块,使用很简单
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XF3BP6Xt-1591437204977)(https://s1.ax1x.com/2020/03/20/8cW7GQ.jpg)]

也有这种体积较小的L298N,但是他的使用比较严格,电压不得超过10V,安装也不是很方便,初学者不建议使用。

我们还是来看第一种体积比较大的L298N

管脚功能
VCC12V电源接口
GND接地
5V12V转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.二路循迹

二路循迹比较简单,有两种编程思路。

第一种:鬼畜式纯电路循迹(自己起的名字)

不常用性能也不好,不需要芯片控制

这种循迹只需要控制左右转或者差速转向,也就是两侧车轮没有同速直线行驶的情况。
本人做的第一个循迹小车就是这种循迹方式,简答纯电路就可以驱动。

常常适用于两个后轮驱动,前方一个万向轮的三轮小车。

** 思路**:前方两个循迹模块,控制继电器即可。一旦左侧检测到黑线,证明车体方向偏右,就需要向左转,这时候左轮不动,右轮前进。一旦右侧检测到黑线,证明车体方向偏左,就需要向右转,右轮不动左轮前进。这时候我们看到的结果就是小车在左右摇摆着沿着黑线行驶。

第二种:简单二路的循迹

这是我们最常用的一种二路循迹,性能较好,适用于全部车型。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3PnzUicw-1591437204987)(https://s1.ax1x.com/2020/03/20/8cfks1.jpg)]
两个循迹模块之间的距离稍稍大于循迹线宽即可。

  • 当左侧检测到黑线,车体左转。
  • 当右侧检测到黑线,车体右转
  • 当左右都没有检测到黑线时,证明黑线在两个模块之间,车体前进(暂不考虑冲出轨道的情况)
2.三路循迹

三路循迹与二路相比更加准确,一般用于直角转弯或者精度较高的情况。
和二路循迹一样,两侧模块用来检测车体偏左还是偏右,可以当中间的模块检测到黑线时才开始前进。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NiY40c4N-1591437204990)(https://s1.ax1x.com/2020/03/20/8cfCRJ.jpg)]

直角转弯时,黑线不会在两侧的模块以内,这时候就需要在黑线接近时,可用中间模块判断车体是否准确的对准了黑线。

3.直角弯循迹

有些时候我们需要走一个直角弯,这个时候我们就需要在车体两侧加装循迹模块。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u2cQryQl-1591437204993)(https://s1.ax1x.com/2020/03/20/8cf9G4.jpg)]
两侧模块用来检测是否到达了直角弯,一旦检测到黑线,就原地转向。

4.差速行驶

循迹的过过程中,要想保证速度或经过S弯等情况下,就需要使用差速。

差速就是两侧车轮同向转动但是速度不同,这样的效果就是小车实现S形走位,也可以实现在高速行驶的情况下微调方向。

5.PID算法

比较高级的循迹可以用到PID算法,使用差速来校准方向,但这种方法比较难用。

struct _pid 
{
	float ExpectedValue;//定义设定值
	float ActualValue;//定义实际值
	float err;//定义偏差值
	float err_last;//定义上一个偏差值
	float err_prev;//定义前一个的偏差值
	float Kp, Ki, Kd;//定义比例、积分、微分系数
}pid;
 
void PID_Init()
{
	pid.ExpectedValue = 0.0;
	pid.ActualValue = 0.0;
	pid.err = 0.0;
	pid.err_prev = 0.0;
	pid.err_last = 0.0;
	pid.Kp = 0.4;
	pid.Ki = 0.2;
	pid.Kd = 0.0;
}
 
float PID_Realize(float speed) {
	float index;
	pid.ExpectedValue = speed;
	pid.err = pid.ExpectedValue - pid.ActualValue;
	//增量式pid公式
	float incrementValue = pid.Kp*(pid.err - pid.err_last) + pid.Ki*pid.err + pid.Kd*(pid.err - 2 * pid.err_last + pid.err_prev);
	pid.ActualValue += incrementValue;
	pid.err_prev = pid.err_last;
	pid.err_last = pid.err;
	return pid.ActualValue;
}

五、扩展功能

1、遥控

遥控可以有很多方案:

  • 蓝牙串口
  • JDY-40
  • nrf2401
  • WIFI

用51单片机的就可以使用蓝牙和JDY-40。

蓝牙模块可以实现手机控制,手机下载蓝牙串口调试软件,和蓝牙模块配对即可。

JDY-40,可以使用另一个51芯片来控制。

注意:JDY-40供电电压严格要求3.3V,可以使用稳压芯片转换电压。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-abMLf5Fv-1591437204996)(https://s1.ax1x.com/2020/03/20/8cfVZ6.jpg)]
使用串口遥控时,单片机要注意更换11.0592M晶振,尽量使用9600或115200的波特率,例如JDY-40的初始波特率为9600。
如果在调试过程中出现了乱码,那么首先就要确认两个设备的波特率是否相同,以及RXDTXD是否连接正确。

发送的数据使用十六进制即可,例如0x01。

2、舵机

舵机可以搭载超声波,摄像头等。可以在车辆上制作一个二轴云台,并实现控制。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yx9w5Jne-1591437205000)(https://s1.ax1x.com/2020/03/20/8cfZdK.jpg)]

我们比较常用的sg90,相比金属舵机肯定是微不足道,但是它的性能足以让我们做一些小型的开发。

它的控制原理和pwm调速相似,但是它的周期是固定的。

舵机驱动的周期是20ms占空比为0.5-2.5ms,也就是0-180度。

时间(ms)角度
0.50
1.045
1.590
2.0135
2.5180

当然它的角度是线性变化的,并非固定只有5个角度。

3、同时使用串口和定时器

这里需要将TMOD改为0X21

例:

void TimeInit()//定时器和串口同时初始化
{
	SCON=0X50;		
	TMOD|=0X21;		
	PCON=0X80;			
	TH1 = 0xF3;
    TL1 = TH1;
    TR1=1;	
    TH0 = 0x0FF;
    TL0 = 0x9C;
    ET0 = 1;
    TR0 = 1;
	ES=1;					
	EA=1;						
}
4、超声波避障等

通过时序编写的驱动程序,比较懒没用定时器https://square0097.github.io/2020/02/18/HC-SR04/

超声可以实现避障和倒车自停功能。

5、常见故障问题解决
1.在进行停车或起步等一些动作时,出现重启现象**

这里是因为电机在启动或停止瞬间电流消耗过大,引起的单片机电流不足断电,导致重启。

解决方法:在单片机的VCC和GND之间加一个电容即可,容值越大效果越好。

2.舵机运行时导致重启

同样是耗电的原因,舵机的耗电相比电机要高,所以这里建议单独为舵机供电。

解决办法:外加3.7V电池为舵机供电,注意共地。

六、END

暂时就总结这么多,希望能对大家有所帮助!

  • 6
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值