一、项目介绍
本文使用Silicon Labs公司的XG24-EK2703A开发板和乐鑫科技的ESP32-S3-BOX-Lite带屏幕的开发套件组成一套低功耗蓝牙(BLE)通讯系统。
XG24-EK2703A芯片内置传感器采集环境温度并通过BLE无线发送,ESP32-S3-BOX-Lite接收到温度数据并以曲线形式在自带的显示屏上进行显示。
此外,ESP32-S3-BOX-Lite还能通过按钮将控制命令由BLE发送到XG24-EK2703A,实现XG24-EK2703A板载LED的GPIO控制和外接电机的PWM控制。
二、方案准备
本次Funpack活动任务主要是实现BLE蓝牙通讯功能。
回顾往期Funpack活动,有多款开发板都支持BLE通讯功能,以下板卡都能实现和本期活动的XG24-EK2703A板卡进行BLE通讯。
编号 | Funpack活动 | 开发板型号 | 生产厂商 | 软件平台 |
---|---|---|---|---|
1 | 第1季第4期 | Thunderboard BG22 | Silicon Labs | Simplicity Studio |
2 | 第1季第8期 | Arduino Nano 33 BLE Sense | Arduino | Arduino |
3 | 第1季第12期 | Wio Terminal | Seeed(矽递科技) | Arduino |
4 | 第2季第3期 | FireBeetle ESP32-E | DFRobot | Arduino |
5 | 第2季第5期 | ESP32-S3-BOX-Lite | ESPRESSIF(乐鑫) | Arduino/ ESP-IDF |
经过比较,要实现任务一的温度采集和曲线显示功能,Wio Terminal和ESP32-S3-BOX-Lite都自带屏幕,开发比较方便。而其它三款开发板要实现指定任务,还需要外接显示屏。
Wio Terminal和ESP32-S3-BOX-Lite相比,二者都支持Arduino开发平台,但使用的BLE库文件有所不同,所以最终确定使用ESP32-S3-BOX-Lite配套进行开发。
针对XG24-EK2703A开发板,Funpack第1季第4期Thunderboard BG22也是由Silicon Labs公司出品,它们使用相同的Simplicity Studio软件平台,在软件使用和程序开发上可以借鉴。
另外,本次还用到参加Funpack第1季第7期时采购的mikroBUS模块,型号为MIKROE-4114,可以直接插在XG24-EK2703A的mikroBUS接口上,实现电机驱动功能。
此项目参考了本人以前多期Funpack活动的项目资料。
编号 | 项目 | 链接 |
---|---|---|
1 | EFR32BG22开发板 BLE通讯 | https://www.eetree.cn/project/69 |
2 | 基于DM164137的PWM电机调速试验 | https://www.eetree.cn/project/279 |
3 | 基于Arduino nano 33 BLE Sense和Wio Terminal的蓝牙环境监测站 | https://www.eetree.cn/project/339 |
4 | 基于Arduino Nano33 BLE和Wio Terminal的遥控小车设计 | https://www.eetree.cn/project/1085 |
5 | 基于ESP32-S3-BOX-Lite和Wio Terminal的蓝牙BLE通信与显示系统 | https://www.eetree.cn/project/1941 |
本文还搜集或参考了以下资料
编号 | 链接 | 说明 |
---|---|---|
1 | https://www.silabs.com/developers/simplicity-studio | Simplicity Studio编程软件下载 |
2 | https://github.com/SiliconLabs/gecko_sdk | gecko_sdk开发包下载 |
3 | https://github.com/SiliconLabs/bluetooth_applications/tree/master | 各种参考例程 |
4 | https://github.com/SiliconLabs/third_party_hw_drivers_extension/blob/master/README.md#how-to-add-to-simplicity-studio-ide | Simplicity Studio添加第三方扩展驱动 |
5 | https://www.arduino.cc/reference/en/libraries/arduinoble/ | ArduinoBLE库使用说明 |
6 | https://www.eetree.cn/project/detail/1380 或https://blog.csdn.net/weixin_46422143/article/details/128507489 | 若要Arduino外接SPI屏实现更美观的显示,可使用LVGL库,可参考此文档案例。 |
7 | https://blog.csdn.net/a2360051431/article/details/130857622 | 解决GitHub下载速度太慢问题的方法汇总(本人使用的是第五个方法) |
三、方案设计
系统的设计方案如下图所示
XG24-EK2703A开发板做BLE Server,ESP32-S3-BOX-Lite做BLE Client,两块开发板进行低功耗蓝牙(BLE)通讯。
XG24-EK2703A芯片自带温度检测功能,将温度信息发送到GATT服务器的相应寄存器中。ESP32-S3-BOX-Lite通过蓝牙,读取GATT服务器中的温度数据,并在显示屏上以曲线形式显示。
此外,ESP32-S3-BOX-Lite自带3个按钮,可将输入信号通过BLE发送到XG24-EK2703A,写GATT服务器的数值,进而控制GPIO输出,实现板载LED控制。同时,也控制PWM输出,通过电机驱动板,实现电机的正转、反转和停止等操作功能。
系统用到的主要模块实物图如下
XG24-EK2703A
ESP32-S3-BOX-Lite
MIKROE-4114电机驱动板
5V直流减速电机
四、 软件设计
软件开发包括两部分内容,分别是 对XG24-EK2703A编程和对ESP32-S3-BOX-Lite编程。每个开发板都支持多种软件平台进行开发,可根据个人习惯选择。
本文使用Silicon Labs公司官方的开发环境Simplicity Studio5对XG24-EK2703A编程,使用Arduino对ESP32-S3-BOX-Lite编程。两个软件平台都有很多案例供用户参考。
对XG24-EK2703A编程时,本人先根据向导,建立bt_soc_thermometer_mock工程,手机使用官方的APP EFR Connect或第三方软件nRF Connect进行测试。测试成功后,再用Arduino进一步开发。
后面在bt_soc_thermometer_mock工程的基础上,增加温度数据处理、指示灯GPIO控制、电机PWM控制等功能。Simplicity Studio5中通过slcp文件,可快速配置各种驱动,不用直接操作驱动文件,非常方便。
先添加GATT服务器温湿度数据处理驱动。 然后,添加简单指示灯GPIO控制驱动。
接下来添加两个PWM驱动,使用timer0和timer1分别控制电机驱动板的in1和in2两路输入,注意准确设置引脚号。
XG24-EK2703A程序中,主要代码都在app.c文件中,下面是代码讲解
增加GPIO和PWM等功能相应的头文件。
#include "gatt_db.h" //GATT数据库
#include "sl_simple_led_instances.h" //简单LED控制 GPIO操作
#include "sl_pwm.h" //PWM输出控制
#include "sl_pwm_instances.h"
#include "sl_sleeptimer.h"
接下来在appinit中初始化两个定时器,两路pwm用于控制电机正反转。
SL_WEAK void app_init(void)
{
sl_status_t sc;
app_log_info("health thermometer initialised\n");
// Init temperature sensor.
sc = sl_sensor_rht_init();
if (sc != SL_STATUS_OK) {
app_log_warning("Relative Humidity and Temperature sensor initialization failed.");
app_log_nl();
}
sl_pwm_start(&sl_pwm_motor_in1);//启动PWM1 timer0控制PB00
sl_pwm_start(&sl_pwm_motor_in2);//启动PWM2 timer1控制PC08
}
然后在事件处理函数void sl_bt_on_event(sl_bt_msg_t *evt)中,在GATT数据变化后,增加对GPIO和PWM的控制功能。
/// //原工程新增 基于bt_soc_blinky工程 修改, 控制指示灯及电机
case sl_bt_evt_gatt_server_attribute_value_id:
// gattdb_digital_control characteristic 发生变化
if (gattdb_digital_control == evt->data.evt_gatt_server_attribute_value.attribute) {
uint8_t data_recv;
size_t data_recv_len;
// 读 characteristic 值.
sc = sl_bt_gatt_server_read_attribute_value(gattdb_digital_control,
0,
sizeof(data_recv),
&data_recv_len,
&data_recv);
(void)data_recv_len;
app_log_status_error(sc);
if (sc != SL_STATUS_OK) {
break;
}
// 控制电机及指示灯。 IN1 IN2 0,0:关; IN1有电压正转; IN2有电压反转;
if (data_recv == 0x00) {
sl_pwm_set_duty_cycle(&sl_pwm_motor_in1, 0);
sl_pwm_set_duty_cycle(&sl_pwm_motor_in2, 0);
sl_led_turn_off(SL_SIMPLE_LED_INSTANCE(0));// led0=0 LED关
} else if (data_recv == 0x01) {
sl_pwm_set_duty_cycle(&sl_pwm_motor_in1, 0);
sl_pwm_set_duty_cycle(&sl_pwm_motor_in2, 90);//占空比90%,电机正转
sl_led_turn_on(SL_SIMPLE_LED_INSTANCE(0));// led0=1 LED开
}else if (data_recv == 0x02) {
sl_pwm_set_duty_cycle(&sl_pwm_motor_in1, 60);
sl_pwm_set_duty_cycle(&sl_pwm_motor_in2, 0);//占空比60%,电机反转
sl_led_turn_on(SL_SIMPLE_LED_INSTANCE(0));// led0=1 LED开
} else {
app_log_error("Invalid attribute value: 0x%03x\n", (int)data_recv);
}
}
break;
最后一步,增加温度数据处理的程序段,这一部分参考funpack1-4的thunderoard的读取温湿度的 demo 程序。
//新增的,参考thunderoard demo 。 将取得的温度值,发送到gatt服务器
sl_status_t sl_gatt_service_rht_get(uint32_t *rh, int32_t *t)
{
sl_status_t sc;
sc = sl_sensor_rht_get(rh, t);
if (SL_STATUS_OK == sc) {
app_log_info("Humidity = %3.2f %%RH" APP_LOG_NL, (float)*rh / 1000.0f);
app_log_info("Temperature = %3.2f C" APP_LOG_NL, (float)*t / 1000.0f);
} else if (SL_STATUS_NOT_INITIALIZED == sc) {
app_log_info("Relative Humidity and Temperature sensor is not initialized." APP_LOG_NL);
} else {
app_log_status_error_f(sc, "RHT sensor measurement failed" APP_LOG_NL);
}
return sc;
}
对ESP32-S3-BOX-Lite,使用Arduino编程,因为ESP32-S3-BOX-Lite属于上一季的板卡。具体介绍及使用本文就不再详细介绍。主要是实现BLE数据收发和显示功能。ESP32-S3-BOX-Lite详细资料可查阅Funpack2-5活动资料或本人在那期提交的项目资料https://www.eetree.cn/project/1941 。Arduino编程时,注意正确选择BLE库文件,本人使用的是Arduino官方ArduinoBLE库,如果使用其它库,可能会不支持此硬件。另外还使用了TFT_eSPI库实现显示屏驱动功能。详细代码见附件。
五、演示效果
两个设备建立蓝牙BLE通讯后,ESP32-S3-BOX-Lite的屏幕会显示环境温度数值及温度曲线。电机停止,电机状态值是0。
按下左边按键,XG24-EK2703A上指示灯亮,电机正转,屏幕显示电机状态值为1.
按下中间按键,XG24-EK2703A上指示灯灭,电机停止,屏幕显示电机状态值为0.
按下右边按键,XG24-EK2703A上指示灯亮,电机反转,屏幕显示电机状态值为2.
六、 问题及总结
本次项目,主要遇到了以下问题:
1、XG24-EK2703A下载蓝牙项目时,程序不运行。因为开发板第一次运行蓝牙工程时,需要先下载对应的蓝牙bootloader工程,然后再下载项目工程。bootloader工程在Simplicity Studio5例程中可以找到。
2、需要准备理解GATT服务器中UUID的属性。
Simplicity Studio5的GATT配置时,修改蓝牙设备名称时,注意要根据名称字符数准确设置Value Length。否则如果蓝牙客户端按名称搜索服务器时,会找不到服务器。
Automation IO下面Digital的UUID里面,有个Value Length,长度是1个byte,说明Digital不一定是BOOL量,控制电机正反转发送多个状态值时,可以使用Digital的UUID。
3、 ESP32-S3-BOX-Lite有时Arduino无法下载程序,需要进入boot模式再尝试下载。
经过本次项目,收获很多,还有许多工作要进一步探索和完善。
1、使用Arduino的BLE库时,此次使用的是bleCharacteristic.readValue()和bleCharacteristic.writeValue()两个函数。但对于GATT服务器中,不支持read属性,只有notify或indicate时,Arduino的库如何处理。本人目前还没研究清楚。
2、此次做的界面还不是很美观,如果需要优化界面,需要在Arduino中使用LVGL库,这一部分本人还没有继续研究。