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串口板替换掉即可:
蓝牙通讯是一种非常复杂的无线通讯协议,比之UART串口协议要复杂的多,因此,要想让多个蓝牙设备之间相互通讯其通讯参数也很多,同样的,必须要让大家都遵循同样一种规则发送和接收讯息,才能保证相互之间能够顺利的交流。
蓝牙模块的设置也是通过UART串口发特殊的命令来实现的,这套特殊的设置命令被称为AT指令集,这是一套被广泛应用于通讯设备的指令集,其特点是以字符“AT”为开头,以换行符为结尾的命令字符串。就像我们上次自定义的指令一样。这样的指令直接由蓝牙模块本身识别并处理,并不会通过蓝牙向外部传递。所以,我们在应用时自定义的指令要避免和AT指令集相混淆。
蓝牙模块本身由比较多的设置命令,但所幸的是作为从机的HC-06的设置指令非常简单,一下是HC-06的AT指令:
指令 | 回应 | 说明 |
---|---|---|
AT | OK | 用于确认通讯 |
AT+VERSION | OKlinvorV1.8 | 查看模块版本 |
AT+NAMExxxx | OKsetname | 设定蓝牙名称 |
AT+PINxxxx | OKsetPIN | 设定蓝牙配对密码(4位数字) |
AT+BAUD1 | OK1200 | 设定UART通讯波特率为1200 |
AT+BAUD2 | OK2400 | 设定UART通讯波特率为2400 |
AT+BAUD3 | OK4800 | 设定UART通讯波特率为4800 |
AT+BAUD4 | OK9600 | 设定UART通讯波特率为9600 |
AT+BAUD5 | OK19200 | 设定UART通讯波特率为19200 |
AT+BAUD6 | OK38400 | 设定UART通讯波特率为38400 |
AT+BAUD7 | OK57600 | 设定UART通讯波特率为57600 |
AT+BAUD8 | OK115200 | 设定UART通讯波特率为115200 |
AT+BAUD9 | OK230400 | 设定UART通讯波特率为230400 |
AT+BAUDA | OK460800 | 设定UART通讯波特率为460800 |
AT+BAUDB | OK921600 | 设定UART通讯波特率为921600 |
AT+BAUDC | OK1382400 | 设定UART通讯波特率为1382400 |
可以看到,HC-06的设置指令其实只有4条。HC-06使用UART串口和控制器通讯,默认波特率为9600bps(参见上次串口的使用教程)。如果想修改为其他速率,可使用相应的AT命令设置。
直接通过UART串口发“AT”命令,将收到“OK”作为回应,表明蓝牙模块和控制器的通讯正常。我们经常使用这条命令判断蓝牙模块的连接是否正确,且能否正常工作。
在无线连接方面,蓝牙需要一个识别名称,在主机端的搜索中,可以被发现并识别。默认是HC-06。
另一方面,无线连接时,也需要密码。蓝牙上称为PIN码,是4为数字,默认为1234。
手机APP准备:
在手机端,我们需要一个APP程序来发送自己定义的指令。这个程序应该由我们编制,但显然编制手机APP程序已然超出教程的范围。手机的软件开发,是更加复杂的系统规范,需要读者花费极大的耐心去学习。不过也由入门级和简单的实现方案,以后有时间给大家介绍吧。今天,我们先使用现成的蓝牙测试软件。这类软件不只一种,可以在安卓手机的应用商店中搜索,我这里用的是一个叫“蓝牙串口”的小程序,试了几个,觉得这个还可以。图标是这个样子的:
(关于手机APP,因为我无法保证安全,我就不做搬运工了,大家自行在手机应用商店查找吧,大同小异。)
首先我们要先在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,获取更多资料。