Funpack3-3--基于X-NUCLEO-IKS4A1的QVAR触摸控制传感器的数据显示
该项目使用了X-NUCLEO-IKS4A1搭配NUCLEO-G0B1RE,实现了环境数据的获取和处理的设计,它的主要功能为:通过获取板载的各类传感器的数据和Qvar触摸控制传感器的选择和切换,控制数据在QT上位机上的显示。。
标签
Funpack活动
青芒亭
更新2024-07-08
广东科技学院
22

项目描述:

本项目是基于Funpack活动的第三季第二期,板卡平台来源于ST意法半导体的 X-NUCLEO-IKS4A1 传感器评估板和 NUCLEO-G0B1RE MCU板,板载了相当丰富的MEMS传感器和环境传感器,以及可拆卸的 Qvar 触摸/滑动电极附加板,可实现点按和左右滑动的识别,以及外部环境各种数据的采集。

1,项目介绍

本项目通过I2C协议与各个传感器进行通信,分别获取了LIS2DUX12的加速度数据,LSM6DSV16X的角速度数据,LIS2MDL的磁场数据,STTS22H的温度数据,SHT40AD1B的湿度数据和Qvar触摸/滑动电极的数据,将数据通过UART协议发送到QT6制作的上位机上进行数据处理和显示。

2,硬件概括

2.1 MCU板卡:NUCLEO-G0B1RE

NUCLIO-G0B1RE,这是一块优秀的高性价比板卡,在满足性能的情况下,通过内部或外部SMPS可显著降低运行模式下的功耗,实现了相对不错的性能和低功耗,板载支持了ARDUINO Uno V3 接口,可以轻松通过多种专用拓展板轻松拓展STM32 Nucleo开放式开发平台的功能。还板载了ST-LINK,带有虚拟串口,十分方便开发和验证,基本上拿来就用。

2.2运动MEMS和环境传感器扩展板卡:X-NUCLEO-IKS4A1

X-NUCLEO-IKS4A1运动MEMS与环境传感器评估板套件,集成了先进的MEMS技术与环境传感元件,通过LSM6DSV16X的SPI接口与Qvar电极支持的触摸/滑动输入,专为要求严苛的相机应用设计。该套件以STM32Cube生态系统为核心,提供包括智能处理单元(ISPU)、传感器融合、AI功能及多传感器同步的高级特性,结合了LSM6DSO16IS、LIS2MDL、LIS2DUXS12、LPS22DF、SHT40AD1B和STTS22H等多种传感器,实现了从三维运动追踪、磁场检测到温湿度与气压测量的全方位数据采集。利用DIL24适配器的扩展能力,及对MIPI I3C接口的支持,该平台促进了与红外传感器等外设的无缝集成,为科研与工业应用提供了高效、低功耗、高精度的传感器数据处理与图像稳定解决方案,完全符合RoHS、WEEE及UKCA标准,加速了从原型设计到产品化的进程。

3,项目需求

通过获取板卡上的qvar数据,进行处理,实现双击和左右滑动的触摸手势识别,通过左右滑动来实现传感器和各项数据显示选项的切换,通过双击来实现是否要开启或关闭某个传感器或者传感器某项数据的显示。将使用上位机开发工具,实现功能选择和数据的可视化,如能够选择是否要加速度传感器,陀螺仪的显示,是否要关闭其中的x轴数据显示,或者是否要开启温度或者湿度数据的显示。

4,设计思路

通过板卡配套的官方资料开发手册和交流群中大佬的无私奉献,通过学习大佬的文章,在STM32CubeMX中完成了官方提供的驱动配置,成功使用IIC获取了各个传感器的数据,并通过自定义的串口格式将数据发送至上位机中。

main函数的内容比较简单,就是各个传感器的初始化,并通过while轮询获取各个传感器的数据并发送数据至上位机。

  /* USER CODE BEGIN 2 */
MX_MEMS_Init(); //传感器初始化
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
MX_MEMS_Process();//轮询获取数据
HAL_Delay(20);//轮询周期,避免MCU长期处在高负载
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

这个代码是经过群内大佬的封装的,主要是为了代码阅读更加简介优雅,再次感谢大佬的贡献,底层还是调用的ST官方的驱动代码。

    static void Init_Sensors(void)
{
BSP_SENSOR_LSM6DSV16X_ACC_Init();
BSP_SENSOR_LSM6DSO16IS_ACC_Init();
BSP_SENSOR_LIS2DUXS12_ACC_Init();

BSP_SENSOR_LSM6DSO16IS_GYR_Init();
BSP_SENSOR_LSM6DSV16X_GYR_Init();

BSP_SENSOR_MAG_Init();

BSP_SENSOR_PRESS_Init();
BSP_SENSOR_TEMP_Init();
BSP_SENSOR_HUM_Init();

BSP_SENSOR_LSM6DSO16IS_ACC_SetOutputDataRate(ACC_ODR);
BSP_SENSOR_LSM6DSO16IS_ACC_SetFullScale(ACC_FS);
BSP_SENSOR_LSM6DSV16X_ACC_SetOutputDataRate(ACC_ODR);
BSP_SENSOR_LSM6DSV16X_ACC_SetFullScale(ACC_FS);
BSP_SENSOR_LIS2DUXS12_ACC_SetOutputDataRate(ACC_ODR);
BSP_SENSOR_LIS2DUXS12_ACC_SetFullScale(ACC_FS);
}

轮询获取函数的内容:获取各个传感器的数据。通过简单的状态机对qvar触摸电极的双击,左滑和右滑的识别,并且通过自定义的数据帧格式,将数据通过串口发送至QT上位机

    void MX_MEMS_Process(void)
{
/* USER CODE BEGIN MEMS_Process_PreTreatment */
/* USER CODE END MEMS_Process_PreTreatment */

BSP_SENSOR_MAG_GetAxes(&MagValue);
BSP_SENSOR_LSM6DSV16X_ACC_GetAxes(&GyrValue);
BSP_SENSOR_HUM_GetValue(&HumValue);
BSP_SENSOR_TEMP_GetValue(&TempValue);
BSP_SENSOR_LIS2DUXS12_ACC_GetAxes(&AccValue);
BSP_SENSOR_QVAR_GetValue(&QvarValue);
BSP_SENSOR_PRESS_GetValue(&PressValue);
if (QvarValue >= 30000)
{
flag = 0;
new_time = HAL_GetTick();
// printf("new_time%d\n", new_time);
}
if (QvarValue <= -30000)
{
flag = 1;
new_time1 = HAL_GetTick();
// printf("time1%d\n", new_time1);
}
if (abs(new_time - new_time1) <= 150 && abs(new_time - new_time1) != 0)
{
new_time = new_time1 = 0;
if (flag)
qver_flag = 2;
else
qver_flag = 3;
}

if (abs(QvarValue) >= 30000)
{
if (d_flag1 == 1)
{
d_flag = d_flag1 = 0;
if (HAL_GetTick() - first_time > 100 && HAL_GetTick() - first_time < 400)
{
qver_flag = 1;
}
}
if (d_flag == 0)
{
d_flag = 1;
first_time = HAL_GetTick(); //获取第一次按下的时间
}
}
else
{
if (d_flag == 1)
d_flag1 = 1;
}
printf("T=%f,H=%f,A=%d,m.x=%d,m.y=%d,m.z=%d,a.x=%d,a.y=%d,a.z=%d,g.x=%d,g.y=%d,g.z=%d#", TempValue, HumValue,
qver_flag, MagValue.x, MagValue.y, MagValue.z, AccValue.x, AccValue.y, AccValue.z, GyrValue.x,
GyrValue.y, GyrValue.z);
qver_flag = 0;
/* USER CODE BEGIN MEMS_Process_PostTreatment */

/* USER CODE END MEMS_Process_PostTreatment */
}


上位机是采用QT6来设计开发的,Qt 6是一个高性能的跨平台开发框架,通过优化图形渲染、支持现代图形API、增强模块化设计和采用最新C++标准,实现了更流畅的用户体验、更灵活的开发流程和更高的应用程序安全性,同时保持卓越的跨平台兼容性,助力开发者高效创造高质量的桌面、移动及嵌入式应用。

上位机主要完成的部分是对数据的解析,对gui的绘制和控制,扫描电脑的串口,并使能链接,获取串口数据,通过正则表达式,将接收到的下位机数据进行解析提取,最后显示在UI界面上。


添加串口组件

QT       += core gui serialport

扫描本机可用的串口,显示在下拉列表框中供用户选择,设置当serialport检测到有串口数据可读时,自动调用当前对象的readdate()槽函数来处理这些数据。

    //扫描可用的串口
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
ui->comboBox->addItem(info.portName());
}
connect(serialport,SIGNAL(readyRead()),this,SLOT(readdate()));

主要的数据解析在readdate()槽函数中,通过正则表达式对数据进行解析提取。

const QRegularExpression Widget::regex("T=(-?\\d+\\.\\d+),H=(-?\\d+\\.\\d+),A=(-?\\d+),m.x=(-?\\d+),m.y=(-?\\d+),m.z=(-?\\d+),a.x=(-?\\d+),a.y=(-?\\d+),a.z=(-?\\d+),g.x=(-?\\d+),g.y=(-?\\d+),g.z=(-?\\d+)");
void Widget::readdate()
{
QByteArray buf = serialport->readAll();
if(!buf.isEmpty())
{
bufferedData.append(buf);
int endIndex = bufferedData.indexOf('#');
while(endIndex != -1)
{
QByteArray frame = bufferedData.mid(0,endIndex);
QString processedFrame = QString::fromUtf8(frame);
// qDebug() << "Received Frame:"<< processedFrame;

// 使用正则表达式解析数据
QRegularExpressionMatch match = regex.match(processedFrame);

if (match.hasMatch())
{
float T = match.captured(1).toFloat();
float H = match.captured(2).toFloat();
float A = match.captured(3).toInt();
float mx = match.captured(4).toInt();
float my = match.captured(5).toInt();
float mz = match.captured(6).toInt();
float ax = match.captured(7).toInt();
float ay = match.captured(8).toInt();
float az = match.captured(9).toInt();
float gx = match.captured(10).toInt();
float gy = match.captured(11).toInt();

由于这个QT6也是我学了三四天赶出来的,目前这个上位机的代码里面对于传感器的关闭开启,传感器的选择部分,完全就是”shi山代码“,因为我写的又臭又长,篇幅问题,我就不贴在这里了。

5,软件流程图

6,完成的功能

实现与下位机的串口连接,将数据显示在UI界面上。

image.png

实现传感器的切换,通过双击实现整个传感器数据的切换或者开启,或者传感器单个数据的开启和关闭,其中开启为粉红色,关闭显示蓝色,并显示NONE,通过左滑或者右滑移动选择光标,光标就是选中了哪个选项则会显示淡粉色。

image.png

7,未来计划与活动

通过这次funpack活动的学习,我对各种运动MEMS传感器和环境传感器又有了进一步的了解,明白了基础的上位机的设计制作,顺利的获取了各个传感器的数据,并成功将其控制显示在上位机界面上。十分感谢硬禾给我们广大电子爱好者提供一个有趣好玩,可以动手实操的平台。也感谢交流群内大佬的无私奉献和直播的教程,让我从中学到了许多东西,最后也是希望funpack可以一直开展下去,越办越好,让更多的电子爱好者可以参与学到更多好玩的新玩意。

附件下载
code.zip
项目源码
qt小程序.zip
qt打包好的上位机
QT源码.zip
上位机源码
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号