前言
很久没开发蓝牙相关的项目,找到一块Noridc蓝牙kit板,正好配合6轴来做一个拟合姿态的无线鼠标
如有异议,欢迎指正
方案实现
使用了6轴传感器和Nordic kit开发板,6轴获取姿态换算获得欧拉角,然后对应的角度拟合到HID鼠标描述符的XY轴移动改变量,通过蓝牙传给到PC端,用于控制鼠标指针动作

HID基本概念
HID(The Human Interface Device)人机交互设备,定义了在人机接口设备中的协议、特征和使用规范,蓝牙HID协议以USB HID协议规范为基础
HID规范
HID角色
- HID device:HID 设备,PC主机
- HID Host:HID 主机,鼠标、键盘
设备描述符结构
HID的定义在接口描述符中,HID接口描述包含了报告描述符和物理描述符

HID report
HID Device支持三种报告
- Input report(输入报告): hid device发送给 hid host的封包;例如鼠标将移动和点击事件信息发送给PC端
- Output report(输出报告):hid host发送给 hid device的封包;例如PC端发送数据来控制键盘灯
- Feature report(特征报告):传输双向数据
HID逻辑链路
- HID Control:通道主要用于传输控制封包,这个通道传输的封包为同步封包(synchronous reports),L2CAP的psm为0x0011
- HID Interrupt:通道传输的封包不需要确认,所有称为异步封包(asynchronous reports),L2CAP的psm为0x0013

HID Report Models报告模式
两种协议
- boot protocol:boot protocl不解析报告描述符,设备支持该协议,在PC系统处于BIOS时就可以识别设备
- report protocol:需要解析报告描述符,PC系统启动完成后进行枚举描述符
蓝牙HID
工程实例
使用nordic52832 Kit开发板,SDK为当前最新版本nRF5_SDK_17.0.2_d674dde,工程目录examples\ble_peripheral\ble_app_hids_mouse,协议栈使用S132
广播报文
广播报文包含服务Serivice UUIDs为 0x1812,指示为HID服务,Apperance外观(Type 0x19)为962(960~968),标识HID子类型为鼠标Mouse

代码分析
主函数
- 主函数初始化按键与协议栈,在循环中加入6轴的拟合数据后发送鼠标移动量到PC端
int main(void)
{
bool erase_bonds;
// Initialize.
log_init();
timers_init(); //初始化定时模块
buttons_leds_init(&erase_bonds); //按键led初始化,注册事件回调
power_management_init();////电源管理
/*
* 下面是对蓝牙相关配置的初始化,一般不需要修改
*/
ble_stack_init();//协议栈初始化
scheduler_init();//调度器
gap_params_init();//gap初始化
gatt_init();//gatt初始化
advertising_init();//广播初始化
services_init();//服务初始化
sensor_simulator_init();//模拟电池
conn_params_init();//连接参数初始化
peer_manager_init();//配对绑定初始化
// Start execution.
NRF_LOG_INFO("HID Mouse example started.");
timers_start();// 开启定时器
//erase_bonds = true;//擦除绑定
advertising_start(erase_bonds);//广播开启后,蓝牙内部协议栈的调度就开始跑起来了
Lsm6dlSensor_Init();//6轴初始化
// Enter main loop.
for (;;)
{
x_mov = 0, y_mov = 0;
Lsm6dl_Read(&x_mov, &y_mov);//获取移动量
if (m_conn_handle != BLE_CONN_HANDLE_INVALID)
{
if(x_mov != 0 || y_mov != 0)
mouse_movement_send(x_mov, y_mov);//发送
}
idle_state_handle();//等待事件
}
}
服务初始化
static void services_init(void)
{
qwr_init();//
dis_init();//初始化设备信息服务(产品信息)
bas_init();//注册电池服务
hids_init();//hid服务初始化
}
报告描述符
HID设备是通过报告(report)来传输数据的,包含有输入报告(Input)和输入(Output)报告

- bSiz

本文介绍了如何利用Noridc蓝牙开发板和6轴传感器,通过蓝牙HID协议实现无线鼠标姿态控制,包括HID基本概念、报告描述符解析和实际工程实例。
最低0.47元/天 解锁文章
1541

被折叠的 条评论
为什么被折叠?



