2024年寒假练-基于PSoc62实现电脑音量控制
该项目使用了PSoc62开发板和英飞凌ModusToolBox开发套件,实现了电脑音量调节的设计,它的主要功能为:通过触摸psoc62开发板上的触摸滑条,对电脑音量进行调节。
标签
USB
PSoC62
参加活动
justbe
更新2024-03-27
205

一、任务要求

使用本板卡实现一个滑动控制器,用手指左右滑动时,电脑的音量、亮度或视频进度条等可以变化。

二、bsp移植

提前说一下移植注意事项,后续会详细说明

移植注意事项:

不要在bsp里面初始化debug串口和capsense-tuner的i2c
在基于已有bsp修改时不要增加/删除原有bsp的依赖库

修改bsp时如果下边有提示一定不要忽略,想办法解决

移植流程:

首先使用如下bsp创建我们的bsp。

image.png

修改主控芯片为CY8C624ALQI-S2D42。

打开DeviceConfigurator。

image.png

其中与dap连接的i2c和串口所属的scb2和scb6不需要使能,例程中有初始化代码,如果我们在这里使能,bsp会生成初始化代码,例程中的再次初始化会被pdl库检测到,陷入死循环。

打开CAPSENSE Configuraor,删除两个button。

capsense中的capsense sensors按照原理图中选择,cmod引脚在p71、p72、p77中任选其一(芯片只能选这三个引脚),原理图上三个引脚皆是一个电容对地,因此可以随便选择。注意:CMOD引脚并不是原理图中的MCU_CSS_TX。

image.png

i2c,led,debug_uart引脚别名我们按照这样修改,这几个引脚也不要勾选,出现命名冲突将原有的删掉即可。

image.png

system这里我们要将wco关掉(硬件没有wco),同时也要将debug的swo关掉(引脚与i2c冲突)。

image.png

这个提示是因为原有bsp所用芯片在我们新建的bsp上没有,我们直接删除,其他提示比如时钟不符合要求我们就要修改对应外设以满足要求,不然编译时仍会报此错误。

三、例程

基于我们新建的bsp创建示例工程,需要CAPSENSE_Buttons_and_Slider和emUSB-Device_HID_Generic两个例程

1、CAPSENSE_Buttons_and_Slider

1) 编译

因为没有板子没有触摸按键,因此删除button相关代码;

原有bsp只有一个CYBSP_USER_LED,我们需要将代码里的CYBSP_USER_LED修改为CYBSP_USER_LED1或者CYBSP_USER_LED2。

基本就能编译通过了,如果有报错,如果是recipe-make not found(如果不像我手贱把bsp里的recipe-make库删掉是不会有这个问题的),选中当前工程,打开左下角tools里的Library Manager检查里面是否有recipe-make这个库没有的话添加上保存,然后在下方Terminal串口选中当前工程的页面,执行

make getlibs

其他报错仔细分析报错信息,问题不大。

2) 运行

该例程执行现象为手滑动滑条,led的亮度会根据手的位置变化

3) 调试

如果没有反应,我们可以使用调试功能进行单步调试,我遇到的几个问题:

retarget_io失败:使用单步一步一步往里找,最后找到CYHAL_UART_RSLT_ERR_INVALID_PIN这个错误,参考CYHAL_UART_RSLT_ERR_INVALID_PIN error ,也就是因为bsp初始化占用了这个pin,和例程初始化冲突了。

capsense-tunner初始化失败也是同样的原因。

capsense初始化失败:单步执行找到CY_CAPSENSE_STATUS_BAD_PARAM这个错误,网上搜索找到Psoc 6 - Capsense CMOD pin assignement ,原因在于我误将原理图中的MCU_CSS_TX当作capsense-cmod引脚

2、emUSB-Device_HID_Generic

该例程唯一问题在于要在bsp里面初始化usb外设,并配置好时钟。

只要电脑成功识别该usb设备,就可以认为例程成功跑起来了。需要测试该例程需要相关调试软件,不过这个例程只是把收到数据发送回去,没太大必要。

四、最终实现

基于emUSB-Device_HID_Generic创建新的工程,打开Library Manager添加capsense库,并将capsense例程中的相关函数复制过来

1、HID设备报告描述符

首先在f411上移植CherryUSB,并跑通hid键盘例程,以为修改下hid上报内容就可以了,网上搜了半天搜出来的关键词都离不开【hid report descriptor】。

简单的来说就是hid类设备包含太多类型,键盘、鼠标、游戏摇杆等都属于hid设备,而每种hid设备的报文结构又不相同,因此需要hid报文描述符描述设备类型以及报文的数据结构。

在网上搜索后找到如下hid报文描述符:

static const U8 usb_hid_generic_report[] = {
0x05, 0x0C, // Usage Page (Consumer)
0x09, 0x01, // Usage (Consumer Control)
0xA1, 0x01, // Collection (Application)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x09, 0xEA, // Usage (Volume Decrement)
0x09, 0xE9, // Usage (Volume Increment)
0x75, 0x01, // Report Size (1)
0x95, 0x02, // Report Count (2)
0x81, 0x22, // Input (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0x75, 0x06, // Report Size (6)
0x95, 0x01, // Report Count (1)
0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
// 27 bytes
};

上边的描述符表示有音量减和音量加两个按键,各占一个bit,另外再加6个占位bit,当我们需要按键时,将对应bit置为1发送,需要取消按键时,对应bit置0发送,比如我们要按一下音量减,则我们需要发送一次0x01再发送一次0x00。

在f411上验证成功后,仅需要替换例程中的hid报告描述符。

相关链接:

HID报告描述符教程 手把手教你编写HID报告描述符 - USB中文网 (usbzh.com)

HID音量控制报告描述符 - USB中文网 (usbzh.com)

2、处理逻辑

process.drawio (1).png

五、优化方向

hid设备无法获取系统音量,需要想办法获取系统音量才能实现绝对音量控制。

capsense读取数据以及usb发送数据均会造成mcu死等循环,因此可以添加多线程,将capsense和usb放到两个线程处理。

附件下载
hid_voice_ctrl.zip
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号