2024年寒假练 - 基于英飞凌PSoC62平台实现的USB触摸音量控制
该项目使用了英飞凌PSoC62 MCU 的综合开发平台,实现了USB触摸音量控制的设计,它的主要功能为:实现一个滑动控制器,用手指左右滑动时,电脑的音量变化。
标签
2024年寒假练
PSoC62
USB音量控制
冷月烟
更新2024-03-28
433

项目介绍

项目功能介绍

本项目实现了USB音量控制器,通过USB连接电脑,当用手指左右滑动触摸条时,可以对电脑的音量进行控制。

设计思路

该项目主要有两部分组成:

  1. 触摸部分:通过板载的5段触摸条实现,这一部分英飞凌提供的已经编译好的固件库与例程,RT-Thread也提供了完整的支持,参照进行开发即可。
  2. USB部分:RT-Thread并没有实现USB部分驱动,但英飞凌提供了相应例程,对于本项目来说,主要是实现一个HID音量控制报告描述符与相关数据上报代码即可,在英飞凌HID鼠标例程上进行修改即可实现本次的功能。


硬件框图


软件流程图


硬件介绍

板卡特性

Psoc6-evaluationkit-062S2 是 RT-Thread 联合英飞凌推出的一款集成32位双核CPU子系统( ARM Cortex-M4 和 ARM Cortex-M0)的开发板,其具有单周期乘法的150-MHz Arm Cortex-M4F CPU (浮点和存储器保护单元),100-MHz Cortex M0+ CPU,带单周期乘法和MPU,可以充分发挥 PSoC6 双核芯片性能。其默认内置物联网操作系统 RT-Thread 。PSoC 6 RTT开发板具有丰富的软硬件资源和低成本优势,兼容 Arduino 接口,助力开发者进行评估以及实现创意开发。


  • MCU:CY8C624ALQI-S2D42
    • Cortex-M4主频 150MHz,Cortex-M0主频 100MHz
    • 2MB Flash 和 1MB SRAM
    • 8KB 数据闪存,提供与 EEPROM 类似的数据存储功能
  • 兼容 Arduino 接口,拓展性强
    • 开发板兼容标准 Arduino 接口,兼容市面上大多数的 Arduino 接口拓展板,极大地提高了开发板拓展性与可玩性。
  • CAPSENSE™ 触摸技术,增强型电容触摸感应单元 (CTSU2),助力多种应用场景
    • CAPSENSE电容和电感式触摸感应人机界面(HMI)技术,可为家电、工业、消费级和物联网产品等要求严苛的用户界面提供更强的性能和更低的功耗。增强型HMI改进了检测范围、手势检测和指向性功能,并加入针对未来先进触摸屏的悬停检测功能,可实现近距离传感等先进解决方案。
  • 板载 KitProg3-DAP-Link 调试器
    • 开发板默认集成 KitProg3-DAP-Link 调试器。KitProg3 是用于编程和调试的通信固件。适用于 ModusToolbox™、PSoC™ 和其他软件生态系统的编程解决方案。
  • 12 位 ADC,12 位 DAC,低功耗比较器
  • 32 位通用 PWM 定时器,16 位通用 PWM 定时器,低功耗异步通用定时器


实现的功能及图片展示


主要代码片段及说明

触摸初始化

static uint32_t initialize_capsense(void)
{
uint32_t status = CYRET_SUCCESS;

/* CapSense interrupt configuration parameters */
static const cy_stc_sysint_t capSense_intr_config =
{
.intrSrc = csd_interrupt_IRQn,
.intrPriority = CAPSENSE_INTR_PRIORITY,
};

/* Capture the CSD HW block and initialize it to the default state. */
status = Cy_CapSense_Init(&cy_capsense_context);
if (CYRET_SUCCESS != status)
{
return status;
}

/* Initialize CapSense interrupt */
cyhal_system_set_isr(csd_interrupt_IRQn, csd_interrupt_IRQn, CAPSENSE_INTR_PRIORITY, &capsense_isr);
NVIC_ClearPendingIRQ(capSense_intr_config.intrSrc);
NVIC_EnableIRQ(capSense_intr_config.intrSrc);

/* Initialize the CapSense firmware modules. */
status = Cy_CapSense_Enable(&cy_capsense_context);
if (CYRET_SUCCESS != status)
{
return status;
}

/* Assign a callback function to indicate end of CapSense scan. */
status = Cy_CapSense_RegisterCallback(CY_CAPSENSE_END_OF_SCAN_E,
capsense_callback, &cy_capsense_context);
if (CYRET_SUCCESS != status)
{
return status;
}

return status;
}


触摸采集

uint8_t volume_data;
static void process_touch(void)
{
cy_stc_capsense_touch_t *slider_touch_info;
uint16_t slider_pos;
uint8_t slider_touch_status;
static uint16_t slider_pos_prev;

/* Get slider status */
slider_touch_info = Cy_CapSense_GetTouchInfo(
CY_CAPSENSE_LINEARSLIDER0_WDGT_ID, &cy_capsense_context);
slider_touch_status = slider_touch_info->numPosition;
slider_pos = slider_touch_info->ptrPosition->x;
/* Detect the new touch on slider */

if ((0 != slider_touch_status))
{
if(slider_pos > slider_pos_prev)
{
volume_data = 2;
USBD_HID_Write(usb_hidContext, &volume_data, 1, 0);
}
else if(slider_pos < slider_pos_prev)

{
volume_data = 1;
USBD_HID_Write(usb_hidContext, &volume_data, 1, 0);
}
}
slider_pos_prev = slider_pos;
}

HID报文描述符

const U8 usb_HIDReport[] = {
0x05, 0x0c, // USAGE_PAGE (Consumer Devices)
0x09, 0x01, // USAGE (Consumer Control)
0xa1, 0x01, // COLLECTION (Application)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
//每一个USAGE都定义了一个功能
0x09, 0xe9, // USAGE (Volume Up) //第一个字节
0x09, 0xea, // USAGE (Volume Down)
0x09, 0xe2, // USAGE (Mute)
0x09, 0xcd, // USAGE (Play)
0x09, 0xb1, // USAGE (Pause)
0x09, 0xb5, // USAGE (Scan Next Track)
0x09, 0xb6, // USAGE (Scan Previous Track)
0x09, 0xb7, // USAGE(STOP) //若需要其他功能,在后面添加,同时count也需要相应增加
0x75, 0x01, // REPORT_SIZE (1) //对应的指令代码在文档HID Usage Tables的15节Consumer Page中查看
0x95, 0x08, // REPORT_COUNT (8) //
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
};


主代码

int main(void)
{
cy_rslt_t result;
uint32_t counter = 0;
/* Initialize the device and board peripherals */
result = cybsp_init() ;
if (result != CY_RSLT_SUCCESS)
{
CY_ASSERT(0);
}

/* Enable global interrupts */
__enable_irq();

/* Initialize retarget-io to use the debug UART port */
result = cy_retarget_io_init(CYBSP_DEBUG_UART_TX, CYBSP_DEBUG_UART_RX, CY_RETARGET_IO_BAUDRATE);
/* retarget-io init failed. Stop program execution */
if (result != CY_RSLT_SUCCESS)
{
CY_ASSERT(0);
}

/* \x1b[2J\x1b[;H - ANSI ESC sequence for clear screen */
printf("\x1b[2J\x1b[;H");

printf("****************** "
"emUSB Device: HID mouse application "
"****************** \r\n\n");

/* Initializes the USB stack */
USBD_Init();

/* Endpoint Initialization for HID class */
usb_add_hid();

/* Set device info used in enumeration */
USBD_SetDeviceInfo(&usb_deviceInfo);

/* Start the USB stack */
USBD_Start();

result = initialize_capsense();
if (CYRET_SUCCESS != result)
{
/* Halt the CPU if CapSense initialization failed */
CY_ASSERT(0);
}

/* Initiate first scan */
Cy_CapSense_ScanAllWidgets(&cy_capsense_context);

for (;;)
{

/* Wait for configuration */
while ((USBD_GetState() & USB_STAT_CONFIGURED ) != USB_STAT_CONFIGURED)
{
cyhal_system_delay_ms(50);
}

counter++;

cyhal_system_delay_ms(10);

if (capsense_scan_complete)
{
/* Process all widgets */
Cy_CapSense_ProcessAllWidgets(&cy_capsense_context);

/* Process touch input */
process_touch();

Cy_CapSense_ScanAllWidgets(&cy_capsense_context);

capsense_scan_complete = false;
}

}
}


遇到的主要难题及解决方法

问题:部署环境太困难了,英飞凌的例程都挂在网上,下载好多次都下载不下来。

办法:下载离线包,本地处理。


问题:没能实现旋钮音量控制模式,就是滑动到哪个位置,音量就设置为多大。

办法:使用按钮式音量控制模式,就是按一下音量加1或者减1的模式。


未来的计划或建议

继续对USB、HID进行研究,尝试实现旋钮音量控制的模式。


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