51循迹小车(蓝牙+循迹+超声波+舵机+避障L298N)

基本驱动

L298N电机驱动模块负责供电和控制电机驱动

将电池12V供电接到12V供电上,作为输入。单片机及其他器件供电可以使用5V供电,这里的GND都接到一起。

输出A和输出B接到电机上,负责给电机供电和控制电机。

通道A使能和通道B使能以及逻辑输入部分都接到单片机上,在这里通道A使能和通道B使能接高电平使能,接PWM信号可以控制输出A和输出B的转速。

IN1 和 IN2 控制输出A
IN1=1,IN2=0,对应电机A正转
IN1=0,IN2=1,对应电机A反转
IN1、IN2同时输入高电平HIGH或低电平LOW,对应电机A停止转动

IN3 和 IN4 控制输出B
IN3=1,IN4=0,对应电机B正转
IN3=0,IN4=1,对应电机B反转
IN3、IN4同时输入高电平HIGH或低电平LOW,对应电机B停止转动

这里还要注意,如果电机堵转可能会烧毁其他器件,要注意不要让电机堵转。

代码参考

// 定义电机控制引脚  

#include<REG52.H>

sbit IN1=P1^1;    //左后轮
sbit IN2=P1^2; //左前轮
sbit IN3=P1^3;   //右后轮
sbit IN4=P1^4;//右前轮


void L_motor_go()//左轮前进   
{
	IN2=1; 
	IN1=0;	
}
void L_motor_back()//左轮后退        
{
	 IN2=0; 
	 IN1=1;	  
}
	void R_motor_go() //右轮前进        
{  
	 IN4=1; 
	 IN3=0;
}
void R_motor_back() //右轮后退      
{		
	 IN4=0; 
	 IN3=1;
}
void L_motor_stop() //左轮停止    
{
	IN2=0; 
	IN1=0;	
}
	void R_motor_stop() //右轮停止 
{
	IN4=0; 
	IN3=0;	
}
#include <REGX52.H>
#include "motor.h"
#include "CAR.H"

sbit ENA=P1^5;      //左使能端
sbit ENB=P1^6;     //右使能端

unsigned char speed=50;//小车速度

void timer0_Init() //100微秒@11.0592MHz
{
	  TMOD &= 0xF0;		//设置定时器模式
		TMOD |= 0x01;		//设置定时器模式 
    TH0 = 0xff;  
    TL0 = 0xa4; 
    TF0 = 0;  
    TR0 = 1; // 启动定时器0  
    ET0 = 1; // 允许定时器0中断  
    EA = 1; // 总中断允许   
}
  
void timer0() interrupt 1  
{
		static unsigned char count=0;
	  TH0 = 0xff;  
    TL0 = 0xa4; 
	  count++;
	 if(count >=100)
	 {
		 count = 0;
	 }
	 if(count < speed)//小车PWM
	 {
		 ENA = 1;
		 ENB = 1;
	 }
	 else
	 {
		 ENA = 0;
		 ENB = 0;
	 }
}
void car_go()
{
	R_motor_go();
	L_motor_go();		
}
void car_back()
{
	R_motor_back();
	L_motor_back();		
}
void car_left()
{
	R_motor_back();
	L_motor_go();	
}
void car_right()
{
	R_motor_go();
	L_motor_back();		
		
}
void car_stop()
{
	R_motor_stop();
	L_motor_stop();		
}

蓝牙模块

TXD:发送端,一般表示为自己的发送端,正常通信必须接另一个设备的RXD。
RXD:接收端,一般表示为自己的接收端,正常通信必须接另一个设备的TXD。

只当作串口来用接VCC、GND、TXD、RXD就够了,使用前先测试以下,使用手机蓝牙调试器连接蓝牙,电脑使用USB转TTL接到蓝牙模块上,然后用串口助手测试收发是否正常。正常波特率9600,如果不知道可以使用AT指令修改或查询。

先按住HC05蓝牙模块上面的按键,再给蓝牙模块通电。蓝牙模块上面的LED进入慢闪模式(约1秒钟闪烁一次),即可进行AT命令测试

AT命令格式为:波特率38400,8个数据位,1个停止位,无校验。每条指令输入完成后,必须按一下回车键再发送!

例如:输入AT,按一下回车键发送,蓝牙模块会返回OK

HC06在未连接蓝牙时可直接发送AT指令。

参考代码,主要实现控制小车和调试功能

#include <REGX52.H>
#include "CAR.H"
#include "BLE.H"
#include "CHAOSHENGBO.H"

unsigned char U_data;     //接受数据存放
unsigned char str[]=" Speed: ";//发送数据存放
unsigned char str1[]=" Length: ";
extern unsigned char flag1;

void UartInit(void)        //9600bps@11.0592MHz
{
    PCON &= 0x7F;            //波特率不倍速
    SCON = 0x50;            //8位数据,可变波特率
    TMOD &= 0x0F;             //设置定时器模式
    TMOD |= 0x20;             //设置定时器模式
    TL1 = 0xFD;                //设置定时初始值
    TH1 = 0xFD;                //设置定时重载值
    ET1 = 0;                     //禁止定时器中断
    TR1 = 1;                  //定时器1开始计时
    EA  = 1;
    ES  = 1;
	
}
 
void receive(unsigned char m)//接受数据
{

    switch(m)
    {
        case  'W':      //前进
            car_go();
        break;
        case  'A':
            car_left();    // 左转
        break;
        case  'D':
            car_right();     // 右转
        break;
        case 'S':
            car_back();   //  后退
        break;
        case 'I':      // 停止
            car_stop();
        break;
				case 'Q':      // 速度加
            speed+=5;
				uart_send_string(str);
				uart_send_byte(speed/10+'0');
				uart_send_byte(speed%10+'0');
        break;
				case 'E':      // 速度减
            speed-=5;
				uart_send_string(str);
				uart_send_byte(speed/10+'0');
				uart_send_byte(speed%10+'0');
        break;
				case 'B':      // 显示信息
				showInfo();
        break;
				case 'N':      // 舵机角度加
				angle++;
				if(angle>25)angle=25;
        break;
				case 'M':      // 舵机角度减
				angle--;
				if(angle<5)angle=5;
        break;
				case 'P':      //循迹模式切换
				flag1=!flag1;
				uart_send_byte(flag1);
        break;
				default:
					break;        
    }
        
}


//发送一个字符
void uart_send_byte(unsigned char byte_data)
{
 	SBUF = byte_data;
	while(!TI);
	TI=0;
}

//发送一串字符串
void uart_send_string(unsigned char *str)
{
 	while(*str)
	{
	 	uart_send_byte(*str++);	
	}
}

//显示信息
void showInfo()
{
	uart_send_string(str);
	uart_send_byte(speed/10+'0');
	uart_send_byte(speed%10+'0');
	uart_send_string(str1);
	uart_send_byte(Length/100+'0');
	uart_send_byte(Length/10%10+'0');
	uart_send_byte(Length%10+'0');
}

//***************************************************************************   
void UartInit_seve() interrupt 4
{
    if(RI==1)
		{
			RI = 0;                  //清除接受中断标志位
			U_data = SBUF;                    //接受数据
			receive(U_data);
		}
       
}

循迹模块

调节可调电阻设置测量距离,做到测到地板上黑线灯灭,没测到黑线灯亮的状态,通过排列所有情况组合可以达到循迹的效果

参考代码

#include <REGX52.H>
#include "CAR.H"
sbit left1=P2^0;
sbit left2=P2^1;
sbit right3=P2^2;
sbit right4=P2^3;
/*循迹情况分析*/
void xunji()
{  
unsigned char a;                                 
if(left1==0 &&left2==0 &&right3==0 &&right4==0)       //0000 
a = 1;
else if(left1==0 &&left2==0 &&right3==0 &&right4==1)  //0001 
a = 3;
else if(left1==0 &&left2==0 &&right3==1 &&right4==0)  //0010
a = 1;
else if (left1==0 &&left2==0 &&right3==1 &&right4==1) //0011 
a = 3;
else if(left1==0 &&left2==1 &&right3==0 &&right4==0)  //0100 
a = 1;
else if(left1==0 &&left2==1 &&right3==0 &&right4==1)  //0101 
a = 3;
else if(left1==0 &&left2==1 &&right3==1 &&right4==0)  //0110 
a = 1;
else if(left1==0 &&left2==0 &&right3==1 &&right4==1)  //0111 
a = 3;
else if(left1==1 &&left2==0 &&right3==0 &&right4==0)  //1000 
a = 2;
else if(left1==1 &&left2==0 &&right3==0 &&right4==1)  //1001 
a = 1;
else if(left1==1 &&left2==0 &&right3==1 &&right4==0)  //1010 
a = 2;
else if(left1==1 &&left2==0 &&right3==1 &&right4==1)  //1011 
a = 1;
else if(left1==1 &&left2==1 &&right3==0 &&right4==0)  //1100
a = 2;
else if(left1==1 &&left2==1 &&right3==0 &&right4==1)  //1101
a = 1;
else if(left1==1 &&left2==1 &&right3==1 &&right4==0)  //1110 
a = 2;
else if(left1==1 &&left2==1 &&right3==1 &&right4==1)  //1111 
a = 1;

  switch (a)
  {
  case 1:car_go();break;
  case 2:car_left();break;
  case 3:car_right();break;
  case 4:car_stop();break;
  default:break;
  }
}

超声波模块

给Trlg引脚至少10us高电平,之后Echo引脚就会返回高电平,通过计算高电平时间即可完成测距,如果需要测距更精确可加入温度补偿。

参考代码

#include <REGX52.H>
#include <intrins.h> 
#include "car.h"
#include "BLE.H"


sbit Trig = P2^7;
sbit Echo = P2^6; 

unsigned char Length; //测距结果
unsigned char mindistance = 10; //小车与障碍物的距离

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 Delay20us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 6;
	while (--i);
}

void chaoshengbo()
{

	T2MOD = 0;		//初始化模式寄存器
	T2CON = 0;		//初始化控制寄存器
	TL2 = 0;		//设置定时初值
	TH2 = 0;		//设置定时初值
	RCAP2L = 0;		//设置定时重载值
	RCAP2H = 0;		//设置定时重载值
	
	Trig = 1;
	Delay20us();
	Trig = 0;
	
	while(!Echo);
	TR2 = 1;
	while(Echo);
	TR2 = 0;
	
	Length = ((TH2*256+TL2)*0.034)/2+1;
	if(mindistance > Length)
	{
		car_stop();
	}
}

舵机驱动

型号:SG90  重量13克 角度0度-180度

信号线(黄线)红线(电源线)棕色(地线)

舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:

   0.5ms--------------0度;

   1.0ms------------45度;

   1.5ms------------90度;

   2.0ms-----------135度;

   2.5ms-----------180度;

参考代码

#include <REGX52.H>

sbit servo=P2^5 ;
unsigned char angle=13;//舵机角度,5-25对应0-180度

void timer0_Init() //100微秒@11.0592MHz
{
	  TMOD &= 0xF0;		//设置定时器模式
		TMOD |= 0x01;		//设置定时器模式 
    TH0 = 0xff;  
    TL0 = 0xa4; 
    TF0 = 0;  
    TR0 = 1; // 启动定时器0  
    ET0 = 1; // 允许定时器0中断  
    EA = 1; // 总中断允许   
}

void timer0() interrupt 1  
{
	static unsigned char count=0;
	TH0 = 0xff;  
    TL0 = 0xa4; 
	count++;
	 if(count >=200)
	 {
		 count = 0;
	 }
	 
	 if(count < angle)//舵机PWM
	 {
		 servo = 1;
	 }
	 else
	 {
		 servo = 0;
	 }
}

避障模块

该传感器模块对环境光线适应能力强,其具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收,经过比较器电路处理之后,绿色指示灯会亮起,同时信号输出接回输出数字信号(一个低电平信号),可通过电位器旋钮调节检测距离,有效距离范围2~30cm,工作电压为3.3v-5v。该传感器的探测距离可以通过电位器调节、具有干扰小、便于装配、使用方便等特点,可以广泛应用于机器人避障、避障小车、流水线计数及黑白线循迹等众多场合。
当模块检测到前方障碍物信号时,电路板上绿色指示灯点亮,同时OUT端口持续输出低电平信号

该模块测距离2~~30cm,检测角度35°,检测距离可以通过电位器进行调节,顺时针调电位器,检测距离增加;逆时针调电位器,检测距离减少。

传感器主动红外线反射探测,因此目标的反射率和形状是探测距离的关键。其中黑色探测距离小,白色大;小面积物体距离小,大面积距离大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/754546.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Windows下使用vckpg下载protoc之后环境变量问题】

使用vcpkg进行下载的protoc&#xff1a; vcpkg install protobuf protobuf:x64-windows 检查protoc版本时出现问题&#xff1a; “protoc”不是内部或外部命令&#xff0c;也不是可运行程序或批处理文件 尝试添加系统环境变量后没有反应。 这个时候找到vckpg下的packages目录…

如何利用ChatGPT寻找科研创新点?分享5个有效实践技巧

欢迎关注&#xff1a;智写AI&#xff0c;为大家带来最酷最有效的智能AI学术科研写作攻略。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥交流&#xff1a;yida985 地表功能最强大的高级学术专业版已经开放&#xff0c;拥有全球领先的GPT学术科研应用&#xff0c;有兴趣…

鸿蒙开发设备管理:【@ohos.brightness (屏幕亮度)】

屏幕亮度 该模块提供屏幕亮度的设置接口。 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import brightness from ohos.brightness;brightness.setValue setValue(value: number):…

【Linux】网络编程套接字

一、预备知识 1.1 理解源IP地址和目的IP地址 在IP数据报的头部中&#xff0c;有两个IP地址&#xff0c;分别叫做源IP地址和目的IP地址。 源IP地址和目的IP地址是网络通信中常用的两个概念&#xff0c;他们代表了通信中的两个节点。 源IP地址是指发起通信的节点的IP地址&#…

在WSL Ubuntu中启用root用户的SSH服务

在 Ubuntu 中&#xff0c;默认情况下 root 用户是禁用 SSH 登录的&#xff0c;这是为了增加系统安全性。 一、修改配置 找到 PermitRootLogin 行&#xff1a;在文件中找到 PermitRootLogin 配置项。默认情况下&#xff0c;它通常被设置为 PermitRootLogin prohibit-password 或…

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩?举个例子你就彻底懂了!!

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩&#xff1f;举个例子你就彻底懂了&#xff01;&#xff01; 缓存穿透发生场景解决方案 缓存击穿解决方案 缓存雪崩发生场景解决方案 总结三者区分三者原因三者解决方案 想象一下&#xff0c;你开了一家便利店&#xff0c;店里…

FastAPI教程I

本文参考FastAPI教程https://fastapi.tiangolo.com/zh/tutorial 第一步 import uvicorn from fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message": "Hello World"}if __name__ __main__:uvicorn.run(&quo…

从我邮毕业啦!!!

引言 时间过的好快&#xff0c;转眼间就要从北邮毕业了&#xff0c;距离上一次月度总结又过去了两个月&#xff0c;故作本次总结。 PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络&#xff0c;欢迎Star&#xff01; 毕业&#x1f393; 6月1号完成了自己的…

Windows server 2016.2019 .NET Framework 3.5安装包、安装步骤

windows server2019 操作系统 安装 sqlserver2008时提示缺少 .NET Frameword 3.5&#xff0c; 在功能里选择 .NET Frameword 3.5安装报错&#xff0c; 下载安装包&#xff0c;下载地址 https://download.csdn.net/download/qq445829096/89450429这里指定备份源路径 安装包解…

多供应商食品零售商城系统的会员营销设计和实现

在多供应商食品零售商城系统中&#xff0c;会员营销是提升用户粘性和增加销售的重要手段。一个有效的会员营销系统能够帮助平台更好地了解用户需求&#xff0c;提供个性化服务&#xff0c;进而提高用户满意度和忠诚度。本文将详细探讨多供应商食品零售商城系统的会员营销设计与…

2毛钱不到的2A同步降压DCDC电压6V频率1.5MHz电感2.2uH封装SOT23-5芯片MT3520B

前言 2A&#xff0c;2.3V-6V输入&#xff0c;1.5MHz 同步降压转换器&#xff0c;批量价格约0.18元 MT3520B 封装SOT23-5 丝印AS20B5 特征 高效率&#xff1a;高达 96% 1.5MHz恒定频率操作 2A 输出电流 无需肖特基二极管 2.3V至6V输入电压范围 输出电压低至 0.6V PFM 模式可在…

MySQL进阶-索引-使用规则-索引失效情况一(索引列运算,字符串不加引号,头部模糊匹配)

文章目录 1、索引列运算1.1、查询表tb_user1.2、查看tb_user的索引1.3、查询 phone177999900151.4、执行计划 phone177999900151.5、查询 substring(phone,10,2) 151.6、执行计划 substring(phone,10,2) 15 2、字符串不加引号2.1、查询 phone177999900152.2、执行计划 phone177…

JAVA-矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 思路&#xff1a; 找到0的位置&#xff0c;把0出现的数组的其他值夜置为0 需要额外空间方法&#xff1a; 1、定义两个布尔数组标记二维数组中行和列…

axios之CancelToken取消请求

从 v0.22.0 开始&#xff0c;Axios 支持以 fetch API 方式—— AbortController 取消请求 此 API 从 v0.22.0 开始已被弃用&#xff0c;不应在新项目中使用 官网链接 1. 背景 最近项目中遇到一个场景&#xff0c;当连续触发一个请求时&#xff0c;如果是同一个接口&#xf…

【仿真建模-anylogic】开发规范

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-28 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 0. 说明 实际模型开发过程中&#xff0c;对遇到的问题进行总结归纳出以下开发规范&#xff0c;仅供参考&#xff01; 1. 强制性规范 1…

加密与安全_Java 加密体系 (JCA) 和 常用的开源密码库

文章目录 Java Cryptography Architecture (JCA)开源国密库国密算法对称加密&#xff08;DES/AES⇒SM4&#xff09;非对称加密&#xff08;RSA/ECC⇒SM2&#xff09;散列(摘要/哈希)算法&#xff08;MD5/SHA⇒SM3&#xff09; 在线生成公钥私钥对&#xff0c;RSA公私钥生成参考…

单目操作符

目录 ! --- 逻辑反操作 & --- 取地址操作符 * --- 间接访问操作符&#xff08;解引用操作符&#xff09; sizeof --- 操作数的类型长度&#xff08;单位为字节&#xff09; ~ --- 对一个数的补码二进制按位取反 前置和前置-- 后置和后置-- (类型) --- 强制类型转换…

《GPT模型揭秘:数据驱动AI的核心概念与GPT系列对比分析》

DS&#xff1a;《What Are the Data-Centric AI Concepts behind GPT Models?通过三个数据为中心的人工智能目标(训练数据开发、推理数据开发和数据维护)揭示GPT模型背后的数据为中心的人工智能概念》解读—GPT-1/GPT-2/GPT-3系列对比(语料大小参数量解码层数上下文长度隐藏层…

RabbitMQ中java实现队列和交换机的声明

java实现队列和交换机的声明 在之前我们都是基于RabbitMQ控制台来创建队列、交换机。但是在实际开发时&#xff0c;队列和交换机是程序员定义的&#xff0c;将来项目上线&#xff0c;又要交给运维去创建。那么程序员就需要把程序中运行的所有队列和交换机都写下来&#xff0c;…

重塑客户体验!VoLTE、VoNR引领新时代企业服务变革

试想一下&#xff0c;当你拨打客服咨询或售后电话时&#xff0c;没有漫长的等待&#xff0c;瞬时在手机中看到清晰的客服人员的脸&#xff0c;你说一句&#xff0c;ta说一句&#xff0c;你们流畅的沟通&#xff0c;仿佛线下面对面交流…… 这是VoLTE&#xff08;Voice over LT…