内容介绍
内容介绍
项目介绍
项目功能介绍
本项目实现了USB音量控制器,通过USB连接电脑,当用手指左右滑动触摸条时,可以对电脑的音量进行控制。
设计思路
该项目主要有两部分组成:
- 触摸部分:通过板载的5段触摸条实现,这一部分英飞凌提供的已经编译好的固件库与例程,RT-Thread也提供了完整的支持,参照进行开发即可。
- 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 定时器,低功耗异步通用定时器
- 开发环境:ModusToolbox 2.0/MDK V5 PSoC® Creator™ 下载链接:ModusToolbox™ Software - Infineon Technologies
- 该开发板也可使用RT-Thread studio、MDK、vscode进行开发。
实现的功能及图片展示
主要代码片段及说明
触摸初始化
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
查看更多
猜你喜欢
2024年寒假在家一起练 - 基于英飞凌PSoc62 MCU实现触摸滑条控制USB鼠标该项目使用了Psoc触摸滑条,实现了USB鼠标的设计,它的主要功能为:Psoc触摸滑条控制USB鼠标左右滑动。
yechoo
225
2024年寒假练 - 基于英飞凌PSoC62 MCU实现桌面音量控制该项目使用了ModustToolbox、KitProg3 调试器,cypress hal基础库和emUSB库,实现了基于PSoC62 MCU和Capsense 电容触摸传感器的桌面音量控制的设计,它的主要功能为:作为USB HID设备连接电脑,手势滑动调整音量,设置绝对音量和相对音量。
alexfanqi
321
2024年寒假练 - 基于英飞凌PSoc62 MCU实现通过USB通信,使用触摸滑条控制电脑音量该项目使用了C语言,ModusToolBox,实现了英飞凌PSoc62 MCU的设计,它的主要功能为:通过USB通信,使用触摸滑条控制电脑音量。
QingSpace
271