51循迹小车
材料:
1.两个亚克力板
2.4个轮子
3.4个电机
4.51最小系统
5.2个L298N
6.两个红外对管
7.杜邦线
第一步
按图所示将电机,轮子,亚克力板安装好
第二步
了解学习并安装L298N模块
L298N模块的样式有很多种但是性质都是一样的,它的作用是驱动电机 他所需的电源电压需要7V到12V效果甚佳,需要注意的是电压在5v左右或者更小是驱动不了电机的电压太大车速过快容易出轨然后是连线L298N上写MOTORA/B,或者写OUT的为连接电机的口,对于电机的正负极不同的接入可以用来调整电机的转向
(可以当作调整轮子转向的物理方法),板子上写ENA ENB为使能接口连接程序中设定的IO口,IN1,IN2,IN3,IN4同样连接程序中设定的IO口,L298N上5V连接单片机上的VCC即可,L298N上VMS(+极),GND(-极)连接7V左右电压的电源
作者用的是差速转弯,所以L298N接的是同一侧的轮子。
第三步
了解学习并安装红外对管,红外对管三个管口 ,一个为输出信号连接程序定义的IO口即可,另外两个为正负极连接单片机的5V,GND即可,红外对管的灵敏度可以通过拧类似螺母的东西调节
工作原理
一个管口发射红外线,另一个接受红外线。此时为高电平状态,当沿着黑色胶布循迹时由于红外线有部分被黑胶布吸收导致此时为低电平。当然,有时也会受到白炽灯中的红外线干扰。只是这种影响是微乎其微的。使用时对管垂直于地面并2~3cm处。
最后连接的成品
再强调一下供电啊(方法不唯一)俺滴是单片机用5V,L298N用7V往上的,不要太大啊。作者大大在L298N供电那加了个DC电源模块(方法不唯一,可以自己焊一个供电的电路板如下图所示)
在这奉上作者大大的代码
#include "reg52.h"
sbit in1 = P1^2;
sbit in2 = P1^3;
sbit in3 = P1^4;
sbit in4 = P1^5;
sbit in5 = P2^2;
sbit in6 = P2^3;
sbit in7 = P2^4;
sbit in8 = P2^5;
sbit ENA = P1^0;//左边两个电机的使能
sbit ENB = P1^1;//右边两个电机的使能 矢能端为1控制电机转动
sbit ena = P2^0;//左边两个电机的使能 矢能端为0电机不转
sbit enb = P2^1;//右边两个电机的使能
sbit lse1 = P3^0;//左边红外传感器的数据口
sbit lse2 = P3^1;//右边红外传感器的数据口
typedef unsigned char u8;
typedef unsigned int u16;
void delay(u16 i)
{
while(i--);
}
void go()
{
ENA=1;
ENB=1;
ena=1;
enb=1;
in1 = 1;
in2 = 0;
in3 = 1;
in4 = 0;
in5 = 1;
in6 = 0;
in7 = 1;
in8 = 0;
}
void ting()
{
in1 = 0;
in2 = 0;
in3 = 0;
in4 = 0;
in5 = 0;
in6 = 0;
in7 = 0;
in8 = 0;
}
void zuozhuan(void)
{
ENA=1;
ENB=1;
ena=1;
enb=1;
in1 = 1;
in2 = 0;
in3 = 1;
in4 = 0;
in5 = 0;
in6 = 1;
in7 = 0;
in8 = 1;
}
void youzhuan(void)
{
ENA=1;
ENB=1;
ena=1;
enb=1;
in1 = 0;
in2 = 1;
in3 = 0;
in4 = 1;
in5 = 1;
in6 = 0;
in7 = 1;
in8 = 0;
}
void xj()
{
unsigned char count;
if((lse1==0)&&(lse2==1))
{
count = 0;//左边检测到黑线
}
else if((lse1==1)&&(lse2==0))
{
count = 1;//右边检测到黑线
}
else if((lse1==1)&&(lse2==1))
{
count = 3;
}
else if(lse1==0&&lse2==0)
{
count = 4;
}
switch(count)
{
case 0:
ting();
delay(50);
zuozhuan();
delay(20);
break;
case 1:
ting();
delay(40);
youzhuan();
delay(20);
break;
case 3:
ting();
delay(40);
go();
delay(20);
break;
case 4:
ting();
delay(40);
go();
delay(15);
break;
}
}
void main()
{
while(1)
{
xj() ;
}
}
最最最后,你们做完之后可能出现一个轮子转,电机有声音但是不转,不能循迹等等一系列不良反应。这就需要在座的各位去想一想,硬件工程师需要积累。
祝各位好运!