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.rhkb.cn/news/363105.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Confluence】markdown格式转换为Confluence

简单的文本可以使用网站来快速转换&#xff0c;但是发现很多格式不能正确转换&#xff0c;所以研究了一个Py的方法来实现&#xff0c;如下&#xff1a; 安装Py插件 本方法主要借用markdown2 来实现&#xff0c;开始之前需要先安装一些库。 pip install markdown2 beautiful…

TCP 和 UDP 可以同时绑定相同的端口吗?

在网络编程中&#xff0c;TCP和UDP都可以绑定到同一个端口上进行通信。TCP和UDP是OSI模型中的传输层协议&#xff0c;它们分别使用不同的端口号来区分不同的应用程序或服务。 TCP&#xff08;Transmission Control Protocol&#xff09;提供了面向连接的、可靠的传输服务&…

python办公自动化之excel

用到的库&#xff1a;openpyxl 实现效果&#xff1a;读取单元格的值&#xff0c;写入单元格 代码&#xff1a; import openpyxl # 打开现有工作簿 workbookopenpyxl.load_workbook(现有工作簿.xlsx) # 选择一个工作表 sheetworkbook[交易表] # 读取单元格的值 cell_valueshe…

webpack【实用教程】

基础配置 配置的拆分和合并 通常 webpack 的配置文件会有3个 webpack.common.js 公共配置&#xff08;会被另外两个配置文件导入并合并&#xff09;webpack.dev.js 开发环境的配置webpack.prod.js 生产环境的配置 开发环境的本地服务 在 webpack.dev.js 中配置 devServer:…

钡铼BL104智慧环保多个485采集转MQTT无线传输

PLC物联网关BL104是一款专为工业环境设计的先进协议转换网关&#xff0c;其集成了钡铼智能技术和环保多个485采集转MQTT无线传输功能&#xff0c;为工业控制系统提供了高效的数据采集、传输和管理解决方案。 技术规格与功能特点 PLC物联网关BL104采用钡铼智能技术&#xff0c…

PPT怎么录制视频?这里有你想要的答案!

“有人知道ppt怎么录制视频吗&#xff1f;我正在准备一个关于新产品功能介绍的演示文稿&#xff0c;希望能将我的ppt转化为一个专业且生动的视频讲解。我尝试了一些方法&#xff0c;但不知道从哪里开始。有没有哪位朋友能分享一下自己录制ppt视频的经验吗&#xff1f;” 在数字…

前端打包配置+nginx配置实现部署及部署地址带特定前缀的几种方式

前端打包后要部署到服务器&#xff0c;在浏览器中可以通过url访问到我们开发的系统&#xff0c;通过nginx代理在工作中是一种很常用的方式。 这里以本地为例&#xff0c;把本地电脑当作一个服务器&#xff0c;实现普通部署、带特定前缀等 前端使用vue-clivue作为例子 以下内容…

Oracle中常用内置函数

一、字符串函数 CONCAT(s1, s2)&#xff1a;连接两个字符串s1和s2。 SELECT CONCAT(Hello, World) FROM DUAL-- 结果&#xff1a;Hello World --或者使用 || 操作符 SELECT Hello || World FROM DUAL -- 结果&#xff1a;Hello World INITCAP(s)&#xff1a;将字符串s…

OpenHarmony 5.0 纯血鸿蒙系统

OpenHarmony-v5.0-Beta1 版本已于 2024-06-20 发布。 OpenHarmony 5.0 Beta1 版本标准系统能力持续完善&#xff0c;ArkUI 完善了组件通过 C API 调用的能力&#xff1b;应用框架细化了生命周期管理能力&#xff0c;完善了应用拉起、跳转的能力&#xff1b;分布式软总线连接能力…

如何找合适的C++项目给自己的简历加分?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; C的工作多种多样&#x…

Str.format()方法

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 在Python2.6之后&#xff0c;提供了字符串的format()方法对字符串进行格式化操作。format()功能非常强大&#xff0c;格式也比较复杂&…

MobPush iOS端海外推送最佳实现

推送注册 在AppDelegate里进行SDK初始化&#xff08;也可以在Info.plist文件中进行AppKey&#xff0c;AppSecret的配置&#xff09;并对通知功能进行注册以及设置推送的环境和切换海外服务器等&#xff0c;参考如下步骤代码&#xff1a; <span style"background-colo…

文心一言 VS 讯飞星火 VS chatgpt (291)-- 算法导论21.3 4题

四、假设想要增加一个 PRINT-SET(x) 操作&#xff0c;它是对于给定的结点 x 打印出 x 所在集合的所有成员&#xff0c;顺序可以任意。如何对一棵不相交集合森林的每个结点仅增加一个属性&#xff0c;使得 PRINT-SET(x) 所花费的时间同 x 所在集合元素的个数呈线性关系&#xff…

C++ | Leetcode C++题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; class Solution {const int L 10;unordered_map<char, int> bin {{A, 0}, {C, 1}, {G, 2}, {T, 3}}; public:vector<string> findRepeatedDnaSequences(string s) {vector<string> ans;int n s.length();if (n < L…

内网穿透实现方案(免费版)_免费内网穿透

#巴比达内网穿透——我的网络救星# 作为一个常常在网络世界里摸索的人&#xff0c;我一直在寻找一款真正好用的内网穿透工具。相信很多朋友都和我有过一样的经历&#xff0c;为了找到合适的工具&#xff0c;试了一个又一个&#xff0c;却总是失望而归。但这次&#xff0c;我真…

2024年湖北省安全员-C证证考试题库及湖北省安全员-C证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年湖北省安全员-C证证考试题库及湖北省安全员-C证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试…

大厂程序员上班猝死成常态?

大家好&#xff0c;我是瑶琴呀&#xff0c;拥有一头黑长直秀发的女程序员。 近日&#xff0c;连续看到大厂程序员猝死、低血糖晕倒的新闻&#xff0c;同为程序员感到很难受。互联网加班成常态这是既定事实&#xff0c;尤其在这个内卷严重、经济不景气的环境中&#xff0c;加班…

C++编程(一)C++与C语言的一些区别

文章目录 一、QtCreator基本使用&#xff08;一&#xff09;编码格式&#xff1a;&#xff08;二&#xff09;C编程1. 文件后缀2. 编译3. 头文件 二、名字空间&#xff08;一&#xff09;概念以及访问方式1. 概念2. 访问方式&#xff08;1&#xff09;通过作用域限定符进行访问…

数据挖掘常见算法(聚类)

划分方法 K-均值算法(K-means算法) 方法: 首先选择K个随机的点,称为聚类中心.对于数据集中的,每一个数据,按照距离K个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类.计算每一个组的平均值,将改组所关联的中心点移动到平均值的位置重复2~…

波士顿大学开发通过患者的声音检测早期阿尔茨海默氏症迹象的AI系统

波士顿大学的研究人员开发了一种人工智能系统&#xff0c;能够通过患者的声音检测阿尔茨海默病的早期迹象。目前尚无治愈这种疾病的方法&#xff0c;但及早发现可以改善患者的治疗选择。研究人员结合自然语言处理和机器学习&#xff0c;开发了一种可以自动预测患者阿尔茨海默病…