实战microPython(10)-蓝牙模块的使用

2023-05-16

实战microPython(10)-蓝牙模块的使用

                                                                       David Zou 2018-12-27

本文讲解蓝牙模块的使用,以及通过uPyBoard来操作蓝牙模块并实现手机和uPyboard互动。

正在学习和使用uPyBoard开发的小伙伴可能一直会有一种遗憾,就是uPyBoard虽然可以使用microPython开发,而且已经带有非常丰富的设备库,但是,却没有无线连接功能,尤其是对于时下最流行的手机控制一切的玩法,是不是就无能为力了呢?NO,我承认有些开发板天生具备无线功能,但没有一款板子可以包含所有你想到的功能。由于成本原因,功能越丰富的开发板价格越高,而且会有很多功能一直都没有机会使用到,这不免会造成浪费。因此,我们需要学会按照自身需要扩充开发板的功能就可以了。
那么,如何扩展功能呢?答案就是上次我们提到的通讯端口(接口),其中三大基础串行通讯端口:UART, SPI, I2C可以包含绝大多数的外扩功能模块。如之前已经接触过的,16路舵机驱动模块(I2C),OLED显示屏模块(SPI/I2C)等。而今天要扩展的蓝牙模块就需要使用上次讲过的UART串口来连接了。
手机通过蓝牙遥控设备示意图
当uPyBoard扩展了蓝牙模块后,就可以通过手机的蓝牙向uPyBoard板发送命令,uPyBoard接收到命令后执行相应的动作。当然,手机上必须要有相应的APP程序。
当前,最常见的蓝牙模块是HC-05和HC-06:
在这里插入图片描述
HC-05的蓝牙模块支持主/从模式,价格贵一些,HC-06的模块只支持从模式,价格稍微便宜些。所谓主模式和从模式,其实就是主模式可以主动搜索其他可见的蓝牙模块,并从中选取要连接的蓝牙设备,而从模式只能等待主模式的蓝牙设备连接。虽然好像主模式功能更好些,但是对于我们嵌入式的应用,在没有显示和输入的情况下,主模式是无法发挥其作用的,因此从模式才是最适合我们使用的工作模式,毕竟手机是可以在主模式下找到我们的设备并连接的。另外还有一点,HC-05模块本身默认为主模式,要想改变模式非常麻烦。综上所述,我这里推荐便宜又好用的HC-06蓝牙模块。大家要注意看上面两个模块的区别,或在购买前向店主问清楚。
HC-06模块只有从方式,因此,接口连接也极为简单:
在这里插入图片描述
只有4个引脚,RX,TX,GND,+5V,前两个,我想大家应该知道是UART串口的收发引脚。不知道的可以看之前的UART串口使用教程。后两个引脚就是电源引脚了,模块是5V供电。
我们依然使用上次的实验,实际上用蓝牙模块将上次实验中的HC340串口板替换掉即可:
在这里插入图片描述

蓝牙模块HC-06的配置:

蓝牙通讯是一种非常复杂的无线通讯协议,比之UART串口协议要复杂的多,因此,要想让多个蓝牙设备之间相互通讯其通讯参数也很多,同样的,必须要让大家都遵循同样一种规则发送和接收讯息,才能保证相互之间能够顺利的交流。
蓝牙模块的设置也是通过UART串口发特殊的命令来实现的,这套特殊的设置命令被称为AT指令集,这是一套被广泛应用于通讯设备的指令集,其特点是以字符“AT”为开头,以换行符为结尾的命令字符串。就像我们上次自定义的指令一样。这样的指令直接由蓝牙模块本身识别并处理,并不会通过蓝牙向外部传递。所以,我们在应用时自定义的指令要避免和AT指令集相混淆。
蓝牙模块本身由比较多的设置命令,但所幸的是作为从机的HC-06的设置指令非常简单,一下是HC-06的AT指令:

指令回应说明
ATOK用于确认通讯
AT+VERSIONOKlinvorV1.8查看模块版本
AT+NAMExxxxOKsetname设定蓝牙名称
AT+PINxxxxOKsetPIN设定蓝牙配对密码(4位数字)
AT+BAUD1OK1200设定UART通讯波特率为1200
AT+BAUD2OK2400设定UART通讯波特率为2400
AT+BAUD3OK4800设定UART通讯波特率为4800
AT+BAUD4OK9600设定UART通讯波特率为9600
AT+BAUD5OK19200设定UART通讯波特率为19200
AT+BAUD6OK38400设定UART通讯波特率为38400
AT+BAUD7OK57600设定UART通讯波特率为57600
AT+BAUD8OK115200设定UART通讯波特率为115200
AT+BAUD9OK230400设定UART通讯波特率为230400
AT+BAUDAOK460800设定UART通讯波特率为460800
AT+BAUDBOK921600设定UART通讯波特率为921600
AT+BAUDCOK1382400设定UART通讯波特率为1382400

可以看到,HC-06的设置指令其实只有4条。HC-06使用UART串口和控制器通讯,默认波特率为9600bps(参见上次串口的使用教程)。如果想修改为其他速率,可使用相应的AT命令设置。
直接通过UART串口发“AT”命令,将收到“OK”作为回应,表明蓝牙模块和控制器的通讯正常。我们经常使用这条命令判断蓝牙模块的连接是否正确,且能否正常工作。
在无线连接方面,蓝牙需要一个识别名称,在主机端的搜索中,可以被发现并识别。默认是HC-06。
另一方面,无线连接时,也需要密码。蓝牙上称为PIN码,是4为数字,默认为1234

手机APP准备:
在手机端,我们需要一个APP程序来发送自己定义的指令。这个程序应该由我们编制,但显然编制手机APP程序已然超出教程的范围。手机的软件开发,是更加复杂的系统规范,需要读者花费极大的耐心去学习。不过也由入门级和简单的实现方案,以后有时间给大家介绍吧。今天,我们先使用现成的蓝牙测试软件。这类软件不只一种,可以在安卓手机的应用商店中搜索,我这里用的是一个叫“蓝牙串口”的小程序,试了几个,觉得这个还可以。图标是这个样子的:
在这里插入图片描述
(关于手机APP,因为我无法保证安全,我就不做搬运工了,大家自行在手机应用商店查找吧,大同小异。)

uPyBoard连接实验:

首先我们要先在microPython板这边将蓝牙模块HC-06连上,并能通过UART端口和其通讯,通过发送AT指令收到其回应,这样才能确定uPyBoard和蓝牙模块HC-06的连接是成功的。
安照前面的连接图,将蓝牙模块连接到uPyBaord板上。连线时一定要仔细,加电前反复确认。确认连接无误后,将uPyBoard连接到电脑,此时蓝牙模块HC-06也会上电,其上的LED灯快速闪动。
在这里插入图片描述
打开控制台软件HexTerminal,在下方的输入窗口复制粘贴如下代码:

import pyb
from pyb import UART

#HC-06模块连接到UART1
uart = UART(1, 9600);#设置UART1的通讯速率为9600
pyb.delay(1000);

#测试AT指令
uart.write('AT');#通过UART1向HC-06发送AT命令
pyb.delay(1000);#延时1秒
uart.read(uart.any());#检查回应并接收

看过上次教程(UART的使用)的朋友,应该能够看懂。初始化UART1后,通过UART1向HC-06发送了AT命令字串。并等待1秒后,去检查UART1收到的内容,我们可以从HexTarminal上面的窗口中看到已经收到回应的字符串:OK。截图如下:
在这里插入图片描述
这说明,uPyboard和HC-06模块的连接正确且能够正常通讯了。HC-06模块的作用就是将UART发来的所有非AT命令的内容通过蓝牙发送给与其配对的设备,而将蓝牙接收的内容通过UART发送给uPyBoard
我们可以进一步测试其他AT指令,用来设置HC-06。不过,最常用的无非是检测蓝牙模块是否可用,修改蓝牙设备名称以及修改PIN码。下面我写了两个功能函数用来实现检测蓝牙模块是否可用和修改蓝牙名称,供大家参考:

import pyb
from pyb import UART

#HC-06模块连接到UART1
uart = UART(1, 9600);#设置UART1的通讯速率为9600
pyb.delay(1000);

#设置BLE设备的名称
def setATBleName(name):
	uart.write('AT+NAME'+name);
	pyb.delay(1000);
	str = uart.read(uart.any());
	# print(str);
	return str;

#检测HC-06是否存在
def isATBleOk():
	uart.write('AT');
	pyb.delay(1000);
	str = uart.read(uart.any());
	# print(str);
	return (str == b'OK');

#注意,要在使用HC-06前先检查模块是否可用
#调用函数测试蓝牙模块是否可用
isATBleOk();

#只有isATBleOk()返回True的情况下,才能进行HC-06其他操作。
setATBleName('MyBLE');

isATBleOK()用来检测蓝牙模块是否连接正常且可用,依据的方法就是前面的直接发送AT指令并收到回应。所以,在系统上电后,使用蓝牙模块前需要调用此函数确认蓝牙模块的正常。否则后面的所有操作都是白瞎。
setATBleName()用来修改蓝牙设备名称,一般情况下不用修改,默认是HC-06。我这里测试修改为MyBLE了。实验结果如下:
在这里插入图片描述
第一个True是isATBleOK()返回的,表面HC-06可用。下面的OKsetname是setATBleName()返回的,说明设备名称修改成功。
现在将上次通过UART串口实现控制LED的程序移植过来,得到如下代码:

import pyb
from pyb import UART
from pyb import LED

#HC-06模块连接到UART1
uart = UART(1, 9600);#设置UART1的通讯速率为9600
pyb.delay(1000);

led1 = pyb.LED(1);
led2 = pyb.LED(2);

uart.write('Please enter led command:\n\r');
while True:
	if (uart.any()):
		str = uart.readline();
		print(str);
		cmd = str.decode('utf-8');
		if (cmd == "led1=on"):
			print("LED1 On.");
			led1.on();
		elif (cmd == "led1=off"):
			print("LED1 Off.");
			led1.off();
		elif (cmd == "led2=on"):
			print("LED2 On.");
			led2.on();
		elif (cmd == "led2=off"):
			print("LED2 Off.");
			led2.off();
		else:
			print("Unknow commad");

打开我们手机的蓝牙,在搜索到的设备列表里就可以找到“MyBLE”(如果你没有通过AT指令更改过的话默认“HC-06”)。关于手机连接蓝牙的操作,因为每个人的手机型号不同,差异很大,我这里无法详述,请大家在网上自行搜索。选中后配对,要求PIN码时输入对应PIN码(如果没更改过默认为1234)。
在这里插入图片描述
再打开手机上的蓝牙串口APP,由于我们的蓝牙模块是属于SPP(Serial Port Profile)的蓝牙设备,HC-06支持是SPP的协议,点击左上角的“连接”:
在这里插入图片描述
设备列表中会有之前配对的蓝牙设备,我们选中它,进行连接。连接成功后会有个提示,并返回到聊天的那个页面:
在这里插入图片描述
好了,回到电脑上将之前的程序用HexTerminal发动到uPyBoard中先运行,程序首先会通过UART1向外发送一个信息:“Please enter led command:”,之后程序主循环会一直等待数据传输进来,如果之前手机蓝牙的操作没有问题,就可以在手机屏幕上看到我们输出的信息,不过遗憾的是,信息显示成多少段落,这是我们无法控制的事,这个APP软件我没有发现可以调整时间参数的地方。
不必理会他,我们可以在下方直接输入我们的自定义命令,如led1=on并发送试试。这里提供一个省事的办法。这个APP有个功能,可以预建一个消息列表,这样就能直接发送一条命令而不需要反复输入了。具体在右上角那3个点的菜单:
在这里插入图片描述
选择“首选项”,并在首选项中,选择“消息管理器”:
在这里插入图片描述
点击右上角“+”号新建消息,并将我们的自定义命令输入:
在这里插入图片描述在这里插入图片描述
将需要的命令全部输入完成:
在这里插入图片描述
退回到聊天窗口,再次点击右上角的三个点菜单,这回我们选择“消息”:
在这里插入图片描述
就可以看到刚才预置的命令了:
在这里插入图片描述
选择命令可以看到效果了。另外这个APP还有个“开关”界面应该可以直接设置开关按钮对应发送的消息,这样就能直接点击开关按键控制LED灯了。
手机端APP的实验结果截图如下:
在这里插入图片描述
电脑端的HexTerminal中会收到手机蓝牙发送过来的命令,并执行:
在这里插入图片描述
我想大家也能看到uPyBoard上LED在手机的控制下产生的效果吧。至此,我们已经具备了使用手机控制uPyBoard的一切条件,接下来就发挥你的想象吧。
本教程源码下载:
链接:https://pan.baidu.com/s/1cIIuIfUjBktfMdQ0fXsZyg
提取码:xl7w
在这里插入图片描述
祝各位玩得愉快!搜索并关注#公#众#号: MakerDIY-Park,获取更多资料。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实战microPython(10)-蓝牙模块的使用 的相关文章

随机推荐

  • 树莓派远程桌面连接出现Connection Problem, giving up

    树莓派4B xff0c 使用官方imager刷系统 xff0c 系统为当下最新的2022 01 28 raspios bullseye armhf xff0c 结果发现使用远程桌面登录时 xff0c 在输入用户名和密码后 xff0c 界面无
  • you-get 下载bilibili视频

    bilibili查看视频清晰度 you get i url https www bilibili com video BV17z411i7er p 61 1 debug 下载视频 you get format 61 flv1080 http
  • 解决“AttributeError: ‘str‘ object has no attribute ‘decode‘”问题

    问题描述 在跑代码的时候出现报错提示 Traceback most recent call last File 34 multi detect Nerual py 34 line 4 in lt module gt import BiLST
  • NGINX 进程通信机制

    本文地址 xff1a http blog csdn net spch2008 article details 38945033 nginx的进程通信分为三种类别 xff1a linux 系统与nginx 通信 xff0c master 进程
  • Could not find main class com/intellij/idea/Main

    Could not find main class com intellij idea Main 下载完Pycharm xff0c 打开时显示Could not find main class com intellij idea Main
  • 记事本里打“联通”为什么会变成乱码?

    记事本的编码问题 xff0c 当文档中所有字符都在 C0 AA DF 80 BB BF 这个范围的时候 xff0c notepad都无法确认文档的格式 xff0c 没有自动按照UTF 8格式来 34 Display 34 34 联通 34
  • 思博伦Spirent Testcenter交换机性能测试主要技术指标_丢帧率/吞吐量/转发速率之间的关系_双极未来

    转发速率 丢帧率和吞吐量是描述交换机转发性能的主要技术指标 xff0c 这些指标的测试结果可以客观地反映出被测交换机的性能 正确理解它们之间的联系与区别对于设计吞吐量 丢帧率和转发速率的测试方法非常重要 如下图所示 xff0c X轴表示 x
  • OpenStack-Ceilometer项目功能与架构介绍

    1 OpenStack Ceilometer项目简介 OpenStack通过Telemetry项目提供计量与监控服务 xff0c 该项目旨在针对组成已部署云的物理和虚拟资源 xff0c 可靠地收集并保存各类使用数据 xff0c 以便对这些数
  • redhat 查询端口占用

    linux redhat 端口和服务的查看与终止 redhat 查询端口占用情况和杀死占用的服务 netstat anp grep lt 端口号或者程序名称 gt 查8080端口占用情况 netstat anp grep 8080 查jav
  • mapl

    business card case executive veto power anime stream radio johann strauss black layout pink star job interview question
  • Knowledge Tracing: A Survey阅读笔记

    xff08 注 xff1a 为了方便后续阅读KT论文 xff0c 文中一些名词使用英文 文中保留的序号与原论文参考文献一致 行文会在后续反刍过程中改进 xff09 原文链接 xff1a https arxiv org abs 2201 06
  • iOS_NSAttributedString 的21种属性详细介绍(图文混排)

    说明 NSAttributedString 可以非常方便的实现文字排版和图文混排功能 共有21中效果 API 本文将较详细的介绍21种的属性的使用 注 本博客由 64 凡俊编写 64 Scott 64 春雨 审核 若转载此文章 请注明出处和
  • ++和--的用法

    单独使用时 xff0c 43 43 或者 无论是放在变量的前面还是后面 xff0c 结果是一样的 参与操作时 如果 43 43 或者 在变量的后面 xff0c 先拿变量参与操作 xff0c 后变量做 43 43 或者 例如 int a 61
  • geoserver集群

    软件准备 geoservertomcat 插件 下载地址 xff1a https build geoserver org geoserver activeMQ broker plugin zipjms cluster plugin zip
  • 为moment.js正名

    说来也奇怪 xff0c 总有人在耳边说moment js对国际化日期支持不好 xff0c 坚决不要使用 xff0c 会带来很多问题之类的话 但就我个人经验来看 xff0c 还从未见到过任何一个反例 xff0c 恰好我又是个不信邪的人 xff
  • sqlite3 的二进制数据插入与获取

    sqlite3 存储和查找二进制数据对象 使用c语言接口 思路 xff1a 通过让代码执行执行sql语句进行查找 xff0c 但二进制的显示方法无法确定所以 xff0c 二进制数据对象查询语句略有不同 注意 xff1a sqlite3的数据
  • MySQL修改数据表中的字段名

    MySQL修改数据表中的字段名 在一张数据表中只能设置一个唯一名称的字段名 在同一张数据表中 xff0c 不能出现两个名称完全相同的字段名 因此 xff0c 数据库系统可以通过字段名来区分数据表中的不同字段 在MySQL中 xff0c AL
  • 证明:当gcd(a, b) = 1,则gcd(a + b, a) = 1

    假设 xff1a gcd a b 61 1 证明 xff1a gcd a 43 b b 61 1 反证法 xff1a 假设gcd a 43 b b 61 k 61 1 则 xff1a b 61 k r1 a 43 b 61 a 43 k r
  • 实战microPython(二)时钟和日历的使用

    实战microPython 2 时钟和日历的使用 David Zou 创客DIY乐园 对于一名创客 xff0c 自制一个个性化的时钟或闹钟啥的 xff0c 应该是比较常见的入门级任务了 通常我们制作时钟或闹钟的时候 xff0c 都需要借助专
  • 实战microPython(10)-蓝牙模块的使用

    实战microPython 10 蓝牙模块的使用 David Zou 2018 12 27 本文讲解蓝牙模块的使用 xff0c 以及通过uPyBoard来操作蓝牙模块并实现手机和uPyboard互动 正在学习和使用uPyBoard开发的小伙