Gravity: BMP585高精度气压温度传感器

产品简介

Gravity:10轴惯性测量单元传感器精妙融合了3轴加速度计、陀螺仪、磁力计与气压传感器,可实现高精度运动检测与动态空间定位。该传感器支持I2C通信,并配备开源的Arduino和Python库,非常适合快速原型开发与灵活集成。其全面的功能使其广泛应用于可穿戴设备、智能手表、物联网设备、无人机及环境监测等领域。无论是工程师还是爱好者,Gravity传感器都能为前沿项目提供所需的精度与适应性。您可以通过教程、项目案例等资源,将该传感器深度融入您的创新设计之中。

产品参数

基本参数

参数 数值
工作电压 DC 3.3-5V
工作电流 3.59mA
通讯接口 I2C/UART
接口类型 PH2.0-4P(Gravity线序)/2.54mm排针孔
I2C 地址 0x4A(默认)/0x4B/0x4C/0x4D
可编程中断引脚 BMI323:2 个
BMM350:1个
BMP581:1个

加速度参数

参数 数值
测量范围 ±2g, ±4g, ±8g, ±16g
ADC 分辨率 16 位
灵敏度 ±2g 量程:16384 LSB/g
±4g 量程:8192 LSB/g
±8g 量程:4096 LSB/g
±16g 量程:2048 LSB/g
灵敏度误差 ±0.5%
零 g 偏移 ±50 mg
输出数据率 (ODR) 高性能 / 正常模式:12.5 Hz ~ 6400 Hz
低功耗模式:0.78125 Hz ~ 400 Hz

陀螺仪参数

参数 数值
角速度量程 ±125, ±250, ±500, ±1000, ±2000 °/s
ADC 分辨率 16 位
灵敏度 ±2000 °/s 量程:16.384 LSB/(°/s)
±1000 °/s 量程:32.768 LSB/(°/s)
±500 °/s 量程:65.536 LSB/(°/s)
±250 °/s 量程:131.072 LSB/(°/s)
灵敏度误差 ±3%(无自动校准)/±0.7%(自动校准后)
零速率偏移 ±1 °/s
输出数据率 (ODR) 高性能 / 正常模式:12.5 Hz ~ 6400 Hz
低功耗模式:0.78125 Hz ~ 400 Hz

地磁参数

参数 数值
工作模式 正常模式(周期性测量)、强制模式(触发式测量)、休眠模式(低功耗待机)
测量范围 ±2000 µT
磁场分辨率 ~0.1 µT
零场偏移漂移(焊接后)零场偏移(校准后) ±2 µT(-40°C ~ +85°C,经 Bosch eCompass 软件校准)
X/Y 轴增益误差 ±1%(25°C,经 API 补偿后)
Z 轴增益误差 ±3%(25°C,经 API 补偿后)
灵敏度温度漂移(TCS) ±0.010 %/K
偏移温度误差(TCOerr) ±200 nT/K
正常模式输出数据率(ODR) 400/200/100/50/25/12.5/6.25/3.125/1.5625 Hz(典型偏差 ±2%)
强制模式最大触发频率 200 Hz(仅 avg=0 时)
X/Y 轴输出噪声(rms) 190 nTrms(ODR=100Hz,平均 2 样本,3dB 带宽 = ODR/2)
Z 轴输出噪声(rms) 450 nTrms(ODR=100Hz,平均 2 样本,3dB 带宽 = ODR/2)

气压参数

参数 数值
气压 - 测量范围 30kPa ~ 125kPa
气压 - 相对精度 700~1100hPa,15~55℃,10kPa 步长,典型 ±6Pa
气压 - 温度诱导偏移 ±0.5Pa/K
气压 - 分辨率 1/64 Pa(约 0.0156Pa)
气压 - 长期漂移(1 年) ±10Pa
温度 - 测量范围 -40℃ ~ +85℃
温度 - 绝对精度 -5~55℃/ 全温域,均为 ±0.5K
温度 - 分辨率 1/65536 ℃(约 0.000015℃)
输出数据率(ODR) 正常模式(NORMAL)0.125Hz ~ 240Hz
过采样率(OSR) 气压 / 温度可独立配置 1x、2x、4x、8x、16x、32x、64x、128x
过采样与噪声 / 数据率关系 过采样越高,噪声越低,数据率越低(如 128x OSR 对应连续模式 12Hz ODR)
滤波 内置 IIR 低通滤波器,系数可配置(0~127),支持气压、温度独立滤波配置

物理尺寸

参数 数值
PCB尺寸 32mm*27mm
安装孔间距 20mm
安装孔直径 3mm

尺寸图

单位:mm

SEN0696-尺寸图

引脚说明

SEN0696-功能图

引脚丝印 功能描述
+ 电源正极(供电输入3.3-5V)
- 电源负极(接地)
C/R 复用引脚:I2C模式为时钟线(SCL),UART模式为接收端(RXD)
D/T 复用引脚:I2C模式为数据线(SDA),UART模式为发送端(TXD)
INT1 BMI323中断输出引脚1
INT2 BMI323中断输出引脚2
INT3 BMM350中断输出引脚
INT4 BMP581中断输出引脚

I2C地址设置开关说明

I2C地址 A0 A1
0x4A 0 0
0x4B 1 0
0x4C 0 1
0x4D 1 1

注意事项:

  • “I2C/UART切换开关”的切换可以断电保存,重启设备后新模式生效。

Arduino IDE 使用教程

说明:本传感器支持任意运动、无运动、显著运动等多种运动状态检测,以及敲击、倾斜、方向、平面检测等手势识别功能。Wiki 仅展示核心基础用法,更多运动状态检测与高级功能实现,请直接参考库文件中完整的 examples 示例程序及API,此处不再逐一展开。

通过I2C读取数据的ESP32示例代码

目标

本教程旨在演示如何初始化10轴IMU传感器,并通过轮询方式直接读取加速度、角速度、地磁和气压数据。

硬件准备

软件准备

接线配置

SEN0696-I2C接线图

  • 按图示连接 传感器与 ESP32-C5,核心对应关系:
    • 传感器引脚 “+” → ESP32-E 3.3V
    • 传感器引脚 “-” → ESP32-E GND
    • 传感器 I2C 引脚 “SCL” → ESP32-E SCL(默认 GPIO10)
    • 传感器 I2C 引脚 “SDA” → ESP32-E SDA(默认 GPIO9)
    • 传感器拨码开关配置:通信模式拨到I2C侧,I2C地址拨到0x4A(A0=0,A1=0)

样例代码

#include "DFRobot_Multi_DOF_IMU.h"

#define IMU_COMM_I2C
// 是否计算海拔高度(true=海拔,false=气压)
const bool CALCULATE_ALTITUDE = true;

const uint8_t IMU_ADDR = 0x4A;

// 初始化I2C通信的IMU对象
DFRobot_Multi_DOF_IMU_I2C imu(DFRobot_Multi_DOF_IMU::eSensorModel10DOF, &Wire, IMU_ADDR);

void setup() {
  Serial.begin(115200);
  while (!Serial) {
    delay(10);
  }

  Serial.println("\n10DOF IMU Simplified Data Reading (ESP32 I2C)\n");

  // 初始化传感器
  Serial.print("Initializing IMU sensor... ");
  while (!imu.begin()) {
    Serial.println("Failed! Check address and wiring.");
    delay(1000);
  }
  Serial.println("Success!");

  // 基础配置(传感器模式、加速度计、陀螺仪量程)
  imu.setSensorMode(DFRobot_Multi_DOF_IMU::eNormalMode);
  imu.setAccelRange(DFRobot_Multi_DOF_IMU::eAccelRange2G);
  imu.setGyroRange(DFRobot_Multi_DOF_IMU::eGyroRange250DPS);

  // 海拔校准(参考海拔540米,可根据实际修改)
  if (CALCULATE_ALTITUDE) {
    Serial.print("Calibrating altitude (reference: 540m)... ");
    imu.calibrateAltitude(540.0);
    Serial.println("Done");
  }

  Serial.println("\nConfiguration completed. Starting data reading...\n");
  delay(500);
}

void loop() {
  // 定义存储传感器数据的变量
  DFRobot_Multi_DOF_IMU::sSensorData_t accelData, gyroData, magData;
  float pressureAltValue; // 存储气压(Pa)或海拔(m)

  // 读取10DOF传感器数据
  if (imu.get10dofData(&accelData, &gyroData, &magData, &pressureAltValue, CALCULATE_ALTITUDE)) {
    Serial.println("==================== IMU Data ====================");
    
    // 加速度计数据(Accelerometer)
    Serial.println("--- Accelerometer Data (g) ---");
    Serial.print("X-axis: "); Serial.print(accelData.x, 3); Serial.println(" g");
    Serial.print("Y-axis: "); Serial.print(accelData.y, 3); Serial.println(" g");
    Serial.print("Z-axis: "); Serial.print(accelData.z, 3); Serial.println(" g");

    // 陀螺仪数据(Gyroscope)
    Serial.println("--- Gyroscope Data (dps) ---");
    Serial.print("X-axis: "); Serial.print(gyroData.x, 2); Serial.println(" dps");
    Serial.print("Y-axis: "); Serial.print(gyroData.y, 2); Serial.println(" dps");
    Serial.print("Z-axis: "); Serial.print(gyroData.z, 2); Serial.println(" dps");

    // 磁力计数据(Magnetometer)
    Serial.println("--- Magnetometer Data (uT) ---");
    Serial.print("X-axis: "); Serial.print(magData.x, 2); Serial.println(" uT");
    Serial.print("Y-axis: "); Serial.print(magData.y, 2); Serial.println(" uT");
    Serial.print("Z-axis: "); Serial.print(magData.z, 2); Serial.println(" uT");

    // 气压/海拔数据
    if (CALCULATE_ALTITUDE) {
      Serial.println("--- Altitude Data ---");
      Serial.print("Altitude: "); Serial.print(pressureAltValue, 2); Serial.println(" meters");
    } else {
      Serial.println("--- Pressure Data ---");
      Serial.print("Pressure: "); Serial.print(pressureAltValue, 2); Serial.println(" Pa");
      Serial.print("Pressure (hPa): "); Serial.print(pressureAltValue / 100.0, 2); Serial.println(" hPa");
    }
    Serial.println("===================================================\n");
  } else {
    Serial.println("Error: Failed to read IMU sensor data!\n");
  }
  delay(500);
}

结果

SEN0696-I2C结果图

通过UART与中断读取数据的ESP32示例代码

目标

本教程旨在演示如何配置9轴IMU传感器,在数据就绪时通过硬件中断触发,并在中断服务程序中读取加速度、角速度和地磁数据,实现高效的数据采集。

硬件准备

软件准备

接线配置

SEN0696-UART接线图

  • 按图示连接10轴IMU传感器与 ESP32-C5,核心对应关系:
    • 传感器引脚 “+” → ESP32-C5 3.3V
    • 传感器引脚 “-” → ESP32-C5 GND
    • 传感器引脚“INT1” → ESP32-C5 GPIO27
    • 传感器引脚“INT3” → ESP32-C5 GPIO28
    • 传感器引脚“INT4” → ESP32-C5 GPIO25
    • 传感器 UART 引脚 “RX” → ESP32-C5 D3(GPIO26)
    • 传感器 UART 引脚 “TX” → ESP32-C5 D2(GPIO8)
    • 传感器拨码开关配置:通信模式拨到UART侧,地址拨到0x4A(A0=0,A1=0)

样例代码

#include "DFRobot_Multi_DOF_IMU.h"
#define IMU_COMM_UART

#undef CALIBRATE_ABSOLUTE_DIFFERENCE
const bool CALCULATE_ALTITUDE = false;

const uint8_t ADDR = 0x4A;


DFRobot_Multi_DOF_IMU_UART imu(DFRobot_Multi_DOF_IMU::eSensorModel10DOF, &Serial1, 9600, ADDR, /*rx=*/8, /*tx=*/26);

volatile bool int1DataReady = false;
volatile bool int3DataReady = false;
volatile bool int4DataReady = false;

// INT1数据就绪中断服务函数
void IRAM_ATTR int1ISR() {
  int1DataReady = true;
}

// INT3数据就绪中断服务函数
void IRAM_ATTR int3ISR() {
  int3DataReady = true;
}

// INT4数据就绪中断服务函数
void IRAM_ATTR int4ISR() {
  int4DataReady = true;
}

void setup() {
  // 初始化串口监视器(波特率115200)
  Serial.begin(115200);
  while (!Serial) delay(10);

  // [1] 初始化传感器
  Serial.print("\n[1] Initializing sensor... ");
  while (!imu.begin()) {
    Serial.println("Failed, please check device address and connections!");
    delay(1000);
  }
  Serial.println("Success");
  delay(500);

  // [2] 设置传感器为正常模式
  Serial.print("[2] Setting sensor mode to normal... ");
  while (!imu.setSensorMode(DFRobot_Multi_DOF_IMU::eNormalMode)) {
    Serial.println("Failed, please check device communication!");
    delay(1000);
  }
  Serial.println("Success");
  delay(500);

  // [3] 设置加速度计量程为±2G
  Serial.print("[3] Setting accelerometer range to ±2G... ");
  while (!imu.setAccelRange(DFRobot_Multi_DOF_IMU::eAccelRange2G)) {
    Serial.println("Failed, please check device communication!");
    delay(1000);
  }
  Serial.println("Success");
  delay(500);

  // [4] 设置陀螺仪量程为±250dps
  Serial.print("[4] Setting gyroscope range to ±250dps... ");
  while (!imu.setGyroRange(DFRobot_Multi_DOF_IMU::eGyroRange250DPS)) {
    Serial.println("Failed, please check device communication!");
    delay(1000);
  }
  Serial.println("Success");
  delay(500);



  // [5] 配置INT1数据就绪中断
  Serial.print("[5] Configuring INT1 data ready interrupt... ");
  while (!imu.setInt(DFRobot_Multi_DOF_IMU::eImuIntPin1, DFRobot_Multi_DOF_IMU::eInt1_2DataReady)) {
    Serial.println("Failed, please check pin and interrupt configuration!");
    delay(1000);
  }
  Serial.println("Success");
  delay(500);

  // [6] 配置INT3数据就绪中断
  Serial.print("[6] Configuring INT3 data ready interrupt... ");
  while (!imu.setInt(DFRobot_Multi_DOF_IMU::eImuIntPin3, DFRobot_Multi_DOF_IMU::eInt3DataReady)) {
    Serial.println("Failed, please check pin and interrupt configuration!");
    delay(1000);
  }
  Serial.println("Success");
  delay(500);

  // [7] 配置INT4数据就绪中断
  Serial.print("[7] Configuring INT4 data ready interrupt... ");
  while (!imu.setInt(DFRobot_Multi_DOF_IMU::eImuIntPin4, DFRobot_Multi_DOF_IMU::eInt4DataReady)) {
    Serial.println("Failed, please check pin and interrupt configuration!");
    delay(1000);
  }
  Serial.println("Success");
  delay(500);

  // [8] 配置ESP32-C5外部中断(INT1→GPIO27,INT3→GPIO28,INT4→GPIO25,上升沿触发)
  Serial.print("[8] Configuring Arduino interrupt pins... ");
  attachInterrupt(digitalPinToInterrupt(27), int1ISR, RISING);
  attachInterrupt(digitalPinToInterrupt(28), int3ISR, RISING);
  attachInterrupt(digitalPinToInterrupt(25), int4ISR, RISING);
  Serial.println("Success");
  Serial.println("Trigger mode: Rising edge");

  // 配置完成提示
  Serial.println("\nConfiguration complete, starting data reading");
  delay(100);
}

void loop() {
  if (int1DataReady || int3DataReady || int4DataReady) {
    if (int1DataReady && int3DataReady && int4DataReady) {
      int1DataReady = false;
      int3DataReady = false;
      int4DataReady = false;

      DFRobot_Multi_DOF_IMU::sSensorData_t accel, gyro, mag;
      float pressureValue; // 固定为压力(Pa)

      if (imu.get10dofData(&accel, &gyro, &mag, &pressureValue, CALCULATE_ALTITUDE)) {
        
        Serial.println("--- New Data ---");
        Serial.print("AccX (g): "); Serial.println(accel.x, 3);
        Serial.print("AccY (g): "); Serial.println(accel.y, 3);
        Serial.print("AccZ (g): "); Serial.println(accel.z, 3);
        Serial.print("GyrX (dps): "); Serial.println(gyro.x, 2);
        Serial.print("GyrY (dps): "); Serial.println(gyro.y, 2);
        Serial.print("GyrZ (dps): "); Serial.println(gyro.z, 2);
        Serial.print("MagX (uT): "); Serial.println(mag.x, 2);
        Serial.print("MagY (uT): "); Serial.println(mag.y, 2);
        Serial.print("MagZ (uT): "); Serial.println(mag.z, 2);
  
        Serial.print("Pressure (Pa): "); 
        Serial.println(pressureValue, 2);
        Serial.println(" ");
      } else {
        Serial.println("Failed to read 10DOF data!");
      }
    }
  }
  delay(200);
}

结果

SEN0696-UART结果图

API函数

 /**
   * @fn begin
   * @brief 初始化UART通信和传感器
   * @return bool
   * @retval true  初始化成功
   * @retval false 初始化失败
   */
  bool begin(void);

  /**
   * @fn setSensorMode
   * @brief 设置传感器工作模式
   * @param mode 传感器工作模式(参见 eSensorMode_t)
   * @n 可用模式:
   * @n - eSleepMode:           睡眠模式(最低功耗,传感器停止工作)
   * @n - eLowPowerMode:        低功耗模式(降低采样率,节省功耗)
   * @n - eNormalMode:          正常模式(平衡功耗和性能)
   * @n - eHighPerformanceMode: 高性能模式(最高采样率和精度,功耗最高)
   * @return bool
   * @retval true  设置成功
   * @retval false 设置失败
   */
  bool setSensorMode(eSensorMode_t mode);

  /**
   * @fn reset
   * @brief 恢复出厂设置
   * @return bool
   * @retval true  恢复出厂设置成功
   * @retval false 恢复出厂设置失败
   */
  bool reset(void);

  /**
   * @fn setAccelRange
   * @brief 设置加速度计量程
   * @param range 加速度计量程(参见 eAccelRange_t)
   * @n 可用量程:
   * @n - eAccelRange2G:  ±2g 量程
   * @n - eAccelRange4G:  ±4g 量程
   * @n - eAccelRange8G:  ±8g 量程
   * @n - eAccelRange16G: ±16g 量程
   * @return bool
   * @retval true  设置成功
   * @retval false 设置失败
   */
  bool setAccelRange(eAccelRange_t range);

  /**
   * @fn setGyroRange
   * @brief 设置陀螺仪量程
   * @param range 陀螺仪量程(参见 eGyroRange_t)
   * @n 可用量程:
   * @n - eGyroRange125DPS:  ±125dps 量程
   * @n - eGyroRange250DPS:  ±250dps 量程
   * @n - eGyroRange500DPS:  ±500dps 量程
   * @n - eGyroRange1000DPS: ±1000dps 量程
   * @n - eGyroRange2000DPS: ±2000dps 量程
   * @return bool
   * @retval true  设置成功
   * @retval false 设置失败
   */
  bool setGyroRange(eGyroRange_t range);

  /**
   * @fn get6dofData
   * @brief 读取6轴IMU数据(物理量)
   * @param accel 指向sSensorData_t结构的指针,用于存储加速度数据(单位:g)
   * @param gyro 指向sSensorData_t结构的指针,用于存储陀螺仪数据(单位:dps)
   * @return bool
   * @retval true  读取成功
   * @retval false 读取失败
   */
  bool get6dofData(sSensorData_t *accel, sSensorData_t *gyro);

  /**
   * @fn get9dofData
   * @brief 读取9轴IMU数据(物理量)
   * @param accel 指向sSensorData_t结构的指针,用于存储加速度数据(单位:g)
   * @param gyro 指向sSensorData_t结构的指针,用于存储陀螺仪数据(单位:dps)
   * @param mag 指向sSensorData_t结构的指针,用于存储磁力计数据(单位:uT)
   * @return bool
   * @retval true  读取成功
   * @retval false 读取失败
   */
  bool get9dofData(sSensorData_t *accel, sSensorData_t *gyro, sSensorData_t *mag);

  /**
   * @fn get10dofData
   * @brief 读取10轴IMU数据(物理量)
   * @param accel 指向sSensorData_t结构的指针,用于存储加速度数据(单位:g)
   * @param gyro 指向sSensorData_t结构的指针,用于存储陀螺仪数据(单位:dps)
   * @param mag 指向sSensorData_t结构的指针,用于存储磁力计数据(单位:uT)
   * @param pressure 指向float类型的指针,用于存储气压或海拔高度数据
   * @param calcAltitude 是否计算海拔高度,默认为false
   * @n true: pressure存储海拔高度(单位:m)
   * @n false: pressure存储气压数据(单位:Pa)
   * @return bool
   * @retval true  读取成功
   * @retval false 读取失败
   */
  bool get10dofData(sSensorData_t *accel, sSensorData_t *gyro, sSensorData_t *mag, float *pressure, bool calcAltitude = false);

  /**
   * @fn calibrateAltitude
   * @brief 根据当地海拔高度校准海拔数据
   * @param altitude 当地海拔高度(单位:m)
   * @n 例如:540.0 表示海拔540米
   * @n 调用此函数后,get10dofData 中请求海拔时(calcAltitude 为 true)将使用该校准消除绝对误差
   * @return bool
   * @retval true  校准成功(海拔高度 > 0)
   * @retval false 校准失败(海拔高度 <= 0)
   */
  bool calibrateAltitude(float altitude);

  /**
   * @fn setPressOOR
   * @brief 配置气压超出范围(OOR)参数
   * @param threshold 气压阈值(单位:Pa)
   * @param range 允许范围(单位:Pa)
   * @n 实际允许范围:threshold - range ~ threshold + range
   * @param countLimit 计数限制(参见 ePressOORCountLimit_t)
   * @n 连续N次超出范围后才触发中断,用于滤波避免误触发
   * @n 可用值:
   * @n - ePressOORCountLimit1:  连续1次超出范围后触发
   * @n - ePressOORCountLimit3:  连续3次超出范围后触发
   * @n - ePressOORCountLimit7:  连续7次超出范围后触发
   * @n - ePressOORCountLimit15: 连续15次超出范围后触发
   * @return bool
   * @retval true  配置成功
   * @retval false 配置失败
   */
  bool setPressOOR(uint32_t threshold, uint8_t range, ePressOORCountLimit_t countLimit);

  /**
   * @fn setInt
   * @brief 配置中断(统一API)
   * @param pin 中断引脚(参见 eImuIntPin_t)
   * @n 可用引脚:
   * @n - eImuIntPin1: INT1引脚(6轴传感器,支持多种中断类型)
   * @n - eImuIntPin2: INT2引脚(6轴传感器,支持多种中断类型)
   * @n - eImuIntPin3: INT3引脚(9轴传感器-磁力计,仅支持数据就绪中断)
   * @n - eImuIntPin4: INT4引脚(10轴传感器-气压计,支持数据就绪和气压OOR中断)
   * @param intType 中断类型(uint8_t)
   * @n INT1/INT2支持的中断类型(eInt1_2Type_t):
   * @n - eInt1_2Disable (0x00): 禁用中断
   * @n - eInt1_2DataReady (0x01): 数据就绪中断
   * @n - eInt1_2AnyMotion (0x02): 任意运动中断
   * @n - eInt1_2NoMotion (0x03): 无运动中断
   * @n - eInt1_2SigMotion (0x04): 显著运动中断
   * @n - eInt1_2StepCounter (0x05): 步进计数中断
   * @n - eInt1_2Flat (0x06): 平面中断
   * @n - eInt1_2Orientation (0x07): 方向中断
   * @n - eInt1_2Tap (0x08): 敲击中断
   * @n - eInt1_2Tilt (0x09): 倾斜中断
   * @n INT3支持的中断类型(eInt3Type_t):
   * @n - eInt3Disable (0x00): 禁用中断
   * @n - eInt3DataReady (0x01): 数据就绪中断
   * @n INT4支持的中断类型(eInt4Type_t):
   * @n - eInt4Disable (0x00): 禁用中断
   * @n - eInt4DataReady (0x01): 数据就绪中断
   * @n - eInt4PressureOOR (0x02): 气压超出范围中断
   * @return bool
   * @retval true  配置成功
   * @retval false 配置失败
   */
  bool setInt(eImuIntPin_t pin, uint8_t intType);

  /**
   * @fn getIntStatus
   * @brief 读取中断状态(统一API)
   * @param pin 中断引脚(参见 eImuIntPin_t)
   * @return uint16_t 中断状态
   * @n 可与相应的中断状态宏进行按位与操作来判断中断类型
   * @retval 0 无中断或读取失败
   */
  uint16_t getIntStatus(eImuIntPin_t pin);

  /**
   * @fn getStepCount
   * @brief 读取步数计数器数据
   * @details 读取当前累计步数
   * @n 检测到步进中断后,调用此函数读取累计步数
   * @return uint32_t 累计步数(32位)
   * @retval 0 无步数数据或读取失败
   */
  uint32_t getStepCount(void);

  /**
   * @fn getTap
   * @brief 读取敲击数据
   * @details 当检测到敲击中断后,调用此函数读取具体的敲击类型
   * @return uint16_t 敲击数据
   * @n 返回值:
   * @n - TAP_TYPE_SINGLE (0x0001): 单击
   * @n - TAP_TYPE_DOUBLE (0x0002): 双击
   * @n - TAP_TYPE_TRIPLE (0x0003): 三击
   * @retval 0 无敲击数据或读取失败
   */
  uint16_t getTap(void);

  /**
   * @fn getOrientation
   * @brief 读取方向数据
   * @details 当检测到方向中断后,调用此函数读取具体的方向和面部朝向
   * @return uint16_t 方向数据
   * @n 高字节:方向类型
   * @n - ORIENT_TYPE_PORTRAIT_UP (0x01): 竖屏正向
   * @n - ORIENT_TYPE_LANDSCAPE_LEFT (0x02): 横屏向左
   * @n - ORIENT_TYPE_LANDSCAPE_RIGHT (0x03): 横屏向右
   * @n - ORIENT_TYPE_PORTRAIT_DOWN (0x04): 竖屏倒置
   * @n 低字节:朝向类型
   * @n - ORIENT_FACE_UP (0x00): 面向前
   * @n - ORIENT_FACE_DOWN (0x01): 面向后
   * @retval 0 无方向数据或读取失败
   */
  uint16_t getOrientation(void);

上位机使用教程

硬件准备

软件准备

接线配置

SEN0696-上位机接线图

  • 按图示连接10轴IMU传感器与 RainbowLink V2,核心对应关系:
    • 传感器引脚 “+” → RainbowLink V2 5V
    • 传感器引脚 “-” → RainbowLink V2 GND
    • 传感器 UART 引脚 “RX” → RainbowLink V2 TX
    • 传感器 UART 引脚 “TX” → RainbowLink V2 RX
    • 传感器拨码开关配置:通信模式拨到UART侧,地址拨到0x4A

操作步骤

  1. 将 10 轴 IMU 传感器与 RainbowLink V2 正确连接,传感器通信模式拨码开关拨至 UART 侧,地址拨至 0x4A。
  2. 打开上位机,在右上方将语言切换为中文模式,选择正确的端口号,设置波特率为默认9600,点击右上方的「打开串口」。
  3. 然后摇动传感器3s进行校准,此时界面左侧可显示6轴IMU传感器运动的动态画面。右侧则是加速度、陀螺仪等实时数据。

结果

Modbus 寄存器定义

寄存器类型 寄存器地址 名称 读/写 数据范围 默认值 描述
输入寄存器 0x0000 VID R 0x3343 0x3343 VID(代表厂商为DFRobot)
输入寄存器 0x0001 PID R 0x0010 型号而定 0x0010代表10DOF IMU传感器
输入寄存器 0x0002 设备地址 R 0x004A~0x004D 根据拨码开关决定 MODBUS设备地址,可通过拨码开关修改
输入寄存器 0x0003 保留 R 0x0000~0xFFFF 0xFFFF 保留
输入寄存器 0x0004 模块校验位(H) 停止位(L) R 0x0001 0x0001 模块校验位(H) 停止位(L)
0x00--None 0x01--1Byte
输入寄存器 0x0005 VERSION R 0x0000~0xFFFF 0x1000 0x1000表示固件版本号为V1.0.0.0
输入寄存器 0x0006 加速度计X轴数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的加速度计X轴方向数据
输入寄存器 0x0007 加速度计Y轴数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的加速度计Y轴方向数据
输入寄存器 0x0008 加速度计Z轴数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的加速度计Z轴方向数据
输入寄存器 0x0009 陀螺仪X轴数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的陀螺仪计X轴方向数据
输入寄存器 0x000A 陀螺仪Y轴数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的陀螺仪计Y轴方向数据
输入寄存器 0x000B 陀螺仪Z轴数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的陀螺仪计Z轴方向数据
输入寄存器 0x000C 磁力计X轴低字数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的磁力计X轴方向低字数据
输入寄存器 0x000D 磁力计X轴高字数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的磁力计X轴方向高字数据
输入寄存器 0x000E 磁力计Y轴低字数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的磁力计Y轴方向低字数据
输入寄存器 0x000F 磁力计Y轴高字数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的磁力计Y轴方向高字数据
输入寄存器 0x0010 磁力计Z轴低字数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的磁力计Z轴方向低字数据
输入寄存器 0x0011 磁力计Z轴高字数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的磁力计Z轴方向高字数据
输入寄存器 0x0012 气压计低字数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的气压计低字数据
输入寄存器 0x0013 气压计高字数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的气压计高字数据
输入寄存器 0x0014 计步器低字数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的计步器低字数据
输入寄存器 0x0015 计步器高字数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的计步器高字数据
输入寄存器 0x0016 敲击状态数据 R 0x0000~0x0003 0x0000 10DOF IMU的敲击状态数据
0x0001---单次敲击中断
0x0002---双击中断
0x0003---三击中断
输入寄存器 0x0017 方向检测数据 R 0x0000~0xFFFF 0x0000 10DOF IMU的方向状态数据
方向(H) 朝向(L)
0x01--竖屏正向 0x00--面向前
0x02--横屏向左 0x01--面向后
0x03--横屏向右 ------------
0x04--竖屏倒置 ------------
保持寄存器 0x0000 保留 R/W 0x0000~0xFFFF 0xFFFF 保留
保持寄存器 0x0001 保留 R/W 0x0000~0xFFFF 0x0000 保留
保持寄存器 0x0002 保留 R/W 0x0000~0xFFFF 0xFFFF 保留
保持寄存器 0x0003 设备波特率 R/W 0x0000~0x00FF 0x0003 设备波特率
0x0001---2400
0x0002---4800
0x0003---9600
0x0004---14400
0x0005---19200
0x0006---38400
0x0007---57600
0x0008---115200
Other---115200
输入寄存器 0x0004 保留 R 0x0000~0xFFFF 0xFFFF 保留
保持寄存器 0x0005 保留 R/W 0x0000~0xFFFF 0xFFFF 保留
保持寄存器 0x0006 设备工作模式 R/W 0x0000~0x0003 0x0002 0x0000---休眠模式(丢失传感器配置进入休眠,功耗最低)
0x0001---低功耗模式(以较低功耗测量数据)
0x0002---正常模式(平衡测量精度与功耗)
0x0003---高性能模式(测量精度最高,功耗最大)
保持寄存器 0x0007 恢复出厂设置 R/W 0x0000~0x0001 0x0001 恢复出厂设置
写入0x0001触发恢复出厂设置
保持寄存器 0x0008 加速度计量程 R/W 0x0000~0x0003 0x0002 加速度计的测量范围
0x0000---±2G
0x0001----±4G
0x0002---±8G
0x0003----±16G
保持寄存器 0x0009 陀螺仪量程 R/W 0x0000~0x0004 0x0004 陀螺仪的测量范围
0x0000---±125DPS
0x0001---±250DPS
0x0002---±500DPS
0x0003---±1000DPS
0x0004---±2000DPS
保持寄存器 0x000A 气压计阈值低字配置 R/W 0x0000~0xFFFF 0x0000 10DOF IMU的气压计的阈值底字配置
保持寄存器 0x000B 气压计阈值高字配置 R/W 0x0000~0xFFFF 0x0000 10DOF IMU的气压计的阈值高字配置
保持寄存器 0x000C 气压计阈值范围配置 R/W 0x0000~0xFFFF 0x0000 10DOF IMU的气压计的阈值范围配置
保持寄存器 0x000D 气压计阈值计数限制配置 R/W 0x0000~0x0003 0x0000 10DOF IMU的气压计的阈值计数限制配置
0x0000---1次
0x0001----3次
0x0002---7次
0x0003----15次
保持寄存器 0x000E 中断引脚1配置 R/W 0x0000~0x0009 0x0000 10DOF IMU的中断引脚1配置
0x0000---中断禁用
0x0001---6DOF数据就绪中断使能
0x0002---任意运动检测中断使能
0x0003---静止检测中断使能
0x0004---显著运动检测中断使能
0x0005---计步数据检测中断使能
0x0006---平面检测中断使能
0x0007---方向检测中断使能
0x0008---敲击检测中断使能
0x0009---倾斜检测中断使能
保持寄存器 0x000F 中断引脚2配置 R/W 0x0000~0x0009 0x0000 10DOF IMU的中断引脚2配置
与INT1相同
保持寄存器 0x0010 中断引脚3配置 R/W 0x0000~0x0001 0x0000 10DOF IMU的中断引脚3配置
0x0000---中断禁用
0x0001----地磁数据就绪中断使能
保持寄存器 0x0011 中断引脚4配置 R/W 0x0000~0x0002 0x0000 10DOF IMU的中断引脚4配置
0x0000---中断禁用
0x0001----气压数据就绪中断使能
0x0002---气压数据超出阈值中断使能

Modbus-RTU 常用功能代码:

功能码 名称 功能
0x03 读多个寄存器 读整型、字符型、状态字、浮点型(读N个words)---读保持寄存器,字节操作
0x04 读输入寄存器 读整型、状态字、浮点型(读N个words)---读输入寄存器,字节操作
0x06 写单个保持寄存器 写整型、字符型、状态字、浮点型(写一个word)---写保持寄存器,字节操作
0x10 写多个保持寄存器 写多个保持寄存器---把具体的二进制值装入一串连续的保持寄存器

通过以上命令可读写输入寄存器和保持寄存器。

读取加速度三轴数据示例

目标

通过 Modbus RTU 协议读取10轴IMU传感器当前检测到的加速度数值

硬件准备

接线配置

SEN0696-上位机接线图

  • 按图示连接10轴IMU传感器与 RainbowLink V2,核心对应关系:
    • 传感器引脚 “+” → RainbowLink V2 5V
    • 传感器引脚 “-” → RainbowLink V2 GND
    • 传感器 UART 引脚 “RX” → RainbowLink V2 TX
    • 传感器 UART 引脚 “TX” → RainbowLink V2 RX
    • 传感器拨码开关配置:通信模式拨到UART侧,地址拨到0x4A

通用操作步骤

  • 硬件连接:通过 RainbowLink USB 协议转换器,将传感器与主机(电脑)连接,传感器通信模式切换至 UART,地址切换至0x4A
  • 参数配置:在串口调试工具中设置参数(需与传感器一致):
    • 波特率:9600(默认)
    • 数据位:8 位
    • 停止位:1 位
    • 校验位:无
  • 发送指令:在调试工具的 “发送区” 输入下述十六进制指令,勾选 “十六进制发送” 后发送。

发送指令及解析

字段名 十六进制值 说明
设备地址 4A MODBUS设备地址,默认 0x4A(可通过拨码开关修改)
功能码 04 读输入寄存器(固定指令)
寄存器起始地址 00 06 加速度 X 轴寄存器地址(0x0006)
寄存器个数 00 03 读取 3 个寄存器(加速度 X、Y、Z)
CRC 校验 5F B1 指令的 CRC16 校验值

完整发送指令:4A 04 00 06 00 03 5F B1

返回数据及解析

传感器收到指令后返回如下数据(示例):

字段名 十六进制值 说明
设备地址 4A 与发送指令中的设备地址一致
功能码 04 确认执行 “读输入寄存器” 操作
字节数 06 返回数据的字节总数(6 字节)
读取数据 FF AD FF DD EF E1 依次为加速度 X、Y、Z 轴的原始值(各 2 字节)
CRC 校验 B7 E1 返回数据的 CRC16 校验值

完整返回数据:4A 04 06 FF AD FF DD EF E1 B7 E1

SEN0696-modbus结果

数据解析步骤

返回的原始数据 FF ADFF DDEF E1 是 16 位有符号整数(补码),需要按以下步骤转换为实际的加速度值(单位:g)。

  1. 将十六进制转换为有符号十进制

    • X 轴原始值:FF AD 无符号值 = 0xFFAD = 65453 有符号值 = 65453 − 65536 = -83
    • Y 轴原始值:FF DD 无符号值 = 0xFFDD = 65493 有符号值 = 65493 − 65536 = -43
    • Z 轴原始值:EF E1 无符号值 = 0xEFE1 = 61409 有符号值 = 61409 − 65536 = -4127
  2. 根据量程和灵敏度转换为物理值

    BMI323 加速度计的默认量程为 ±8 g,在此量程下灵敏度为 4096 LSB/g(参见规格书第 9 页 Table 3)。

    计算公式:

    加速度 (g)=有符号原始值/灵敏度

    • X 轴:−83/4096≈−0.0203 g
    • Y 轴:−43/4096≈−0.0105 g
    • Z 轴:−4127/4096≈−1.0076 g
  3. 结果解读

  • X、Y 轴接近 0 g,表明传感器在水平面上无倾斜。
  • Z 轴约为 -1 g,表明重力方向为负(传感器正面朝上,Z 轴指向地心)。
  • 该数据符合传感器静止时的预期输出。

为什么这样处理?

  1. 数字输出:传感器内部将模拟量转换为数字信号,输出为 16 位二进制补码。必须通过规格书定义的灵敏度将其还原为物理量。
  2. 量程影响:灵敏度与所选量程相关(不同量程对应不同 LSB/g 值),解析前需确认当前量程设置(默认 ±8 g,若更改需通过保持寄存器 0x0008 读取)。
  3. 符号性:加速度有方向,因此采用有符号数表示。补码格式需通过减去 65536 转换为负数。

注意事项

  • 若修改了加速度计量程(如 ±2 g、±4 g、±16 g),灵敏度会相应变化,解析公式中的分母需同步调整。
  • 返回数据中的 CRC 校验可用于验证传输完整性(本示例中 CRC 正确,数据可靠)。
  • 如需连续读取,可直接重复发送相同指令,传感器会返回最新采样值。

更多资料下载