Skip to content

Commit 4d4e836

Browse files
Add IMU app
1 parent f8676c8 commit 4d4e836

File tree

3 files changed

+119
-0
lines changed

3 files changed

+119
-0
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"name": "IMU",
3+
"publisher": "MicroPythonOS",
4+
"short_description": "Inertial Measurement Unit Visualization",
5+
"long_description": "Visualize data from the Intertial Measurement Unit, also known as the accellerometer.",
6+
"icon_url": "https://apps.micropythonos.com/apps/com.micropythonos.helloworld/icons/com.micropythonos.imu.0.0.1_64x64.png",
7+
"download_url": "https://apps.micropythonos.com/apps/com.micropythonos.helloworld/mpks/com.micropythonos.mu.0.0.1.mpk",
8+
"fullname": "com.micropythonos.imu",
9+
"version": "0.0.1",
10+
"category": "hardware",
11+
"activities": [
12+
{
13+
"entrypoint": "assets/imu.py",
14+
"classname": "IMU",
15+
"intent_filters": [
16+
{
17+
"action": "main",
18+
"category": "launcher"
19+
}
20+
]
21+
}
22+
]
23+
}
24+
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
from mpos.apps import Activity
2+
3+
class IMU(Activity):
4+
5+
sensor = None
6+
refresh_timer = None
7+
8+
# widgets:
9+
sliderx = None
10+
slidery = None
11+
sliderz = None
12+
slidergx = None
13+
slidergy = None
14+
slidergz = None
15+
16+
def onCreate(self):
17+
screen = lv.obj()
18+
self.templabel = lv.label(screen)
19+
self.templabel.align(lv.ALIGN.TOP_MID, 0, 10)
20+
self.sliderx = lv.slider(screen)
21+
self.sliderx.align(lv.ALIGN.CENTER, 0, -60)
22+
self.slidery = lv.slider(screen)
23+
self.slidery.align(lv.ALIGN.CENTER, 0, -30)
24+
self.sliderz = lv.slider(screen)
25+
self.sliderz.align(lv.ALIGN.CENTER, 0, 0)
26+
self.slidergx = lv.slider(screen)
27+
self.slidergx.align(lv.ALIGN.CENTER, 0, 30)
28+
self.slidergy = lv.slider(screen)
29+
self.slidergy.align(lv.ALIGN.CENTER, 0, 60)
30+
self.slidergz = lv.slider(screen)
31+
self.slidergz.align(lv.ALIGN.CENTER, 0, 90)
32+
try:
33+
from machine import Pin, I2C
34+
from qmi8658 import QMI8658
35+
import machine
36+
self.sensor = QMI8658(I2C(0, sda=machine.Pin(48), scl=machine.Pin(47)))
37+
except Exception as e:
38+
warning = f"Warning: could not initialize IMU hardware:\n{e}"
39+
print(warning)
40+
self.templabel.set_text(warning)
41+
self.setContentView(screen)
42+
43+
def onStart(self, screen):
44+
self.refresh_timer = lv.timer_create(self.refresh, 100, None)
45+
46+
def onStop(self, screen):
47+
if self.refresh_timer:
48+
self.refresh_timer.delete()
49+
50+
51+
def map_nonlinear(self, value: float) -> int:
52+
# Preserve sign and work with absolute value
53+
sign = 1 if value >= 0 else -1
54+
abs_value = abs(value)
55+
# Apply non-linear transformation (square root) to absolute value
56+
# Scale input range [0, 200] to [0, sqrt(200)] first
57+
sqrt_value = (abs_value ** 0.5)
58+
# Scale to output range [0, 100]
59+
# Map [0, sqrt(200)] to [50, 100] for positive, [0, 50] for negative
60+
max_sqrt = 200.0 ** 0.5 # Approx 14.142
61+
scaled = (sqrt_value / max_sqrt) * 50.0 # Scale to [0, 50]
62+
return int(50.0 + (sign * scaled)) # Shift to [0, 100]
63+
64+
def refresh(self, timer):
65+
if self.sensor:
66+
#print(f"""{sensor.temperature=} {sensor.acceleration=} {sensor.gyro=}""")
67+
temp = self.sensor.temperature
68+
ax = self.sensor.acceleration[0]
69+
axp = int((ax * 100 + 100)/2)
70+
ay = self.sensor.acceleration[1]
71+
ayp = int((ay * 100 + 100)/2)
72+
az = self.sensor.acceleration[2]
73+
azp = int((az * 100 + 100)/2)
74+
# values between -200 and 200 => /4 becomes -50 and 50 => +50 becomes 0 and 100
75+
gx = self.map_nonlinear(self.sensor.gyro[0])
76+
gy = self.map_nonlinear(self.sensor.gyro[1])
77+
gz = self.map_nonlinear(self.sensor.gyro[2])
78+
self.templabel.set_text(f"IMU chip temperature: {temp:.2f}°C")
79+
else:
80+
#temp = 12.34
81+
import random
82+
randomnr = random.randint(0,100)
83+
axp = randomnr
84+
ayp = 50
85+
azp = 75
86+
gx = 45
87+
gy = 50
88+
gz = 55
89+
self.sliderx.set_value(axp, lv.ANIM.OFF)
90+
self.slidery.set_value(ayp, lv.ANIM.OFF)
91+
self.sliderz.set_value(azp, lv.ANIM.OFF)
92+
self.slidergx.set_value(gx, lv.ANIM.OFF)
93+
self.slidergy.set_value(gy, lv.ANIM.OFF)
94+
self.slidergz.set_value(gz, lv.ANIM.OFF)
95+
5.87 KB
Loading

0 commit comments

Comments
 (0)