Skip to content

Commit e581843

Browse files
SensorManager: add mounted_position to IMUs
1 parent f61ca56 commit e581843

File tree

4 files changed

+63
-26
lines changed

4 files changed

+63
-26
lines changed

internal_filesystem/builtin/apps/com.micropythonos.settings/assets/calibrate_imu.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,19 @@ def onCreate(self):
4949
screen.set_style_pad_all(mpos.ui.pct_of_display_width(3), 0)
5050
screen.set_flex_flow(lv.FLEX_FLOW.COLUMN)
5151
screen.set_flex_align(lv.FLEX_ALIGN.CENTER, lv.FLEX_ALIGN.START, lv.FLEX_ALIGN.CENTER)
52+
focusgroup = lv.group_get_default()
53+
if focusgroup:
54+
focusgroup.add_obj(screen)
5255

5356
# Title
5457
self.title_label = lv.label(screen)
5558
self.title_label.set_text("IMU Calibration")
56-
self.title_label.set_style_text_font(lv.font_montserrat_20, 0)
59+
self.title_label.set_style_text_font(lv.font_montserrat_16, 0)
5760

5861
# Status label
5962
self.status_label = lv.label(screen)
6063
self.status_label.set_text("Initializing...")
61-
self.status_label.set_style_text_font(lv.font_montserrat_16, 0)
64+
self.status_label.set_style_text_font(lv.font_montserrat_12, 0)
6265
self.status_label.set_long_mode(lv.label.LONG_MODE.WRAP)
6366
self.status_label.set_width(lv.pct(90))
6467

@@ -71,7 +74,7 @@ def onCreate(self):
7174
# Detail label (for additional info)
7275
self.detail_label = lv.label(screen)
7376
self.detail_label.set_text("")
74-
self.detail_label.set_style_text_font(lv.font_montserrat_12, 0)
77+
self.detail_label.set_style_text_font(lv.font_montserrat_10, 0)
7578
self.detail_label.set_style_text_color(lv.color_hex(0x888888), 0)
7679
self.detail_label.set_long_mode(lv.label.LONG_MODE.WRAP)
7780
self.detail_label.set_width(lv.pct(90))
@@ -82,6 +85,7 @@ def onCreate(self):
8285
btn_cont.set_height(lv.SIZE_CONTENT)
8386
btn_cont.set_style_border_width(0, 0)
8487
btn_cont.set_flex_flow(lv.FLEX_FLOW.ROW)
88+
btn_cont.set_style_pad_all(1,0)
8589
btn_cont.set_style_flex_main_place(lv.FLEX_ALIGN.SPACE_BETWEEN, 0)
8690

8791
# Action button

internal_filesystem/builtin/apps/com.micropythonos.settings/assets/check_imu_calibration.py

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,12 @@ def __init__(self):
3636

3737
def onCreate(self):
3838
screen = lv.obj()
39-
screen.set_style_pad_all(mpos.ui.pct_of_display_width(2), 0)
39+
screen.set_style_pad_all(mpos.ui.pct_of_display_width(1), 0)
40+
#screen.set_style_pad_all(0, 0)
4041
screen.set_flex_flow(lv.FLEX_FLOW.COLUMN)
42+
focusgroup = lv.group_get_default()
43+
if focusgroup:
44+
focusgroup.add_obj(screen)
4145
self.setContentView(screen)
4246

4347
def onResume(self, screen):
@@ -50,11 +54,6 @@ def onResume(self, screen):
5054
self.accel_labels = []
5155
self.gyro_labels = []
5256

53-
# Title
54-
title = lv.label(screen)
55-
title.set_text("IMU Calibration Check")
56-
title.set_style_text_font(lv.font_montserrat_20, 0)
57-
5857
# Status label
5958
self.status_label = lv.label(screen)
6059
self.status_label.set_text("Checking...")
@@ -68,34 +67,57 @@ def onResume(self, screen):
6867
# Quality score (large, prominent)
6968
self.quality_score_label = lv.label(screen)
7069
self.quality_score_label.set_text("Quality: --")
71-
self.quality_score_label.set_style_text_font(lv.font_montserrat_20, 0)
70+
self.quality_score_label.set_style_text_font(lv.font_montserrat_16, 0)
71+
72+
data_cont = lv.obj(screen)
73+
data_cont.set_width(lv.pct(100))
74+
data_cont.set_height(lv.SIZE_CONTENT)
75+
data_cont.set_style_pad_all(0, 0)
76+
data_cont.set_style_bg_opa(lv.OPA.TRANSP, 0)
77+
data_cont.set_style_border_width(0, 0)
78+
data_cont.set_flex_flow(lv.FLEX_FLOW.ROW)
79+
data_cont.set_style_flex_main_place(lv.FLEX_ALIGN.SPACE_BETWEEN, 0)
7280

7381
# Accelerometer section
74-
accel_title = lv.label(screen)
75-
accel_title.set_text("Accelerometer (m/s²)")
76-
accel_title.set_style_text_font(lv.font_montserrat_14, 0)
82+
acc_cont = lv.obj(data_cont)
83+
acc_cont.set_height(lv.SIZE_CONTENT)
84+
acc_cont.set_width(lv.pct(45))
85+
acc_cont.set_style_border_width(0, 0)
86+
acc_cont.set_style_pad_all(0, 0)
87+
acc_cont.set_flex_flow(lv.FLEX_FLOW.COLUMN)
88+
89+
accel_title = lv.label(acc_cont)
90+
accel_title.set_text("Accel. (m/s^2)")
91+
accel_title.set_style_text_font(lv.font_montserrat_12, 0)
7792

7893
for axis in ['X', 'Y', 'Z']:
79-
label = lv.label(screen)
94+
label = lv.label(acc_cont)
8095
label.set_text(f"{axis}: --")
81-
label.set_style_text_font(lv.font_montserrat_12, 0)
96+
label.set_style_text_font(lv.font_montserrat_10, 0)
8297
self.accel_labels.append(label)
8398

8499
# Gyroscope section
85-
gyro_title = lv.label(screen)
86-
gyro_title.set_text("Gyroscope (deg/s)")
87-
gyro_title.set_style_text_font(lv.font_montserrat_14, 0)
100+
gyro_cont = lv.obj(data_cont)
101+
gyro_cont.set_width(mpos.ui.pct_of_display_width(45))
102+
gyro_cont.set_height(lv.SIZE_CONTENT)
103+
gyro_cont.set_style_border_width(0, 0)
104+
gyro_cont.set_style_pad_all(0, 0)
105+
gyro_cont.set_flex_flow(lv.FLEX_FLOW.COLUMN)
106+
107+
gyro_title = lv.label(gyro_cont)
108+
gyro_title.set_text("Gyro (deg/s)")
109+
gyro_title.set_style_text_font(lv.font_montserrat_12, 0)
88110

89111
for axis in ['X', 'Y', 'Z']:
90-
label = lv.label(screen)
112+
label = lv.label(gyro_cont)
91113
label.set_text(f"{axis}: --")
92-
label.set_style_text_font(lv.font_montserrat_12, 0)
114+
label.set_style_text_font(lv.font_montserrat_10, 0)
93115
self.gyro_labels.append(label)
94116

95117
# Separator
96-
sep2 = lv.obj(screen)
97-
sep2.set_size(lv.pct(100), 2)
98-
sep2.set_style_bg_color(lv.color_hex(0x666666), 0)
118+
#sep2 = lv.obj(screen)
119+
#sep2.set_size(lv.pct(100), 2)
120+
#sep2.set_style_bg_color(lv.color_hex(0x666666), 0)
99121

100122
# Issues label
101123
self.issues_label = lv.label(screen)
@@ -107,6 +129,7 @@ def onResume(self, screen):
107129

108130
# Button container
109131
btn_cont = lv.obj(screen)
132+
btn_cont.set_style_pad_all(5, 0)
110133
btn_cont.set_width(lv.pct(100))
111134
btn_cont.set_height(lv.SIZE_CONTENT)
112135
btn_cont.set_style_border_width(0, 0)

internal_filesystem/lib/mpos/board/fri3d_2024.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ def adc_to_voltage(adc_value):
323323
# Create I2C bus for IMU (different pins from display)
324324
from machine import I2C
325325
imu_i2c = I2C(0, sda=Pin(9), scl=Pin(18))
326-
SensorManager.init(imu_i2c, address=0x6B)
326+
SensorManager.init(imu_i2c, address=0x6B, mounted_position=SensorManager.FACING_EARTH)
327327

328328
print("Fri3d hardware: Audio, LEDs, and sensors initialized")
329329

internal_filesystem/lib/mpos/sensor_manager.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,18 @@
2525
except ImportError:
2626
_lock = None
2727

28+
2829
# Sensor type constants (matching Android SensorManager)
2930
TYPE_ACCELEROMETER = 1 # Units: m/s² (meters per second squared)
3031
TYPE_GYROSCOPE = 4 # Units: deg/s (degrees per second)
3132
TYPE_TEMPERATURE = 13 # Units: °C (generic, returns first available - deprecated)
3233
TYPE_IMU_TEMPERATURE = 14 # Units: °C (IMU chip temperature)
3334
TYPE_SOC_TEMPERATURE = 15 # Units: °C (MCU/SoC internal temperature)
3435

36+
# mounted_position:
37+
FACING_EARTH = 20 # underside of PCB, like fri3d_2024
38+
FACING_SKY = 21 # top of PCB, like waveshare_esp32_s3_lcd_touch_2 (default)
39+
3540
# Gravity constant for unit conversions
3641
_GRAVITY = 9.80665 # m/s²
3742

@@ -41,6 +46,7 @@
4146
_sensor_list = []
4247
_i2c_bus = None
4348
_i2c_address = None
49+
_mounted_position = FACING_SKY
4450
_has_mcu_temperature = False
4551

4652

@@ -71,7 +77,7 @@ def __repr__(self):
7177
return f"Sensor({self.name}, type={self.type})"
7278

7379

74-
def init(i2c_bus, address=0x6B):
80+
def init(i2c_bus, address=0x6B, mounted_position=FACING_SKY):
7581
"""Initialize SensorManager. MCU temperature initializes immediately, IMU initializes on first use.
7682
7783
Args:
@@ -85,6 +91,7 @@ def init(i2c_bus, address=0x6B):
8591

8692
_i2c_bus = i2c_bus
8793
_i2c_address = address
94+
_mounted_position = mounted_position
8895

8996
# Initialize MCU temperature sensor immediately (fast, no I2C needed)
9097
try:
@@ -218,7 +225,10 @@ def read_sensor(sensor):
218225
try:
219226
if sensor.type == TYPE_ACCELEROMETER:
220227
if _imu_driver:
221-
return _imu_driver.read_acceleration()
228+
ax, ay, az = _imu_driver.read_acceleration()
229+
if _mounted_position == SensorManager.FACING_EARTH:
230+
az += _GRAVITY
231+
return (ax, ay, az)
222232
elif sensor.type == TYPE_GYROSCOPE:
223233
if _imu_driver:
224234
return _imu_driver.read_gyroscope()

0 commit comments

Comments
 (0)