一.材料
1.51单片机开发板
2.L298N电机
3.红外循迹模块
4.直流电机
5.电池(提供电源,选用的是三节18650锂电池)
6.杜邦线
7.两个主动轮,一个万向轮
8.小车底板(亚克力板)
二.实现效果
使小车在两侧黑线内沿着环形跑道自主行驶一圈,打开开关时小车前行,左侧检测到黑线时左轮前进,右侧检测到黑线时右轮前进,两侧都检测到黑线时小车停止。
三.组装接线
1.初步组装:将直流电机、 主动轮、万向轮、电池盒接在小车底板上。每个直流电机焊接两根线,后续接到L298N两端。
2.红外模块:四路红外循迹模块的VCC、GND用杜邦线接在单片机的+5V、GND端,IN1-IN4接在单片机对应引脚上。红外发射接收器接在小车前方下端,离地距离不能过远,便于检测到黑线,执行循迹功能。
3.单片机最小系统:装入芯片,执行程序代码。用杜邦线完成单片机上引脚和红外模块、L298N、电池的接线。注意连线和程序中接口的对应。
4.L298N:L298N前面蓝色的三个接口外接电源供电用,左端接电池电源正极12V输入,右端接单片机5V接口,GND连接电池电源负极和单片机的GND接口。L298N的左右两个蓝色插口输出,接左右电机,可先焊接电机的两根线,在程序中让小车前进,若车轮转向正确,则接线正确;若车轮反向转动,可通过两根接线实现小车前进。ENA、ENB、IN1、IN2、IN3、IN4定义接口后接到单片机相应引脚上。ENA和ENB通过定时器调节输出PWM波,实现小车转弯。单片机控制IN1-IN4,来控制小车轮子的正反转。
5.组装接线成果图
四。工作原理
1.PWM调速
(1)PWM:脉冲宽度调制,PWM波形如下所示。
(2)占空比:指高电平在一个周期中所占比例。对于单片机小车直流电机的调速,可以通过定时器设置定时初值,在中断服务函数中对占空比进行调整,从而实现电机的转速控制。
2.红外循迹
模块正式连接后,传感器开始工作。传感器有两个检测灯,一个灯用于发射光,另一个灯用于检测反射光的强度来判断是否检测到黑线。如果检测到黑线,黑色对光线的反射较弱,红外光无法反射回来,则模块指示灯熄灭,输出高电平(1)。未检测到黑线时,传感器发射出的红外光大部分被反射回来,模块感应到传感器反射回来的红外光,指示灯亮,输出低电平(0)。
五.程序编写
1.开头头文件、位定义
#include <reg51.h>
sbit IN1=P1^2;
sbit IN2=P1^3;
sbit IN3=P1^4;
sbit IN4=P1^5;
sbit ENA=P1^0;//左边两个电机使能
sbit ENB=P1^1;//右边两个电机使能
sbit lse1=P2^1;//左边红外传感器的数据口
sbit lse2=P2^2;//右边红外传感器的数据口
unsigned char mot1=0;//定义左轮
unsigned char mot2=0;//定义右轮
int t = 0;
2.小车状态控制函数
void run(void) //小车前进
{
mot1=13;
mot2=13;
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
void stop(void) //小车停止
{
mot1=0;
mot2=0;
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
void leftrun(void) //小车右转
{
mot1=15;
mot2=0;
IN1=1;
IN2=0;
IN3=0;
IN4=0;
}
void rightrun(void) //小车左转
{
mot1=0;
mot2=15;
IN1=0;
IN2=0;
IN3=1;
IN4=0;
}
3.定时器中断函数
void PIT_Init()
{
EA=1; //打开总中断
TMOD |=0x01;
TL0=0xA4; //设置定时初值
TH0=0xFF; //设置定时初值
ET0=1; //打开定时器中断允许
TR0=1; //打开定时器
}
void timer()interrupt 1//interrrupt
{
TL0 = 0xA4; //设置定时初值
TH0 = 0xFF; //设置定时初值
if(t<mot1)
{
ENA = 1;
}
else
{
ENA = 0;
}
if(t<mot2)
{
ENB = 1;
}
else
{
ENB = 0;
}
t=(t+1)%100;
}
4.延时函数
延时函数,可以用单片机辅助软件(stc-isp),设定时间直接生成。
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
{
for(y=0;y<2000;y++);
}
}
5.循迹模块
void xunji()
{
unsigned char flag; //用于循迹方向的判断
if((lse1==1)&&(lse2==0))
{
flag=0; //左边检测到黑线
}
else if((lse1==0)&&(lse2==1))
{
flag=1; //右边检测到黑线
}
else if((lse1==1)&&(lse2==1))
{
flag=3; //两边检测到黑线
}
else
{
flag=4;
}
switch(flag)
{
case 0:leftrun(); break;
case 1:rightrun();break;
case 3:stop();break;
case 4:run();break;
}
}
6.主函数
void main()
{
PIT_Init();
mot1=13;
mot2=13;
IN1=1;
IN2=0;
IN3=1;
IN4=0;
while(1)
{
xunji() ;
}
}
六.注意事项
小车直走时,左右两轮mot赋值不一定相同,通过赋值尝试给与不同的数值,使小车达到直走的效果。
小车左右转弯时,若转速过大,可能会使小车转弯幅度过大;同理,若转速过小,可能会使小车转弯幅度过小,不能按轨迹行驶。
小车转弯可使一轮前行,另一轮停止实现;也可通过一轮正转,一轮反转实现。
左右两个红外传感器的距离,若小于两主动轮的距离,可能会导致小车循迹时压线,可通过延长传感器伸出的长度,避免小车压线。
红外传感器的检测距离,可通过调节传感器上的旋钮,观察检测黑线时指示灯亮灭情况,实现增大或减小检测距离的效果。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_62130844/article/details/122136640
|