产品简介
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

引脚说明

| 引脚丝印 | 功能描述 |
|---|---|
| + | 电源正极(供电输入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传感器,并通过轮询方式直接读取加速度、角速度、地磁和气压数据。
硬件准备
- DFR1222 FireBeetle 2 ESP32-C5 ×1
- SEN0696 Gravity: BMI323+BMM350+BMP581 10 DOT传感器×1
软件准备
- 下载并安装 Arduino IDE:下载 Arduino IDE
- 下载并安装 DFRobot_Multi_DOF_IMU 库:下载 DFRobot_Multi_DOF_IMU 库
- 下载并安装 DFRobot_RTU 库:下载 DFRobot_RTU 库
- 库安装指南:查看安装指南
接线配置

- 按图示连接 传感器与 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);
}
结果

通过UART与中断读取数据的ESP32示例代码
目标
本教程旨在演示如何配置9轴IMU传感器,在数据就绪时通过硬件中断触发,并在中断服务程序中读取加速度、角速度和地磁数据,实现高效的数据采集。
硬件准备
- DFR1222 FireBeetle 2 ESP32-C5 ×1
- SEN0696 Gravity: BMI323+BMM350+BMP581 10 DOT传感器×1
软件准备
- 下载并安装 Arduino IDE:下载 Arduino IDE
- 下载并安装 DFRobot_Multi_DOF_IMU 库:下载 DFRobot_Multi_DOF_IMU 库
- 下载并安装 DFRobot_RTU 库:下载 DFRobot_RTU 库
- 库安装指南:查看安装指南
接线配置

- 按图示连接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);
}
结果

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);
上位机使用教程
硬件准备
- TEL0190 RainbowLink V2 ×1
- SEN0696 Gravity:9 DOF IMU Sensor ×1
软件准备
- 下载并解压上位机软件:下载上位机软件
接线配置

- 按图示连接10轴IMU传感器与 RainbowLink V2,核心对应关系:
- 传感器引脚 “+” → RainbowLink V2 5V
- 传感器引脚 “-” → RainbowLink V2 GND
- 传感器 UART 引脚 “RX” → RainbowLink V2 TX
- 传感器 UART 引脚 “TX” → RainbowLink V2 RX
- 传感器拨码开关配置:通信模式拨到UART侧,地址拨到0x4A
操作步骤
- 将 10 轴 IMU 传感器与 RainbowLink V2 正确连接,传感器通信模式拨码开关拨至 UART 侧,地址拨至 0x4A。
- 打开上位机,在右上方将语言切换为中文模式,选择正确的端口号,设置波特率为默认9600,点击右上方的「打开串口」。
- 然后摇动传感器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传感器当前检测到的加速度数值
硬件准备
- TEL0190 RainbowLink V2 ×1
- SEN0696 Gravity:9 DOF IMU Sensor ×1
接线配置

- 按图示连接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

数据解析步骤
返回的原始数据 FF AD、FF DD、EF E1 是 16 位有符号整数(补码),需要按以下步骤转换为实际的加速度值(单位:g)。
-
将十六进制转换为有符号十进制
- X 轴原始值:
FF AD无符号值 =0xFFAD= 65453 有符号值 = 65453 − 65536 = -83 - Y 轴原始值:
FF DD无符号值 =0xFFDD= 65493 有符号值 = 65493 − 65536 = -43 - Z 轴原始值:
EF E1无符号值 =0xEFE1= 61409 有符号值 = 61409 − 65536 = -4127
- X 轴原始值:
-
根据量程和灵敏度转换为物理值
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
-
结果解读
- X、Y 轴接近 0 g,表明传感器在水平面上无倾斜。
- Z 轴约为 -1 g,表明重力方向为负(传感器正面朝上,Z 轴指向地心)。
- 该数据符合传感器静止时的预期输出。
为什么这样处理?
- 数字输出:传感器内部将模拟量转换为数字信号,输出为 16 位二进制补码。必须通过规格书定义的灵敏度将其还原为物理量。
- 量程影响:灵敏度与所选量程相关(不同量程对应不同 LSB/g 值),解析前需确认当前量程设置(默认 ±8 g,若更改需通过保持寄存器 0x0008 读取)。
- 符号性:加速度有方向,因此采用有符号数表示。补码格式需通过减去 65536 转换为负数。
注意事项
- 若修改了加速度计量程(如 ±2 g、±4 g、±16 g),灵敏度会相应变化,解析公式中的分母需同步调整。
- 返回数据中的 CRC 校验可用于验证传输完整性(本示例中 CRC 正确,数据可靠)。
- 如需连续读取,可直接重复发送相同指令,传感器会返回最新采样值。