# DFRobot_Multi_DOF_IMU **Repository Path**: dfrobot/DFRobot_Multi_DOF_IMU ## Basic Information - **Project Name**: DFRobot_Multi_DOF_IMU - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-23 - **Last Updated**: 2026-03-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DFRobot_Multi_DOF_IMU - [English Version](./README.md) DFRobot_Multi_DOF_IMU 是一款多轴IMU传感器库,支持通过I2C/UART接口读取传感器数据。该库支持6轴(加速度计+陀螺仪)、9轴(+磁力计)和10轴(+气压计)传感器,提供全面的运动检测和姿态感知功能。 该传感器非常适合可穿戴设备、智能手表、健身追踪器、无人机、机器人导航和物联网应用,这些应用对运动感知、姿态检测和能效要求很高。通过可配置的中断引脚(INT1、INT2、INT3、INT4),传感器可以高效地通知主机系统各种运动事件,非常适合电池供电的应用。 **主要特性:** - 多轴运动感知(6轴/9轴/10轴) - 支持I2C和UART(Modbus RTU)两种通信方式 - 硬件计步器,支持中断 - 多种运动检测模式(任意运动、无运动、显著运动) - 手势识别(敲击、倾斜、方向、平面检测) - 气压检测和海拔高度计算 - 气压超出范围(OOR)中断 - 多种工作模式(睡眠、低功耗、正常、高性能) - 可配置加速度计和陀螺仪量程 - 多中断引脚,灵活的事件处理 ### SEN0692

### SEN0694

### SEN0696

## 产品链接 (https://www.dfrobot.com) ``` SKU: SEN0692/SEN0694/SEN0696 ``` ## 目录 * [概述](#概述) * [库安装](#库安装) * [方法](#方法) * [兼容性](#兼容性) * [历史](#历史) * [创作者](#创作者) ## 概述 本 Arduino 库为多轴IMU传感器提供全面的接口。它支持: **基本功能:** - 通过I2C或UART接口初始化传感器 - 配置传感器工作模式(睡眠、低功耗、正常、高性能) - 配置加速度计和陀螺仪量程 - 读取6轴传感器数据(加速度计 + 陀螺仪) - 读取9轴传感器数据(加速度计 + 陀螺仪 + 磁力计) - 读取10轴传感器数据(加速度计 + 陀螺仪 + 磁力计 + 气压计) - 气压校准(根据当地海拔高度) - 气压超出范围(OOR)检测配置 **高级功能:** - 计步器,支持中断 - 任意运动检测中断 - 无运动检测中断 - 显著运动检测中断 - 平面检测中断 - 方向检测中断(横竖屏、正反面) - 敲击检测中断(单击/双击/三击) - 倾斜检测中断 - 气压数据就绪中断 - 气压超出范围中断 ## 库安装 要使用本库,请先下载库文件,将其粘贴到 \Arduino\libraries 目录,然后打开 examples 文件夹并运行其中的示例程序。 ## 方法 ```C++ /** * @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 配置中断 * @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 getStepCount * @brief 读取步数计数器数据 * @details 读取当前累计步数 * @n 使能步进计数后,可随时调用此函数从计步器读取当前真实步数, * @n 无需等待或依赖Arduino中断触发 * @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); ``` ## 兼容性 | MCU | 运行良好 | 运行异常 | 未测试 | 备注 | | ------------------ | :-----: | :------: | :----: | ---- | | Arduino uno | √ | | | | | ESP32-P4 | √ | | | | | FireBeetle esp32 | √ | | | | | FireBeetle esp8266 | √ | | | | | FireBeetle m0 | √ | | | | | Leonardo | √ | | | | | Microbit | √ | | | | | Arduino MEGA2560 | √ | | | | ## 历史 - Date 2026-01-16 - Version V1.0.0 ## 创作者 Written by(Martin@dfrobot.com), 2026. (Welcome to our [website](https://www.dfrobot.com/))