基于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
本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值