2024年寒假练 - 基于英飞凌PSoC62 MCU实现基于蓝牙的无线音量控制
该项目使用了英飞凌PSoC62 MCU,实现了基于蓝牙的无线音量控制的设计,它的主要功能为:基于蓝牙的无线音量控制。
标签
嵌入式系统
显示
2024寒假练
cjmf
更新2024-03-28
中国计量大学
2277

项目要求

本项目旨在利用英飞凌PSoC62 MCU实现基于蓝牙的无线音量控制功能。通过该功能,用户可以通过蓝牙连接控制设备的音量调节。

板卡介绍

Psoc6-evaluationkit-062S2是由RT-Thread联合英飞凌推出的一款开发板,具有以下主要特性:

  • MCU:CY8C624ALQI-S2D42,包含Cortex-M4和Cortex-M0+双核CPU,主频分别为150MHz和100MHz。
  • 内存:2MB Flash和1MB SRAM,以及8KB数据闪存,提供类似EEPROM的数据存储功能。
  • 兼容Arduino接口,拓展性强。
  • CAPSENSE™触摸技术,增强型电容触摸感应单元(CTSU2),可助力多种应用场景。
  • 内置KitProg3-DAP-Link调试器,便于编程和调试。

cyw43012模块是英飞凌基于CYW43012开发的SDIO高速WiFi和蓝牙模块,具有以下特性:

  • 提供超低功耗的Wi-Fi和蓝牙连接,适用于可穿戴设备、智能家居产品和便携式音频应用。
  • 先进的共存引擎,支持2.4GHz和5GHz双频Wi-Fi以及双模式蓝牙/低功耗蓝牙(BLE)5.0应用。

实现思路

基于Psoc6-evaluationkit-062S2开发板和cyw43012模块,实现蓝牙连接控制设备音量的功能,具体思路如下:

  1. 使用Psoc6-evaluationkit-062S2作为主控板。
  2. 将cyw43012 模块连接至Psoc6-evaluationkit-062S2开发板,提供蓝牙连接功能。
  3. 通过蓝牙通信实现与外部设备连接,用于实现音量调节功能。

实现框图

实现方法

  1. 连接cyw43012 WiFi模块至Psoc6-evaluationkit-062S2开发板的预留接口,确保插入正确方向。
  2. 利用RT-Thread Studio开发环境,安装蓝牙模块驱动。

打开项目设置,点击最上面的“添加软件包”,即可添加上“bt_cyw43012”驱动。

  1. 添加触摸滑条驱动

在同样的设置中,选择“硬件”选项卡,勾选触摸滑条驱动。

此时保存并关闭设置,整个项目都会自动配置来使用驱动。

  1. 开发蓝牙广播逻辑。

HID(Human Interface Device)协议是一种用于连接计算机和人机界面设备的通信协议,如键盘、鼠标、游戏手柄等。它定义了设备与计算机之间的通信格式和数据传输方式,使得设备可以与计算机进行有效的交互。

BLE HID(Bluetooth Low Energy Human Interface Device)协议是在传统HID协议的基础上,针对低功耗蓝牙技术进行了优化和扩展。它允许支持BLE的设备(如智能手机、平板电脑)通过低功耗蓝牙连接与HID设备进行通信,实现了更为便捷和灵活的设备互联。

相较于传统的HID协议,BLE HID协议具有以下优势:

  1. 低功耗: BLE技术采用了低功耗设计,可以延长设备的电池寿命,适合于需要长时间使用的无线人机交互设备。
  2. 无线连接: BLE技术消除了传统HID协议中的有线连接需求,使设备间的连接更为自由和便捷。
  3. 通信距离: BLE技术支持较远的通信距离,可以满足更广泛的应用场景需求。
  4. 灵活性: BLE HID协议可以与智能手机、平板电脑等BLE设备进行连接,实现了更为灵活的设备互联。

然而,BLE HID协议也存在一些挑战,如连接稳定性、通信延迟等方面仍需不断优化。此外,由于BLE技术相对较新,部分老旧设备可能不支持BLE,这也限制了BLE HID协议在某些场景下的应用。

HID这一部分和上期“Funpack第三季第一期-基于 XG24-EK2703A 的蓝牙鼠标+键盘复合设备”中的HID一致。

都是通过实现一个自定义的设备来实现功能。这里的功能包括音量增减。

将之前设计设计好的Report Map应用到 cycfg_gatt_db.c 中,即可进行设备广播。


  1. 实现触摸滑条的检测

这里通过中断来检测触摸滑条的状态。如果使用轮询的话会严重浪费资源,使用中断可以很好地解决这一问题。

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;
}

然后在中断回调函数中,将触摸和蓝牙进行连接起来。当触摸滑条向上滑动时,那么触发音量加操作,反之触发音量减操作。

static void process_touch(void)
{
cy_stc_capsense_touch_t *slider_touch_info;
uint16_t slider_pos;
uint8_t slider_touch_status;
bool led_update_req = false;

static uint16_t slider_pos_prev;
static led_data_t led_data = {LED_ON, LED_MAX_BRIGHTNESS};

/* 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 ((RT_NULL != slider_touch_status) &&
(slider_pos != slider_pos_prev))
{
led_data.brightness = (slider_pos * 100)
/ cy_capsense_context.ptrWdConfig[CY_CAPSENSE_LINEARSLIDER0_WDGT_ID].xResolution;

led_update_req = true;
app_bt_send_message(slider_pos < slider_pos_prev);
}

#ifndef RT_USING_PWM
#error You need enable PWM to use this sample
#else
/* Update the LED state if requested */
if (led_update_req)
{
update_led_state(&led_data);
}
#endif
slider_pos_prev = slider_pos;
}


  1. 实现蓝牙控制算法,通过蓝牙连接与外部设备通信,实现音量调节功能。
void app_bt_send_message(bool incr) {
wiced_bt_gatt_status_t status;
printf("hello_sensor_send_message: CCCD:%d\n",
app_hids_report_client_char_config[0]);

/* If client has not registered for indication or notification, no action */
if (0 == app_hids_report_client_char_config[0]) {
return;
} else if (app_hids_report_client_char_config[0] &
GATT_CLIENT_CONFIG_NOTIFICATION) {
app_hids_report[0] = incr ? 0x8 : 0x4;
app_hids_report[1] = 0;
status = wiced_bt_gatt_server_send_notification(
hello_sensor_state.conn_id, HDLC_HIDS_REPORT_VALUE, app_hids_report_len,
app_hids_report, NULL);
app_hids_report[0] = 0;
app_hids_report[1] = 0;
status = wiced_bt_gatt_server_send_notification(
hello_sensor_state.conn_id, HDLC_HIDS_REPORT_VALUE, app_hids_report_len,
app_hids_report, NULL);
printf("Notification Status: %d \n", status);
}
}

通过使能 notify,通知外部设备按下按键后弹起事件,从而触发外部事件对音量进行修改。

实物展示

遇到问题

在实现过程中可能会遇到以下问题:

  1. 硬件连接问题:确保cyw43012 WiFi模块正确连接至Psoc6-evaluationkit-062S2开发板,并且插入方向正确。
  2. 软件开发问题:蓝牙通信和音量控制算法的开发可能会遇到一些挑战,需要耐心调试和优化。

总结感想

通过本次项目,我深入了解了英飞凌PSoC62 MCU和cyw43012 模块的特性和应用场景。同时,实践了基于蓝牙的无线音量控制功能的开发,提升了我的硬件和软件开发能力。在此,我要感谢“硬禾学堂”的赞助,为本次实验提供了宝贵的资源支持。

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