Fermion:高精度10轴惯性运动传感器

系列简介

DFRobot 推出新一代多自由度 IMU 传感器:全系采用博世最新 MEMS 技术,共 6 款产品,覆盖 6/9/10 轴全维度感知需求,一个系列搞定从基础姿态检测到航向融合再到定高的所有应用场景。提供 Gravity 和 Fermion 两种形态,适配快速原型验证与量产项目集成不同开发阶段。

产品简介

这款产品基于博世 BMI323 六轴惯性测量单元、BMM350 三轴地磁计,额外集成 BMP581 高精度气压传感器,保留传感器核心功能特性。集成三轴加速度计、三轴陀螺仪、三轴地磁计与气压检测单元,内置硬件运动引擎,可精准捕捉物体加速度、角速度、方位角度、空间姿态,同时采集气压与海拔数据,有效改善惯性器件长期数据漂移问题。采用超小体积设计与原生接口,是传感器性能验证与嵌入式量产集成的理想选择。

高性能・高精度・高稳定
BMI323 搭载低噪声硬件架构与片上温度补偿设计,有效削减环境干扰带来的数据偏差,保障测量精度,加速度零偏 ±35 mg、陀螺仪零偏 ±1 °/s,低噪稳定;内置 2KB FIFO 缓冲区,确保高采样率下数据传输连续稳定。BMM350 地磁计采用博世第三代 TMR 磁阻技术,噪声降至前代 1/3、磁场冲击恢复<10ms,校准后可输出稳定的物体方位数据。搭配的 BMP581 高精度气压传感器,气压精度 ±0.06 hPa、海拔精度 ±0.5 m(典型),数据平稳、环境适应性强,可精准实现气压检测与海拔高度换算。配套独立传感器库,开放 I2C 接口下所有功能和寄存器,可充分验证传感器功能与性能。

内置多种硬件级运动算法,免开发
内置智能运动处理器,无需消耗主控资源即可直接输出计步、敲击、倾斜、自由落体、运动状态识别等检测结果。硬件加速姿态解算,帮助快速集成常用运动交互能力。

灵活配置,功耗可控
加速度与角速度量程多档可调,最高支持 6400Hz 数据输出率,地磁计最高支持 400Hz 采样率,适配不同精度与响应速度需求。提供睡眠、低功耗、正常、高性能多种工作模式,低功耗模式仅需 0.37mA 电流,可适配电池供电设备。

紧凑尺寸,便捷集成
采用 24×19mm 紧凑型 PCB 设计,体积小巧,方便嵌入各类设备内部。板载 I2C 接口,支持焊接固定与插接使用两种形式,适配不同集成场景,使用方式灵活。

开发便捷,兼容性广
配套完善的 Arduino 与 Python 开发库,无需底层开发,广泛兼容 Arduino、树莓派、ESP32 等主流嵌入式开发平台,快速推进项目开发。

典型应用场景
广泛适用于无人机航向定高控制、室内惯性导航、机器人定位、电子罗盘、海拔监测、可穿戴设备、体感控制器、微型设备姿态监测等领域。

产品特性

  • 基于博世BMI323 6轴IMU+BMM350地磁计+BMP581气压传感器设计
  • 具备高精度、高稳定性输出,内置低噪声 + 片上温度补偿
  • 内置计步、敲击、倾斜、自由落体、运动状态识别等多种硬件级运动算法
  • 内置 2KB FIFO 缓冲区,保障高速数据传输
  • 地磁计采用第三代TMR技术,抗干扰能力增强
  • 集成高精度气压传感器,采集气压和海拔数据
  • 支持睡眠、低功耗、正常、高性能等多种工作模式,低功耗仅0.37mA
  • 板载I2C接口,支持焊接/插接双模式
  • 兼容Arduino、树莓派、ESP32等主流开发板

产品参数

基本参数

参数 数值
工作电压 3.3V
工作电流 1.12mA
低功耗电流 0.37mA
通讯接口 I2C
接口类型 SH1.0-5P 接口/2.54mm 排针孔
I2C 地址 BMI323:0x69(默认)/0x68
BMM350:0x15(默认)/0x14
BMP581:0x47(默认)/0x46
可编程中断引脚 BMI323:2个(INT1、INT2)
BMM350:1个(INT3)
BMP581:1个(INT4)

BMI323参数

参数 数值
加速度测量范围 ±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

BMM350参数

参数 数值
工作模式 正常模式(周期性测量)、强制模式(触发式测量)、休眠模式(低功耗待机)
测量范围 ±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)

BMP581参数

参数 数值
气压 - 测量范围 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尺寸 24mm*19mm
安装孔间距 19mm
安装孔直径 2mm

尺寸图

单位:mm

SEN0697-尺寸图

引脚说明

SEN0697-功能图

引脚丝印 功能描述
3V3 电源正极(供电输入3.3V)
GND 电源负极(接地)
SCL I2C模式时钟线(SCL)
SDA I2C模式数据线(SDA)
INT1 BMI323 中断输出引脚1
INT2 BMI323 中断输出引脚2
INT3 BMM350 中断输出引脚
INT4 BMP581 中断输出引脚

注意:本传感器供电与通信电平均为 3.3V,推荐搭配 3.3V 供电、3.3V 电平的主控使用。直接接入5V主控易导致传感器损坏。

焊盘配置说明(I2C地址选择)

传感器板载 3 个独立焊盘,对应 BMP581、BMI323、BMM350 的 I2C 地址切换。通过焊盘的 “断开 / 连接” 状态即可灵活配置目标地址,无需额外硬件修改。

SEN0697-I2C地址焊盘图

BMI581 传感器 I2C 地址配置规则

BMI581 的 I2C 地址通过对应焊盘状态切换,配置规则如下:

  • 焊盘断开:I2C 地址为 0x47
  • 焊盘连接:I2C 地址为 0x46

BMI323 传感器 I2C 地址配置规则

BMI323 的 I2C 地址通过对应焊盘状态切换,配置规则如下:

  • 焊盘断开:I2C 地址为 0x69
  • 焊盘连接:I2C 地址为 0x68

BMM350 传感器 I2C 地址配置

BMM350 的 I2C 地址通过对应焊盘状态切换,配置规则如下:

  • 焊盘断开:I2C 地址为 0x15
  • 焊盘连接:I2C 地址为 0x14

Arduino IDE 使用教程

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

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

目标

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

硬件准备

软件准备

接线配置

SEN0697-I2C接线图

  • 按图示连接10轴IMU传感器与 ESP32-C5,核心对应关系:
    • 传感器引脚 “3V3” → ESP32-C5 3.3V
    • 传感器引脚 “GND” → ESP32-C5 GND
    • 传感器 I2C 引脚 “SCL” → ESP32-C5 SCL(默认 GPIO10)
    • 传感器 I2C 引脚 “SDA” → ESP32-C5 SDA(默认 GPIO9)
    • I2C地址焊盘配置:将BMI323、BMM350和BMP581的I2C地址焊盘断开,此时 BMI323的 I2C 地址为 0x69,BMM350的 I2C 地址为 0x15,BMP581的 I2C 地址为 0x47(出厂默认模式)

样例代码

#include "DFRobot_BMI323.h"
#include "DFRobot_BMM350.h"
#include "DFRobot_BMP58X.h"

#define BMP5_COMM_I2C
#define CALIBRATE_ABSOLUTE_DIFFERENCE

#define BMI323_I2C_ADDR 0x69    
#define BMM350_I2C_ADDR 0x15
#define BMP58X_I2C_ADDR 0x47

DFRobot_BMI323 bmi323(&Wire, BMI323_I2C_ADDR);
DFRobot_BMM350_I2C bmm350(&Wire, BMM350_I2C_ADDR);
DFRobot_BMP58X_I2C bmp58x(&Wire, BMP58X_I2C_ADDR);

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

  Serial.println("Combined Sensor Demo: BMI323 (6-axis) + BMM350 (Magnetometer) + BMP58X (Pressure)");
  Serial.println("==================================================================================");

  // 初始化BMI323(六轴)
  while (!bmi323.begin()) {
    Serial.println("BMI323 init failed, retry in 1s");
    delay(1000);
  }
  Serial.println("BMI323 init success!");

  // 配置加速度计:50Hz采样,±8g,普通模式
  if (!bmi323.configAccel(bmi323.eAccelODR50Hz, bmi323.eAccelRange8G, bmi323.eAccelModeNormal)) {
    Serial.println("Accel config failed!");
    while(1) delay(1000);
  }

  // 配置陀螺仪:800Hz采样,±2000dps,普通模式
  if (!bmi323.configGyro(bmi323.eGyroODR800Hz, bmi323.eGyroRange2000DPS, bmi323.eGyroModeNormal)) {
    Serial.println("Gyro config failed!");
    while(1) delay(1000);
  }

  // 初始化BMM350(磁力计)
  while (bmm350.begin()) {   // begin()返回0表示成功,非0表示失败
    Serial.println("BMM350 init failed, retry in 1s");
    delay(1000);
  }
  Serial.println("BMM350 init success!");

  // 设置操作模式为普通模式
  bmm350.setOperationMode(eBmm350NormalMode);

  // 设置预设模式为高精度,数据率25Hz
  bmm350.setPresetMode(BMM350_PRESETMODE_HIGHACCURACY, BMM350_DATA_RATE_25HZ);

  // 使能X、Y、Z轴测量(默认已使能,但显式调用确保)
  bmm350.setMeasurementXYZ();

  // 初始化BMP58X(气压传感器)
  while(!bmp58x.begin()){
    Serial.println("BMP58X init fail!");
    delay(1000);
  }
  Serial.println("BMP58X init success!");

  // 校准绝对误差(根据实际高度修改参数)
  #if defined(CALIBRATE_ABSOLUTE_DIFFERENCE)
    /* 示例使用成都温江区540米的标高。使用时请用当地标高代替。 */
    bmp58x.calibratedAbsoluteDifference(540.0);
  #endif

  // 将测量模式设置为正常模式
  bmp58x.setMeasureMode(bmp58x.eNormal);

  Serial.println("Setup complete!\n");
}

void loop()
{
  // 读取BMI323数据
  DFRobot_BMI323::sSensorData accel, gyro;
  if (bmi323.getAccelGyroData(&accel, &gyro)) {
    Serial.print("Accel (g)  : ");
    Serial.print(accel.x, 3);
    Serial.print(", ");
    Serial.print(accel.y, 3);
    Serial.print(", ");
    Serial.println(accel.z, 3);

    Serial.print("Gyro (dps) : ");
    Serial.print(gyro.x, 2);
    Serial.print(", ");
    Serial.print(gyro.y, 2);
    Serial.print(", ");
    Serial.println(gyro.z, 2);
  } else {
    Serial.println("Failed to read BMI323 data.");
  }

  // 读取BMM350数据
  sBmm350MagData_t magData = bmm350.getGeomagneticData();
  Serial.print("Mag (uT)   : ");
  Serial.print(magData.float_x, 2);
  Serial.print(", ");
  Serial.print(magData.float_y, 2);
  Serial.print(", ");
  Serial.println(magData.float_z, 2);

  // 读取BMP58X数据
  Serial.print("Pressure   : ");
  Serial.print(bmp58x.readPressPa());
  Serial.println(" Pa");
  
  Serial.print("Altitude   : ");
  Serial.print(bmp58x.readAltitudeM());
  Serial.println(" m");

  Serial.println("--------------------------------");
  delay(200);   // 约5Hz刷新率
}

结果

SEN0697-I2C结果图

API函数

BMI323 API函数

/**
   * @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 getTemperature
   * @brief 读取芯片温度(摄氏度)
   * @details 从传感器读取温度原始值,并按官方公式换算:温度(°C) = (int16_t)raw / 512.0 + 23.0。
   * 需先配置加速度计或陀螺仪。
   * @return float 温度值(单位:°C);若传感器未初始化或读取失败则返回 0.0f
   */
  float getTemperature(void);

  /**
   * @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);

BMM350 API函数

 /**
   * @fn softReset
   * @brief 软件复位,软件复位后先恢复为挂起模式
   */
  void softReset(void);

  /**
   * @fn setOperationMode
   * @brief 设置传感器的执行模式
   * @param opMode mode
   * @n eBmm350SuspendMode       挂起模式:挂起模式是芯片上电后BMM350的默认电源模式,在挂起模式下电流消耗最小,因此该模式适用于不需要数据转换的时期(所有寄存器的读写都是可能的)
   * @n eBmm350NormalMode        常规模式: 获取地磁数据      
   * @n eBmm350ForcedMode        强制模式: 单次测量,测量完成后传感器恢复到暂停模式
   * @n eBmm350ForcedModeFast   只有使用FM_FAST时,ODR才能达到200Hz
   */
  void setOperationMode(uint8_t opMode);

  /**
   * @fn getOperationMode
   * @brief 获取传感器的执行模式
   * @return result 返回字符串为传感器的执行模式
   */
  String getOperationMode(void);

  /**
   * @fn setPresetMode
   * @brief 设置预置模式,使用户更简单的配置传感器来获取地磁数据(默认的采集速率为12.5Hz)
   * @param presetMode
   * @n BMM350_PRESETMODE_LOWPOWER       低功率模式,获取少量的数据 取均值
   * @n BMM350_PRESETMODE_REGULAR        普通模式,获取中量数据 取均值
   * @n BMM350_PRESETMODE_ENHANCED       增强模式,获取大量数据 取均值
   * @n BMM350_PRESETMODE_HIGHACCURACY   高精度模式,获取超大量数据 取均值
   */
  void setPresetMode(uint8_t presetMode, uint8_t rate = BMM350_DATA_RATE_12_5HZ);

  /**
   * @fn setRate
   * @brief 设置获取地磁数据的速率,速率越大获取越快(不加延时函数)
   * @param rate
   * @n BMM350_DATA_RATE_1_5625HZ
   * @n BMM350_DATA_RATE_3_125HZ
   * @n BMM350_DATA_RATE_6_25HZ
   * @n BMM350_DATA_RATE_12_5HZ  (默认速率)
   * @n BMM350_DATA_RATE_25HZ
   * @n BMM350_DATA_RATE_50HZ
   * @n BMM350_DATA_RATE_100HZ
   * @n BMM350_DATA_RATE_200HZ
   * @n BMM350_DATA_RATE_400HZ
   */
  void setRate(uint8_t rate);

  /**
   * @fn getRate
   * @brief 获取配置的数据速率 单位:HZ
   * @return rate
   */
  uint8_t getRate(void);

  /**
   * @fn selfTest
   * @brief 传感器自测,返回值表明自检结果
   * @param testMode:
   * @n     eBmm350SelfTestNormal               常规自检,检查x轴、y轴、z轴是否接通或短路
   * @return result 返回的字符串为自测的结果
   */
  String selfTest(eBmm350SelfTest_t testMode = eBmm350SelfTestNormal);

  /**
   * @fn setMeasurementXYZ
   * @brief 使能x y z 轴的测量,默认设置为使能,禁止后xyz轴的地磁数据不准确
   * @param en_x
   * @n   BMM350_X_EN        使能 x 轴的测量
   * @n   BMM350_X_DIS       禁止 x 轴的测量
   * @param en_y
   * @n   BMM350_Y_EN        使能 y 轴的测量
   * @n   BMM350_Y_DIS       禁止 y 轴的测量
   * @param en_z
   * @n   BMM350_Z_EN        使能 z 轴的测量
   * @n   BMM350_Z_DIS       禁止 z 轴的测量
   */
  void setMeasurementXYZ(enum eBmm350XAxisEnDis_t enX = BMM350_X_EN, enum eBmm350YAxisEnDis_t enY = BMM350_Y_EN, enum eBmm350ZAxisEnDis_t enZ = BMM350_Z_EN);

  /**
   * @fn getMeasurementStateXYZ
   * @brief 获取 x y z 轴的使能状态
   * @return result 返回字符串为使能的状态
   */
  String getMeasurementStateXYZ(void);

  /**
   * @fn getGeomagneticData
   * @brief 获取x y z 三轴的地磁数据
   * @return 地磁的数据的结构体,单位:微特斯拉(uT)
   */
  sBmm350MagData_t getGeomagneticData(void);

  /**
   * @fn getCompassDegree
   * @brief 获取罗盘方向
   * @return 罗盘方向 (0° - 360°)
   * @n      0° = North, 90° = East, 180° = South, 270° = West.
   */
  float getCompassDegree(void);

  /**
   * @fn setDataReadyPin
   * @brief 使能或者禁止数据准备中断引脚
   * @n 使能后有数据来临DRDY引脚跳变
   * @n 禁止后有数据来临DRDY不进行跳变
   * @n 高极性:高电平为活动电平,默认为低电平,触发中断时电平变为高
   * @n 低极性:低电平为活动电平,默认为高电平,触发中断时电平变为低
   * @param modes
   * @n     BMM350_ENABLE_INTERRUPT        使能DRDY
   * @n     BMM350_DISABLE_INTERRUPT       禁止DRDY
   * @param polarity
   * @n     BMM350_ACTIVE_HIGH      高极性
   * @n     BMM350_ACTIVE_LOW       低极性
   */
  void setDataReadyPin(uint8_t modes, uint8_t polarity=POLARITY_HIGH);

  /**
   * @fn getDataReadyState
   * @brief 获取数据准备的状态,用来判断数据是否准备好
   * @return status
   * @n true  数据准备好了
   * @n false 数据没有准备好
   */
  bool getDataReadyState(void);

  /**
   * @fn setThresholdInterrupt(uint8_t modes, int8_t threshold, uint8_t polarity)
   * @brief 设置阈值中断,当某个通道的地磁值高/低于阈值时触发中断
   * @n     高极性:高电平为活动电平,默认为低电平,触发中断时电平变为高
   * @n     低极性:低电平为活动电平,默认为高电平,触发中断时电平变为低
   * @param modes
   * @n     LOW_THRESHOLD_INTERRUPT       低阈值中断模式
   * @n     HIGH_THRESHOLD_INTERRUPT      高阈值中断模式
   * @param  threshold
   * @n     阈值,默认扩大16倍,例如:低阈值模式下传入阈值1,实际低于16的地磁数据都会触发中断
   * @param polarity
   * @n     POLARITY_HIGH      高极性
   * @n     POLARITY_LOW       低极性
   */
  void setThresholdInterrupt(uint8_t modes, int8_t threshold, enum eBmm350IntrPolarity_t polarity);

  /**
   * @fn getThresholdData
   * @brief 获取发生阈值中断的数据
   * @return 返回存放地磁数据的结构体,结构体存放三轴当数据和中断状态,
   * @n xyz轴的数据为 NO_DATA 时,未触发中断
   * @n mag_x、mag_y、mag_z 存放地磁数据
   * @n interrupt_x、interrupt_y、interrupt_z 存放轴中断状态
   */
  sBmm350ThresholdData_t getThresholdData(void);

BMP581 API函数

/**
 * @fn begin
 * @brief 初始化传感器硬件接口
 * @return 初始化成功返回true,失败返回false
 */
bool begin(void);

/**
 * @fn setODR
 * @brief 配置传感器输出数据率(ODR)
 * @param odr 输出数据率选择(见: eOdr_t)
 * @n 可用速率:
 * @n - eOdr240Hz:    输出速率240 Hz
 * @n - eOdr218_5Hz:  输出速率218.5 Hz
 * @n - eOdr199_1Hz:  输出速率199.1 Hz
 * @n - eOdr179_2Hz:  输出速率179.2 Hz
 * @n - eOdr160Hz:    输出速率160 Hz
 * @n - eOdr149_3Hz:  输出速率149.3 Hz
 * @n - eOdr140Hz:    输出速率140 Hz
 * @n - eOdr129_8Hz:  输出速率129.8 Hz
 * @n - eOdr120Hz:    输出速率120 Hz
 * @n - eOdr110_1Hz:  输出速率110.1 Hz
 * @n - eOdr100_2Hz:  输出速率100.2 Hz
 * @n - eOdr89_6Hz:   输出速率89.6 Hz
 * @n - eOdr80Hz:     输出速率80 Hz
 * @n - eOdr70Hz:     输出速率70 Hz
 * @n - eOdr60Hz:     输出速率60 Hz
 * @n - eOdr50Hz:     输出速率50 Hz
 * @n - eOdr45Hz:     输出速率45 Hz
 * @n - eOdr40Hz:     输出速率40 Hz
 * @n - eOdr35Hz:     输出速率35 Hz
 * @n - eOdr30Hz:     输出速率30 Hz
 * @n - eOdr25Hz:     输出速率25 Hz
 * @n - eOdr20Hz:     输出速率20 Hz
 * @n - eOdr15Hz:     输出速率15 Hz
 * @n - eOdr10Hz:     输出速率10 Hz
 * @n - eOdr5Hz:      输出速率5 Hz
 * @n - eOdr4Hz:      输出速率4 Hz
 * @n - eOdr3Hz:      输出速率3 Hz
 * @n - eOdr2Hz:      输出速率2 Hz
 * @n - eOdr1Hz:      输出速率1 Hz
 * @n - eOdr0_5Hz:    输出速率0.5 Hz
 * @n - eOdr0_250Hz:  输出速率0.250 Hz
 * @n - eOdr0_125Hz:  输出速率0.125 Hz
 * @return 成功返回0,错误返回1
 */
uint8_t setODR(eODR_t odr);

/**
 * @fn setOSR
 * @brief 设置温度和压力的过采样率
 * @param osrTemp 温度过采样(见: eOverSampling_t)
 * @param osrPress 压力过采样(见: eOverSampling_t)
 * @n 支持的值:
 * @n - eOverSampling1:   1倍过采样
 * @n - eOverSampling2:   2倍过采样
 * @n - eOverSampling4:   4倍过采样
 * @n - eOverSampling8:   8倍过采样
 * @n - eOverSampling16:  16倍过采样
 * @n - eOverSampling32:  32倍过采样
 * @n - eOverSampling64:  64倍过采样
 * @n - eOverSampling128: 128倍过采样
 * @return 成功返回0,错误返回1
 */
uint8_t setOSR(eOverSampling_t osrTemp, eOverSampling_t osrPress);

/**
 * @fn setMeasureMode
 * @brief 配置传感器电源/测量模式
 * @param mode 操作模式(见: eMeasureMode_t)
 * @n 可用模式:
 * @n - eSleep:         睡眠模式
 * @n - eNormal:        正常测量模式
 * @n - eSingleShot:    单次测量
 * @n - eContinuous:    连续测量
 * @n - eDeepSleep:     深度睡眠模式
 * @return 成功返回0,错误返回1
 */
uint8_t setMeasureMode(eMeasureMode_t mode);

/**
 * @fn reset
 * @brief 执行传感器软件复位
 * @return 成功返回0,错误返回1
 */
uint8_t reset(void);

/**
 * @fn readTempC
 * @brief 读取校准后的温度数据
 * @return 温度值(摄氏度)
 */
float readTempC(void);

/**
 * @fn readPressPa
 * @brief 读取校准后的压力数据
 * @return 压力值(帕斯卡)
 */
float readPressPa(void);

/**
 * @fn readAltitudeM
 * @brief 根据压力读数计算海拔高度
 * @note 使用公式:
 * @n altitude = (1 - (P/101325)^0.190284) * 44307.7
 * @n 其中P = 当前压力值(Pa)
 * @return 海拔高度(米)
 */
float readAltitudeM(void);

/**
 * @fn configIIR
 * @brief 配置IIR滤波器系数
 * @param iirTemp  温度IIR滤波器(见: eIIRFilter_t)
 * @param iirPress 压力IIR滤波器(见: eIIRFilter_t)
 * @n 可用系数:
 * @n - eFilterBypass:   旁路滤波器
 * @n - eFilter1:        1阶滤波器
 * @n - eFilter3:        3阶滤波器
 * @n - eFilter7:        7阶滤波器
 * @n - eFilter15:       15阶滤波器
 * @n - eFilter31:       31阶滤波器
 * @n - eFilter63:       63阶滤波器
 * @n - eFilter127:      127阶滤波器
 * @return 成功返回0,错误返回1
 */
uint8_t configIIR(eIIRFilter_t iirTemp, eIIRFilter_t iirPress);

/**
 * @fn configFIFO
 * @brief 配置FIFO操作参数
 * @param dataSel 数据帧类型(见: eFIFODataSel_t)
 * @n 可用类型:
 * @n - eFIFODisable:           FIFO禁用
 * @n - eFIFOTempData:          仅温度数据
 * @n - eFIFOPressData:         仅压力数据
 * @n - eFIFOPressAndTempData:  压力和温度数据
 *
 * @param downSampling 下采样率(见: eFIFODownSampling_t)
 * @n 可用比率:
 * @n - eNoDownSampling:    无下采样
 * @n - eDownSampling2:     2倍下采样
 * @n - eDownSampling4:     4倍下采样
 * @n - eDownSampling8:     8倍下采样
 * @n - eDownSampling16:    16倍下采样
 * @n - eDownSampling32:    32倍下采样
 * @n - eDownSampling64:    64倍下采样
 * @n - eDownSampling128:   128倍下采样
 *
 * @param mode FIFO操作模式(见: eFIFOWorkMode_t)
 * @n 可用模式:
 * @n - eFIFOOverwriteMode:  连续数据流模式
 * @n - eFIFOFullStopMode:   FIFO满时停止
 *
 * @param threshold FIFO触发阈值(0=禁用, 1-31=帧数)
 * @n - 0x0F: 15帧。这是PT模式下的最大设置。最高有效位被忽略。
 * @n - 0x1F: 31帧。这是P或T模式下的最大设置。
 * @return 成功返回0,错误返回1
 */
uint8_t configFIFO(eFIFODataSel_t dataSel, eFIFODownSampling_t downSampling, eFIFOWorkMode_t mode, uint8_t threshold);

/**
 * @fn getFIFOCount
 * @brief 获取FIFO中当前的帧数
 * @return 存储的数据帧数(0-31)
 */
uint8_t getFIFOCount(void);

/**
 * @fn getFIFOData
 * @brief 从FIFO读取所有数据
 * @return sFIFOData_t 包含压力和温度数据的结构体
 * @n - len: 存储的数据帧数(0-31)
 * @n - pressure: 压力值数组
 * @n - temperature: 温度值数组
 */
sFIFOData_t getFIFOData(void);

/**
 * @fn configInterrupt
 * @brief 配置中断行为
 * @param intMode 触发模式(见: eIntMode_t)
 * @n 可用模式:
 * @n - eIntModePulsed: 脉冲模式
 * @n - eIntModeLatched: 锁存模式
 *
 * @param intPol 信号极性(见: eIntPolarity_t)
 * @n 可用极性:
 * @n - eIntLowActive:  低电平有效
 * @n - eIntHighActive: 高电平有效
 *
 * @param intOd 输出驱动类型(见: eIntOutputMode_t)
 * @n 可用类型:
 * @n - eIntPushPull: 推挽输出
 * @n - eIntOpenDrain: 开漏输出
 *
 * @return 成功返回0,错误返回1
 */
uint8_t configInterrupt(eIntMode_t mode, eIntPolarity_t pol, eIntOutputMode_t outputMode);

/**
 * @fn setIntSource
 * @brief 启用特定的中断源
 * @param source 触发位掩码(见: eIntSource_t)
 * @n 可用源:
 * @n - eIntDataReady:    数据就绪中断
 * @n - eIntFIFOFull:    FIFO满中断
 * @n - eIntFIFOThres:   FIFO阈值中断
 * @n - eIntPressureOOR: 压力超出范围中断
 * @details 可以使用按位或(|)组合多个中断源。
 *          示例: 同时启用数据就绪和FIFO满中断:
 *          @code
 *          setIntSource(bmp58x.eIntDataReady | bmp58x.eIntFIFOFull);
 *          @endcode
 * @return 成功返回0,错误返回1
 */
uint8_t setIntSource(uint8_t source);

/**
 * @fn getIntStatus
 * @brief 读取当前中断状态标志
 * @return uint16_t 活动中断的位掩码
 * @n 可能的标志:
 * @n - eIntStatusDataReady: 数据就绪(0x01)
 * @n - eIntStatusFIFOFull: FIFO已满 (0x02)
 * @n - eIntStatusFIFOThres: FIFO达到阈值(0x04)
 * @n - eIntStatusPressureOOR: 压力超出范围(0x08)
 * @n - eIntStatusResetComplete: 复位完成(0x10)
 */
uint16_t getIntStatus(void);

/**
 * @fn setPressOOR
 * @brief 配置压力超出范围检测
 * @param oor 阈值压力值(0x00000-0x1FFFF)
 * @param range 迟滞范围(0-255)
 * @n oor - range < 压力 < oor + range
 * @param cntLimit 触发持续计数
 * @n 可用持续设置:
 * @n - eOORCountLimit1:  1次计数
 * @n - eOORCountLimit3:  3次计数
 * @n - eOORCountLimit7:  7次计数
 * @n - eOORCountLimit15: 15次计数
 * @return 成功返回0,错误返回1
 */
uint8_t setPressOOR(uint32_t oor, uint8_t range, eOORCountLimit_t cntLimit);

/**
 * @fn calibratedAbsoluteDifference
 * @brief 使用给定的当前海拔高度作为参考值,消除后续压力和海拔数据的绝对差值
 * @param altitude 当前海拔高度
 * @return 布尔值,表示参考值是否设置成功
 * @retval True 表示参考值设置成功
 * @retval False 表示设置参考值失败
 */
bool calibratedAbsoluteDifference(float altitude);

/**
 * @fn setBaud
 * @brief 设置UART通信波特率
 * @details 使用指定的波特率枚举值配置串行通信速度。
 *          该函数初始化必要的硬件寄存器以实现所需的数据传输速率。
 * @param baud eBaud枚举值,指定所需的波特率。
 *             如果未显式设置,默认为e9600。
 * @note 实际硬件配置可能因微控制器型号而异。
 *       该函数假设使用标准时钟频率;如果使用非默认系统时钟配置,请调整时钟设置。
 * @warning 在通信过程中更改波特率可能导致数据丢失或通信错误(如果两个设备未同步)。
 * @see eBaud可用的波特率选项:
 *      - e2400: 2400比特/秒
 *      - e4800: 4800比特/秒  
 *      - e9600: 9600比特/秒(默认值)
 *      - e14400: 14400比特/秒
 *      - e19200: 19200比特/秒
 *      - e38400: 38400比特/秒
 *      - e57600: 57600比特/秒
 *      - e115200: 115200比特/秒
 */
void setBaud(eBaud baud);

资料下载

更多

还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

DFshopping_car1.png DFRobot商城购买链接