2024年寒假练 - 基于SAMD21G17D的触摸滑条USB HID设备实现及控制PC音量的功能开发
该项目使用了SAMD21 Curiosity Nano 评估套件,实现了触摸滑条USB HID设备的设计,它的主要功能为:左右划动触摸滑条作为键盘F2、F3按下,通过USB HID协议报告至PC,从而控制PC音量。
标签
嵌入式系统
Microchip
触摸
USB HID
MPLAB X IDE
葉SiR
更新2024-05-27
北京大学
311

项目介绍

本项目基于 Microchip 的 SAMD21 Curiosity Nano 核心板及 Curiosity Nano EVB 扩展板,通过 USB HID 协议实现了一个键盘设备,通过使用 Touch 库实现了对触摸滑条左右滑动的识别,将不同方向滑动作为两个按键(F2、F3)按下,上报至 PC,从而实现 PC 音量调节。

👉 MPLAB X IDE

硬件介绍

SAMD21 Curiosity Nano 评估套件是评估 SAMD21G17D MCU 的硬件平台。它由 MPLAB® X 集成开发环境 (IDE) 和 MPLAB Harmony v3 软件开发框架提供支持。通过评估套件可以轻松访问 SAMD21 MCU 的功能,从而将器件集成到定制设计中。由于评估套件包含用于编程和调试的板载 Nano 调试器,因此无需外部工具即可对 SAMD21G17D 器件进行编程。

SAMD21 Curiosity Nano 开发板板载一个用于编程和调试的 Nano 调试器。Nano 调试器是一个复杂的 USB 设备,由多个接口组成,如调试器、大容量存储设备、数据网关和虚拟接口、 数据网关和虚拟 COM 端口 (CDC)。板卡特性:


  • 板载SAMD21G17D微控制器
  • 一个机械用户开关
  • 板载 Nano 调试器
    • 在 MPLAB X IDE 中识别电路板
    • 一个绿色电源/状态 LED
    • 编程和调试
    • 虚拟 COM 端口(CDC)
    • 一个逻辑分析器(DGI GPIO)
  • USB 供电
  • 可调目标电压

项目设计

开发环境及工程参考

本项目使用 Microchip 官方的 MPLAB X IDE 开发。项目所用到的工具链、库或 packs 如下:

1. 编译器:xc32 v4.35

2. Packs: SAMD21_DFP 3.6.144、CMSIS 5.8.0、PKOB nano 1.13.715(调试用)

3. MCC Content Libraries:

1. MCC Harmony Core 1.5.1

2. csp v3.18.2

3. core v3.13.3

4. bsp v3.17.0

5. CMSIS_5 5.9.0

6. 触摸设备库:touch v3.15.0、touch_apps v3.6.0、touch_host_driver v1.0.0

7. USB库:usb v3.12.0、usb_apps_device v3.6.0


⚠️ 请注意,如果因为网络问题导致 MCC 的库下载失败,需要在安装目录下的空文件夹删除,否则它依然识别你安装了该包。上述所列的部分库是必需的。在基础环境设置好后,本项目可基于官方提供的 USB HID 键盘示例进行功能开发。

👉 MPLAB-Harmony的USB HID键盘示例:hid_keyboard

总体流程图

在 USB HID 设备的事件回调内,在 USB_DEVICE_EVENT_SOF 内,检测触摸滑条,当检测到滑条有动作时,isTouchbarPress 置位。在状态机 APP_STATE_EMULATE_KEYBOARD ,判断 isTouchbarPress ,如果是则判断滑动方向,左划代表键盘 F2,右划代表键盘 F3。最后将通过 USB_DEVICE_HID_ReportSend 将键盘输入报告发送至 PC。

硬件基本配置

虽然有示例代码可以进行参考,但是相关的库还是需要进行配置。在 MCC Content Manager 内安装必备的包后,则在 Project Graph 内添加对应的库,并进行功能配置。项目系统框图如下:



其中,Touchbar 与 USB HID 模块内的框图分别为:



⚠️ 需要将“Enable VBUS Sense”功能关闭,因为扩展板 TypeC 口未预留该 IO。


调试串口及BSP配置

PIN

功能

PA22

SERCOM5_PAD0

PB22

SERCOM5_PAD2

结合电路图,我们使用 SERCOM5(PA22、PB22正好作为作为CDC TX、RX)作为调试串口,添加 STDIO 模块实现 printf() 的重定向。在 SERCOM5 的配置选项内,设置:


注意 Receive Pinout 选择PAD[2],这对应 PB22(SERCOM5_PAD2),Transmit Pinout 选择为PAD[0] 作为 TxD,这对应 PA22(SERCOM5_PAD0)且不能影响 PAD[2]。

添加 BSP 模块,以简单控制核心板上的 LED 与按键。它会自动对相应 PIN 进行设置,如果用不到可以手动将 PIN 取消。

PIN

功能

方向

PB10

LED_AL

Out

触摸滑条

PIN设置:

PIN

功能

PA03

PTC_Y1

PA06

PTC_Y4

PA07

PTC_Y5

添加 Touchbar 模块,其附带的几个模块都会自动摆放上。在 [Project Graph] -> [Plugins] -> [Touch Configuration] 内进行配置。

先添加一个滑条,之后将传感器与 PIN 绑定,从左到右依次为 PA03、PA06、PA07(结合电路图)。最后调整一下参数(多次尝试后取功能实现效果较好的参数):滑动分辨率为7bit,滑动死区为8%。



识别触摸滑条的左右划动动作代码如下:

#define SLIDER_CONTACTED_MASK (1 << 1u)

touch_process();
if (measurement_done_touch == 1u)
{
measurement_done_touch = 0u;
if (SLIDER_CONTACTED_MASK == (get_scroller_state(0) & SLIDER_CONTACTED_MASK))
{
if ((qtm_scroller_data1[0].right_hyst & 0x08) == 0x08)
{
// slide right
}
else if ((qtm_scroller_data1[0].left_hyst & 0x08) == 0x08)
{
// slide left
}
}
}

通过 get_scroller_state(0) 获取0号触摸滑条状态。查阅 QTouch 库的手册,bit 1 为接触移动标志位,该位置位表示触摸滑条被接触。这之后,通过 qtm_scroller_data1[0].right_hyst 与 left_hyst 判断是向左还是向右移动,从而识别相应的动作。



USB HID

参考 MPLAB-Harmony的USB HID键盘示例:hid_keyboard,例程中的 keyboard.c/.h 定义了键盘设备的输入报告格式及生成输入报告的函数。app.c/.h 内则为一状态机,用以实现 USB HID 设备的连接、发送键盘输入报告、接收键盘输出报告等功能。

APP_Tasks() 定义了状态机及主要的逻辑,该状态机将一直运行。在状态机初始状态时,将为USB设备注册回调函数,而回调函数内,则是实现各种业务逻辑的地方。这部分需要进行修改。

替换 APP_ProcessSwitchPress() ,以检测触摸滑条是否有动作。在检测到有动作后,通过置位 appData.isTouchbarPress ,以在其他函数内实现后续功能。

void APP_ProcessTouchbarPress(void)
{
/* This function checks if the touchbar is pressed */
touch_process();

if (measurement_done_touch == 1u)
{
measurement_done_touch = 0u;
if (SLIDER_CONTACTED_MASK == (get_scroller_state(0) & SLIDER_CONTACTED_MASK))
{
if (appData.sofEventHasOccurred)
{
appData.sofEventHasOccurred = false;
appData.isTouchbarPress = true;
}
}
else
{
/* No key press. Reset all the indicators. */
appData.sofEventHasOccurred = false;
}
}
}

修改函数 APP_EmulateKeyboard(),其原先逻辑是,判断按键是否按下,按下后 appData.key++,即依次发送 A、B、C……我们所要实现的逻辑是判断 appData.isTouchbarPress,之后判断触摸滑条滑动方向,左划表示按键 F2,右划表示 F3。

动作

表示按键

左划

F2,音量减小快捷键

右划

F3,音量增大快捷键

void APP_EmulateKeyboard(void)
{
if (appData.isTouchbarPress)
{
/* Clear the touchbar pressed flag */
appData.isTouchbarPress = false;

/* If the touchbar was pressed, update the key counter and then
* add the key to the key code array. */
if ((qtm_scroller_data1[0].right_hyst & 0x08) == 0x08)
{
appData.key = USB_HID_KEYBOARD_KEYPAD_KEYBOARD_F3;
printf("F3 pressed\n");
}
else if ((qtm_scroller_data1[0].left_hyst & 0x08) == 0x08)
{
appData.key = USB_HID_KEYBOARD_KEYPAD_KEYBOARD_F2;
printf("F2 pressed\n");
}
else
{
appData.key = USB_HID_KEYBOARD_KEYPAD_RESERVED_NO_EVENT_INDICATED;
}

appData.keyCodeArray.keyCode[0] = appData.key;

/* Start a touch press ignore counter */
}
else
{
/* Indicate no event */
appData.keyCodeArray.keyCode[0] =
USB_HID_KEYBOARD_KEYPAD_RESERVED_NO_EVENT_INDICATED;
}

KEYBOARD_InputReportCreate(&appData.keyCodeArray,
&appData.keyboardModifierKeys, &keyboardInputReport);
}

功能展示

下载程序后连接 PC,可以发现 PC 识别该 USB HID 设备。通过左右滑动触摸滑条可以实现控制 PC 音量的效果。注意操作的时候板子不要接触桌面,否则触摸滑条会误触。


👉 详细展示参见:B站:基于SAMD21G17D的触摸滑条USB HID设备实现及控制PC音量的功能开发

项目总结

本次项目通过 USB HID 协议与触摸库,实现了将触摸滑条作为 USB HID 设备,左右滑动表示按键按下,报告至 PC,从而实现音量控制的功能开发。MPLAB X IDE 只能说一言难尽,MCC 每次打开要半天,对网络环境要求严苛,Project Graph 界面式调用模块出发点是好的,但是有时修改配置会卡死,例如 STDIO 模块还需要单独调用,从而实现 printf 重定向。单就触摸库的开发来说,这部分上手很快。

附件下载
工程源代码.zip
团队介绍
北京大学 软件与微电子学院 集成电路工程专业就读
团队成员
葉SiR
二次元の开发者;👉 GitHub: https://github.com/KafCoppelia
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号