基于51的智能小车(蓝牙、循迹)

本文详细介绍了如何设计一款具备蓝牙控制和红外循迹功能的小车。硬件包括STC89C52单片机、L298N电机驱动模块、红外循迹模块和蓝牙模块。通过单片机控制电机的正反转和速度,利用PWM调速,红外传感器检测路线,蓝牙模块实现远程控制。代码实现了小车的前进、后退、转弯和停止等功能。
摘要由CSDN通过智能技术生成

文章目录

    • 基本概述
      • 硬件组成
      • 功能概述
      • 原理图
    • 模块介绍
      • 单片机控制模块
      • L298N电机驱动模块
      • 红外循迹模块
      • 蓝牙模块
      • 电源和小车车体
    • 小车功能实现及代码介绍

一、基本概述

硬件组成整个系统包括单片机控制模块,L298N电机驱动模块、循迹模块、蓝牙模块、电源和小车车体

功能介绍小车的拥有两种功能模式,小车循迹模式蓝牙控制模式,通过拨动开关给给选择小车的两种模式

原理图

 ​​​​​​

pcb:

二、模块介绍

1.单片机控制模块 

        该小车使用STC89C52芯片作为驱动,利用了该单片机内部的三个定时器,一个UART串口通信还有若干个I/O口等。

2.L298N电机驱动模块

        

L298N就是L298的立式封装,源自意法半导体集团旗下品牌产品,是一款可接受高电压、大电流双路全桥式电机驱动芯片,工作电压可达46V,输出电流最高可至4A,采用Multiwatt 15脚封装,接受标准TTL逻辑电平信号,具有两个使能控制端,在不受输入信号影响的情况下通过板载跳帽插拔的方式,动态调整电路运作方式,有一个逻辑电源输入端,通过内置的稳压芯片78MO5,使内部逻辑电路部分在低电压下工作,也可以对外输出逻辑电压5V,为了避免稳压芯片损坏,当使用大于12V驱动电压时,务必使用外置的5V接口独立供电

L298N通过控制主控芯片上的I/O输入端,直接通过电源来调节输出电压,即可实现电机的正转、反转、停止,由于电路简单,使用方便,通常情况下L298N可直接驱动继电器(四路)、螺线管、电磁阀、直流电机(两台)以及步进电机(一台两相或四相)。

使用:右上角输入12,34分别接入单片机I\O口,通过I/O口给予不同高低电平驱动电机转向,A、B使能端控制输通过A、B端的开关,通道A、B分别接入两个电机的各自两条引线。

使用A、B使能时,需要插入跳线帽。

PWM:

PWM Pulse Width Modulation )即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域
PWM 重要参数:

     频率 = 1 / TS            占空比 = TON / TS           精度 = 占空比变化步距

                      

PWM原理

以STM32单片机为例,其IO口只能输出高电平和低电平。

假设高电平为5V、低电平则为0V,那么要输出不同的模拟电压就要用到PWM。通过改变IO口输出的方波的占空比,从而获得使用数字信号模拟成的模拟电压信号。

电压是以一种脉冲序列被加到模拟负载上去的,接通时是高电平1,断开时是低电平0。接通时直流供电输出,断开时直流供电断开。通过对接通和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值5V的模拟电压。

比方说,占空比为50%那就是高电平时间一半,低电平时间一半。在一定的频率下,就可以得到模拟的2.5V输出电压。那么75%的占空比,得到的电压就是3.75V,如下图所示。

也就是说,在一定的频率下,通过不同的占空比即可得到不同大小的输出模拟电压,PWM就是通过这种原理实现数字模拟信号转换的。

PWM对电机转速的控制

调节占空比可以实现不同电压的输出,实现对电机转速的调节。

对于直流电机来讲,电机输出端引脚是高电平电机就可以转动,当输出端高电平时,电机会转动,但是是一点一点的提速,在高电平突然转向低电平时,电机由于电感有防止电流突变的作用是不会停止的,会保持这原有的转速,以此往复,电机的转速就是周期内输出的平均电压值,所以实质上我们调速是将电机处于一种,似停非停,似全速转动又非全速转动的状态,那么在一个周期的平均速度就是我们占空比调出来的速度了。

在电机控制中,电压越大,电机转速越快,而通过PWM输出不同的模拟电压,便可以使电机达到不同的输出转速。

当然,在电机控制中,不同的电机都有其适应的频率 频率太低会导致运动不稳定,如果频率刚好在人耳听觉范围,有时还会听到呼啸声。频率太高时,电机可能反应不过来,正常的电机频率在 6-16kHZ之间为好。

3.红外循迹

                                                                     

TCRT5000传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态;总结就是:

没反射——D0输出高电平——灭灯

反射——D0输出低电平——点亮

接线

1VCC:接电源正极(3-5V)

2GND:接电源负极

3D0TTL开关信号输出

4A0:模拟信号输出

AI和AO的讲解

(1)AI信号:模拟量输入

所谓模拟量即4-20mA或0-10V的电流或电压信号,输入到DCS中,经过变换,还原出原来的值,比如电流值到DCS中显示出来;电流互感器二次值(5A)经过电流变送器转换成4-20mA信号(5A对应20mA),输入到DCS机柜,经过转换,在DCS中显示实际的电流值。

(2)AO信号:模拟量输出

和AI相反,AO是DCS输出4-20mA或0-10V信号,去控制设备的运行参数;比如,变频器的速度控制过程,以40HZ为例,通过远程DCS控制,认为给定参数值:40HZ,DCS同样发出一个对应的模拟量电流值,在4-20mA范围内(20mA对应50HZ),信号传入到变频器的控制器,变频器按照要求运行在40HZ。

4.蓝牙模块

蓝牙通信:蓝牙小车通过蓝牙模块与控制设备——手机,进行无线通信。

控制信号传输:蓝牙模块接入51单片机的TXRX口,手机通过蓝牙串口连接发送指令数字给蓝牙小车。

数据解析与处理:蓝牙接收到控制设备发送的指令后,会通过蓝牙模块接收并解析这些数据。然后,根据指令的内容进行相应的动作,控制电机驱动轮子前进或后退。

电机驱动:小车接收到指令后控制,电机和驱动电路,用于控制车轮的转动。根据接收到的指令,电机驱动电路会控制电机的转速和方向,从而实现小车的运动。

      

       

*RXD: 接收端

*TXD: 发送端

*VCC: 模块供电正极(5V)

*GND: 模块供电负极

AT EN:在配置蓝牙模块时接上蓝牙下载口

5.小车车体及电源

该小车使用的二驱的车体,使用两组电池给小车整体供电,一组电池用于给L298N电机驱动来对电机进行驱动,另一组用于其他vcc、gnd供电,两组电池均为12v

三、小车功能实现及代码介绍

代码中P0_4口的为1还是为0由接入的vcc或gnd决定。

//#Car.h
#ifndef __CAR_H__
#define __CAR_H__
void Timer0Init(void);
//void Timer1Init(void)	;
void Timer2Init(void);
void goLeftForward();
void goLeftStop();
void goRightForward();
void goRightStop();
void goForward();
void goStop();
void goLeft();
void goRight();

#endif

//#Car.c  小车车轮转动

#include <REGX52.H>
sfr AUXR = 0x8E;
sbit left_con1A = P1^1;
sbit left_con2A = P1^2;
sbit right_con1A = P1^4;
sbit right_con2A = P1^3;

char leftSpeed;
char rightSpeed;
int cntLeft = 0;
int cntRight = 0;

void Timer0Init(void)		//@11.0592MHz
{
	AUXR &= 0x7F;		
	TMOD &= 0xF0;		
	TMOD |= 0x01;		
	TL0 = 0x66;		
	TH0 = 0xFC;		
	TF0 = 0;		
	TR0 = 1;		
	ET0 = 1;
	EA  = 1;
}
 
void Timer2Init(void)		//1毫秒@11.0592MHz
{
	T2MOD = 0;		//初始化模式寄存器
	T2CON = 0;		//初始化控制寄存器
	TL2 = 0x66;		//设置定时初值
	TH2 = 0xFC;		//设置定时初值
	RCAP2L = 0x66;		//设置定时重载值
	RCAP2H = 0xFC;		//设置定时重载值
	TR2 = 1;		//定时器2开始计时
	ET2=1;
	EA=1;
}

void goLeftForward()//左边前进
{
	left_con1A = 1;
	left_con2A = 0;
}
 

void goLeftStop()//左边停止
{
	left_con1A = 0;
	left_con2A = 0;
}
 
//?????
void goRightForward()//右边前进 
{
	right_con1A = 1;	
	right_con2A = 0;
}
 
//?????
void goRightStop()//右边停止 
{
	right_con1A = 0;	
	right_con2A = 0;
}
 
//??
void goForward()//前进 
{
	leftSpeed = 18;
	rightSpeed = 19;
}
 
//??
void goStop()//停止 
{
	leftSpeed = 0;
	rightSpeed = 0;
}
 
//??
void goLeft()//左转 
{
	leftSpeed = 5;
	rightSpeed = 18;
}
 
//??
void goRight()//右转 
{
	leftSpeed = 18;
	rightSpeed = 5;
}

void Time0Handler() interrupt 1//左边电机调速
{
	cntLeft++;
	TL0 = 0x66;		
	TH0 = 0xFC;
	if(cntLeft == 20){
		cntLeft = 0;
	}

	//左边占空比
	if(cntLeft < leftSpeed)
	{
		goLeftForward();
	}else{
		goLeftStop();
	}

	
}
 


void Timer2_Routine() interrupt 5  //右边电机调速
{
	cntRight++;
	if(cntRight < rightSpeed)
	{
		goRightForward();
	}else{
		goRightStop();
	}
	if(cntRight == 20){
		cntRight = 0;
	}
}

//#Uath.h

#ifndef __UART_H__
#define __UART_H__ 
void Uart_Init();
void receive();
#endif

//#Uath.c  蓝牙模式

#include <REGX52.H>
#include "car.h"
unsigned char receiveData;

 void Uart_Init()
 {
 		/*波特率设置*/
	TMOD = 0x20;//设置定时器T1的工作方式-2,即8位自动装填定时器
	TH1 = 0xFD;//波特率为9600
	TL1 = 0xFD;	
	TR1 = 1;//打开定时器T1
	/*串口设置*/
	SM0 = 0;//设置串口工作方式1
	SM1 = 1;
	REN = 1;//使能串口接收允许位
	ES  = 1;//使能串行中断允许位
	EA  = 1;//使能中断允许位
 }
 
void receive()//执行蓝牙控制函数
{
	Uart_Init();
 while(1)
 { 
		switch(receiveData)
		{
			case '2':
				goForward();
				break;
			
			case '4':
				goLeft();
				break;
			
			case '6':
				goRight();
				break;
			case '8':
				goStop();
		}
	}
}
	
	void Uart_Routine() interrupt 4
{
	if(RI==1)
	{	
		goStop();
		RI=0;
		receiveData=SBUF;
	}
	SBUF=receiveData;
	while(!TI);
		TI=0;
	 
}

//#main.c

#include <REGX52.H>
#include "car.h"
#include "Uart.h"
sbit tracingLeft = P1^5;
sbit tracingRight = P1^6;
 unsigned char keynum;
void tracingMode()//红外循迹模式
{	
	if(tracingLeft == 0 && tracingRight == 0)
	{
		goForward();		
	}
 
	if(tracingLeft == 0 && tracingRight == 1)
		{
		goRight();
		}
 
	if(tracingLeft == 1 && tracingRight == 0)
		{
		goLeft();
		}
 
	if(tracingLeft == 1 && tracingRight == 1)
		{
		goStop();
	}
}

void main()
{
	Timer0Init();
	Timer2Init();
	

	while(1)
	{

		if(P0_4==1)	//手机遥控模式 
		{
			
			receive();
		}

		else if(P0_4==0)//红外循迹模式
		{
			tracingMode();
		} 
		
	}
}

  • 9
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曾大侠.ccc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值