50
50
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_LSM9DS1.git"
51
51
52
52
import time
53
+
53
54
try :
54
55
import struct
55
56
except ImportError :
61
62
62
63
# Internal constants and register values:
63
64
# pylint: disable=bad-whitespace
64
- _LSM9DS1_ADDRESS_ACCELGYRO = const (0x6B )
65
- _LSM9DS1_ADDRESS_MAG = const (0x1E )
66
- _LSM9DS1_XG_ID = const (0b01101000 )
67
- _LSM9DS1_MAG_ID = const (0b00111101 )
68
- _LSM9DS1_ACCEL_MG_LSB_2G = 0.061
69
- _LSM9DS1_ACCEL_MG_LSB_4G = 0.122
70
- _LSM9DS1_ACCEL_MG_LSB_8G = 0.244
71
- _LSM9DS1_ACCEL_MG_LSB_16G = 0.732
72
- _LSM9DS1_MAG_MGAUSS_4GAUSS = 0.14
73
- _LSM9DS1_MAG_MGAUSS_8GAUSS = 0.29
74
- _LSM9DS1_MAG_MGAUSS_12GAUSS = 0.43
75
- _LSM9DS1_MAG_MGAUSS_16GAUSS = 0.58
76
- _LSM9DS1_GYRO_DPS_DIGIT_245DPS = 0.00875
77
- _LSM9DS1_GYRO_DPS_DIGIT_500DPS = 0.01750
78
- _LSM9DS1_GYRO_DPS_DIGIT_2000DPS = 0.07000
79
- _LSM9DS1_TEMP_LSB_DEGREE_CELSIUS = 8 # 1°C = 8, 25° = 200, etc.
80
- _LSM9DS1_REGISTER_WHO_AM_I_XG = const (0x0F )
81
- _LSM9DS1_REGISTER_CTRL_REG1_G = const (0x10 )
82
- _LSM9DS1_REGISTER_CTRL_REG2_G = const (0x11 )
83
- _LSM9DS1_REGISTER_CTRL_REG3_G = const (0x12 )
84
- _LSM9DS1_REGISTER_TEMP_OUT_L = const (0x15 )
85
- _LSM9DS1_REGISTER_TEMP_OUT_H = const (0x16 )
86
- _LSM9DS1_REGISTER_STATUS_REG = const (0x17 )
87
- _LSM9DS1_REGISTER_OUT_X_L_G = const (0x18 )
88
- _LSM9DS1_REGISTER_OUT_X_H_G = const (0x19 )
89
- _LSM9DS1_REGISTER_OUT_Y_L_G = const (0x1A )
90
- _LSM9DS1_REGISTER_OUT_Y_H_G = const (0x1B )
91
- _LSM9DS1_REGISTER_OUT_Z_L_G = const (0x1C )
92
- _LSM9DS1_REGISTER_OUT_Z_H_G = const (0x1D )
93
- _LSM9DS1_REGISTER_CTRL_REG4 = const (0x1E )
94
- _LSM9DS1_REGISTER_CTRL_REG5_XL = const (0x1F )
95
- _LSM9DS1_REGISTER_CTRL_REG6_XL = const (0x20 )
96
- _LSM9DS1_REGISTER_CTRL_REG7_XL = const (0x21 )
97
- _LSM9DS1_REGISTER_CTRL_REG8 = const (0x22 )
98
- _LSM9DS1_REGISTER_CTRL_REG9 = const (0x23 )
99
- _LSM9DS1_REGISTER_CTRL_REG10 = const (0x24 )
100
- _LSM9DS1_REGISTER_OUT_X_L_XL = const (0x28 )
101
- _LSM9DS1_REGISTER_OUT_X_H_XL = const (0x29 )
102
- _LSM9DS1_REGISTER_OUT_Y_L_XL = const (0x2A )
103
- _LSM9DS1_REGISTER_OUT_Y_H_XL = const (0x2B )
104
- _LSM9DS1_REGISTER_OUT_Z_L_XL = const (0x2C )
105
- _LSM9DS1_REGISTER_OUT_Z_H_XL = const (0x2D )
106
- _LSM9DS1_REGISTER_WHO_AM_I_M = const (0x0F )
107
- _LSM9DS1_REGISTER_CTRL_REG1_M = const (0x20 )
108
- _LSM9DS1_REGISTER_CTRL_REG2_M = const (0x21 )
109
- _LSM9DS1_REGISTER_CTRL_REG3_M = const (0x22 )
110
- _LSM9DS1_REGISTER_CTRL_REG4_M = const (0x23 )
111
- _LSM9DS1_REGISTER_CTRL_REG5_M = const (0x24 )
112
- _LSM9DS1_REGISTER_STATUS_REG_M = const (0x27 )
113
- _LSM9DS1_REGISTER_OUT_X_L_M = const (0x28 )
114
- _LSM9DS1_REGISTER_OUT_X_H_M = const (0x29 )
115
- _LSM9DS1_REGISTER_OUT_Y_L_M = const (0x2A )
116
- _LSM9DS1_REGISTER_OUT_Y_H_M = const (0x2B )
117
- _LSM9DS1_REGISTER_OUT_Z_L_M = const (0x2C )
118
- _LSM9DS1_REGISTER_OUT_Z_H_M = const (0x2D )
119
- _LSM9DS1_REGISTER_CFG_M = const (0x30 )
120
- _LSM9DS1_REGISTER_INT_SRC_M = const (0x31 )
121
- _MAGTYPE = True
122
- _XGTYPE = False
123
- _SENSORS_GRAVITY_STANDARD = 9.80665
65
+ _LSM9DS1_ADDRESS_ACCELGYRO = const (0x6B )
66
+ _LSM9DS1_ADDRESS_MAG = const (0x1E )
67
+ _LSM9DS1_XG_ID = const (0b01101000 )
68
+ _LSM9DS1_MAG_ID = const (0b00111101 )
69
+ _LSM9DS1_ACCEL_MG_LSB_2G = 0.061
70
+ _LSM9DS1_ACCEL_MG_LSB_4G = 0.122
71
+ _LSM9DS1_ACCEL_MG_LSB_8G = 0.244
72
+ _LSM9DS1_ACCEL_MG_LSB_16G = 0.732
73
+ _LSM9DS1_MAG_MGAUSS_4GAUSS = 0.14
74
+ _LSM9DS1_MAG_MGAUSS_8GAUSS = 0.29
75
+ _LSM9DS1_MAG_MGAUSS_12GAUSS = 0.43
76
+ _LSM9DS1_MAG_MGAUSS_16GAUSS = 0.58
77
+ _LSM9DS1_GYRO_DPS_DIGIT_245DPS = 0.00875
78
+ _LSM9DS1_GYRO_DPS_DIGIT_500DPS = 0.01750
79
+ _LSM9DS1_GYRO_DPS_DIGIT_2000DPS = 0.07000
80
+ _LSM9DS1_TEMP_LSB_DEGREE_CELSIUS = 8 # 1°C = 8, 25° = 200, etc.
81
+ _LSM9DS1_REGISTER_WHO_AM_I_XG = const (0x0F )
82
+ _LSM9DS1_REGISTER_CTRL_REG1_G = const (0x10 )
83
+ _LSM9DS1_REGISTER_CTRL_REG2_G = const (0x11 )
84
+ _LSM9DS1_REGISTER_CTRL_REG3_G = const (0x12 )
85
+ _LSM9DS1_REGISTER_TEMP_OUT_L = const (0x15 )
86
+ _LSM9DS1_REGISTER_TEMP_OUT_H = const (0x16 )
87
+ _LSM9DS1_REGISTER_STATUS_REG = const (0x17 )
88
+ _LSM9DS1_REGISTER_OUT_X_L_G = const (0x18 )
89
+ _LSM9DS1_REGISTER_OUT_X_H_G = const (0x19 )
90
+ _LSM9DS1_REGISTER_OUT_Y_L_G = const (0x1A )
91
+ _LSM9DS1_REGISTER_OUT_Y_H_G = const (0x1B )
92
+ _LSM9DS1_REGISTER_OUT_Z_L_G = const (0x1C )
93
+ _LSM9DS1_REGISTER_OUT_Z_H_G = const (0x1D )
94
+ _LSM9DS1_REGISTER_CTRL_REG4 = const (0x1E )
95
+ _LSM9DS1_REGISTER_CTRL_REG5_XL = const (0x1F )
96
+ _LSM9DS1_REGISTER_CTRL_REG6_XL = const (0x20 )
97
+ _LSM9DS1_REGISTER_CTRL_REG7_XL = const (0x21 )
98
+ _LSM9DS1_REGISTER_CTRL_REG8 = const (0x22 )
99
+ _LSM9DS1_REGISTER_CTRL_REG9 = const (0x23 )
100
+ _LSM9DS1_REGISTER_CTRL_REG10 = const (0x24 )
101
+ _LSM9DS1_REGISTER_OUT_X_L_XL = const (0x28 )
102
+ _LSM9DS1_REGISTER_OUT_X_H_XL = const (0x29 )
103
+ _LSM9DS1_REGISTER_OUT_Y_L_XL = const (0x2A )
104
+ _LSM9DS1_REGISTER_OUT_Y_H_XL = const (0x2B )
105
+ _LSM9DS1_REGISTER_OUT_Z_L_XL = const (0x2C )
106
+ _LSM9DS1_REGISTER_OUT_Z_H_XL = const (0x2D )
107
+ _LSM9DS1_REGISTER_WHO_AM_I_M = const (0x0F )
108
+ _LSM9DS1_REGISTER_CTRL_REG1_M = const (0x20 )
109
+ _LSM9DS1_REGISTER_CTRL_REG2_M = const (0x21 )
110
+ _LSM9DS1_REGISTER_CTRL_REG3_M = const (0x22 )
111
+ _LSM9DS1_REGISTER_CTRL_REG4_M = const (0x23 )
112
+ _LSM9DS1_REGISTER_CTRL_REG5_M = const (0x24 )
113
+ _LSM9DS1_REGISTER_STATUS_REG_M = const (0x27 )
114
+ _LSM9DS1_REGISTER_OUT_X_L_M = const (0x28 )
115
+ _LSM9DS1_REGISTER_OUT_X_H_M = const (0x29 )
116
+ _LSM9DS1_REGISTER_OUT_Y_L_M = const (0x2A )
117
+ _LSM9DS1_REGISTER_OUT_Y_H_M = const (0x2B )
118
+ _LSM9DS1_REGISTER_OUT_Z_L_M = const (0x2C )
119
+ _LSM9DS1_REGISTER_OUT_Z_H_M = const (0x2D )
120
+ _LSM9DS1_REGISTER_CFG_M = const (0x30 )
121
+ _LSM9DS1_REGISTER_INT_SRC_M = const (0x31 )
122
+ _MAGTYPE = True
123
+ _XGTYPE = False
124
+ _SENSORS_GRAVITY_STANDARD = 9.80665
124
125
125
126
# User facing constants/module globals.
126
- ACCELRANGE_2G = ( 0b00 << 3 )
127
- ACCELRANGE_16G = ( 0b01 << 3 )
128
- ACCELRANGE_4G = ( 0b10 << 3 )
129
- ACCELRANGE_8G = ( 0b11 << 3 )
130
- MAGGAIN_4GAUSS = ( 0b00 << 5 ) # +/- 4 gauss
131
- MAGGAIN_8GAUSS = ( 0b01 << 5 ) # +/- 8 gauss
132
- MAGGAIN_12GAUSS = ( 0b10 << 5 ) # +/- 12 gauss
133
- MAGGAIN_16GAUSS = ( 0b11 << 5 ) # +/- 16 gauss
134
- GYROSCALE_245DPS = ( 0b00 << 3 ) # +/- 245 degrees/s rotation
135
- GYROSCALE_500DPS = ( 0b01 << 3 ) # +/- 500 degrees/s rotation
136
- GYROSCALE_2000DPS = ( 0b11 << 3 ) # +/- 2000 degrees/s rotation
127
+ ACCELRANGE_2G = 0b00 << 3
128
+ ACCELRANGE_16G = 0b01 << 3
129
+ ACCELRANGE_4G = 0b10 << 3
130
+ ACCELRANGE_8G = 0b11 << 3
131
+ MAGGAIN_4GAUSS = 0b00 << 5 # +/- 4 gauss
132
+ MAGGAIN_8GAUSS = 0b01 << 5 # +/- 8 gauss
133
+ MAGGAIN_12GAUSS = 0b10 << 5 # +/- 12 gauss
134
+ MAGGAIN_16GAUSS = 0b11 << 5 # +/- 16 gauss
135
+ GYROSCALE_245DPS = 0b00 << 3 # +/- 245 degrees/s rotation
136
+ GYROSCALE_500DPS = 0b01 << 3 # +/- 500 degrees/s rotation
137
+ GYROSCALE_2000DPS = 0b11 << 3 # +/- 2000 degrees/s rotation
137
138
# pylint: enable=bad-whitespace
138
139
139
140
@@ -160,11 +161,13 @@ def __init__(self):
160
161
self ._write_u8 (_MAGTYPE , _LSM9DS1_REGISTER_CTRL_REG2_M , 0x0C )
161
162
time .sleep (0.01 )
162
163
# Check ID registers.
163
- if self ._read_u8 (_XGTYPE , _LSM9DS1_REGISTER_WHO_AM_I_XG ) != _LSM9DS1_XG_ID or \
164
- self ._read_u8 (_MAGTYPE , _LSM9DS1_REGISTER_WHO_AM_I_M ) != _LSM9DS1_MAG_ID :
165
- raise RuntimeError ('Could not find LSM9DS1, check wiring!' )
164
+ if (
165
+ self ._read_u8 (_XGTYPE , _LSM9DS1_REGISTER_WHO_AM_I_XG ) != _LSM9DS1_XG_ID
166
+ or self ._read_u8 (_MAGTYPE , _LSM9DS1_REGISTER_WHO_AM_I_M ) != _LSM9DS1_MAG_ID
167
+ ):
168
+ raise RuntimeError ("Could not find LSM9DS1, check wiring!" )
166
169
# enable gyro continuous
167
- self ._write_u8 (_XGTYPE , _LSM9DS1_REGISTER_CTRL_REG1_G , 0xC0 ) # on XYZ
170
+ self ._write_u8 (_XGTYPE , _LSM9DS1_REGISTER_CTRL_REG1_G , 0xC0 ) # on XYZ
168
171
# Enable the accelerometer continous
169
172
self ._write_u8 (_XGTYPE , _LSM9DS1_REGISTER_CTRL_REG5_XL , 0x38 )
170
173
self ._write_u8 (_XGTYPE , _LSM9DS1_REGISTER_CTRL_REG6_XL , 0xC0 )
@@ -191,8 +194,7 @@ def accel_range(self):
191
194
192
195
@accel_range .setter
193
196
def accel_range (self , val ):
194
- assert val in (ACCELRANGE_2G , ACCELRANGE_4G , ACCELRANGE_8G ,
195
- ACCELRANGE_16G )
197
+ assert val in (ACCELRANGE_2G , ACCELRANGE_4G , ACCELRANGE_8G , ACCELRANGE_16G )
196
198
reg = self ._read_u8 (_XGTYPE , _LSM9DS1_REGISTER_CTRL_REG6_XL )
197
199
reg = (reg & ~ (0b00011000 )) & 0xFF
198
200
reg |= val
@@ -219,8 +221,7 @@ def mag_gain(self):
219
221
220
222
@mag_gain .setter
221
223
def mag_gain (self , val ):
222
- assert val in (MAGGAIN_4GAUSS , MAGGAIN_8GAUSS , MAGGAIN_12GAUSS ,
223
- MAGGAIN_16GAUSS )
224
+ assert val in (MAGGAIN_4GAUSS , MAGGAIN_8GAUSS , MAGGAIN_12GAUSS , MAGGAIN_16GAUSS )
224
225
reg = self ._read_u8 (_MAGTYPE , _LSM9DS1_REGISTER_CTRL_REG2_M )
225
226
reg = (reg & ~ (0b01100000 )) & 0xFF
226
227
reg |= val
@@ -265,9 +266,8 @@ def read_accel_raw(self):
265
266
accelerometer property!
266
267
"""
267
268
# Read the accelerometer
268
- self ._read_bytes (_XGTYPE , 0x80 | _LSM9DS1_REGISTER_OUT_X_L_XL , 6 ,
269
- self ._BUFFER )
270
- raw_x , raw_y , raw_z = struct .unpack_from ('<hhh' , self ._BUFFER [0 :6 ])
269
+ self ._read_bytes (_XGTYPE , 0x80 | _LSM9DS1_REGISTER_OUT_X_L_XL , 6 , self ._BUFFER )
270
+ raw_x , raw_y , raw_z = struct .unpack_from ("<hhh" , self ._BUFFER [0 :6 ])
271
271
return (raw_x , raw_y , raw_z )
272
272
273
273
@property
@@ -276,8 +276,9 @@ def acceleration(self):
276
276
m/s^2 values.
277
277
"""
278
278
raw = self .read_accel_raw ()
279
- return map (lambda x : x * self ._accel_mg_lsb / 1000.0 * _SENSORS_GRAVITY_STANDARD ,
280
- raw )
279
+ return map (
280
+ lambda x : x * self ._accel_mg_lsb / 1000.0 * _SENSORS_GRAVITY_STANDARD , raw
281
+ )
281
282
282
283
def read_mag_raw (self ):
283
284
"""Read the raw magnetometer sensor values and return it as a
@@ -286,9 +287,8 @@ def read_mag_raw(self):
286
287
magnetometer property!
287
288
"""
288
289
# Read the magnetometer
289
- self ._read_bytes (_MAGTYPE , 0x80 | _LSM9DS1_REGISTER_OUT_X_L_M , 6 ,
290
- self ._BUFFER )
291
- raw_x , raw_y , raw_z = struct .unpack_from ('<hhh' , self ._BUFFER [0 :6 ])
290
+ self ._read_bytes (_MAGTYPE , 0x80 | _LSM9DS1_REGISTER_OUT_X_L_M , 6 , self ._BUFFER )
291
+ raw_x , raw_y , raw_z = struct .unpack_from ("<hhh" , self ._BUFFER [0 :6 ])
292
292
return (raw_x , raw_y , raw_z )
293
293
294
294
@property
@@ -306,9 +306,8 @@ def read_gyro_raw(self):
306
306
gyroscope property!
307
307
"""
308
308
# Read the gyroscope
309
- self ._read_bytes (_XGTYPE , 0x80 | _LSM9DS1_REGISTER_OUT_X_L_G , 6 ,
310
- self ._BUFFER )
311
- raw_x , raw_y , raw_z = struct .unpack_from ('<hhh' , self ._BUFFER [0 :6 ])
309
+ self ._read_bytes (_XGTYPE , 0x80 | _LSM9DS1_REGISTER_OUT_X_L_G , 6 , self ._BUFFER )
310
+ raw_x , raw_y , raw_z = struct .unpack_from ("<hhh" , self ._BUFFER [0 :6 ])
312
311
return (raw_x , raw_y , raw_z )
313
312
314
313
@property
@@ -325,8 +324,7 @@ def read_temp_raw(self):
325
324
want to use the temperature property!
326
325
"""
327
326
# Read temp sensor
328
- self ._read_bytes (_XGTYPE , 0x80 | _LSM9DS1_REGISTER_TEMP_OUT_L , 2 ,
329
- self ._BUFFER )
327
+ self ._read_bytes (_XGTYPE , 0x80 | _LSM9DS1_REGISTER_TEMP_OUT_L , 2 , self ._BUFFER )
330
328
temp = ((self ._BUFFER [1 ] << 8 ) | self ._BUFFER [0 ]) >> 4
331
329
return _twos_comp (temp , 12 )
332
330
@@ -337,7 +335,7 @@ def temperature(self):
337
335
# See discussion from:
338
336
# https://github.com/kriswiner/LSM9DS1/issues/3
339
337
temp = self .read_temp_raw ()
340
- temp = 27.5 + temp / 16
338
+ temp = 27.5 + temp / 16
341
339
return temp
342
340
343
341
def _read_u8 (self , sensor_type , address ):
@@ -379,16 +377,23 @@ class LSM9DS1_I2C(LSM9DS1):
379
377
Defaults to ``0x6B``.
380
378
381
379
"""
382
- def __init__ (self , i2c , mag_address = _LSM9DS1_ADDRESS_MAG ,
383
- xg_address = _LSM9DS1_ADDRESS_ACCELGYRO ):
384
- if mag_address in (0x1c , 0x1e ) and xg_address in (0x6a , 0x6b ):
380
+
381
+ def __init__ (
382
+ self ,
383
+ i2c ,
384
+ mag_address = _LSM9DS1_ADDRESS_MAG ,
385
+ xg_address = _LSM9DS1_ADDRESS_ACCELGYRO ,
386
+ ):
387
+ if mag_address in (0x1C , 0x1E ) and xg_address in (0x6A , 0x6B ):
385
388
self ._mag_device = i2c_device .I2CDevice (i2c , mag_address )
386
389
self ._xg_device = i2c_device .I2CDevice (i2c , xg_address )
387
390
super ().__init__ ()
388
391
else :
389
- raise ValueError ('address parmeters are incorrect. Read the docs at '
390
- 'circuitpython.rtfd.io/projects/lsm9ds1/en/latest'
391
- '/api.html#adafruit_lsm9ds1.LSM9DS1_I2C' )
392
+ raise ValueError (
393
+ "address parmeters are incorrect. Read the docs at "
394
+ "circuitpython.rtfd.io/projects/lsm9ds1/en/latest"
395
+ "/api.html#adafruit_lsm9ds1.LSM9DS1_I2C"
396
+ )
392
397
393
398
def _read_u8 (self , sensor_type , address ):
394
399
if sensor_type == _MAGTYPE :
@@ -397,7 +402,9 @@ def _read_u8(self, sensor_type, address):
397
402
device = self ._xg_device
398
403
with device as i2c :
399
404
self ._BUFFER [0 ] = address & 0xFF
400
- i2c .write_then_readinto (self ._BUFFER , self ._BUFFER , out_end = 1 , in_start = 1 , in_end = 2 )
405
+ i2c .write_then_readinto (
406
+ self ._BUFFER , self ._BUFFER , out_end = 1 , in_start = 1 , in_end = 2
407
+ )
401
408
return self ._BUFFER [1 ]
402
409
403
410
def _read_bytes (self , sensor_type , address , count , buf ):
@@ -435,10 +442,15 @@ class LSM9DS1_SPI(LSM9DS1):
435
442
LSM9DS1's CSAG (Chip Select Accelerometer/Gyroscope) pin.
436
443
437
444
"""
445
+
438
446
# pylint: disable=no-member
439
447
def __init__ (self , spi , xgcs , mcs ):
440
- self ._mag_device = spi_device .SPIDevice (spi , mcs , baudrate = 200000 , phase = 1 , polarity = 1 )
441
- self ._xg_device = spi_device .SPIDevice (spi , xgcs , baudrate = 200000 , phase = 1 , polarity = 1 )
448
+ self ._mag_device = spi_device .SPIDevice (
449
+ spi , mcs , baudrate = 200000 , phase = 1 , polarity = 1
450
+ )
451
+ self ._xg_device = spi_device .SPIDevice (
452
+ spi , xgcs , baudrate = 200000 , phase = 1 , polarity = 1
453
+ )
442
454
super ().__init__ ()
443
455
444
456
def _read_u8 (self , sensor_type , address ):
0 commit comments