基于Nordic52832的六轴HID蓝牙鼠标开发(上)

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

很久没开发蓝牙相关的项目,找到一块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
时下智能语音交互市场火热,越来越多的设备都开始支持原场AI语音交互。例如:智能音箱,智能电视等等。但这类产品的识别率和误唤醒率还需要再不断的优化提升,以至于日常生活中人们还是离不开各式各样的遥控器。基于TDK 6-传感器ICM-40608和炬芯 BLE SOC ATB1103的智能语音遥控器解决方案实现真正的智能、万物互联。 遥控器方案整体硬件设计指南 基于Actions 炬芯的ATB110x SOC BLE语音遥控器已经大批量量产,搭配 6-运动传感器使其更加智能、拥有更高的市场竞争力; PCB板按功能模块分模拟信号部分(例如MIC IN走线)、射频信号部分(例如BLE及相关关键外围)、数字信号部分(例如TWI、UART、SPI等),电源部分(如芯片内部电源),模拟信号和射频信号容易受到干扰,布局时尽量远离数字信号电路和大电流电源电路。BLE的天线应远离喇叭(以及喇叭引线)、指示灯、频谱灯、按键等的排线。 数字、模拟元器件尽量远离并限定在各自的布线区域内。元器件周围留出电源和地走线的空间。数字元器件集中放置以减少走线长度。在IC的电源Pin放置0.1uF的去耦电容。晶振电路尽量靠近其驱动器件。 为利于系统散热,布局时发热量较高的器件尽量分开摆放,有EPAD的器件可以在地焊盘和器件周围的地多打过孔,可以达到更好的散热效果。 在设计许可的条件下,元器件的布局尽可能做到同类元器件按相同的方向排列,相同功率的模块集中在一起布置;相同封装的元器件等炬力放置,以便元件贴装、焊接和检测。 走线 RF走线 对于板载天线注意点如下: 1)板载天线面积尽量大,在匹配时带宽会更加宽,性能更佳; 2)匹配网络尽量靠近板载天线,如下图所示; 3)如果面积允许情况下靠近芯片端多预留一个TT型匹配网络,可根据情况进一步优化匹配; 4)针对两个走线的情况,在叠层选定后需计算相关的线宽和铺铜间距,因为板材有差异,注意和板厂沟通相关阻抗情况; 电源线: 1)根据印制线路板电流的大小,尽量加粗电源线的宽度,减少环路电阻。大电流的电源过孔推荐使用大于20-12mil的过孔,并打多个过孔连接。 2)电源线、底线的走向和数据传递的方向尽量保持一致,有助于增强抗噪声能力。 地线:1)模拟地、数字地、大功率器件的地在布线时分开,而最后都汇集到接地点上来,如:MIC会进行单独的AGND处理再连接到GND上。 2)接地线应尽量加粗。若接地线很细,则接地电位随电流的变化而变化,致使电子设备的信号电平不稳,抗噪声性能变差。因此应将接地线加粗,使它通过三倍于印制板上的允许电流。 TDK拥有最丰富的麦克风产品组合、基于运动传感器的光标控制的核心专利拥有者,适用于智能遥控器、智能电视和机顶盒的完整软件包(空鼠、手势、游戏控制); Air Motion软件方案 嵌入式软件:AirMotion Library (AML) 6-软件运行在遥控器端 提供空中相对指向 发送dx/dy给远端目标设备 支持基本的手势 支持无线接口 目标CPU:8051,ARM Cortex M0,M3,M4 AirMotionLib固件数据 基于ARM Cortex-M3平台验证 数据处理频率:100Hz 基于运动的功能 算法简介 AML算法获取手持遥控设备内的6运动传感器数据,在遥控设备端融合计算出远端被控制焦点在两纬平面的实时相对位置(dx, dy)。同时,为了保证良好的用户体验,AML算法对传感器数据做实时动态校准,设备横滚补偿。AML算法还可以支持常用的遥控手势识别,如左、右、上、下四方向的划动,以及顺时针和逆时针方向的快速旋转。 1、 API AIR MOTION库使用以下功能: •invn_algo_aml_init():每次处理(重新)启动时,必须调用此函数进行库初始化。•invn_algo_aml_process():每次有新的传感器值时,都必须调用此函数。该库被设计为以100Hz运行。 2、校准 陀螺仪偏移值可能会随着时间的推移而波动,具体取决于各种参数。 该库支持连续校准,实时计算陀螺仪偏移值。 每次调用invn_algo_aml_process()时,都会检查陀螺仪即时“静态”。 如果考虑设备静态,计算新的陀螺仪偏移值。 然后可以将遥控器视为已校准。 您可以检查'InvnAlgoAMLOutput.status'以跟踪校准状态。 'gyr_fsr'参数用于校准运动算法。 'acc_fsr'参数用于滚动补偿功能场景应用图产品实体图展示板照片方案方块图ICM-40608参数对比关键网络原理图核心技术优势TDK硬件和软件的优势 》终极用户体验 最好的声音质量 快速响应的空中指向 直观、高效的应用体验 》最低功耗的灵活方案 嵌入遥控器 可运动在远端设备(智能电视、机顶盒或者流媒体设备) 》低风
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值