2
2
3
3
from machine import Pin , I2C
4
4
import math
5
+ import utime
5
6
6
7
MPU6050_ADDR = const (0x68 )
7
8
LSM303AGR_ACC_ADDR = const (0x19 )
10
11
MPU6050 = const (0 )
11
12
LSM303AGR = const (1 )
12
13
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 ]
16
17
temp = 0.0
17
18
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
+
18
36
# Check sensor on board
19
37
i2c1 = I2C (1 , scl = Pin (5 ), sda = Pin (4 ), freq = 100000 )
20
38
devAddrs = i2c1 .scan ()
27
45
28
46
if __device == MPU6050 :
29
47
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
31
49
i2c1 .writeto_mem (MPU6050_ADDR , 0x1B , b'\x00 ' ) # 250 */sec
32
50
elif __device == LSM303AGR :
33
51
i2c1 .writeto_mem (LSM303AGR_ACC_ADDR , 0x2E , b'\x00 ' ) # FIFO_CTRL_REG_A
34
52
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
+
37
55
i2c1 .writeto_mem (LSM303AGR_MEG_ADDR , 0x60 , b'\x8C ' ) # CFG_REG_A_M
38
56
i2c1 .writeto_mem (LSM303AGR_MEG_ADDR , 0x61 , b'\x01 ' ) # CFG_REG_B_M
39
57
@@ -48,26 +66,29 @@ def update():
48
66
buff = i2c1 .readfrom_mem (MPU6050_ADDR , 0x3B , 14 )
49
67
for i in range (3 ):
50
68
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 )
52
70
x = - acc [1 ]
53
71
y = acc [0 ]
54
72
z = - acc [2 ]
55
73
acc [0 ] = x
56
74
acc [1 ] = y
57
75
acc [2 ] = z
76
+ acc [3 ] = math .sqrt (math .pow (acc [0 ], 2 ) + math .pow (acc [1 ], 2 ) + math .pow (acc [2 ], 2 ))
58
77
del x , y , z
59
78
temp = round (b2i (buff [6 ], buff [7 ]) / 340.00 + 36.53 , 2 )
60
79
for i in range (3 ):
61
80
gyro [i ] = b2i (buff [(i * 2 ) + 8 ], buff [(i * 2 ) + 9 ])
62
81
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 ))
63
83
elif __device == LSM303AGR :
64
84
buff = [0 , 0 , 0 , 0 , 0 , 0 ]
65
85
for i in range (6 ):
66
86
value = i2c1 .readfrom_mem (LSM303AGR_ACC_ADDR , 0x28 + i , 1 )[0 ]
67
87
buff [i ] = value
68
88
for i in range (3 ):
69
89
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 ))
71
92
acc [0 ] = acc [0 ] * - 1
72
93
acc [1 ] = acc [1 ] * - 1
73
94
buff = [0 , 0 , 0 , 0 , 0 , 0 ]
@@ -76,7 +97,7 @@ def update():
76
97
for i in range (3 ):
77
98
mag [i ] = b2i (buff [(i * 2 ) + 1 ], buff [(i * 2 ) + 0 ])
78
99
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 ))
80
101
81
102
def rotation ():
82
103
x_g_value = acc [0 ] / 1000.0 # Acceleration in x-direction in g units
@@ -216,3 +237,58 @@ def calCRC(data, size):
216
237
sum += data [i ]
217
238
sum = sum ^ 0xFF
218
239
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