一、遇到的问题及解决方案
Q1:马达与车盘连接不牢固。
A:可用橡皮筋缠紧连接处(如图)。
Q2:L298N电机驱动模块无法驱动电机。
A:若是仅仅连接了一个EN引脚则可能需要对ENA(或B)的两个引脚输入同样的电平。
Q3:测试蓝牙时无法将程序烧录到单片机上。
A:蓝牙模块的收发口与单片机的收发口(P3_0 P3_1)不能连接。
Q4:通过蓝牙发送数据小车无法接收。
A:注意是蓝牙的发送端连接单片机的接收端,接收端连接发送端。
Q5:程序无法烧录到单片机。
A:勾选图示绿色打钩项,慎勾,原因未知,本人靠此解决问题,不了解是否存在隐患。也有可能是串口号选择错误。
Q6:想将PWM调速、超声波避障、蓝牙通信同时使用在小车上。
A:使用3个定时器,可利用定时器2中断实现PWM调速,定时器1实现串口(蓝牙)通信,定时器0实现超声波避障。
Q7:小车走直线走不直。
A:无法仅仅依靠上述模块完美解决(猜测需要测速然后用PID?控制轮子PWM波以控制转速来使小车走直线。)
此外也可尝试更改左右电机PWM波改善此问题但效果并不理想。
Q8:蓝牙控制有明显延迟。
A:蓝牙模块质量过低或手机蓝牙传输速度慢。前者可更换蓝牙模块,后者可换个手机确认是否是手机问题。
二、步骤心得
1.前备知识
寻迹模块
简介:TCRT5000传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态。
接线
1、VCC:接电源正极(3-5V)
2、GND:接电源负极
3、D0:TTL开关信号输出
4、A0:不接
L289N
引脚:
- IN1, IN2, IN3, IN4: 输入控制引脚,控制电机的转动方向。
- ENA, ENB: 使能引脚,用于启动和停止电机。
- OUT1, OUT2, OUT3, OUT4: 输出引脚,连接到电机端子。
- VSS: 逻辑电压供应引脚。
- VS: 电机电压供应引脚。
- GND: 地引脚。
接线:
- 12V供电接上7-12V电压,供电GND处与单片机共地即可,5V供电处会输出一个5V的电压,可以用于给单片机供电。
控制逻辑:
由图可知:
启动电机1:使能引脚ENA设置为高电平
停止电机1:使能引脚ENA设置为低电平
IN1高电平,IN2低电平:电机1正转
IN1低电平,IN2高电平:电机1反转
若想要控制电机转速则需要PWM调速
PWM
使定时器在0-99循环自增,通过设置一个比较值,若计数值小于比较值则输出高电平,大于情况以此类推。
//前略
void Back()
{
CompareA=35;
CompareB=30;
Z=0;Y=1;
IN3=0;IN4=1;
}
void Timer2_Routine() interrupt 5
{
TF2=0;
RCAP2L= 0x9C;
RCAP2H = 0xFF;
CounterA++;
CounterA%=100;
CounterB++;
CounterB%=100;
if(CounterA<CompareA)
{
ENA1=1;
ENA2=1;
}
else
{
ENA1=0;
ENA2=0;
}
if(CounterB<CompareB)
{
ENB1=1;
ENB2=1;
}
else
{
ENB1=0;
ENB2=0;
}
}
超声波(HC-SR04)
HC-SR04参数:
- 工作电压:DC5V
- 静态电流:小于2mA
- 电平信号输出:高5V ,低0V
- 感应角度:不大于15度
- 探测距离:2cm-450cm
工作原理:
(1)采用IO触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.
(4)单片机将得到的数据进行处理计算,公式如下
测试距离 = (高电平时间 * 声速(340M / S)) /2
//前略
void T0_Init()
{
TMOD&=0xF0;
TMOD|=0x01;
TH0=0;
TL0=0;
}
void UT_Init()
{
Echo=0;
Trig=0;
T0_Init();
}
void UT_triggr()
{
Trig=1;
Delay10us(2);
Trig=0;
}
unsigned int measure()
{
unsigned int a,distance;
while(Echo==0);
TR0=1;
while(Echo);
TR0=0;
a=TH0*256+TL0;
TH0=0;
TL0=0;
distance= a*1.7/100;
return distance;
}
蓝牙模块(HC-05):
接线:
#include <REGX52.H>
void UART_Init()
{
SCON=0xD0;
PCON &= 0x7F;
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1;
ES=1;
}
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);
TI=0;
}
void UART_Routine() interrupt 4
{
if(RI==1)
{
//语句
RI=0;
}
}
文末附有参考文章链接,可点击链接详细了解。
2、宏观思路
定义一个“turn”函数将其放入死循环中,motor使用定时器中断确保时刻具有动力,蓝牙通讯使用串口中断确保可以顺利切换模式。
代码如下:
//前引用头文件、配置引脚略
void turn()
{
if(mode==1) //超声波避障模式
{
UT_triggr();
dis=measure();
if(dis<=30) GoRight();
if(dis>=30) GoForward();
}
else if(mode==0) //寻迹模式
{
if(LeftSersor == 0 && RightSersor == 0) GoForward(); //直行
//以此类推
}
else if(mode==2) //独立控制前进
{
GoForward();
}
//中略 独立控制行进方向
else Stop(); //停止
}
void main()
{
UART_Init(); //串口初始化
Timer2_Init();
mode=7; //初始模式为停止模式
while(1) turn();
}
void UART_Routine() interrupt 4
{
if(RI==1) //如果接收标志位为1,接收到了数据
{
switch(SBUF)
{
case 0x11:mode=0;break;
//发送16进制数对应模式略
default :Stop();
}
UART_SendByte(SBUF); //将受到的数据发回串口
RI=0; //接收标志位清0
}
}
三、视频
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="MVv88AdZ-1730351483540" src="https://live.csdn.net/v/embed/431944"></iframe>蓝牙小车
参考文章:
【超详细】C51单片机与HC-05蓝牙模块实现手机点灯_c51蓝牙hc05-CSDN博客
声明:此文章仅是作者对51蓝牙小车开发经验的分享,若读者使用本人建议后出现任何问题应由读者自己承担。
标签:定时器,引脚,蓝牙,void,高电平,51,单片机 From: https://blog.csdn.net/2401_87428048/article/details/143371861