打印
[经验分享]

51单片机循迹小车

[复制链接]
195|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-12-10 09:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一.材料

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2007

主题

15840

帖子

13

粉丝