IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于51单片机的蓝牙循迹小车 -> 正文阅读

[嵌入式]基于51单片机的蓝牙循迹小车

51单片机课程设计做了辆蓝牙小车,下面是对课程设计内容的一些总结

硬件模块

L298N

具体如图所示:
在这里插入图片描述

工作原理

简介:可以直接驱动两路 3-16V 直流电机,并提供了 5V 输出接口(输入最低只要 6V),可以给 5V 单片机电路系统供电。
输入电压最好是7v以上,输入电压低了会导致一系列问题,在后面有具体实践总结
具体应用:可以方便的控制直流电机速度和方向,也可以控制 2 相步进电机,5 线 4 相步进电机。

管脚应用可以参考如图所示:
在这里插入图片描述
①板载5V输出使能:
如果跳线帽接上,则5v端子可以输出电压,若跳线帽没有街上,则12v输入端子没有作用,只能5v输入口输入(如果不接上直接废了,5v输入基本不能使电机模块正常工作
②AB通道使能:
端子接在上面表示AB通道一直保持高电平,处于使能状态,并且电压和5v输入端口电压相同;若处于没有使能状态,直接影响到输入端,让其无法工作!
③单片机IO控制输入 + 马达AB输出 :
顾名思义,四个IO输入端口和单片机四个IO口相连,然后通过电机驱动模块(双H桥电路)马达AB输出,以获得更大的驱动直流减速电机的能力,带动电机转动!
B站直接搜L298N电机驱动模块,有视频详情介绍

问题以及解决方案

下面是一些使用L298N驱动电机的一些问题以及解决方法总结
问题:1.直流减速电机不能正常转动,一个轮子只能单方向转动
2.使能端口帽摘下来后,pwm信号输入问题
3.供电问题
解决:1.起初用4节南孚电池供电,用万用表测电压小于4.8v(电池快没啥电了),更换四节电池后用万用表测得4.9v+,上面出现的问题解决了
2.输入端电压小于7v(用得四节南孚电池6v不到供电),使能电压和5v输入端子的电压相同,经测量5v端口电压只有3.8v左右,故使能电压就只有3.8v左右了,对PWM输出使能有一定影响
3.L298N电机驱动中有稳压降压模块,如果供电足够大(大于7v),那么稳压降压模块会发挥作用,使得5v输入端子、使能端子、马达电机都能有稳定的5v高电平输出。

红外对管

工作原理

具体如图所示:
在这里插入图片描述
一些注意事项如下:
①VCC:外接3.3-5v(可以直接接L298N的5v端) GND:外接GND ;
OUT:外接开发板或者单片机的IO口(有遮挡输出低电平,无遮挡输出高电平)
距离较远/未感应到障碍物:输出指示灯灭,OUT引脚输出高电平
距离较近,感应到障碍物时,输出指示灯亮,OUT输出低电平
距离较近,感应到黑色物体时候,黑管接收不到,输出指示灯灭,OUT引脚输出高电平
③检测距离2~30mm,可以通过电位器进行调节;顺时针调节,检测距离增加;逆时针调节,检测距离减少

HC-05 蓝牙模块

模块介绍

主要用于短距离的数据无线传输领域。可以方便的和 PC 机的蓝牙设备相连,也可以两个模块之间的数据互通。避免繁琐的线缆连接,能直接替代串口线。

工作原理

如图所示,核心模块使用蓝牙模块从模块,引出接口包括VCC,GND,TXD,RXD(TX、RX和串口通讯有关)
在这里插入图片描述
具体使用事项:
①led 指示蓝牙连接状态,闪烁表示没有蓝牙连接,需要进行配对;常亮表示蓝牙已连接并打开了端口
②配对以后当全双工串口使用,无需了解任何蓝牙协议,但仅支持 8 位数据位、1 位停止位、无奇偶校验的通信格式。
③在未建立蓝牙连接时支持通过 AT 指令设置波特率、名称、配对密码,设置的参数掉电保存。蓝牙连接以后自动切换到透传模式1

④蓝牙的使用

AT指令

HC-05进入 AT 命令:
按住按键或EN脚拉高,此时灯是慢闪, HC-05进入AT命令模式,默认波特率是38400(原始模式),原始模式下一直处于AT命令模式状态。
①测试通讯
发送:AT(返回 OK,一秒左右发一次)
返回:OK
②改蓝牙串口通讯波特率
发送:AT+BAUDx 其中x代表0-C

字符x波特率(bauds)
11200
22400
34800
49600(常用)
519200
638400
757600
8115200(常用)
9230400
A460800
B921600
C1382400

返回:BAUD(波特率)
③改蓝牙名称
发送:AT+NAMEname
返回:OK
参数 name:所要设置的当前名称,即蓝牙被搜索到的名称。20 个
字符以内
④改蓝牙配对密码
发送:AT+PSWDxxxx
返回:+PSWD=xxxx
例如 设置密码888888 AT+PSWD123456 返回密码 123456
⑤更改模块的主从模式
发送:AT+ROLE=1(设置模块为主模式 Master)
返回:+ROLE=1
发送:AT+ROLE=0(设置模块为从模式 Slave)
返回:+ROLE=0

TT电机

下面为一些电机注意事项

不带编码器,不能测速,测速的话需要添加测速模块;性能也没有编码器电机好。
两个电阻片端子,通过导线和AB马达输出端子连接,输出电平相反,电机实现前后转动;输出电平均为0,电机停止转动;

硬件接线

具体参考简图所示:
在这里插入图片描述

软件部分

电机车轮

chelun.c

#include <REG52.H>
#include "CheLun.h"
#include <intrins.h>
/**********************/
/****相关端口定义******/
/**********************/
sbit ENA = P1^0;
sbit Left_IN1 = P1^1;
sbit Left_IN2 = P1^2;
sbit Right_IN3 =P1^3;
sbit Right_IN4 =P1^4;
sbit ENB = P1^5;
//左右轮PWM当前值 左右轮PWM比较值
unsigned char pwm_val_left;
unsigned char pwm_val_right;
unsigned char push_val_left;
unsigned char push_val_right;

//改变这里的值就是改变左右轮子的占空比,实现调转速
 unsigned char Left_Speed_Ratio =15;  	//左电机转速设定
 unsigned char Right_Speed_Ratio =15 ;  //右电机转速设定

//左右电机标志位
bit Left_moto_flag = 1;
bit Right_moto_flag = 1;
void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
/*左边电机调速函数*/
void pwm_out_left_moto()     
{ 
	if(Left_moto_flag) 
		{ 
			if(pwm_val_left<=push_val_left) 	//当前值和设定的比较值进行比较,来控制使能端口,进而控制车轮
			ENA=1; 
			else 
			ENA=0; 
				if(pwm_val_left>20) 						//PWM当前值自增到20之后变为0,相当于一个周期
				pwm_val_left=0; 
		}		 
	else 
			ENA=0; 
}
/*右边电机调速函数*/
void pwm_out_right_moto()     
{ 
	if(Left_moto_flag) 
		{ 
			if(pwm_val_right<=push_val_right) 
			ENB=1; 
			else 
			ENB=0; 
				if(pwm_val_right>20) 
				pwm_val_right=0; 
		}		 
	else 
			ENB=0; 
}
//左右轮前进后退停止,根据自己小车视情况而测
void Left_moto_Go()   {Left_IN1 = 0,Left_IN2 = 1;}
void Left_moto_Back() {Left_IN1 = 1,Left_IN2 = 0;}
void Left_moto_Stop() {Left_IN1 = 1,Left_IN2 = 1;}
void Right_moto_Go()  {Right_IN3 = 1,Right_IN4 = 0;}
void Right_moto_Back(){Right_IN3 = 0;Right_IN4 = 1;}
void Right_moto_Stop(){Right_IN3 = 1;Right_IN4 = 1;}


void GoStright()     //小车前进
{ 
	/*设置比较值,左右轮子各自前转*/
	push_val_left =Left_Speed_Ratio;    
	push_val_right =Right_Speed_Ratio; 
	Left_moto_Go(); 
	Right_moto_Go(); 
} 

void GoBack()   //小车后退
{ 
	push_val_left =Left_Speed_Ratio; 
	push_val_right =Right_Speed_Ratio; 
} 



void TurnLeft()   //小车左转
{ 

	push_val_right =10;		//把右轮子速度降低
	Right_moto_Go(); 
	Left_moto_Stop();
} 

 void TurnRight() //小车右转
{ 

	push_val_left =10;		//把左轮子速度降低
	Right_moto_Stop();
	Left_moto_Go();
} 

void Stop()  //小车停
{ 
	Left_moto_Stop();
	Right_moto_Stop();
} 

void Rotate() 	//小车原地转圈
{ 
	push_val_left =Left_Speed_Ratio; 
	push_val_right =Right_Speed_Ratio; 
	Left_moto_Back();
	Right_moto_Go();
}

chelun.h

#ifndef _CHELUN_H_
#define _CHELUN_H_				//预编译,防止头文件重复定义

void Delay1000ms();//1000ms延时函数
//关于轮子电机
void Left_moto_Go(void);
void Left_moto_Back(void);
void Left_moto_Stop(void);			//左轮子 前进 后退 停止函数
void Right_moto_Go(void);
void Right_moto_Back(void);
void Right_moto_Stop(void);			//右轮子 前进 后退 停止函数

void pwm_out_left_moto(void);   //左边电机调速函数
void pwm_out_right_moto(void);  //右边电机调速函数

void Rotate(); 									//小车原地转圈
void Stop();  									//小车停
void TurnRight(); 							//小车右转
void TurnLeft();   							//小车左转
void GoBack();  								//小车后退
void GoStright();   					  //小车前进
#endif

红外对管

RED.c

/*红外对管的使用
输出端子接单片机的io口,有遮挡输出0,无遮挡输出1*/
#include <REG52.H>
#include "RED.H"
//红外对管,感应到黑线不亮指示灯且输出高电平,未感应到就亮指示灯且输出低电平
sbit RED_LEFT = P2^6;
sbit RED_RIGHT = P2^7;		//定义两个红外对管输出端子接的io口
//检测灯
sbit Left_led = P2^1;
sbit Right_led = P2^0;
void RED_test()
{
	RED_RIGHT=1;
		
		if(RED_RIGHT == 0)	//没感应到黑线
		{
			LED1=1;
		}
		else
		{
			LED1=0;	//感应到黑线
		}
}
//感应到黑线 指示灯灭 输出1 没感应到黑线 指示灯亮 输出0
void xj_Run()
{
	//碰到黑线为1,没碰到黑线为0
	if(Left_led == 0 && Right_led==1)	//右边碰到黑线
	{
		TurnLeft();//左转
	}
	if(Left_led == 1 && Right_led==0)//左边碰到黑线
	{
		 TurnRight();//右转
	}
	if(Left_led == 0 && Right_led==0)//没有碰到
	{
		 GoStright();//前进
	}
}

RED.h

#ifndef _RED_H_
#define _RED_H_
 void  RED_test();
 void  xj_Run();
#endif

蓝牙模块

HR_SC.c

#include <REG52.H>
#include "HR_SC.H"
unsigned char flag;
/*蓝牙控制小车前进后腿左转右转通过按键实现*/
void Init_UART()
{
	TMOD &= 0X00;
	TMOD |= 0X21;	//开启定时器1,采用工作方式2,8位自动重装载
								//开启定时器0,采用工作方式1
	SCON = 0X50;	//串口通信采取工作方式1,REN位打开
	PCON = 0X80;	//波特率加倍
	TH1 = 0XFA;
	TL1 = 0XFA;//9600 蓝牙配置好了也是这个波特率
	ET1 = 0;
	ES = 1;
	EA = 1;		//开启定时器中断
	TR1 = 1;
}

void Init_Timer0()
{
	TH0 = (65535-1000)/256;
	TL0 = (65535-1000)%256;
	
	ET0 = 1;
	EA = 1;
	TR0 = 1;
}
void SendByte(unsigned char temp)	//串口发送数据
{
	SBUF = temp;
	while(TI == 0);
	TI = 0;
}
void HR_SC_INPUT()
{
	flag = SBUF;		//接收手机发来的数据
	while(RI ==0);	//等待接收完成
	RI = 0;
  SendByte(flag);
}

HR_SC.h

#ifndef _HR_SC_H_
#define _HR_SC_H_

void Init_UART();	//初始化串口
void HR_SC_INPUT();
void Init_Timer0();
void SendByte(unsigned char temp);
#endif

循迹小车

main.c

/*
循迹的main函数,主要实现循迹功能
*/
#include <REG52.H>
#include "CheLun.h"
#include "RED.h"
extern unsigned char pwm_val_left;
extern unsigned char pwm_val_right;
void Init_Timer0()
{
	TMOD = 0X01;
	TH0 = (65535-1000)/256;
	TL0 = (65535-1000)%256;
	
	ET0 = 1;
	EA = 1;
	TR0 = 1;
}
int main()
{
	Init_Timer0();
	while(1)
	{
		xj_Run();	
	}
}
void Timer0_ser () interrupt 1
{
	TH0 = (65535-1000)/256;
	TL0 = (65535-1000)%256;

	pwm_val_left++;
	pwm_val_right++;
	
	pwm_out_left_moto();
	pwm_out_right_moto();
}

蓝牙小车

main.c

/*蓝牙控制小车*/
#include <REG52.H>
#include "HR_SC.H"
#include "RED.H"
#include "CHELUN.H"

sbit BEEP = P1^6;
extern unsigned char flag;
extern unsigned char Left_Speed_Ratio;  	//电机转速设定
extern unsigned char Right_Speed_Ratio;
extern unsigned char pwm_val_left;
extern unsigned char pwm_val_right;

void Add_Speed_Ratio()	//调速函数
{
		Left_Speed_Ratio++;
		Right_Speed_Ratio++;
}
void Remine_Speed_Ratio()	//调速函数
{
		Left_Speed_Ratio--;
		Right_Speed_Ratio--;
}

void beep_ring()
{
	BEEP = 0;
	Delay1000ms();
	BEEP = 1;
}
int main()
{
	Init_UART();
	Init_Timer0();
	while(1)
	{
		switch (flag)
		{		
		case 'A':Add_Speed_Ratio();break;	//加速
		case 'B':Remine_Speed_Ratio();break;//减速
		case 'G':GoStright();break;//前进
		case 'K':GoBack();break;//后退
		case 'H':TurnLeft();break;//左转
		case 'J':TurnRight();break;//右转
		case 'I':beep_ring();Stop();break;//停止
		}
	}
}
void UART_ser() interrupt 4
{
	HR_SC_INPUT();
}
void Timer0_ser () interrupt 1
{
	TH0 = (65535-1000)/256;
	TL0 = (65535-1000)%256;

	pwm_val_left++;
	pwm_val_right++;
	pwm_out_left_moto();
	pwm_out_right_moto();
}
//		switch (flag)	//蓝牙发送按键测试
//		{
//		case 'G':P2 = 0XFE;break;//前进
//		case 'K':P2 = 0XFD;break;//后退
//		case 'H':P2 = 0XFB;break;//左转
//		case 'J':P2 = 0XF7;break;//右转
//		case 'I':P2 = 0XEF;break;//停止

总结

实现过程+问题

一.拼装车模:
对车子的总体构架有能有很好的理解

二.L298N电机驱动模块的测试+代码测试车轮运动情况:
了解到L298N的工作原理,测试电机运动情况可以增强代码调试能力,中间遇到过一些列不正常情况经过总结大部分都和供电有关(L298N供电最好用12v锂电池供电,我用的四节南孚电池只有6v左右,电机驱动模块不稳)建议用12v供电

三.红外对管模块的测试
实际情况下红外对管的识别度不是很好,很容易受到外界的干扰,用两个红外对管循迹有很大误差,循迹可以采用三路循迹模块或者更好好的方案!
在循迹转弯时候讲车速降低一点,不然车子容易跑飞,脱离循迹轨道,当然可以加入PID控制算法根据具体情况来控制车速(不建议51两轮小车,万向轮不好操作)

四.蓝牙模块的测试
蓝牙可以理解为一个手机上的串口调试助手,通过手机发送或接收指令,
而平时用的UART都是用ch340电平转化芯片来实现单片机和电脑串口的通讯!


  1. 简单理解为不赚差价的中间商!主机发数据,通过蓝牙模块的透传模式到从机,从机接收到对应的响应信号 ??

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-10 12:33:50  更:2021-11-10 12:34:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:28:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码