Skip to content

Commit be0309f

Browse files
committed
add imu.is_gesture()
1 parent 888647c commit be0309f

File tree

1 file changed

+85
-9
lines changed
  • ports/esp32/boards/KidBright32/modules

1 file changed

+85
-9
lines changed

ports/esp32/boards/KidBright32/modules/imu.py

Lines changed: 85 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from machine import Pin, I2C
44
import math
5+
import utime
56

67
MPU6050_ADDR = const(0x68)
78
LSM303AGR_ACC_ADDR = const(0x19)
@@ -10,11 +11,28 @@
1011
MPU6050 = const(0)
1112
LSM303AGR = const(1)
1213

13-
acc = [0, 0, 0]
14-
gyro = [0, 0, 0]
15-
mag = [0, 0, 0]
14+
acc = [0, 0, 0, 0]
15+
gyro = [0, 0, 0, 0]
16+
mag = [0, 0, 0, 0]
1617
temp = 0.0
1718

19+
EVENT_SHAKE = const(0)
20+
EVENT_BOARD_UP = const(1)
21+
EVENT_BOARD_DOWN = const(2)
22+
EVENT_SCREEN_UP = const(3)
23+
EVENT_SCREEN_DOWN = const(4)
24+
EVENT_TILT_LEFT = const(5)
25+
EVENT_TILT_RIGHT = const(6)
26+
EVENT_FREE_FALL = const(7)
27+
EVENT_3G = const(8)
28+
EVENT_6G = const(9)
29+
EVENT_8G = const(10)
30+
31+
__event_callback = [ None ] * 10
32+
33+
__startCalcLowStrengthContinue = False
34+
__xStartCalc = 0
35+
1836
# Check sensor on board
1937
i2c1 = I2C(1, scl=Pin(5), sda=Pin(4), freq=100000)
2038
devAddrs = i2c1.scan()
@@ -27,13 +45,13 @@
2745

2846
if __device == MPU6050:
2947
i2c1.writeto_mem(MPU6050_ADDR, 0x6B, b'\x00')
30-
i2c1.writeto_mem(MPU6050_ADDR, 0x1C, b'\x00') # 2g
48+
i2c1.writeto_mem(MPU6050_ADDR, 0x1C, b'\x10') # 8g
3149
i2c1.writeto_mem(MPU6050_ADDR, 0x1B, b'\x00') # 250 */sec
3250
elif __device == LSM303AGR:
3351
i2c1.writeto_mem(LSM303AGR_ACC_ADDR, 0x2E, b'\x00') # FIFO_CTRL_REG_A
3452
i2c1.writeto_mem(LSM303AGR_ACC_ADDR, 0x20, b'\x57') # CTRL_REG1_A
35-
# Full-scale selection, 2g
36-
i2c1.writeto_mem(LSM303AGR_ACC_ADDR, 0x23, b'\x00')
53+
i2c1.writeto_mem(LSM303AGR_ACC_ADDR, 0x23, b'\x20') # Full-scale selection, 8g
54+
3755
i2c1.writeto_mem(LSM303AGR_MEG_ADDR, 0x60, b'\x8C') # CFG_REG_A_M
3856
i2c1.writeto_mem(LSM303AGR_MEG_ADDR, 0x61, b'\x01') # CFG_REG_B_M
3957

@@ -48,26 +66,29 @@ def update():
4866
buff = i2c1.readfrom_mem(MPU6050_ADDR, 0x3B, 14)
4967
for i in range(3):
5068
acc[i] = b2i(buff[(i * 2)], buff[(i * 2) + 1])
51-
acc[i] = round(acc[i] / 16384.0 * 1000.0, 2)
69+
acc[i] = round(acc[i] / 4096.0 * 1000.0, 2)
5270
x = -acc[1]
5371
y = acc[0]
5472
z = -acc[2]
5573
acc[0] = x
5674
acc[1] = y
5775
acc[2] = z
76+
acc[3] = math.sqrt(math.pow(acc[0], 2) + math.pow(acc[1], 2) + math.pow(acc[2], 2))
5877
del x, y, z
5978
temp = round(b2i(buff[6], buff[7]) / 340.00 + 36.53, 2)
6079
for i in range(3):
6180
gyro[i] = b2i(buff[(i * 2) + 8], buff[(i * 2) + 9])
6281
gyro[i] = round(gyro[i] / 131.0, 2)
82+
gyro[3] = math.sqrt(math.pow(gyro[0], 2) + math.pow(gyro[1], 2) + math.pow(gyro[2], 2))
6383
elif __device == LSM303AGR:
6484
buff = [0, 0, 0, 0, 0, 0]
6585
for i in range(6):
6686
value = i2c1.readfrom_mem(LSM303AGR_ACC_ADDR, 0x28 + i, 1)[0]
6787
buff[i] = value
6888
for i in range(3):
6989
acc[i] = b2i(buff[(i * 2) + 1], buff[(i * 2) + 0])
70-
acc[i] = round(((acc[i] >> 6) * 3900 + 500) / 1000, 2)
90+
acc[i] = round(((acc[i] >> 6) * 15630 + 500) / 1000, 2)
91+
acc[3] = math.sqrt(math.pow(acc[0], 2) + math.pow(acc[1], 2) + math.pow(acc[2], 2))
7192
acc[0] = acc[0] * -1
7293
acc[1] = acc[1] * -1
7394
buff = [0, 0, 0, 0, 0, 0]
@@ -76,7 +97,7 @@ def update():
7697
for i in range(3):
7798
mag[i] = b2i(buff[(i * 2) + 1], buff[(i * 2) + 0])
7899
mag[i] = round(mag[i] * 1.5 * 0.1, 2)
79-
100+
mag[3] = math.sqrt(math.pow(mag[0], 2) + math.pow(mag[1], 2) + math.pow(mag[2], 2))
80101

81102
def rotation():
82103
x_g_value = acc[0] / 1000.0 # Acceleration in x-direction in g units
@@ -216,3 +237,58 @@ def calCRC(data, size):
216237
sum += data[i]
217238
sum = sum ^ 0xFF
218239
return sum
240+
241+
def is_gesture(event, blocking=True):
242+
global __xStartCalc, __startCalcLowStrengthContinue
243+
if event == EVENT_SHAKE:
244+
return acc[3] > 4000
245+
elif event == EVENT_BOARD_UP:
246+
return acc[1] < -600
247+
elif event == EVENT_BOARD_DOWN:
248+
return acc[1] > 600
249+
elif event == EVENT_SCREEN_UP:
250+
pitch = rotation()[1]
251+
return pitch >= -30 and pitch <= 30
252+
elif event == EVENT_SCREEN_DOWN:
253+
pitch = rotation()[1]
254+
return pitch >= 150 or pitch <= -150
255+
elif event == EVENT_TILT_LEFT:
256+
roll = rotation()[0]
257+
return roll <= -30
258+
elif event == EVENT_TILT_RIGHT:
259+
roll = rotation()[0]
260+
return roll >= 30
261+
elif event == EVENT_FREE_FALL:
262+
if blocking:
263+
lowStrengthContinue = False
264+
for i in range(0, 240, 40):
265+
if acc[3] < 500:
266+
lowStrengthContinue = True
267+
utime.sleep_ms(40)
268+
else:
269+
lowStrengthContinue = False
270+
break
271+
return lowStrengthContinue;
272+
else:
273+
if acc[3] < 500:
274+
if not __startCalcLowStrengthContinue:
275+
__xStartCalc = utime.ticks_ms()
276+
__startCalcLowStrengthContinue = True
277+
else:
278+
if (utime.ticks_ms() - __xStartCalc) >= 220E3:
279+
__startCalcLowStrengthContinue = False
280+
return True
281+
else:
282+
__xStartCalc = 0
283+
__startCalcLowStrengthContinue = False
284+
return False
285+
elif event == EVENT_3G:
286+
return acc[3] > 3000
287+
288+
elif event == EVENT_6G:
289+
return acc[3] > 6000
290+
291+
elif event == EVENT_8G:
292+
return acc[3] > 8000
293+
else:
294+
return False

0 commit comments

Comments
 (0)