60
60
_ICM20X_REG_INT_ENABLE_0 = 0x10 # Interrupt enable register 0
61
61
_ICM20X_REG_INT_ENABLE_1 = 0x11 # Interrupt enable register 1
62
62
63
+ _ICM20X_REG_INT_STATUS_0 = (
64
+ 0x19 # Interrupt status register 0 Wake on motion, DMP int, i2c int
65
+ )
66
+ _ICM20X_REG_INT_STATUS_1 = (
67
+ 0x1A # Interrupt status register 1 data register from all sensors
68
+ )
69
+ _ICM20X_REG_INT_STATUS_2 = 0x1B # Interrupt status register 2 FIFO overflow
70
+ _ICM20X_REG_INT_STATUS_3 = 0x1C # Interrupt status register 3 Watermark interrupt
71
+
63
72
# Bank 2
64
73
_ICM20X_GYRO_SMPLRT_DIV = 0x00
65
74
_ICM20X_GYRO_CONFIG_1 = 0x01
@@ -159,6 +168,8 @@ class ICM20X: # pylint:disable=too-many-instance-attributes
159
168
160
169
_lp_config_reg = UnaryStruct (_ICM20X_LP_CONFIG , ">B" )
161
170
171
+ _data_ready = ROBit (_ICM20X_REG_INT_STATUS_1 , 0 )
172
+
162
173
_i2c_master_cycle_en = RWBit (_ICM20X_LP_CONFIG , 6 )
163
174
_accel_cycle_en = RWBit (_ICM20X_LP_CONFIG , 5 )
164
175
_gyro_cycle_en = RWBit (_ICM20X_LP_CONFIG , 4 )
@@ -237,6 +248,8 @@ def initialize(self):
237
248
self .accelerometer_data_rate_divisor = 20 # ~53.57Hz
238
249
self .gyro_data_rate_divisor = 10 # ~100Hz
239
250
251
+ self ._gravity = G_TO_ACCEL
252
+
240
253
def reset (self ):
241
254
"""Resets the internal registers and restores the default settings"""
242
255
self ._bank = 0
@@ -247,6 +260,11 @@ def reset(self):
247
260
while self ._reset :
248
261
sleep (0.005 )
249
262
263
+ def data_ready (self ):
264
+ """Checks if new data is available"""
265
+ self ._bank = 0
266
+ return self ._data_ready
267
+
250
268
@property
251
269
def _sleep (self ):
252
270
self ._bank = 0
@@ -286,7 +304,9 @@ def gyro(self):
286
304
return (x , y , z )
287
305
288
306
def _scale_xl_data (self , raw_measurement ):
289
- return raw_measurement / AccelRange .lsb [self ._cached_accel_range ] * G_TO_ACCEL
307
+ return (
308
+ raw_measurement / AccelRange .lsb [self ._cached_accel_range ] * self ._gravity
309
+ )
290
310
291
311
def _scale_gyro_data (self , raw_measurement ):
292
312
return (
@@ -422,7 +442,8 @@ def accelerometer_data_rate(self, value):
422
442
raise AttributeError (
423
443
"Accelerometer data rate must be between 0.27 and 1125.0"
424
444
)
425
- self .accelerometer_data_rate_divisor = value
445
+ divisor = round (((1125.0 - value ) / value ))
446
+ self .accelerometer_data_rate_divisor = divisor
426
447
427
448
@property
428
449
def gyro_data_rate (self ):
@@ -445,8 +466,7 @@ def gyro_data_rate(self):
445
466
def gyro_data_rate (self , value ):
446
467
if value < self ._gyro_rate_calc (4095 ) or value > self ._gyro_rate_calc (0 ):
447
468
raise AttributeError ("Gyro data rate must be between 4.30 and 1100.0" )
448
-
449
- divisor = round (((1125.0 - value ) / value ))
469
+ divisor = round (((1100.0 - value ) / value ))
450
470
self .gyro_data_rate_divisor = divisor
451
471
452
472
@property
@@ -511,6 +531,15 @@ def _low_power(self, enabled):
511
531
self ._bank = 0
512
532
self ._low_power_en = enabled
513
533
534
+ @property
535
+ def gravity (self ):
536
+ """The gravity magnitude in m/s^2."""
537
+ return self ._gravity
538
+
539
+ @gravity .setter
540
+ def gravity (self , value ):
541
+ self ._gravity = value
542
+
514
543
515
544
class ICM20649 (ICM20X ):
516
545
"""Library for the ST ICM-20649 Wide-Range 6-DoF Accelerometer and Gyro.
@@ -740,7 +769,7 @@ def _mag_id(self):
740
769
741
770
@property
742
771
def magnetic (self ):
743
- """The current magnetic field strengths onthe X, Y, and Z axes in uT (micro-teslas)"""
772
+ """The current magnetic field strengths on the X, Y, and Z axes in uT (micro-teslas)"""
744
773
745
774
self ._bank = 0
746
775
full_data = self ._raw_mag_data
0 commit comments