项目要求
本项目旨在利用英飞凌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模块,实现蓝牙连接控制设备音量的功能,具体思路如下:
- 使用Psoc6-evaluationkit-062S2作为主控板。
- 将cyw43012 模块连接至Psoc6-evaluationkit-062S2开发板,提供蓝牙连接功能。
- 通过蓝牙通信实现与外部设备连接,用于实现音量调节功能。
实现框图
实现方法
- 连接cyw43012 WiFi模块至Psoc6-evaluationkit-062S2开发板的预留接口,确保插入正确方向。
- 利用RT-Thread Studio开发环境,安装蓝牙模块驱动。
打开项目设置,点击最上面的“添加软件包”,即可添加上“bt_cyw43012”驱动。
- 添加触摸滑条驱动
在同样的设置中,选择“硬件”选项卡,勾选触摸滑条驱动。
此时保存并关闭设置,整个项目都会自动配置来使用驱动。
- 开发蓝牙广播逻辑。
HID(Human Interface Device)协议是一种用于连接计算机和人机界面设备的通信协议,如键盘、鼠标、游戏手柄等。它定义了设备与计算机之间的通信格式和数据传输方式,使得设备可以与计算机进行有效的交互。
BLE HID(Bluetooth Low Energy Human Interface Device)协议是在传统HID协议的基础上,针对低功耗蓝牙技术进行了优化和扩展。它允许支持BLE的设备(如智能手机、平板电脑)通过低功耗蓝牙连接与HID设备进行通信,实现了更为便捷和灵活的设备互联。
相较于传统的HID协议,BLE HID协议具有以下优势:
- 低功耗: BLE技术采用了低功耗设计,可以延长设备的电池寿命,适合于需要长时间使用的无线人机交互设备。
- 无线连接: BLE技术消除了传统HID协议中的有线连接需求,使设备间的连接更为自由和便捷。
- 通信距离: BLE技术支持较远的通信距离,可以满足更广泛的应用场景需求。
- 灵活性: BLE HID协议可以与智能手机、平板电脑等BLE设备进行连接,实现了更为灵活的设备互联。
然而,BLE HID协议也存在一些挑战,如连接稳定性、通信延迟等方面仍需不断优化。此外,由于BLE技术相对较新,部分老旧设备可能不支持BLE,这也限制了BLE HID协议在某些场景下的应用。
HID这一部分和上期“Funpack第三季第一期-基于 XG24-EK2703A 的蓝牙鼠标+键盘复合设备”中的HID一致。
都是通过实现一个自定义的设备来实现功能。这里的功能包括音量增减。
将之前设计设计好的Report Map应用到 cycfg_gatt_db.c 中,即可进行设备广播。
- 实现触摸滑条的检测
这里通过中断来检测触摸滑条的状态。如果使用轮询的话会严重浪费资源,使用中断可以很好地解决这一问题。
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;
}
- 实现蓝牙控制算法,通过蓝牙连接与外部设备通信,实现音量调节功能。
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,通知外部设备按下按键后弹起事件,从而触发外部事件对音量进行修改。
实物展示
遇到问题
在实现过程中可能会遇到以下问题:
- 硬件连接问题:确保cyw43012 WiFi模块正确连接至Psoc6-evaluationkit-062S2开发板,并且插入方向正确。
- 软件开发问题:蓝牙通信和音量控制算法的开发可能会遇到一些挑战,需要耐心调试和优化。
总结感想
通过本次项目,我深入了解了英飞凌PSoC62 MCU和cyw43012 模块的特性和应用场景。同时,实践了基于蓝牙的无线音量控制功能的开发,提升了我的硬件和软件开发能力。在此,我要感谢“硬禾学堂”的赞助,为本次实验提供了宝贵的资源支持。