# DFRobot_BMI323
**Repository Path**: dfrobot/DFRobot_BMI323
## Basic Information
- **Project Name**: DFRobot_BMI323
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-11-23
- **Last Updated**: 2025-12-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# DFRobot_BMI323
- [English Version](./README.md)
BMI323 是一款低功耗、高性能的 6 轴 IMU 传感器,集成了 3 轴加速度计和 3 轴陀螺仪。它通过 I2C 接口通信,提供全面的运动检测功能,包括计步、任意运动检测、无运动检测、显著运动检测、敲击检测、倾斜检测、方向检测和平面检测。
该传感器非常适合可穿戴设备、智能手表、健身追踪器和物联网应用,这些应用对运动感知和能效要求很高。BMI323 具有基于硬件的运动检测算法,可独立运行,无需 MCU 持续干预即可实现超低功耗。通过可配置的中断引脚(INT1 和 INT2),传感器可以高效地通知主机系统运动事件,非常适合电池供电的应用。
**主要特性:**
- 6 轴运动感知(3 轴加速度计 + 3 轴陀螺仪)
- 硬件计步器,支持中断
- 多种运动检测模式(任意运动、无运动、显著运动)
- 手势识别(敲击、倾斜、方向、平面检测)
- 可配置输出数据速率(ODR),从 0.78Hz 到 6400Hz
- 多种工作模式(低功耗、普通、高性能)
- I2C 接口,可配置地址(0x68/0x69)
- 双中断引脚,灵活的事件处理
## 产品链接 (https://www.dfrobot.com)
SKU: SEN0693
## 目录
* [概述](#概述)
* [库安装](#库安装)
* [方法](#方法)
* [兼容性](#兼容性)
* [历史](#历史)
* [创作者](#创作者)
## 概述
本 Arduino 库为 BMI323 6 轴 IMU 传感器提供全面的接口。它支持:
**基本功能:**
- 通过 I2C 接口初始化传感器
- 配置加速度计和陀螺仪参数(ODR、量程、工作模式)
- 同时读取 6 轴传感器数据(加速度计 + 陀螺仪)
**高级功能:**
- 计步器,支持中断
- 任意运动检测中断
- 无运动检测中断
- 显著运动检测中断
- 平面检测中断
- 方向检测中断(横竖屏、正反面)
- 敲击检测中断(单击/双击/三击)
- 倾斜检测中断
所有运动检测功能都支持可配置阈值,并可映射到 INT1 或 INT2 中断引脚,实现灵活的系统集成。
## 库安装
要使用本库,请先下载库文件,将其粘贴到 \Arduino\libraries 目录,然后打开 examples 文件夹并运行其中的示例程序。
## 方法
```C++
/**
* @fn DFRobot_BMI323
* @brief 构造函数
* @details 构造函数 - I2C 接口
* @param wire TwoWire 对象指针,默认为 &Wire
* @param i2cAddr I2C 地址,默认为 0x69
* @return 无
*/
DFRobot_BMI323(TwoWire *wire = &Wire, uint8_t i2cAddr = 0x69);
/**
* @fn begin
* @brief 初始化函数
* @details 初始化 I2C 接口、芯片寄存器和功能上下文
* @param 无
* @return bool 类型,表示初始化状态
* @retval true 初始化成功
* @retval false 初始化失败
*/
bool begin(void);
/**
* @fn configAccel
* @brief 配置加速度计
* @param odr 输出数据速率选择(参见:eAccelODR_t)
* @n 可用速率:
* @n - eAccelODR0_78125Hz: 0.78125 Hz
* @n - eAccelODR1_5625Hz: 1.5625 Hz
* @n - eAccelODR3_125Hz: 3.125 Hz
* @n - eAccelODR6_25Hz: 6.25 Hz
* @n - eAccelODR12_5Hz: 12.5 Hz
* @n - eAccelODR25Hz: 25 Hz
* @n - eAccelODR50Hz: 50 Hz
* @n - eAccelODR100Hz: 100 Hz
* @n - eAccelODR200Hz: 200 Hz
* @n - eAccelODR400Hz: 400 Hz
* @n - eAccelODR800Hz: 800 Hz
* @n - eAccelODR1600Hz: 1600 Hz
* @n - eAccelODR3200Hz: 3200 Hz
* @n - eAccelODR6400Hz: 6400 Hz
* @n @note ODR 范围限制(基于工作模式):
* @n - 低功耗模式:0.78Hz ~ 400Hz
* @n - 普通模式:12.5Hz ~ 6400Hz
* @n - 高性能模式:12.5Hz ~ 6400Hz
* @param range 量程选择(参见:eAccelRange_t)
* @n 可用量程:
* @n - eAccelRange2G: ±2g
* @n - eAccelRange4G: ±4g
* @n - eAccelRange8G: ±8g
* @n - eAccelRange16G: ±16g
* @param mode 工作模式选择(参见:eAccelMode_t),默认为 eAccelModeNormal
* @n 可用模式:
* @n - eAccelModeLowPower: 低功耗模式
* @n - eAccelModeNormal: 普通模式(默认)
* @n - eAccelModeHighPerf: 高性能模式
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool configAccel(eAccelODR_t odr, eAccelRange_t range, eAccelMode_t mode = eAccelModeNormal);
/**
* @fn configGyro
* @brief 配置陀螺仪
* @param odr 输出数据速率选择(参见:eGyroODR_t)
* @n 可用速率:
* @n - eGyroODR0_78125Hz: 0.78125 Hz
* @n - eGyroODR1_5625Hz: 1.5625 Hz
* @n - eGyroODR3_125Hz: 3.125 Hz
* @n - eGyroODR6_25Hz: 6.25 Hz
* @n - eGyroODR12_5Hz: 12.5 Hz
* @n - eGyroODR25Hz: 25 Hz
* @n - eGyroODR50Hz: 50 Hz
* @n - eGyroODR100Hz: 100 Hz
* @n - eGyroODR200Hz: 200 Hz
* @n - eGyroODR400Hz: 400 Hz
* @n - eGyroODR800Hz: 800 Hz
* @n - eGyroODR1600Hz: 1600 Hz
* @n - eGyroODR3200Hz: 3200 Hz
* @n - eGyroODR6400Hz: 6400 Hz
* @n @note ODR 范围限制(基于工作模式):
* @n - 低功耗模式:0.78Hz ~ 400Hz
* @n - 普通模式:12.5Hz ~ 6400Hz
* @n - 高性能模式:12.5Hz ~ 6400Hz
* @param range 量程选择(参见:eGyroRange_t)
* @n 可用量程:
* @n - eGyroRange125DPS: ±125dps
* @n - eGyroRange250DPS: ±250dps
* @n - eGyroRange500DPS: ±500dps
* @n - eGyroRange1000DPS: ±1000dps
* @n - eGyroRange2000DPS: ±2000dps
* @param mode 工作模式选择(参见:eGyroMode_t),默认为 eGyroModeNormal
* @n 可用模式:
* @n - eGyroModeLowPower: 低功耗模式
* @n - eGyroModeNormal: 普通模式(默认)
* @n - eGyroModeHighPerf: 高性能模式
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool configGyro(eGyroODR_t odr, eGyroRange_t range, eGyroMode_t mode = eGyroModeNormal);
/**
* @fn getAccelGyroData
* @brief 同时读取加速度计和陀螺仪数据并返回物理单位
* @details 一次性读取加速度计和陀螺仪原始数据,转换为 g/dps 并返回
* @param accel 加速度计输出
* @param gyro 陀螺仪输出
* @return bool 类型,表示读取状态
* @retval true 读取成功
* @retval false 读取失败
*/
bool getAccelGyroData(sSensorData *accel, sSensorData *gyro);
/**
* @fn enableStepCounterInt
* @brief 使能计步器中断功能
* @details 配置计步器功能并映射到指定的中断引脚,当步数变化时将触发中断
* @param pin 绑定的中断引脚(eINT1 或 eINT2)
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool enableStepCounterInt(eInt_t pin);
/**
* @fn readStepCounter
* @brief 读取计步器数据
* @param stepVal 步数输出指针,读取的步数将写入该指针指向的内存
* @return int8_t BMI3_OK 表示成功,其他值表示失败
*/
int8_t readStepCounter(uint16_t *stepVal);
/**
* @fn getIntStatus
* @brief 获取中断状态
* @details 读取并合并 INT1 和 INT2 引脚的中断状态,返回值为 INT1 和 INT2 状态寄存器的 OR 组合。
* @return uint16_t 合并的中断状态寄存器值(INT1 | INT2)。每一位代表不同的中断类型:
* @n - BMI3_INT_STATUS_ANY_MOTION: 检测到任意运动
* @n - BMI3_INT_STATUS_NO_MOTION: 检测到无运动
* @n - BMI3_INT_STATUS_FLAT: 平面检测
* @n - BMI3_INT_STATUS_ORIENTATION: 方向变化
* @n - BMI3_INT_STATUS_STEP_DETECTOR: 检测到步数
* @n - BMI3_INT_STATUS_SIG_MOTION: 检测到显著运动
* @n - BMI3_INT_STATUS_TILT: 检测到倾斜
* @n - BMI3_INT_STATUS_TAP: 检测到敲击
*/
uint16_t getIntStatus(void);
/**
* @fn enableAnyMotionInt
* @brief 配置任意运动阈值中断(使用官方结构体参数)
* @param config 任意运动配置结构体(参见 bmi3_any_motion_config)
* @n 参数说明:
* @n - slope_thres: 加速度斜率阈值,范围
* 0-4095,单位 1.953mg/LSB(官方示例:9 ≈ 17.6mg)
* @n - hysteresis: 滞回值,范围 0-1023,单位 1.953mg/LSB(官方示例:5 ≈ 9.8mg)
* @n - duration: 持续时间,范围 0-8191,单位 20ms(官方示例:9 = 180ms)
* @n - acc_ref_up: 加速度参考更新模式,0=事件触发时,1=始终更新(官方示例:1)
* @n - wait_time: 等待时间,范围 0-7,单位 20ms(官方示例:4-5 = 80-100ms)
* @param pin 绑定的中断引脚
* @param axisMask 轴选择掩码(默认:eAxisXYZ)
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool enableAnyMotionInt(const struct bmi3_any_motion_config &config,
eInt_t pin, uint8_t axisMask = eAxisXYZ);
/**
* @fn enableNoMotionInt
* @brief 配置无运动阈值中断(使用官方结构体参数)
* @param config 无运动检测配置结构体(参见 bmi3_no_motion_config)
* @n 参数说明:
* @n - slope_thres: 加速度斜率阈值,范围
* 0-4095,单位 1.953mg/LSB(官方示例:9 ≈ 17.6mg)
* @n - hysteresis: 滞回值,范围 0-1023,单位 1.953mg/LSB(官方示例:5 ≈ 9.8mg)
* @n - duration: 持续时间,范围 0-8191,单位 20ms(官方示例:9 = 180ms)
* @n - acc_ref_up: 加速度参考更新模式,0=事件触发时,1=始终更新(官方示例:1)
* @n - wait_time: 等待时间,范围 0-7,单位 20ms(官方示例:5 = 100ms)
* @param pin 绑定的中断引脚
* @param axisMask 轴选择掩码(默认:eAxisXYZ)
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool enableNoMotionInt(const struct bmi3_no_motion_config &config, eInt_t pin,
uint8_t axisMask = eAxisXYZ);
/**
* @fn enableSigMotionInt
* @brief 配置显著运动检测中断(使用官方结构体参数)
* @param config 显著运动配置结构体(参见 bmi3_sig_motion_config)
* @n 参数说明:
* @n - block_size: 检测段大小,范围 0-65535(官方示例:200)
* @n - peak_2_peak_min: 峰峰值加速度最小值,范围 0-1023(官方示例:30)
* @n - peak_2_peak_max: 峰峰值加速度最大值,范围 0-1023(官方示例:30)
* @n - mcr_min: 每秒平均交叉率最小值,范围 0-62(官方示例:0x10 = 16)
* @n - mcr_max: 每秒平均交叉率最大值,范围 0-62(官方示例:0x10 = 16)
* @param pin 绑定的中断引脚
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool enableSigMotionInt(const struct bmi3_sig_motion_config &config,
eInt_t pin);
/**
* @fn enableFlatInt
* @brief 配置平面检测中断(使用官方结构体参数)
* @param config 平面检测配置结构体(参见 bmi3_flat_config)
* @n 参数说明:
* @n - theta: 最大允许倾斜角,范围 0-63,角度计算公式为 64 *
* (tan(angle)^2)(官方示例:9)
* @n - blocking: 阻塞模式,0=MODE_0(禁用),1=MODE_1(>1.5g),
* 2=MODE_2(>1.5g 或斜率>半阈值),3=MODE_3(>1.5g 或斜率>阈值)(官方示例:3)
* @n - hold_time: 设备保持平面状态的最小持续时间,范围 0-255,单位 20ms(官方示例:50 = 1000ms)
* @n - hysteresis: 平面检测的滞回角度,范围 0-255(官方示例:9)
* @n - slope_thres: 连续加速度样本之间的最小斜率,范围 0-255(官方示例:0xCD = 205)
* @param pin 绑定的中断引脚
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool enableFlatInt(const struct bmi3_flat_config &config, eInt_t pin);
/**
* @fn enableOrientationInt
* @brief 配置方向检测中断(使用官方结构体参数)
* @param config 方向检测配置结构体(参见 bmi3_orientation_config)
* @n 参数说明:
* @n - ud_en: 是否检测翻转(正反面),0=禁用,1=使能(官方示例:1)
* @n - hold_time: 方向变化检测所需的持续时间,范围 0-255,单位 20ms(官方示例:4 = 80ms)
* @n - hysteresis: 方向检测的滞回值,范围 0-255(官方示例:5)
* @n - theta: 最大允许倾斜角,范围 0-63,角度=64*(tan(angle)^2)(官方示例:16)
* @n - mode: 方向检测模式,0/3=对称,1=高不对称,2=低不对称(官方示例:1)
* @n - slope_thres: 防止剧烈运动导致误检测的斜率阈值,范围 0-255(官方示例:30)
* @n - blocking: 阻塞模式,0-3(官方示例:3)
* @param pin 绑定的中断引脚
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool enableOrientationInt(const struct bmi3_orientation_config &config,
eInt_t pin);
/**
* @fn readOrientation
* @brief 读取方向检测输出
* @param portraitLandscape 横竖屏状态输出指针,可为 NULL
* @param faceUpDown 正反面状态输出指针,可为 NULL
* @return bool 类型,表示读取状态
* @retval true 读取成功
* @retval false 读取失败或功能未使能
*/
bool readOrientation(uint8_t *portraitLandscape, uint8_t *faceUpDown);
/**
* @fn enableTapInt
* @brief 配置敲击检测中断(使用官方结构体参数)
* @param config 敲击检测配置结构体(参见 bmi3_tap_detector_config)
* @n 关键参数(参考 tap.c):
* @n - axis_sel: 选择敲击检测的轴(0=X,1=Y,2=Z)
* @n - mode: 检测模式(0=敏感,1=普通,2=稳健)
* @n - tap_peak_thres / tap_shock_settling_dur 等用于确定敲击的时序/幅度阈值
* @param pin 绑定的中断引脚
* @param enableSingle 是否使能单击检测(默认 true)
* @param enableDouble 是否使能双击检测(默认 true)
* @param enableTriple 是否使能三击检测(默认 true)
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool enableTapInt(const struct bmi3_tap_detector_config &config, eInt_t pin,
bool enableSingle = true, bool enableDouble = true,
bool enableTriple = true);
/**
* @fn readTapStatus
* @brief 读取敲击检测状态(单击/双击/三击)
* @param tapMask 输出掩码(可组合 BMI3_TAP_DET_STATUS_SINGLE/DOUBLE/TRIPLE)
* @return bool 类型,表示读取状态
* @retval true 读取成功
* @retval false 读取失败
*/
bool readTapStatus(uint8_t *tapMask);
/**
* @fn enableTiltInt
* @brief 配置倾斜检测中断(使用官方结构体参数)
* @param config 倾斜检测配置结构体(参见 bmi3_tilt_config)
* @n 关键参数(参考 tilt.c):
* @n - segment_size: 用于平均参考向量的时间窗口,范围 0-255
* @n - min_tilt_angle: 需要超过的最小倾斜角,范围 0-255,角度=256*cos(angle)
* @n - beta_acc_mean: 低通平均系数,范围 0-65535
* @param pin 绑定的中断引脚
* @return bool 类型,表示配置状态
* @retval true 配置成功
* @retval false 配置失败
*/
bool enableTiltInt(const struct bmi3_tilt_config &config, eInt_t pin);
```
## 兼容性
| MCU | 运行良好 | 运行异常 | 未测试 | 备注 |
| ------------------ | :-----: | :------: | :----: | ---- |
| Arduino uno | √ | | | |
| FireBeetle esp32 | √ | | | |
| FireBeetle esp8266 | √ | | | |
| FireBeetle m0 | √ | | | |
| Leonardo | √ | | | |
| Microbit | √ | | | |
| Arduino MEGA2560 | √ | | | |
## 历史
- Date 2025-09-22
- Version V1.0.0
## 创作者
Written by(Martin@dfrobot.com), 2025. (Welcome to our [website](https://www.dfrobot.com/))