当前位置: 首页 > news >正文

第14章-蓝牙遥控小车 手把手做蓝牙APP遥控小车 蓝牙串口通讯讲解

本文讲解手机蓝牙如何遥控小车,如何编写串口通信指令

第14章-手机遥控功能

我们要实现蓝牙遥控功能,蓝牙遥控功能要使用:1.单片机的串口、2.蓝牙通信模块

所以我们先调试好:单片机的串口->蓝牙模块->接到一起联调
在这里插入图片描述

14.1-电脑控制小车

完成功能:电脑连接单片机串口三 控制小车前进后退

先看原理图

通过原理图可以看出这是使用的串口3 在使用的时候注意把跳线帽,跳线到蓝牙通信位置
在这里插入图片描述
打开初始化软件
在这里插入图片描述
在这里插入图片描述

生成代码

在main 定义全局变量

uint8_t g_ucUsart3ReceiveData;  //保存串口三接收的数据

开启串口三中断接收
在这里插入图片描述

  HAL_UART_Receive_IT(&huart3,&g_ucUsart3ReceiveData,1);  //串口三接收数据

usart.c 重新实现串口中断回调函数
在这里插入图片描述
然后我们可以在中断回调函数里面中编写遥控命令控制逻辑了
在这里插入图片描述

//串口接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if( huart == &huart3)//判断中断源{if(g_ucUsart3ReceiveData == 'A') motorPidSetSpeed(1,1);//前运动if(g_ucUsart3ReceiveData == 'B') motorPidSetSpeed(-1,-1);//后运动if(g_ucUsart3ReceiveData == 'C') motorPidSetSpeed(0,0);//停止if(g_ucUsart3ReceiveData == 'D') motorPidSetSpeed(1,2);//右边运动	if(g_ucUsart3ReceiveData == 'E') motorPidSetSpeed(2,1);//左边运动if(g_ucUsart3ReceiveData == 'F') motorPidSpeedUp();//加速if(g_ucUsart3ReceiveData == 'G') motorPidSpeedCut();//减速HAL_UART_Receive_IT( &huart3, &g_ucUsart3ReceiveData, 1);//继续进行中断接收}
}

在usart.c中声明外部变量

extern uint8_t g_ucUsart3ReceiveData;  //保存串口三接收的数据

然后我们更改一下 主函数内容,把PID红外循迹代码注释掉,然后我们增加串口三的输出,以便我们后面观察数据。
串口不定长输出
我们把转速等信息都可以显示在OLED上,那么如何通过串口输出那?
在这里插入图片描述

	sprintf((char *)Usart3String,"V1:%.2fV2:%.2f\r\n",Motor1Speed,Motor2Speed);//显示两个电机转速 单位:转/秒HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),50);//阻塞式发送通过串口三输出字符 strlen:计算字符串大小sprintf((char *)Usart3String,"Mileage%.2f\r\n",Mileage);//计算小车里程 单位cmHAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),50);//阻塞式发送通过串口三输出字符 strlen:计算字符串大小sprintf((char *)Usart3String,"U:%.2fV\r\n",adcGetBatteryVoltage());//显示电池电压HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),50);//阻塞式发送通过串口三输出字符 strlen:计算字符串大小	HAL_Delay(5);

把之前PID初始化时候速度PID目标值改成0
在这里插入图片描述
然后我们测试

硬件连接

我们现在使用USB-TTL连接串口三,单片机串口三与电脑通信(底板不需要插入蓝牙)
在这里插入图片描述
然后打开软件

发送指令小车就会对应运动

在电脑串口软件查看输出信息、发送 指令控制小车运动
在这里插入图片描述

14.2-手机蓝牙控制小车

功能:蓝牙遥控小车前进、后退、停止、左右转、加速、减速、手机显示数据

蓝牙模块和电脑通信

蓝牙模块-硬件介绍

使用:HC-05 主从机一体蓝牙串口透传模块

注意: 供电3.6V-6V(最好5V)

引脚顺序 VCC GND TXD RXD
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
先调试蓝牙模块-设置波特率

如图先把蓝牙模块通过USB-TTL模块相连接,然后
在这里插入图片描述
如果反复测试不能进入AT模式,可能是新版蓝牙模块,
在这里插入图片描述

  1. 先连接好蓝牙模块的几根线,然后按住蓝牙模块的按键

  2. 然后连接电脑,然后几秒后蓝牙小灯慢闪,说明进入AT模式

  3. 然后串口助手通过38400发送设置指令:AT+UART=115200,0,0

  4. 然后收到OK数据,说明设置成功。

这个是设置波特率截图
在这里插入图片描述
5. 然后重新拔插蓝牙模块(不用按按键)

  1. 在手机系统蓝牙配对HC-50 密码1234

  2. 串口助手设置波特率115200,然后打开手机APP发送任意内容测试

这个是后面通信测试截图
在这里插入图片描述
8. 设置按键-按照代码设置按下发送的数据
9.在这里插入图片描述
在这里插入图片描述

蓝牙模块连接单片机

把蓝牙插入到底板、跳线帽选择蓝牙通信
在这里插入图片描述
按下不同按钮小车会对应控制

相关文章:

第14章-蓝牙遥控小车 手把手做蓝牙APP遥控小车 蓝牙串口通讯讲解

本文讲解手机蓝牙如何遥控小车,如何编写串口通信指令 第14章-手机遥控功能 我们要实现蓝牙遥控功能,蓝牙遥控功能要使用:1.单片机的串口、2.蓝牙通信模块 所以我们先调试好:单片机的串口->蓝牙模块->接到一起联调 14.1-电脑控制小车 完成功能…...

【补充1】字节对齐

文章目录 1.字节对齐的基本概念2.字节对齐规则3.实践出真知(加大难度)4 位域 1.字节对齐的基本概念 (1)现代计算机中内存空间都是按照byte划分的, 从理论上讲似乎对任何类型的变量的访问可以从任何地址开始&#xff0…...

Java数据库连接(JDBC)

一、引言 在Java应用程序中,经常需要与数据库进行交互以存储、检索和处理数据。Java数据库连接(JDBC)是Java平台中用于执行这一任务的标准API。JDBC允许Java程序连接到关系数据库,并使用SQL语句来执行查询和更新操作。本教程将详…...

记录一次cas单点登录的集成

主要思路:浏览器访问CAS服务器登录,拿到凭证给后端,后端用此凭证到CAS服务器验证登录并拿到用户信息,之后基于该凭证维持用户的登录状态。 主要流程: 1.浏览器访问后端需认证登录地址(不带ticket&#xf…...

【吊打面试官系列】Java高并发篇 - 什么是乐观锁和悲观锁?

大家好,我是锋哥。今天分享关于 【什么是乐观锁和悲观锁?】面试题,希望对大家有帮助; 什么是乐观锁和悲观锁? 1、乐观锁: 就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态, 乐观锁认为竞争…...

机器学习之词袋模型

目录 1 词袋模型基本概念 2 词袋模型的表示方法 2.1 三大方法 1 独热表示法(One-Hot) 2 词频表示法(Term Frequency, TF) 3 词频-逆文档频率表示法(TF-IDF) 2.2 例子 1 词袋模型基本概念 词袋模型&a…...

【C++/STL】vector(常见接口、模拟实现、迭代器失效)

🌈个人主页:秦jh_-CSDN博客🔥 系列专栏: https://blog.csdn.net/qinjh_/category_12575764.html?spm1001.2014.3001.5482 目录 简单使用 常见接口 find insert vector模板 模拟实现 尾插 构造 迭代器失效 使用memcpy拷贝问…...

Spring Boot Web 开发:MyBatis、数据库连接池、环境配置与 Lombok 全面解析

推荐一个AI网站,免费使用豆包AI模型,快去白嫖👉海鲸AI 1.0 MyBatis 概述 MyBatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 可以帮助我们将数据库操作抽象出来,使得我们的代码更加简洁…...

【UE5.1 多线程 异步】“Async Blueprints Extension”插件使用记录

目录 一、异步生成Actor示例 二、异步计算示例 参考视频 首先需要在商城中下载“Async Blueprints Extension”插件 一、异步生成Actor示例 2. 创建一个线程类,这里要指定父类为“LongAsyncTask”、“InfiniteAsyncTask”、“ShortAsyncTask”中的一个 在线程类…...

【已解决】在jupyter里运行torch.cuda.is_available(),显示True,在pycharm中运行却显示false。

文章目录 问题概述1、在Jupyter中GPU运行true2、在pycharm中GPU运行false3、个人解决方案仅供参考 问题概述 在jupyter里运行torch.cuda.is_available(),显示True,在pycharm中运行却显示false。原因在于jupyter 运行环境和pycharm 运行环境不同&#xf…...

Flutter 中的 Scrollbar 小部件:全面指南

Flutter 中的 Scrollbar 小部件:全面指南 在Flutter中,滚动条(Scrollbar)是一种常见的UI组件,用于提供对滚动内容的快速访问和控制。Scrollbar 小部件可以附加到任何可滚动的widget上,如ListView、GridVie…...

【华为】将eNSP导入CRT,并解决不能敲Tab问题

华为】将eNSP导入CRT,并解决不能敲Tab问题 eNSP导入CRT打开eNSP,新建一个拓扑右键启动查看串口号关联CRT成功界面 SecureCRT连接华为模拟器ensp,Tab键不能补全问题选择Options(选项)-- Global Options (全局选项&#…...

实验二 电子传输系统安全-进展2

上周任务完成情况(代码链接,所写文档等) 重新调通电子公文传输系统部署gmssl学习生成SM2证书学习gmssl中的CTLS实现将数据库从SqlServer迁移到Mysql调试Mysql驱动学习Bouncy Castle 代码链接 Mysql表设计 /* Navicat MySQL Data Transfer…...

JavaScript 获取 HTML 中特定父元素下的子元素

JavaScript 获取 HTML 中特定父元素下的子元素 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>查找子元素示例</title> </head> <body><div id"parent"><p&…...

等保服务是一次性服务吗?为什么?怎么理解?

我国等保政策已经严格落地执行&#xff0c;但还有不少企业对于等保服务不是很了解。例如有人问&#xff0c;等保服务是一次性服务吗&#xff1f;为什么&#xff1f;怎么理解&#xff1f;今天我们就来简单回答一下&#xff0c;仅供参考哈&#xff01; 等保服务是一次性服务吗&…...

全网首发UNIAPP功能多的iapp后台源码

全网首发UNIAPP功能多的iapp后台源码&#xff0c;众所周知UN Dev Assist 后台是一款既不免费又不好用的后台今天直接分享。 搭建教程在里面了&#xff0c;自己查看。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89291994 更多资源下载&#xff1a;…...

【搜索方法推荐】高效信息检索方法和实用网站推荐

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…...

面试被问到不懂的东西,是直接说不懂还是坚持狡辩一下?

大家好&#xff0c;我是瑶琴呀。 面试被问到不懂的东西&#xff0c;是直接说不懂还是坚持狡辩一下&#xff1f;这个问题可以转变一下&#xff0c;如果你顺利拿到 offer&#xff0c;公司安排的工作跟你之前的技术和经验不匹配&#xff0c;你还愿意干下去吗&#xff1f; 转变一…...

Flutter 中的 StatefulBuilder 小部件:全面指南

Flutter 中的 StatefulBuilder 小部件&#xff1a;全面指南 在Flutter中&#xff0c;StatefulBuilder是一个高效的小部件&#xff0c;它根据给定的构建函数来构建widget&#xff0c;并在组件树中只对需要重新构建的部分进行更新。这使得它在性能优化方面非常有用&#xff0c;特…...

mail发送接口API如何使用?怎么调用接口?

mail发送接口API的性能怎么样&#xff1f;邮件接口发信的技巧&#xff1f; 为了自动化和集成电子邮件功能到应用程序或系统中&#xff0c;开发人员可以使用各种邮件发送接口API。AokSend将介绍如何使用这些API来发送电子邮件&#xff0c;提高效率和灵活性。 mail发送接口API&…...

Android Native逆向实战:Frida与IDA协同分析ART内存模型

1. 这不是“游戏外挂开发指南”&#xff0c;而是一次对移动应用安全边界的诚实测绘你打开手机里那个图标是蓝色小鸟、背景是木头和石头的《愤怒的小鸟》——它早已不是2010年那个靠物理引擎惊艳全场的休闲游戏&#xff0c;而是被无数人遗忘在角落、却仍静静躺在旧安卓设备里的“…...

小红书下载终极指南:5分钟掌握无水印批量下载技巧

小红书下载终极指南&#xff1a;5分钟掌握无水印批量下载技巧 【免费下载链接】XHS-Downloader 小红书&#xff08;XiaoHongShu、RedNote&#xff09;链接提取/作品采集工具&#xff1a;提取账号发布、收藏、点赞、专辑作品链接&#xff1b;提取搜索结果作品、用户链接&#xf…...

GitHub中文插件:打破语言壁垒,让开源协作更顺畅

GitHub中文插件&#xff1a;打破语言壁垒&#xff0c;让开源协作更顺畅 【免费下载链接】github-chinese GitHub 汉化插件&#xff0c;GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 你是否曾在Git…...

相对噪声模型下梯度下降的收敛性分析与实践指南

1. 项目概述&#xff1a;当梯度方向遇上相对噪声在机器学习和优化的世界里&#xff0c;梯度下降算法就像我们手中的指南针&#xff0c;指引着我们在复杂的高维地形中寻找最低点。但现实往往没那么理想&#xff0c;这个指南针的指针会晃动&#xff0c;我们得到的梯度方向总带着“…...

Leslie矩阵建模:从种群动力学到捕食竞争与机器学习拟合

1. 项目概述&#xff1a;从矩阵视角看种群兴衰在生态学和种群生物学里&#xff0c;我们总想预测未来&#xff1a;这片森林里的鹿群十年后会怎样&#xff1f;引入狼群后&#xff0c;整个系统会稳定还是崩溃&#xff1f;传统微分方程模型&#xff08;比如经典的Lotka-Volterra方程…...

基于拓扑数据分析的脑电信号特征提取与癫痫样放电检测

1. 项目概述&#xff1a;从高维脑电信号到可解释的拓扑特征在神经科学和临床神经病学领域&#xff0c;脑电图&#xff08;EEG&#xff09;分析一直是诊断癫痫等神经系统疾病的核心手段。其中&#xff0c;发作间期癫痫样放电&#xff08;Interictal Epileptic Discharges, IEDs&…...

STIML框架:融合标度理论与机器学习的企业增长预测新范式

1. 项目概述&#xff1a;当标度律遇见机器学习在金融分析和企业研究领域&#xff0c;预测一家公司的未来增长&#xff0c;就像试图预测一艘巨轮在复杂洋流中的航迹。传统上&#xff0c;我们有两类“航海图”&#xff1a;一类是基于物理定律的“机制模型”&#xff0c;它告诉你船…...

从λκ观测量到喷注鉴别:探索夸克与胶子分类的最优尺度

1. 项目概述与核心问题在大型强子对撞机&#xff08;LHC&#xff09;上&#xff0c;我们每秒要处理数以亿计的质子-质子对撞事件。这些对撞产生的绝大多数产物&#xff0c;是量子色动力学&#xff08;QCD&#xff09;主导的强子化过程所形成的“喷注”——即高度准直的强子流。…...

前缀和与差分 | 数组区间查询的利器

前缀和与差分 | 数组区间查询的利器 引言 前缀和&#xff08;Prefix Sum&#xff09;与差分&#xff08;Difference Array&#xff09;是数组处理中两种重要且互补的技术。前缀和用于快速计算数组区间元素的和&#xff0c;而差分用于快速对数组区间进行相同的加减操作。这两种技…...

Windows设备管理器报‘代码43’导致HDMI无输出?保姆级排查与修复指南(附原理)

Windows设备管理器报‘代码43’导致HDMI无输出&#xff1f;保姆级排查与修复指南&#xff08;附原理&#xff09;当你正准备进行一场重要的演示&#xff0c;或是沉浸在游戏世界中时&#xff0c;突然发现外接显示器黑屏无信号&#xff0c;设备管理器显示"Windows已停止该设…...