[Funpack2-6]基于nRF7002-DK的蓝牙HID应用
Funpack活动项目,基于nRF7002-DK实现的蓝牙键盘鼠标+NFC模拟标签。
项目背景
这是我在参与的第二个Funpack活动项目。任务内容如下:
任务一:
任务二:
任务三:
任务四:
这次活动我最开始选择完成的是任务一,设计一个蓝牙鼠标+键盘复合设备,但是开发完键鼠共功能以后发现最后那个通过同步电脑大小写的状态没法做,群里大佬说是官方SDK有问题。不得已又加了任务三的内容,所以实际我完成的应该算任务四吧。
硬件介绍
nRF7002-DK 简介
nRF7002-DK——用于nRF7002 Wi-Fi 6双频辅助IC的开发套件。
nRF7002 DK是nRF7002 Wi-Fi 6协同IC的开发评估板,它包含了在单板上开发所需要的所有元器件。开发板采用nRF5340多协议SoC作为主处理器,配合nRF7002 Wi-Fi协同芯片。可以同时支持低功耗蓝牙和Wi-Fi 应用的开发,并实现如 OFDMA、波束成形和目标唤醒时间等多项 Wi-Fi 6 功能。
nRF7002是Nordic的Wi-Fi产品系列中的首款器件,符合802.11ax标准,可提供双频段(2.4和5GHz)连接,支持Matter中使用的全部无线协议,可以为产品中添加最新的Wi-Fi 6技术,该芯片还具有帮助保护用户数据的先进安全功能。并与Nordic现有的超低功率技术无缝结合,可延长电池使用寿命。它提供快速、可靠的连接,具有先进的安全功能,并且方便集成到各个应用当中。
板上的nRF5340是支持低功耗蓝牙、蓝牙Mesh、NFC、Thread和Zigbee的双核蓝牙5.3 SoC,并且蓝牙测向可实现所有到达角(AoA)和出发角(AoD)的测量功能。此外,它支持低功耗蓝牙音频,2 Mbps高吞吐量、广播扩展和长距离。像蓝牙Mesh、Thread和Zigbee这样的Mesh协议可以与低功耗蓝牙同时运行,从而使智能手机能够配网、入网、配置和控制Mesh节点。还支持NFC、ANT、802.15.4和2.4 GHz专有协议。
特性:
• Arduino连接器
• 两个可编程的按钮
• 搭载nRF7002 Wi-Fi协同IC
• 作为主处理器的nRF5340 SoC
• 电流测量引脚
• 2.4GHz、2.4/5 GHz和NFC天线
• 高性能的128MHz Arm Cortex-M33应用内核
• 超低功率的64MHz Arm Cortex-M33网络核心
项目介绍
本次项目基于nRFConnect SDK进行开发,它集成了ZephyrOS操作系统,使用zephyr的多线程管理实现了同时模拟蓝牙HID输入设备和NFC标签的功能。通过接入五轴摇杆外设可以实现模拟鼠标的移动和左右键点击操作。使用手机触碰NFC天线可以实现使用NFC打开eetree funpack项目首页的功能。
功能介绍
1. 接线上电,注意要打开左上角电源开关。
2. 蓝牙配对
3. 蓝牙鼠标模拟
4. 蓝牙键盘模拟
5.扫描NFC
6. NFC打开浏览器指定网址
程序编码
一、搭建环境
1. 安装VisualStudio Code
官方网址:https://code.visualstudio.com/
2. 安装nRF Connect For Desktop
3. 安装nRF Connect SDK
选择需要安装的SDK版本,点击Install。点击右下角的SHOW LOG可以查看安装日志。
下面是安装完成日志
4. 安装VisualStudio Code扩展
安装SDK后点击Open VS Code提示下图,点击Install missing extensions安装VS Code扩展。
安装完扩展之后要安装command lines工具
5. 安装nRF Command line tools
未安装command lines tools效果
安装command lines tools后的效果
二、程序设计与实现
软件流程
工程目录结构
设备树按钮配置
因为我这边开发的时候是通过CLion进行的,这边需要配置CMake profile的环境变量,增加ZEPHYR_BASE=/opt/nordic/ncs/v2.4.1/zephyr。
另外对CMakeLists.txt也要进行修改,添加以下代码设置板卡信息和dts overlay文件
set(BOARD nrf7002dk_nrf5340_cpuapp)
set(DTC_OVERLAY_FILE nrf7002dk_nrf5340_cpuapp.overlay)
prj.conf需要按以下代码进行调整,主要是启用蓝牙和NFC,另外要调整堆内存池大小等。
#
# Copyright (c) 2019 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#
CONFIG_NCS_SAMPLES_DEFAULTS=y
CONFIG_BT=y
CONFIG_BT_DEBUG_LOG=y
CONFIG_BT_MAX_CONN=3
CONFIG_BT_MAX_PAIRED=3
CONFIG_BT_L2CAP_TX_BUF_COUNT=5
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_DEVICE_NAME="HessianBTMouse"
CONFIG_BT_DEVICE_APPEARANCE=962
CONFIG_BT_BAS=y
CONFIG_BT_HIDS=y
CONFIG_BT_HIDS_MAX_CLIENT_COUNT=2
CONFIG_BT_HIDS_ATTR_MAX=40
CONFIG_BT_HIDS_SECURITY_ENABLED=y
CONFIG_BT_GATT_UUID16_POOL_SIZE=40
CONFIG_BT_GATT_CHRC_POOL_SIZE=40
CONFIG_BT_CONN_CTX=y
CONFIG_BT_DIS=y
CONFIG_BT_DIS_PNP=y
CONFIG_BT_DIS_MANUF="NordicSemiconductor"
CONFIG_BT_DIS_PNP_VID_SRC=2
CONFIG_BT_DIS_PNP_VID=0x1915
CONFIG_BT_DIS_PNP_PID=0xEEEE
CONFIG_BT_DIS_PNP_VER=0x0100
# 解决
# W: Unable to allocate ATT TX meta
# W: No buffer available to send notification
CONFIG_BT_CONN_TX_MAX=40
CONFIG_HEAP_MEM_POOL_SIZE=4196
CONFIG_NFC_NDEF=y
CONFIG_NFC_NDEF_MSG=y
CONFIG_NFC_NDEF_RECORD=y
CONFIG_NFC_NDEF_URI_MSG=y
CONFIG_NFC_NDEF_URI_REC=y
CONFIG_NFC_NDEF_LAUNCHAPP_MSG=y
CONFIG_NFC_T2T_NRFXLIB=y
CONFIG_MAIN_STACK_SIZE=1536
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_DK_LIBRARY=y
创建NFC处理线程(其实后面发现好像也不需要开线程)
/* size of stack area used by each thread */
#define STACKSIZE 1024
/* scheduling priority used by each thread */
#define PRIORITY 7
K_THREAD_DEFINE(nfc_task_id, STACKSIZE, nfc_task, NULL, NULL, NULL,
PRIORITY, 0, 0);
设置NFC URL标签内容
const uint8_t url[] = "//www.eetree.cn/page/digikey-funpack";
/* Encode launch URI */
err = nfc_ndef_uri_msg_encode(NFC_URI_HTTPS,
url,
sizeof(url)-1,
ndef_msg_buf,
&len);
if (err) {
printk("Cannot encode message!\n");
goto fail;
}
/* Set created message as the NFC payload */
err = nfc_t2t_payload_set(ndef_msg_buf, len);
if (err) {
printk("Cannot set payload!\n");
goto fail;
}
/* Start sensing NFC field */
err = nfc_t2t_emulation_start();
if (err) {
printk("Cannot start emulation!\n");
goto fail;
}
printk("NFC configuration done\n");
return;
三、固件烧录(下载)、串口跟踪
通过Clion右上角的cmake task,选择flash即可进行烧录。下面可以看到烧录日志,看到Build finished就成功了。
然后串口调试这边我用的是minicom(完全不知道nRF Connect SDK有没有带调试工具)
四、遇到的问题
初次接触nRF Connect SDK和Zephyr着实挠头,难度相比ESP-IDF、Arduino来说还是高了很多。很多默认配置要调整,文档也不太会找,程序开发下来举步维艰。
烧录的时候还经常会出现失败的情况,要执行下面的脚本解锁。
nrfjprog --recover --coprocessor CP_APPLICATION
nrfjprog --recover --coprocessor CP_NETWORK
未来计划
未来想再扩展一下NFC的玩法,像NFC分享WiFi连接信息之类。
参考资料
- nRF Connect SDK官方文档:https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/introduction.html
- Zephyr官方文档:https://docs.zephyrproject.org/
- HID报告描述符:https://www.usbzh.com/article/detail-775.html