基于SAMD21G17D的触摸滑条USB HID设备实现及控制PC音量的功能开发(USB HID+MPLAB)

https://www.bilibili.com/video/BV1dr421H7yP@TOC

👉 【2024年寒假练】基于SAMD21G17D的触摸滑条USB HID控制PC音量快捷键的功能开发
👉 Github: EmbeddedCamerata/SAMD21_touchbar_usb_hid

项目介绍

本项目基于 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 器件进行编程。
SAM D21 Curiosity Nano 评估套件
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

总体流程图

硬件基本配置

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

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

项目系统框图-触摸滑条
项目系统框图-USB HID
⚠️ 需要将“Enable VBUS Sense”功能关闭,因为扩展板 TypeC 口未预留该 IO。

调试串口及BSP配置

PIN功能
PA22SERCOM5_PAD0
PB22SERCOM5_PAD2

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

SECOM5配置

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

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

PIN功能方向
PB10LED_ALOut

触摸滑条

PIN设置:

PIN功能
PA03PTC_Y1
PA06PTC_Y4
PA07PTC_Y5

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

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

添加触摸滑条

绑定传感器PIN

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

#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_hystleft_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 音量的效果。注意操作的时候板子不要接触桌面,否则触摸滑条会误触。

PC识别USB HID设备

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

项目总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/741056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解快速排序

一、快速排序 快速排序是冒泡排序的一种改进算法&#xff0c;相比于冒泡排序效率更优。 算法过程分析&#xff1a; 通过采用分治策略&#xff0c;围绕一个 x 将原始数组划分为两个子数组&#xff0c;使得前一个子数组的元素≤ x ≤ 后一个子数组元素&#xff0c;对两个子数组进…

WebGIS开发0基础必看教程:鹰眼的实现思路

1.背景 鹰眼功能是WebGIS中的一种常见功能&#xff0c;利用一些开源的框架实现起来非常方便。当然&#xff0c;按照博主从底层谈WebGIS这套系列的风格&#xff0c;在这里还是跟大家一起探讨探讨不借助第三方框架开发鹰眼的简单实现思路。 2.鹰眼功能分析 3.实现思路设计 3.1…

C语言 - 堆栈二叉树的基础及应用

1.历史 堆栈是为了减少程序内存占用的问题而发明的 机器上电后&#xff0c;所有的变量都需要copy到内存中运行&#xff0c;但是机器的内存大小一直都是比较有限的&#xff0c;所以堆栈和局部变量两个概念被提出来 2.栈 每次手动创建、删除变量非常麻烦&#xff0c;于是…

【spring】@Bean注解学习

Bean介绍 Bean用于指示一个方法应该产生一个Bean对象&#xff0c;并将其交给Spring容器管理。 当使用Bean注解的方法被Spring容器调用时&#xff0c;它只会执行一次&#xff0c;随后该方法返回的Bean对象会被添加到Spring的IOC&#xff08;Inversion of Control&#xff0c;控…

静电ESD整改:原因、影响与解决方案详解?|深圳比创达电子

静电&#xff08;ESD&#xff09;是在日常生活和工作中常见的现象&#xff0c;但它可能对电子设备和器件造成严重的损坏。本文将介绍静电ESD的定义、原因、影响以及解决方案&#xff0c;帮助大家更好地了解ESD问题&#xff0c;并采取相应的整改措施。 一、静电ESD的定义 静电…

L2-4 寻宝图(Python3)

给定一幅地图&#xff0c;其中有水域&#xff0c;有陆地。被水域完全环绕的陆地是岛屿。有些岛屿上埋藏有宝藏&#xff0c;这些有宝藏的点也被标记出来了。本题就请你统计一下&#xff0c;给定的地图上一共有多少岛屿&#xff0c;其中有多少是有宝藏的岛屿。 输入格式&#xf…

Python Excel 文本编辑库之xlsxwriter使用详解

概要 在现代数据处理和报表生成中,Excel 文件是一个非常常见的格式。Python XlsxWriter 库是一个强大的工具,可以帮助开发者轻松创建和编辑 Excel 文件,并且具有高度的灵活性和可定制性。本文将全面介绍 XlsxWriter 库的原理、功能、用法,并通过丰富的示例代码来展示其强大…

什么是工业数采网关?如何远程数采?

随着工业自动化的不断发展&#xff0c;数据采集与远程控制成为了生产过程中不可或缺的一环。而工业数采网关&#xff0c;作为连接工业设备与上位管理系统之间的桥梁&#xff0c;扮演着越来越重要的角色。HiWoo Box 作为一款优秀的工业数采网关产品&#xff0c;为 PLC、传感器、…

蓝牙系列十五:协议栈GAP层分析

Generic Access Profile&#xff08;通用访问规范&#xff09; 它在用来控制设备连接和广播&#xff0c;用于提供蓝牙设备的通用访问功能&#xff0c;包括设备发现、连接、鉴权、服务发现等等。 GATT是建立连接后通信规范&#xff0c; 而蓝牙是通过GAP建立通信的。 GAP 使你的…

边缘智能融合区块链:研究现状、应用及挑战

源自&#xff1a;信息与控制 作者&#xff1a;任晓旭 仇超 邓辉 戴子明 刘泽军 王晓飞 “人工智能技术与咨询” 发布 摘 要 边缘智能集网络、计算、存储和智能于一体&#xff0c;将智能推向网络边缘&#xff0c;为互联时代的低延迟关键计算开辟了道路。为进一步满足…

算法学习系列(四十):贡献法

目录 引言概念一、孤独的照片二、牛的基因学三、字串分值 引言 关于这个贡献法考的不是很多&#xff0c;主要题型是出现在需要枚举每一个组合这类题&#xff0c;出现的次数较多。没有固定的模板&#xff0c;就是一种思想&#xff0c;跟贪心一样&#xff0c;每个题都是不一样的…

Thymeleaf 基本使用

01、Thymeleaf 官网地址&#xff1a;Thymeleafhttps://www.thymeleaf.org/ 简介 Thymeleaf是一种服务器端Java模板引擎&#xff0c;用于将数据渲染为HTML、XML、JavaScript等格式&#xff0c;并在Web浏览器中呈现给用户。 具体来说&#xff0c;Thymeleaf充当着视图层的角色&…

C语言 ——注释

1.1 单行注释 - 语法&#xff1a;// 待注释的内容 - 位置&#xff1a;可放在代码后&#xff0c;称之为行尾注释&#xff1b; 也可放代码上一行&#xff0c;称作行上注释。 c // 这是单行注释文字 1.2 多行注释 - 语法&#xff1a;/* 待注释的内容 */ - 注意&#xff1a;多⾏…

考研C语言复习进阶(1)

目录 1. 数据类型介绍 1.1 类型的基本归类&#xff1a; 2. 整形在内存中的存储 2.1 原码、反码、补码 2.2 大小端介绍 3. 浮点型在内存中的存储 ​编辑 1. 数据类型介绍 前面我们已经学习了基本的内置类型&#xff1a; char //字符数据类型 short //短整型 int /…

前端之用HTML弄一个古诗词

将进酒 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>将进酒</title><h1><big>将进酒</big> 君不见黄河之水天上来</h1><table><tr><td ><img…

借助ChatGPT提高编程效率指南

PS: ChatGPT无限次数&#xff0c;无需魔法&#xff0c;登录即可使用,网页打开下面 一、借助ChatGPT提高编程效率指南 随着计算机技术的飞速发展&#xff0c;编程已经成为了现代社会中一个非常重要的技能。对于许多人来说&#xff0c;编程不仅是一项工作技能&#xff0c;而且是…

操作系统系列学习——操作系统之“树”

文章目录 前言操作系统之“树” 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划学习操作系统并完成6.0S81&#xff0c;加油&#xff01; 本文总结自B站【哈工大】操作系统 李治军&#xff08;全32讲&#xff09; 老师课程讲的非常好&#xff0c;感谢 【哈…

sqllab第五关通关笔记

知识点&#xff1a; 报错注入函数语法&#xff08;详见第二关笔记&#xff09;报错注入打印位数最多32位对于大于32位的数据最好使用截取函数进行控制&#xff1b;以保证输出完整mysql表中的重点数据库 information_schema &#xff08;mysql 5.0以上&#xff09; schemata …

每日一题 — 长度最小的子数组

LCR 008. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 首先在暴力枚举的方法下&#xff0c;我们可以进行优化&#xff0c;让right不用从头开始&#xff0c;只需让left移动&#xff0c;进行判断。然后就是变成了同向双指针&#xff0c;也就是滑…

责任链模式-C#实现

责任链模式指的是——某个请求需要多个对象进行处理&#xff0c;从而避免请求的发送者和接收之间的耦合关系。 将这些对象连成一条链子&#xff0c;并沿着这条链子传递该请求&#xff0c;直到有对象处理它为止。 主要涉及两个角色&#xff1a; 抽象处理者角色&#xff08;Hand…