打印
[信息]

基于Nucleo-L476L的全部传感器数据读取和演示

[复制链接]
338|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcky001|  楼主 | 2021-3-10 09:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

1、基于Nucleo-L476L的全部传感器数据读取和演示主要是演示评测计划中全部传感器数据的读取和输出。

根据分析传感器的数据表,可以看出,这些传感器全部是 通过I2C总线读取和访问的。每个传感器具有一个唯一的地址码,再I2C读取的时候,指定地址码就可以唯一的访问这个传感器。传感器的地址码再开发板的反面完整地列出,详见上一帖的照片。

再这样的情况下,对于传感器数据的读取就变为对I2C的访问和读取,这样简化了设计,而且具有快速移植的特点。

2、开发环境和IDE

2.1 原计划中采用的arduino平台是一个快速开发和评测的工具,但是代码编译同样具有高效特点,因为,调用的编译器是GCC。对于代码的效率,重要的是代码逻辑的优化,那么同样具有复杂程序开发的能力。编译的hex可执行文件,可以直接写入flash,即使是工业化开发也没有问题。

2.2 再完成了arduino平台的开发后,其实同样的开发板移植到mbed平台也是非常迅速的,可以发现,很多代码都可以直接使用,适当调整一下格式就可以了。但是因为本次活动的先发先评的积分规则,如果同时进行评测mbed的平台会影响其他评测的计分,毕竟还有没有收到快递的。

2.3 使用Arduino-uno和使用Nucleo-Arduino开发的最大区别是标准arduino使用原生I2C库wire.h,使用更简单。而Nucleo-arduino重写了I2C的驱动,使用的是TwoWire类,用一个指针传递DEVICE_I2C,这样和STM的HAL等开发库的代码保持一致。所以,如果使用arduino-uno等均需要再wire部分进行调整。

3. 综合全部传感器数据读取的程序helloworld代码如下。因为是arduino代码,所以非常直观。

  • // Includes
  • #include <LSM6DSOSensor.h>
  • #include <LIS2DW12Sensor.h>
  • #include <LIS2MDLSensor.h>
  • #include <LPS22HHSensor.h>
  • #include <STTS751Sensor.h>
  • #include <HTS221Sensor.h>
  • #ifdef ARDUINO_SAM_DUE
  • #define DEV_I2C Wire1
  • #elif defined(ARDUINO_ARCH_STM32)
  • #define DEV_I2C Wire
  • #elif defined(ARDUINO_ARCH_AVR)
  • #define DEV_I2C Wire
  • #else
  • #define DEV_I2C Wire
  • #endif
  • #define SerialPort Serial
  • // Components
  • LSM6DSOSensor *AccGyr;
  • LIS2DW12Sensor *Acc2;
  • LIS2MDLSensor *Mag;
  • LPS22HHSensor *PressTemp;
  • HTS221Sensor *HumTemp;
  • STTS751Sensor *Temp3;
  • void setup() {
  •   // Led.
  •   pinMode(LED_BUILTIN, OUTPUT);
  •   // Initialize serial for output.
  •   SerialPort.begin(115200);
  •   // Initialize I2C bus.
  •   DEV_I2C.begin();
  •   AccGyr = new LSM6DSOSensor (&DEV_I2C);
  •   AccGyr->Enable_X();
  •   AccGyr->Enable_G();
  •   Acc2 = new LIS2DW12Sensor (&DEV_I2C);
  •   Acc2->Enable_X();
  •   Mag = new LIS2MDLSensor (&DEV_I2C);
  •   Mag->Enable();
  •   PressTemp = new LPS22HHSensor(&DEV_I2C);
  •   PressTemp->Enable();
  •   HumTemp = new HTS221Sensor (&DEV_I2C);
  •   HumTemp->Enable();
  •   Temp3 = new STTS751Sensor (&DEV_I2C);
  •   Temp3->Enable();
  • }
  • void loop() {
  •   // Led blinking.
  •   digitalWrite(LED_BUILTIN, HIGH);
  •   delay(250);
  •   digitalWrite(LED_BUILTIN, LOW);
  •   delay(250);
  •   // Read humidity and temperature.
  •   float humidity = 0, temperature = 0;
  •   HumTemp->GetHumidity(&humidity);
  •   HumTemp->GetTemperature(&temperature);
  •   // Read pressure and temperature.
  •   float pressure = 0, temperature2 = 0;
  •   PressTemp->GetPressure(&pressure);
  •   PressTemp->GetTemperature(&temperature2);
  •   //Read temperature
  •   float temperature3 = 0;
  •   Temp3->GetTemperature(&temperature3);
  •   // Read accelerometer and gyroscope.
  •   int32_t accelerometer[3];
  •   int32_t gyroscope[3];
  •   memset(accelerometer, 0, 3);
  •   memset(gyroscope, 0, 3);
  •   AccGyr->Get_X_Axes(accelerometer);
  •   AccGyr->Get_G_Axes(gyroscope);
  •   //Read accelerometer
  •   int32_t accelerometer2[3];
  •   memset(accelerometer2, 0, 3);
  •   Acc2->Get_X_Axes(accelerometer2);
  •   //Read magnetometer
  •   int32_t magnetometer[3];
  •   memset(magnetometer, 0, 3);
  •   Mag->GetAxes(magnetometer);
  •   // Output data.
  •   SerialPort.print("| Hum[%]: ");
  •   SerialPort.print(humidity, 2);
  •   SerialPort.print(" | Temp[C]: ");
  •   SerialPort.print(temperature, 2);
  •   SerialPort.print(" | Pres[hPa]: ");
  •   SerialPort.print(pressure, 2);
  •   SerialPort.print(" | Temp2[C]: ");
  •   SerialPort.print(temperature2, 2);
  •   SerialPort.print(" | Temp3[C]: ");
  •   SerialPort.print(temperature3, 2);
  •   SerialPort.print(" | Acc[mg]: ");
  •   SerialPort.print(accelerometer[0]);
  •   SerialPort.print(" ");
  •   SerialPort.print(accelerometer[1]);
  •   SerialPort.print(" ");
  •   SerialPort.print(accelerometer[2]);
  •   SerialPort.print(" | Gyr[mdps]: ");
  •   SerialPort.print(gyroscope[0]);
  •   SerialPort.print(" ");
  •   SerialPort.print(gyroscope[1]);
  •   SerialPort.print(" ");
  •   SerialPort.print(gyroscope[2]);
  •   SerialPort.print(" | Acc2[mg]: ");
  •   SerialPort.print(accelerometer2[0]);
  •   SerialPort.print(" ");
  •   SerialPort.print(accelerometer2[1]);
  •   SerialPort.print(" ");
  •   SerialPort.print(accelerometer2[2]);
  •   SerialPort.print(" | Mag[mGauss]: ");
  •   SerialPort.print(magnetometer[0]);
  •   SerialPort.print(" ");
  •   SerialPort.print(magnetometer[1]);
  •   SerialPort.print(" ");
  •   SerialPort.print(magnetometer[2]);
  •   SerialPort.println(" |");
  • }

程序编译并上传到开发板,占用了38.180k内存(3%代码空间)

同时串口输出了全部的传感器数据,如下


4、演示视频

VID_20190716_152730.mp4 (5.74 MB, 下载次数: 1)


这个视频中,显示了变化的传感器数据读数,其中在转动和冲击时,x-y-z传感器和加速度传感器的数据都在实时地变化。

5、第一步基本数据读取和显示的评测任务完成。包括了以下的全部传感器。后续在一个演示程序中使用。

  • LSM6DSOSensor ;
  • LIS2DW12Sensor ;
  • LIS2MDLSensor ;
  • LPS22HHSensor ;
  • HTS221Sensor ;
  • STTS751Sensor ;

参考的流程包括以下步骤,

  • 导入传感器驱动,

#include <LSM6DSOSensor.h>
#include <LIS2DW12Sensor.h>
#include <LIS2MDLSensor.h>
#include <LPS22HHSensor.h>
#include <STTS751Sensor.h>
#include <HTS221Sensor.h>

  • 创建传感器实例

LSM6DSOSensor *AccGyr;
LIS2DW12Sensor *Acc2;
LIS2MDLSensor *Mag;
LPS22HHSensor *PressTemp;
HTS221Sensor *HumTemp;
STTS751Sensor *Temp3;

// new instance

  AccGyr = new LSM6DSOSensor (&DEV_I2C);
  AccGyr->Enable_X();
  AccGyr->Enable_G();
  Acc2 = new LIS2DW12Sensor (&DEV_I2C);
  Acc2->Enable_X();
  Mag = new LIS2MDLSensor (&DEV_I2C);
  Mag->Enable();
  PressTemp = new LPS22HHSensor(&DEV_I2C);
  PressTemp->Enable();
  HumTemp = new HTS221Sensor (&DEV_I2C);
  HumTemp->Enable();
  Temp3 = new STTS751Sensor (&DEV_I2C);
  Temp3->Enable();

  • 初始化I2C端口

#define DEV_I2C Wire

  DEV_I2C.begin();

  • 逐个读取传感器数据并用串口以115200的波特率输出

float humidity = 0, temperature = 0;
  HumTemp->GetHumidity(&humidity);
  HumTemp->GetTemperature(&temperature);

  // Read pressure and temperature.
  float pressure = 0, temperature2 = 0;
  PressTemp->GetPressure(&pressure);
  PressTemp->GetTemperature(&temperature2);

  //Read temperature
  float temperature3 = 0;
  Temp3->GetTemperature(&temperature3);

  // Read accelerometer and gyroscope.
  int32_t accelerometer[3];
  int32_t gyroscope[3];
  memset(accelerometer, 0, 3);
  memset(gyroscope, 0, 3);
  AccGyr->Get_X_Axes(accelerometer);
  AccGyr->Get_G_Axes(gyroscope);

  //Read accelerometer
  int32_t accelerometer2[3];
  memset(accelerometer2, 0, 3);
  Acc2->Get_X_Axes(accelerometer2);

  //Read magnetometer
  int32_t magnetometer[3];
  memset(magnetometer, 0, 3);
  Mag->GetAxes(magnetometer);


此内容由EEWORLD论坛网友北方原创,如需转载或用于商业用途需征得作者同意并注明出处

此帖出自MEMS传感器论坛

11.PNG (51.27 KB, 下载次数: 0)


[url=] [/url]

12.PNG (39.74 KB, 下载次数: 0)


[url=] [/url]


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1505

主题

4522

帖子

6

粉丝