DoF10 Unit

此库是 Unit DoF10 的驱动程序。

支持以下产品:

Unit DoF10

UiFlow2 应用示例

读取加速度

在 UiFlow2 中打开 cores3_unit_dof10_accel_example.m5f2 项目。

此示例演示如何读取并显示 X、Y、Z 轴加速度。

UiFlow2 代码块:

accel_example.png

示例输出:

无

读取气压计

在 UiFlow2 中打开 cores3_unit_dof10_barometer_example.m5f2 项目。

此示例演示如何读取并显示气压、海拔和温度。

UiFlow2 代码块:

barometer_example.png

示例输出:

无

MicroPython 应用示例

读取加速度

此示例演示如何读取并显示 X、Y、Z 轴加速度。

MicroPython 代码块:

  1# SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
  2#
  3# SPDX-License-Identifier: MIT
  4
  5import os, sys, io
  6import M5
  7from M5 import *
  8import m5ui
  9import lvgl as lv
 10from hardware import Pin
 11from hardware import I2C
 12from unit import DoF10Unit
 13import time
 14
 15
 16page0 = None
 17title = None
 18unit_label = None
 19range_label = None
 20axis_x = None
 21axis_y = None
 22axis_z = None
 23slider_x = None
 24slider_y = None
 25slider_z = None
 26label_x_value = None
 27label_y_value = None
 28label_z_value = None
 29scale_low = None
 30scale_zero = None
 31scale_high = None
 32i2c0 = None
 33dof10_0 = None
 34
 35
 36last_time = None
 37UPDATE_DURATION_MS = None
 38accel = None
 39
 40
 41def setup():
 42    global \
 43        page0, \
 44        title, \
 45        unit_label, \
 46        range_label, \
 47        axis_x, \
 48        axis_y, \
 49        axis_z, \
 50        slider_x, \
 51        slider_y, \
 52        slider_z, \
 53        label_x_value, \
 54        label_y_value, \
 55        label_z_value, \
 56        scale_low, \
 57        scale_zero, \
 58        scale_high, \
 59        i2c0, \
 60        dof10_0, \
 61        last_time, \
 62        UPDATE_DURATION_MS, \
 63        accel
 64
 65    M5.begin()
 66    Widgets.setRotation(0)
 67    m5ui.init()
 68    page0 = m5ui.M5Page(bg_c=0x10171D)
 69    title = m5ui.M5Label(
 70        "DoF10 / Accel Vector",
 71        x=12,
 72        y=8,
 73        text_c=0xF2F6F8,
 74        bg_c=0x10171D,
 75        bg_opa=0,
 76        font=lv.font_montserrat_18,
 77        parent=page0,
 78    )
 79    unit_label = m5ui.M5Label(
 80        "m/s2",
 81        x=274,
 82        y=11,
 83        text_c=0x4CD7D0,
 84        bg_c=0x10171D,
 85        bg_opa=0,
 86        font=lv.font_montserrat_14,
 87        parent=page0,
 88    )
 89    range_label = m5ui.M5Label(
 90        "Range  -20.0 ~ +20.0",
 91        x=12,
 92        y=34,
 93        text_c=0x8FA1AD,
 94        bg_c=0x10171D,
 95        bg_opa=0,
 96        font=lv.font_montserrat_12,
 97        parent=page0,
 98    )
 99    axis_x = m5ui.M5Label(
100        "X",
101        x=11,
102        y=69,
103        text_c=0xFF6B6B,
104        bg_c=0x10171D,
105        bg_opa=0,
106        font=lv.font_montserrat_18,
107        parent=page0,
108    )
109    axis_y = m5ui.M5Label(
110        "Y",
111        x=11,
112        y=115,
113        text_c=0x63D08C,
114        bg_c=0x10171D,
115        bg_opa=0,
116        font=lv.font_montserrat_18,
117        parent=page0,
118    )
119    axis_z = m5ui.M5Label(
120        "Z",
121        x=11,
122        y=159,
123        text_c=0x63A8FF,
124        bg_c=0x10171D,
125        bg_opa=0,
126        font=lv.font_montserrat_18,
127        parent=page0,
128    )
129    slider_x = m5ui.M5Slider(
130        x=44,
131        y=70,
132        w=200,
133        h=10,
134        mode=lv.slider.MODE.NORMAL,
135        min_value=-200,
136        max_value=200,
137        value=0,
138        bg_c=0x27323A,
139        color=0xFF6B6B,
140        parent=page0,
141    )
142    slider_y = m5ui.M5Slider(
143        x=44,
144        y=115,
145        w=200,
146        h=10,
147        mode=lv.slider.MODE.NORMAL,
148        min_value=-200,
149        max_value=200,
150        value=0,
151        bg_c=0x27323A,
152        color=0x63D08C,
153        parent=page0,
154    )
155    slider_z = m5ui.M5Slider(
156        x=44,
157        y=160,
158        w=200,
159        h=10,
160        mode=lv.slider.MODE.NORMAL,
161        min_value=-200,
162        max_value=200,
163        value=0,
164        bg_c=0x27323A,
165        color=0x63A8FF,
166        parent=page0,
167    )
168    label_x_value = m5ui.M5Label(
169        "0.00",
170        x=260,
171        y=70,
172        text_c=0xF2F6F8,
173        bg_c=0x10171D,
174        bg_opa=0,
175        font=lv.font_montserrat_16,
176        parent=page0,
177    )
178    label_y_value = m5ui.M5Label(
179        "0.00",
180        x=260,
181        y=115,
182        text_c=0xF2F6F8,
183        bg_c=0x10171D,
184        bg_opa=0,
185        font=lv.font_montserrat_16,
186        parent=page0,
187    )
188    label_z_value = m5ui.M5Label(
189        "0.00",
190        x=260,
191        y=160,
192        text_c=0xF2F6F8,
193        bg_c=0x10171D,
194        bg_opa=0,
195        font=lv.font_montserrat_16,
196        parent=page0,
197    )
198    scale_low = m5ui.M5Label(
199        "-20",
200        x=55,
201        y=211,
202        text_c=0x8FA1AD,
203        bg_c=0x10171D,
204        bg_opa=0,
205        font=lv.font_montserrat_12,
206        parent=page0,
207    )
208    scale_zero = m5ui.M5Label(
209        "0",
210        x=153,
211        y=211,
212        text_c=0xF2F6F8,
213        bg_c=0x10171D,
214        bg_opa=0,
215        font=lv.font_montserrat_12,
216        parent=page0,
217    )
218    scale_high = m5ui.M5Label(
219        "+20",
220        x=235,
221        y=211,
222        text_c=0x8FA1AD,
223        bg_c=0x10171D,
224        bg_opa=0,
225        font=lv.font_montserrat_12,
226        parent=page0,
227    )
228
229    i2c0 = I2C(0, scl=Pin(1), sda=Pin(2), freq=400000)
230    dof10_0 = DoF10Unit(i2c0, addr=0x68)
231    page0.screen_load()
232    UPDATE_DURATION_MS = 100
233    last_time = time.ticks_ms()
234
235
236def loop():
237    global \
238        page0, \
239        title, \
240        unit_label, \
241        range_label, \
242        axis_x, \
243        axis_y, \
244        axis_z, \
245        slider_x, \
246        slider_y, \
247        slider_z, \
248        label_x_value, \
249        label_y_value, \
250        label_z_value, \
251        scale_low, \
252        scale_zero, \
253        scale_high, \
254        i2c0, \
255        dof10_0, \
256        last_time, \
257        UPDATE_DURATION_MS, \
258        accel
259    M5.update()
260    if (time.ticks_diff((time.ticks_ms()), last_time)) >= UPDATE_DURATION_MS:
261        last_time = time.ticks_ms()
262        accel = dof10_0.get_accel()
263        slider_x.set_value(int(accel[0] * 10), True)
264        label_x_value.set_text(str(round(accel[0], 2)))
265        slider_y.set_value(int(accel[1] * 10), True)
266        label_y_value.set_text(str(round(accel[1], 2)))
267        slider_z.set_value(int(accel[2] * 10), True)
268        label_z_value.set_text(str(round(accel[2], 2)))
269
270
271if __name__ == "__main__":
272    try:
273        setup()
274        while True:
275            loop()
276    except (Exception, KeyboardInterrupt) as e:
277        try:
278            m5ui.deinit()
279            from utility import print_error_msg
280
281            print_error_msg(e)
282        except ImportError:
283            print("please update to latest firmware")

示例输出:

无

读取气压计

此示例演示如何读取并显示气压、海拔和温度。

MicroPython 代码块:

  1# SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
  2#
  3# SPDX-License-Identifier: MIT
  4
  5import os, sys, io
  6import M5
  7from M5 import *
  8from hardware import Pin
  9from hardware import I2C
 10from unit import DoF10Unit
 11import time
 12
 13
 14title = None
 15live = None
 16pressure_caption = None
 17label_pressure = None
 18pressure_unit = None
 19altitude_caption = None
 20label_altitude = None
 21altitude_unit = None
 22temperature_caption = None
 23label_temperature = None
 24temperature_unit = None
 25sea_level_caption = None
 26i2c0 = None
 27dof10_0 = None
 28
 29
 30UPDATE_DURATION_MS = None
 31last_time = None
 32
 33
 34def setup():
 35    global \
 36        title, \
 37        live, \
 38        pressure_caption, \
 39        label_pressure, \
 40        pressure_unit, \
 41        altitude_caption, \
 42        label_altitude, \
 43        altitude_unit, \
 44        temperature_caption, \
 45        label_temperature, \
 46        temperature_unit, \
 47        sea_level_caption, \
 48        i2c0, \
 49        dof10_0, \
 50        UPDATE_DURATION_MS, \
 51        last_time
 52
 53    M5.begin()
 54    Widgets.setRotation(0)
 55    Widgets.fillScreen(0x10171D)
 56    title = Widgets.Label(
 57        "DoF10 / Barometer", 12, 8, 1.0, 0x4CD7D0, 0x10171D, Widgets.FONTS.Montserrat18
 58    )
 59    live = Widgets.Label("Live", 272, 11, 1.0, 0x63D08C, 0x10171D, Widgets.FONTS.Montserrat14)
 60    pressure_caption = Widgets.Label(
 61        "Pressure", 12, 44, 1.0, 0x8FA1AD, 0x10171D, Widgets.FONTS.Montserrat14
 62    )
 63    label_pressure = Widgets.Label(
 64        "----.--", 12, 62, 1.0, 0xF2F6F8, 0x10171D, Widgets.FONTS.Montserrat40
 65    )
 66    pressure_unit = Widgets.Label(
 67        "hPa", 170, 84, 1.0, 0x4CD7D0, 0x10171D, Widgets.FONTS.Montserrat18
 68    )
 69    altitude_caption = Widgets.Label(
 70        "Altitude", 12, 132, 1.0, 0x8FA1AD, 0x10171D, Widgets.FONTS.Montserrat14
 71    )
 72    label_altitude = Widgets.Label(
 73        "---.-", 12, 151, 1.0, 0xF2F6F8, 0x10171D, Widgets.FONTS.Montserrat24
 74    )
 75    altitude_unit = Widgets.Label(
 76        "m", 116, 158, 1.0, 0x63A8FF, 0x10171D, Widgets.FONTS.Montserrat18
 77    )
 78    temperature_caption = Widgets.Label(
 79        "SPL06 Temp", 170, 132, 1.0, 0x8FA1AD, 0x10171D, Widgets.FONTS.Montserrat14
 80    )
 81    label_temperature = Widgets.Label(
 82        "--.-", 170, 151, 1.0, 0xFFB454, 0x10171D, Widgets.FONTS.Montserrat24
 83    )
 84    temperature_unit = Widgets.Label(
 85        "DEG C", 244, 158, 1.0, 0x8FA1AD, 0x10171D, Widgets.FONTS.Montserrat14
 86    )
 87    sea_level_caption = Widgets.Label(
 88        "SEA LEVEL  1013.25 hPa", 12, 211, 1.0, 0x8FA1AD, 0x10171D, Widgets.FONTS.Montserrat14
 89    )
 90
 91    i2c0 = I2C(0, scl=Pin(1), sda=Pin(2), freq=400000)
 92    dof10_0 = DoF10Unit(i2c0, addr=0x68)
 93    dof10_0.set_sea_level_pressure(1013.25)
 94    UPDATE_DURATION_MS = 100
 95    last_time = time.ticks_ms()
 96
 97
 98def loop():
 99    global \
100        title, \
101        live, \
102        pressure_caption, \
103        label_pressure, \
104        pressure_unit, \
105        altitude_caption, \
106        label_altitude, \
107        altitude_unit, \
108        temperature_caption, \
109        label_temperature, \
110        temperature_unit, \
111        sea_level_caption, \
112        i2c0, \
113        dof10_0, \
114        UPDATE_DURATION_MS, \
115        last_time
116    M5.update()
117    if (time.ticks_diff((time.ticks_ms()), last_time)) >= UPDATE_DURATION_MS:
118        last_time = time.ticks_ms()
119        label_pressure.setText(str(round(dof10_0.get_pressure(), 2)))
120        label_altitude.setText(str(round(dof10_0.get_altitude(), 1)))
121        label_temperature.setText(str(round(dof10_0.get_temperature("pressure"), 1)))
122
123
124if __name__ == "__main__":
125    try:
126        setup()
127        while True:
128            loop()
129    except (Exception, KeyboardInterrupt) as e:
130        try:
131            from utility import print_error_msg
132
133            print_error_msg(e)
134        except ImportError:
135            print("please update to latest firmware")

示例输出:

无

API

DoF10Unit

构造函数

class DoF10Unit(i2c, addr=0x68)

在主机 I2C 总线上创建 DoF10Unit。BMI270 地址可选 0x68 或 0x69,默认为 0x68。BMM350 和 SPL06-001 地址仍为 0x14 和 0x76。

参数:
  • i2c (I2C or PAHUBUnit) – 已初始化的 I2C 或 PAHUBUnit 接口。

  • addr (int) – BMI270 I2C 地址,可选 0x68 或 0x69,默认为 0x68。

抛出:
  • TypeError – addr 必须为整数。

  • ValueError – addr 必须为 0x68 或 0x69。

  • UnitError – 所选地址未检测到 BMI270。

  • OSError – 传感器初始化或 I2C 通信失败。

UiFlow2 代码块:

init.png

MicroPython 代码块:

dof = DoF10Unit(i2c)  # Default BMI270 address: 0x68
# Use this instead when the BMI270 is configured at 0x69:
# dof = DoF10Unit(i2c, addr=0x69)

方法

下面列出了完整的 DoF10 接口。

get_accel()

返回映射后的加速度 (x, y, z),单位为 m/s2。

返回:

加速度元组。

返回类型:

tuple[float, float, float]

UiFlow2 代码块:

get_accel.png

get_accel_raw()

返回范围为 -32768 到 32767 的有符号 16 位 BMI270 计数值。

返回:

原始加速度计数值。

返回类型:

tuple[int, int, int]

UiFlow2 代码块:

get_accel_raw.png

get_gyro()

返回经过映射和偏移校正的角速度 (x, y, z),单位为 rad/s。

返回:

角速度元组。

返回类型:

tuple[float, float, float]

UiFlow2 代码块:

get_gyro.png

get_gyro_raw()

返回范围为 -32768 到 32767 的有符号 16 位 BMI270 陀螺仪计数值。

返回:

原始陀螺仪计数值。

返回类型:

tuple[int, int, int]

UiFlow2 代码块:

get_gyro_raw.png

get_mag()

返回经过映射和校准的磁场 (x, y, z),单位为 uT。

返回:

磁场元组。

返回类型:

tuple[float, float, float]

UiFlow2 代码块:

get_mag.png

get_mag_raw()

返回范围为 -8388608 到 8388607 的有符号 24 位 BMM350 计数值。

返回:

原始磁场计数值。

返回类型:

tuple[int, int, int]

UiFlow2 代码块:

get_mag_raw.png

get_temperature(sensor='pressure')

返回温度,单位为摄氏度。sensor 可接受 "imu"、"magnetometer" 或 "pressure",默认值为 "pressure"。

参数:

sensor (str) – 温度来源。

返回:

温度,单位为摄氏度。

返回类型:

float

UiFlow2 代码块:

get_temperature.png

get_pressure()

返回补偿后的大气压,单位为 hPa。

返回:

气压,单位为 hPa。

返回类型:

float

UiFlow2 代码块:

get_pressure.png

get_altitude()

根据配置的海平面气压返回气压高度,单位为米。

返回:

高度,单位为米。

返回类型:

float

UiFlow2 代码块:

get_altitude.png

set_sea_level_pressure(pressure)

设置海平面参考气压,单位为 hPa,默认值为 1013.25。

参数:

pressure (float) – 参考气压,单位为 hPa。

抛出:

ValueError – 如果气压不是正数。

UiFlow2 代码块:

set_sea_level_pressure.png

get_heading()

采样运动和磁场数据并返回经过倾斜补偿的航向角,范围为 0 到小于 360 度。

返回:

航向角,单位为度。

返回类型:

float

UiFlow2 代码块:

get_heading.png

get_attitude()

采样运动和磁场数据并返回 (yaw, pitch, roll),单位为度。

返回:

姿态角,单位为度。

返回类型:

tuple[float, float, float]

UiFlow2 代码块:

get_attitude.png

set_accel_range(accel_scale)

设置为 ACCEL_RANGE_2G、ACCEL_RANGE_4G、ACCEL_RANGE_8G 或 ACCEL_RANGE_16G 之一。

参数:

accel_scale (int) – 满量程范围,单位为 g。

UiFlow2 代码块:

set_accel_range.png

set_gyro_range(gyro_scale)

设置为 GYRO_RANGE_125DPS、GYRO_RANGE_250DPS、GYRO_RANGE_500DPS、GYRO_RANGE_1000DPS 或 GYRO_RANGE_2000DPS 之一。

参数:

gyro_scale (int) – 满量程范围,单位为 deg/s。

UiFlow2 代码块:

set_gyro_range.png

set_accel_gyro_odr(accel_odr, gyro_odr)

使用 ACCEL_ODR_VALUES 和 GYRO_ODR_VALUES 设置 BMI270 输出数据率。

参数:
  • accel_odr (float) – 加速度计输出数据率,单位为 Hz。

  • gyro_odr (int) – 陀螺仪输出数据率,单位为 Hz。

UiFlow2 代码块:

set_accel_gyro_odr.png

set_gyro_offsets(x, y, z)

设置映射后的陀螺仪偏移量,单位为 rad/s。

参数:
  • x (float) – X 轴偏移量,单位为 rad/s。

  • y (float) – Y 轴偏移量,单位为 rad/s。

  • z (float) – Z 轴偏移量,单位为 rad/s。

UiFlow2 代码块:

set_gyro_offsets.png

calibrate_gyro(samples=32)

设备静止时估算偏移量,成功时返回 True。

参数:

samples (int) – 采样次数。

返回:

校准是否成功。

返回类型:

bool

UiFlow2 代码块:

calibrate_gyro.png

set_magnetometer_calibration(offsets, scales)

设置硬铁偏移量(单位为 uT)和无量纲软铁比例因子。

参数:

UiFlow2 代码块:

set_magnetometer_calibration.png

set_axis_mapping(sensor, x_axis, y_axis, z_axis)

映射 accelerometer、gyroscope 或 magnetometer 轴。1/-1、2/-2 和 3/-3 分别选择带符号的源 X/Y/Z 轴;源轴不能重复。

参数:
  • sensor (str) – 传感器名称。

  • x_axis (int) – 输出 X 轴对应的源轴。

  • y_axis (int) – 输出 Y 轴对应的源轴。

  • z_axis (int) – 输出 Z 轴对应的源轴。

UiFlow2 代码块:

set_axis_mapping.png

set_fusion_time_constant(seconds)

设置非负的互补滤波器时间常数,单位为秒。

参数:

seconds (float) – 非负滤波器时间常数。

UiFlow2 代码块:

set_fusion_time_constant.png

reset_fusion()

重置姿态滤波器;下一次姿态采样时会重新初始化。

UiFlow2 代码块:

reset_fusion.png