ESP32 BLE


项目介绍

MicroPython for ESP32 开发板低功耗蓝牙(BLE)研究学习项目

名词解释

写的比较乱,所以需要规范以下名词解释

BLE:低功耗蓝牙设备(Bluetooth Low Energy、Bluetooth LE)

Peripheral、BLE 设备、外围设备、设备:代表 ESP32 开发板

Central、中心设备:代表手机、电脑等可以连接蓝牙外设的设备

制定目标

使用 BLE 实现蓝牙键盘控制器功能,也就是自制蓝牙(小)键盘(HID)

要自制(小)蓝牙键盘,需要完成下列功能:

开发板实现 HID 功能,即作为外围设备,可以被中心设备扫描连接

制作(小)键盘硬件,编写键盘驱动,实现通过开发板向中心设备输入内容

硬件还包括灯光效果,用一个按键进行灯效切换:

全灭(默认)

全亮

全部呼吸闪烁

按键点击闪烁

设计字符映射表统一规范,方便对应按键和输入内容

进度情况

已完成开发板作为外围设备的功能,可以被手机扫描连接并简单输入一些字母和数字

已完成(小)键盘硬件电路设计,等待合适时机打板制作,目前有 2 种方案

打了若干次板子但是验证功能均失败了,目前硬件已经更新到v0.2.5,准备打板继续验证

目前v0.2.6按键部分硬件已经验证成功,终于可以继续后续开发了。。。

已知问题

BLE 设备在第一次绑定连接成功后,处于连接状态时,复位设备,或者关闭再打开中心设备的蓝牙功能后,设备会处于已连接状态,但是中心设备没有任何反应,既不会连接成功也不会连接失败,此处怀疑是因为缺少连接超时设置,但是当前版本的设备固件并不支持设置超时

在 Windows 10 系统上可以搜索到 BLE 设备并进行连接,但是很快会出现驱动程序错误的提示,暂时无解

导致以上已知问题的原因为,MicroPython ubluetooth不支持设备间的配对和绑定操作,这个问题只能等

自己尝试给固件增加配对功能,目前在iOS上测试成功了

分支项目

在等待打板的这段时间里又继续研究了 BLE 的其它玩法,总结一下:

MicroPython Beacon Library:这个库适用于实现包括谷歌的Eddystone和苹果的iBeacon在内的 2 种信标,还包括了不是很精确的信标测距功能

ESP32 BLE - Remote Controller:这个项目用于制作蓝牙自拍按钮,可惜目前还不支持苹果的设备

MicroPython BLE Library:根据之前研究学习到的 Micropython BLE 相关知识,将相关代码模块封装成为类库,方便以后使用

ESP32 BLE - UART:使用UART与其它设备交换数据

BLE 知识

非业内人士,以下内容纯属个人理解,如有偏差欢迎斧正

BLE 设备遵循 HOGP 规范(HID over GATT Profile)

Profile包扩很多Services

Services包扩很多Characteristics

Characteristics包扩很多Descriptors

例如蓝牙键盘就是一个Profile,它包括了至少(必要的)3 个Services:

Battery Service

Device Information

Human Interface Device

Battery Service又包括了 1 个Characteristics:

Battery Level

Battery Level还可以包括 1 个Descriptors:

Client Characteristic Configuration

软件部分

首先参考HOGP 规范,配置好所有的Services、Characteristics和Descriptors

BLE 设备作为外围设备(GATT Server),本地注册所有Services,生成payload,等待中心设备(GATT Client)连接

然后作为广播者将payload进行广播,包括:

本地名称(显示名称)

所有的Services

外观(显示名称旁边的图标)

中心设备扫描到广播后进行内容分析、展示,用户点击展示内容后开始和外围设备进行绑定连接,并读取保存在 BLE 设备本地的Characteristics和Descriptors信息,最终完成连接,等待接收数据

此过程中我们只负责外围设备(GATT Server)的开发

硬件部分(按键)

已完成电路设计的(小)键盘 2 种方案,分别是:

ADC 采样方案

键盘矩阵方案

ADC 采样方案

ADC 采样方案使用的是同型号电阻串联的方式,如图:


优点:

占用 IO 口少,一个 IO 口至少可以采集 10 个按键输入(未验证)

电阻型号一致,方便管理购买

缺点:

电阻串联方案导致只有 1 个按键的优先级别最高,也就是同时只能检测到 1 个按键按下

这种方案能想到的用途有 2 个:

作为小键盘使用,因为小键盘不需要多个按键同时按下

使用 2 路 ADC,其中一路作为控制键(Ctrl、Alt、Shift等),配合另外一路进行简单输入

键盘矩阵方案

键盘矩阵方案是常规键盘方案,连接方式如图:


优点:

可以做到全键无冲

电路简单,几乎只用到按键

缺点:

占用 IO 口较多,row * column个按键需要row + column个 IO,例如4 * 5的 20 键键盘需要 9 个 IO

硬件部分(灯效)

灯效也将使用矩阵方案(待验证)并使用按键切换 4 种不同灯效