一.材料
1.51单片机开发板
2.L298N电机
3.红外循迹模块
4.直流电机
5.电池(提供电源,选用的是三节18650锂电池)
6.杜邦线
7.两个主动轮,一个万向轮
8.小车底板(亚克力板)
二.实现效果
使小车在两侧黑线内沿着环形跑道自主行驶一圈,打开开关时小车前行,左侧检测到黑线时左轮前进,右侧检测到黑线时右轮前进,两侧都检测到黑线时小车停止。
三.组装接线
1.初步组装:将直流电机、 主动轮、万向轮、电池盒接在小车底板上。每个直流电机焊接两根线,后续接到L298N两端。
2.红外模块:四路红外循迹模块的VCC、GND用杜邦线接在单片机的+5V、GND端,IN1-IN4接在单片机对应引脚上。红外发射接收器接在小车前方下端,离地距离不能过远,便于检测到黑线,执行循迹功能。
3.单片机最小系统:装入芯片(选用的是STC89C52RC),执行程序代码。用杜邦线完成单片机上引脚和红外模块、L298N、电池的接线。注意连线和程序中接口的对应。
4.L298N:L298N前面蓝色的三个接口外接电源供电用,左端接电池电源正极12V输入,右端接单片机5V接口,GND连接电池电源负极和单片机的GND接口。L298N的左右两个蓝色插口输出,接左右电机,可先焊接电机的两根线,在程序中让小车前进,若车轮转向正确,则接线正确;若车轮反向转动,可通过两根接线实现小车前进。ENA、ENB、IN1、IN2、IN3、IN4定义接口后接到单片机相应引脚上。ENA和ENB通过定时器调节输出PWM波,实现小车转弯。单片机控制IN1-IN4,来控制小车轮子的正反转。
直流电机 | 状态 | IN1(IN3) | IN2(IN4) | 使能端 |
M | 正转 | 1 | 0 | 1 |
反转 | 0 | 1 | 1 | |
停止 | 0 | 0 | 1 |
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赋值不一定相同,通过赋值尝试给与不同的数值,使小车达到直走的效果。
- 小车左右转弯时,若转速过大,可能会使小车转弯幅度过大;同理,若转速过小,可能会使小车转弯幅度过小,不能按轨迹行驶。
- 小车转弯可使一轮前行,另一轮停止实现;也可通过一轮正转,一轮反转实现。
- 左右两个红外传感器的距离,若小于两主动轮的距离,可能会导致小车循迹时压线,可通过延长传感器伸出的长度,避免小车压线。
- 红外传感器的检测距离,可通过调节传感器上的旋钮,观察检测黑线时指示灯亮灭情况,实现增大或减小检测距离的效果。