Funpack3-1: 基于XG24-EK2703A和ESP32-S3-BOX-Lite的BLE温度采集与电机控制系统
该项目使用了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控制。。
标签
BLE
Funpack活动
电机
温度
ESP32-S3-BOX-LITE
FunPack3-2
XG24-EK2703A
chinaking
更新2024-03-05
924

一、项目介绍

本文使用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。

image.png

3、 ESP32-S3-BOX-Lite有时Arduino无法下载程序,需要进入boot模式再尝试下载。


经过本次项目,收获很多,还有许多工作要进一步探索和完善。

1、使用Arduino的BLE库时,此次使用的是bleCharacteristic.readValue()bleCharacteristic.writeValue()两个函数。但对于GATT服务器中,不支持read属性,只有notify或indicate时,Arduino的库如何处理。本人目前还没研究清楚。

2、此次做的界面还不是很美观,如果需要优化界面,需要在Arduino中使用LVGL库,这一部分本人还没有继续研究。









附件下载
XG24-EK2703A程序(BLE温度采集及电机PWM正反转控制).rar
使用Simplicity Studio5打开
ESP32_S3_BOX_BLE_ReadTemperature.rar
使用Arduino打开
团队介绍
老胡,自动化工程师,电子发烧友
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号