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 种不同灯效