DoF10 Unit
此库是 Unit DoF10 的驱动程序。
支持以下产品:
UiFlow2 应用示例
读取加速度
在 UiFlow2 中打开 cores3_unit_dof10_accel_example.m5f2 项目。
此示例演示如何读取并显示 X、Y、Z 轴加速度。
UiFlow2 代码块:
示例输出:
无
读取气压计
在 UiFlow2 中打开 cores3_unit_dof10_barometer_example.m5f2 项目。
此示例演示如何读取并显示气压、海拔和温度。
UiFlow2 代码块:
示例输出:
无
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。- 参数:
- 抛出:
TypeError – addr 必须为整数。
ValueError – addr 必须为 0x68 或 0x69。
UnitError – 所选地址未检测到 BMI270。
OSError – 传感器初始化或 I2C 通信失败。
UiFlow2 代码块:

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_raw()
返回范围为
-32768到32767的有符号 16 位 BMI270 计数值。UiFlow2 代码块:

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

- get_gyro_raw()
返回范围为
-32768到32767的有符号 16 位 BMI270 陀螺仪计数值。UiFlow2 代码块:

- get_mag_raw()
返回范围为
-8388608到8388607的有符号 24 位 BMM350 计数值。UiFlow2 代码块:

- get_temperature(sensor='pressure')
返回温度,单位为摄氏度。
sensor可接受"imu"、"magnetometer"或"pressure",默认值为"pressure"。UiFlow2 代码块:

- get_pressure()
返回补偿后的大气压,单位为
hPa。- 返回:
气压,单位为 hPa。
- 返回类型:
UiFlow2 代码块:

- get_altitude()
根据配置的海平面气压返回气压高度,单位为米。
- 返回:
高度,单位为米。
- 返回类型:
UiFlow2 代码块:

- set_sea_level_pressure(pressure)
设置海平面参考气压,单位为
hPa,默认值为 1013.25。- 参数:
pressure (float) – 参考气压,单位为 hPa。
- 抛出:
ValueError – 如果气压不是正数。
UiFlow2 代码块:

- get_heading()
采样运动和磁场数据并返回经过倾斜补偿的航向角,范围为 0 到小于 360 度。
- 返回:
航向角,单位为度。
- 返回类型:
UiFlow2 代码块:

- get_attitude()
采样运动和磁场数据并返回
(yaw, pitch, roll),单位为度。UiFlow2 代码块:

- set_accel_range(accel_scale)
设置为
ACCEL_RANGE_2G、ACCEL_RANGE_4G、ACCEL_RANGE_8G或ACCEL_RANGE_16G之一。- 参数:
accel_scale (int) – 满量程范围,单位为 g。
UiFlow2 代码块:

- 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_accel_gyro_odr(accel_odr, gyro_odr)
使用
ACCEL_ODR_VALUES和GYRO_ODR_VALUES设置 BMI270 输出数据率。UiFlow2 代码块:

- set_gyro_offsets(x, y, z)
设置映射后的陀螺仪偏移量,单位为
rad/s。UiFlow2 代码块:

- calibrate_gyro(samples=32)
设备静止时估算偏移量,成功时返回
True。UiFlow2 代码块:

- set_magnetometer_calibration(offsets, scales)
设置硬铁偏移量(单位为
uT)和无量纲软铁比例因子。- 参数:
UiFlow2 代码块:

- set_axis_mapping(sensor, x_axis, y_axis, z_axis)
映射
accelerometer、gyroscope或magnetometer轴。1/-1、2/-2和3/-3分别选择带符号的源 X/Y/Z 轴;源轴不能重复。- 参数:
UiFlow2 代码块:

- set_fusion_time_constant(seconds)
设置非负的互补滤波器时间常数,单位为秒。
- 参数:
seconds (float) – 非负滤波器时间常数。
UiFlow2 代码块:

- reset_fusion()
重置姿态滤波器;下一次姿态采样时会重新初始化。
UiFlow2 代码块:





