使用Sensirion环境传感模块检测空气质量
图源:snvv/stock.adobe.com
在工业自动化中,温度、湿度、空气质量和压力等环境条件对于维持效率、可靠性和安全性至关重要。这些因素会影响设备性能、产品质量,甚至工作人员的健康状况。例如,在自主移动机器人(AMR)和边缘设备等系统中,感知并响应这些条件是一项至关重要的能力,它们可以借此适应动态变化的环境、提高效率并支持更安全的操作。为此,Sensirion推出了SENSEVAL SCB4xV1 传感器评估板。这是一款紧凑且易于集成的平台,结合了温度、湿度、挥发性有机化合物(VOC)和压力传感功能,可用于实时环境监测。
本文将详细介绍如何从Sensirion SENSEVAL SCB4xV1评估板搭载的传感器中提取有价值的数据,以及如何从ST IKS4A1扩展模块获取运动传感器数据,从而为开发人员提供在设计中结合环境与运动测量数据的工具。
项目材料和资源
· STMicroelectronics NUCLEO-C092RC开发板
· STMicroelectronics X-NUCLEO-IKS4A1扩展板
· Sensirion SENSEVAL-SCB4XV1评估板
· Adafruit USB Type-C数据线
软件和工具:
· STM32CubeIDE
· STM32CubeMX
· 面向STM32Cube的X-CUBE-MEMS1扩展软件包
· 项目GitHub存储库
· Sensirion气体指数算法
· 运行Windows的PC
项目技术概述
下文将介绍本项目中使用的开发板及相关技术信息。
开发板
STMicroelectronics NUCLEO-C092RC Nucleo-64开发板(图1)提供了一种经济且灵活的方式,用于构建基于STM32C092RC微控制器的原型设计。该板配备与Arduino Uno R3兼容的排针以及ST morpho排针,可完全访问STM32的输入和输出(I/O)。NUCLEO-C092RC开发板可与多种集成开发环境(IDE)对接,包括STM32CubeIDE。该板集成了ST-LINK调试器/编程器,无需单独的探针,并附带STM32Cube MCU软件包中提供的全面且免费的STM32软件库和示例。
图1: STMicroelectronics NUCLEO-C092RC开发板。(图源:贸泽电子)
STMicroelectronics X-NUCLEO-IKS4A1扩展板(图2)是一款多功能传感器评估套件,专为先进的运动和环境传感而设计。其主板集成了MEMS传感器和环境传感器,并配有可拆卸的STEVAL-MKE001A附加板,用于QVAR滑动手势检测。该扩展板配备LSM6DSO16IS和LSM6DSV16X MEMS 3D加速度计,非常适合开发智能工业应用。尤为重要的是,其24引脚DIL(DIL24)插座与Sensirion SENSEVAL-SCB4xV1模块兼容,可无缝集成高精度的温度、湿度、VOC和压力传感功能。
图2: STMicroelectronics X-NUCLEO-IKS4A1扩展板。(图源:贸泽电子)
Sensirion SENSEVAL-SCB4XV1评估板(图3)集成了Sensirion SHT40温湿度传感器、SGP40 VOC传感器和STMicroelectronics LPS22DF气压传感器。该板也与STMicroelectronics DIL24插座兼容。
图3: Sensirion SENSEVAL-SCB4XV1评估板。(图源:贸泽电子)
硬件设置
IKS4A1扩展板和Sensirion SENSEVAL SCB4xV1评估板均配备连接到I²C总线的Sensirion SHT40温湿度传感器和ST LPS22DF压力传感器。由于SHT40仅支持单一固定I²C地址,因此在同一总线上使用两个SHT40会导致地址冲突。为解决该问题,需要先拆除IKS4A1扩展板SB37和SB39位置的0Ω电阻(位于SCL和SDA走线上),然后拆除R22位置的0Ω电阻(VDD走线上)(图4和图5)。
图4: 标示拆焊位置的SHT40原理图。(图源:STMicroelectronics)
图5: 标示拆焊位置的IKS4A1扩展板。(图源:贸泽电子)
LPS22DF则提供两个可选择的I²C地址:当SA0引脚连接到VDD时,地址为0x5D(代码中为0xBA);当SA0引脚连接到GND时,地址为0x5C(代码中为0xB8)。IKS4A1扩展板上的压力传感器连接到VDD,而Sensirion评估板上的传感器连接到GND。两块板上的传感器连接的引脚不同,因而在同一I²C总线上具有不同的地址,从而解决了通信问题。
将Sensirion评估板插入IKS4A1扩展板上的DIL24连接器,然后将扩展板插入Nucleo板的Arduino兼容排针,再将Nucleo板的USB Type-C电缆连接到PC。
软件设置
在配置开发板之前,必须先下载并安装STM32CubeMX(图6)和STM32CubeIDE。安装完成后,下载X-CUBE-MEMS1扩展软件包。
STM32CubeMX
1. 打开STM32CubeMX。
2. 单击Access to Board Selector(访问开发板选择器)并选择NUCLEO-C092RC开发板。此操作将打开配置窗口。
3. 启用Virtual COM Port(虚拟COM端口)选项和GPIO LED (LD2) 选项。虚拟COM端口用于通过开发板的USB/ST-LINK连接向PC发送串行数据。
4. 选择PB8引脚并将其设置为I2C1_SCL,然后选择PB9引脚并将其设置为I2C1_SDA。这些是Arduino Uno兼容排针中的I²C引脚。
5. 可选: 仅当Arduino排针引脚上需要单独的UART连接时,才需要配置USART1。
· 在Pinout & Configuration(引脚分配与配置)选项卡中,选择USART1。
· 将模式设置为Asynchronous(异步),然后将PB6设置为USART1_TX,将PB7设置为USART1_RX。这些引脚与板载虚拟COM端口是分开的,需要通过外部UART连接(如3.3V USB转UART适配器或兼容的扩展板)才能与PC通信。
6. 使用开发板的虚拟COM端口将USB串行数据输出到PuTTY终端或自定义图形用户界面(GUI)。
7. 在Project Manager(项目管理器)选项卡的Project Name(项目名称)字段中输入项目名称。
8. 单击Toolchain/IDE(工具链/IDE)下拉菜单,并选择STM32CubeIDE。
9. 单击Generate Code(生成代码)。此操作将根据您的.ioc配置生成STM32CubeIDE项目文件。
10. 项目生成后,单击Open Project(打开项目)。
图6: STM32CubeMX中STM32C092RC MCU的最终引脚分配。(图源:贸泽电子)
STM32CubeIDE
在STM32CubeIDE中打开项目,然后找到X-CUBE-MEMS1文件夹,并导航至 <您的X-CUBE-MEMS1软件包文件夹>/Drivers/BSP/Components/。
也可以通过在STM32CubeMX/STM32CubeIDE中使用X-CUBE-MEMS1软件包来添加所需的传感器驱动程序。以下方法适用于希望直接控制项目中包含哪些驱动程序文件的用户。
找到以下文件夹(粗体表示SENSEVAL-SCB4XV1评估板上的传感器):
· \lis2duxs12
· \lis2mdl
· \lps22df
· \lsm6dso16is
· \lsm6dsv16x
· \sgp40
· \sht40ad1b
· \stts22h
如需手动添加这些驱动程序:
1. 将所需的.h文件从每个选定的驱动程序文件夹复制到 <您的项目>/Core/Inc中。
2. 将所需的.c文件从每个选定的驱动程序文件夹复制到 <您的项目>/Core/Src中。
3. 从“项目材料和资源”部分提供的链接下载Sensirion气体指数算法文件。
4. 将sensirion_gas_index_algorithm.h复制到 <您的项目>/Core/Inc中。
5. 将sensirion_gas_index_algorithm.c复制到 <您的项目>/Core/Src中。
注意: 为便于进行适度的自定义,我们将为每个传感器模块提供单独的库文件。虽然也可以直接运行IKS4A1提供的示例代码,但使用这里提供的方法无需探索其他库和代码即可找到所需的内容。
在...\Src\main.c中,输入:
#include "lis2duxs12.h"
#include "lis2mdl.h"
#include "lps22df.h"
#include "lsm6dso16is.h"
#include "lsm6dsv16x.h"
#include "sgp40.h"
#include "sht40ad1b.h"
#include "stts22h.h"
在本项目使用的X-CUBE-MEMS1扩展软件包中,每个传感器都公开了两个关键结构体:
· <传感器名称>_IO_t
· <传感器名称>_Object_t
在main.c文件的main()函数之前,定义IO对象:
<传感器名称>_IO_t mysensor_io={
.Init = I2C_Init,
.DeInit = I2C_DeInit,
.BusType = 0U,
.Address = #Device Address#,
.Write = I2C_Write, //有时为WriteReg
.Read = I2C_Read, //有时为ReadReg
.GetTick = HAL_GetTick,
.Delay = HAL_Delay
};
每个传感器库都定义了自己的I/O操作结构体,但这些结构体具有相同的成员,例如用于通信例程(如I²C读写)的函数指针。所有这些函数指针通常都指向相同的用户定义函数,因为各个传感器之间的通信逻辑是相同的。这些结构体之间唯一的区别在于设备特定的地址。这些用户定义函数是原始HAL_I2C函数的微调版本。
因此,请进行如下定义:
int32_t I2C_Init(void) {
return (HAL_I2C_Init(&hi2c1) == HAL_OK) ?0 : -1;
}
int32_t I2C_DeInit(void) {
return (HAL_I2C_DeInit(&hi2c1) == HAL_OK) ?0 : -1;
}
int32_t I2C_Write(uint16_t DevAddr, uint8_t *pData, uint16_t Length) {
return (HAL_I2C_Master_Transmit(&hi2c1, DevAddr, pData, Length, HAL_MAX_DELAY) == HAL_OK) ?0 : -1;
}
int32_t I2C_Write_Reg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length) {return (HAL_I2C_Mem_Write(&hi2c1, DevAddr, Reg,
I2C_MEMADD_SIZE_8BIT, pData, Length, HAL_MAX_DELAY) == HAL_OK) ?0 : -1;
}
int32_t I2C_Read(uint16_t DevAddr, uint8_t *pData, uint16_t Length) {
return (HAL_I2C_Master_Receive(&hi2c1, DevAddr, pData, Length, HAL_MAX_DELAY) == HAL_OK) ?0 : -1;
}
int32_t I2C_Read_Reg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length) {
return (HAL_I2C_Mem_Read(&hi2c1, DevAddr, Reg,
I2C_MEMADD_SIZE_8BIT, pData, Length, HAL_MAX_DELAY) == HAL_OK) ?0 : -1;
}
然后定义传感器对象:
_Object_t mysensor_obj;
GasIndexAlgorithmParams params; //针对气体指数算法
在main()函数的while(1)循环之前,调用各个传感器的初始化函数:
..._RegisterBusIO(&mysensor_obj, &mysensor_io);
..._Init(&mysensor_obj);
...__Enable(&mysensor_obj);
//针对气体指数算法
GasIndexAlgorithm_init(¶ms, GasIndexAlgorithm_ALGORITHM_TYPE_VOC);
float value; //针对VOC指数的int32_t
定义一个浮点型变量用于存储数值。在while(1)循环内,调用获取函数:
_GetValue(&mysensor_obj, &value);
//针对气体指数算法
GasIndexAlgorithm_process(¶ms, sgp40_voc_val, &voc_index_value);
然后使用printf()函数打印数值,并通过PuTTY读取。
气体指数算法
Sensirion专门为SGP40和SGP41传感器提供了气体指数算法。该算法从SGP40_GAS_GetValue()获取数值并计算VOC指数。(它也可以从SGP41传感器提取NOx指数数值,不过本项目未采用SGP41。)如果未向传感器提供湿度或温度值,则默认设置为50%湿度和25°C。
在调用SGP40_GAS_GetValue()函数之前,会先调用SHT40AD1B_HUM_GetHumidity()和SHT40AD1B_TEMP_GetTemperature()函数提取湿度和温度值,然后传递给SGP40_GAS_SetHumidity()和SGP40_GAS_SetTemperature()设置函数。之后,便可以调用GasIndexAlgorithm_process()函数。
自定义GUI
PuTTY终端并不适合显示实时更新的传感器数值,因而我们用Python创建了一个GUI(可从GitHub存储库获取)。该GUI通过先前定义的UART通道接收数值,并以用户更容易理解的图表形式呈现(图7)。
1. 使用USB Type-C线缆将Nucleo开发板连接到PC。
2. 打开GUI.exe,选择开发板的COM端口,并将baud rate(波特率)设置为115200。
注意: ST MEMS-STUDIO虽提供与该自定义GUI类似的体验,但不兼容NUCLEO-C092RC开发板。
图7: 自定义GUI可配置为以网格视图显示所有传感器数据。(图源:贸泽电子)
示例应用:在AMR中进行部署
我们将此Sensirion开发板项目部署到了其他项目用过的AMR上,从而构建出一个概念验证原型。我们将三块板组成的系统安装到AMR车辆上,并将其集成到现有的机器人操作系统2(ROS 2)传感器节点。
在当前的设置中,Nucleo MCU通过I²C读取传感器数据,并将单一串行接口/USB数据流发送至PC。IKS4A1和SENSEVAL-SCB4xV1作为扩展传感器板,通过板载连接器与Nucleo连接(即它们并非直接通过USB接)。
因此,PC可以通过USB持续读取来自C092RC、IKS4A1和SCB4XV1的串行数据,并通过自定义接口发布这些数据,从而使任何节点都能订阅该主题并采取相应行动。例如,该设置使我们能够将3D模型[即ROS2中的统一机器人描述格式(URDF)文件]与来自惯性测量单元(IMU)的方向数据关联起来,从而提供更好的可视化效果。利用这些数据,我们可以判断AMR是正在上升还是下降,并相应地调整功率。
结语
将Sensirion的SENSEVAL-SCB4xV1等多传感器平台与基于STM32的开发板集成,展示了如何将环境感知无缝融入到工业自动化应用中。通过将温度、湿度、VOC和压力传感与灵活的软件工具以及用于可视化的自定义GUI相结合,我们实现了边缘端的实时监控和自适应决策。这种方法不仅提高了操作的安全性和效率,还为预测性维护和智能AMR导航等高级应用开辟了道路。最终,这些技术为更智能、更互联的系统铺平了道路,使系统能够动态响应工业环境中不断变化的条件。





