64
64
65
65
# Internal constants and register values:
66
66
# pylint: disable=bad-whitespace
67
- _LSM9DS0_ADDRESS_ACCELMAG = const (0x1D ) # 3B >> 1 = 7bit default
68
- _LSM9DS0_ADDRESS_GYRO = const (0x6B ) # D6 >> 1 = 7bit default
69
- _LSM9DS0_XM_ID = const (0b01001001 )
70
- _LSM9DS0_G_ID = const (0b11010100 )
71
- _LSM9DS0_ACCEL_MG_LSB_2G = 0.061
72
- _LSM9DS0_ACCEL_MG_LSB_4G = 0.122
73
- _LSM9DS0_ACCEL_MG_LSB_6G = 0.183
74
- _LSM9DS0_ACCEL_MG_LSB_8G = 0.244
75
- _LSM9DS0_ACCEL_MG_LSB_16G = 0.732 # Is this right? Was expecting 0.488
76
- _LSM9DS0_MAG_MGAUSS_2GAUSS = 0.08
77
- _LSM9DS0_MAG_MGAUSS_4GAUSS = 0.16
78
- _LSM9DS0_MAG_MGAUSS_8GAUSS = 0.32
79
- _LSM9DS0_MAG_MGAUSS_12GAUSS = 0.48
80
- _LSM9DS0_GYRO_DPS_DIGIT_245DPS = 0.00875
81
- _LSM9DS0_GYRO_DPS_DIGIT_500DPS = 0.01750
82
- _LSM9DS0_GYRO_DPS_DIGIT_2000DPS = 0.07000
83
- _LSM9DS0_TEMP_LSB_DEGREE_CELSIUS = 8 # 1°C = 8, 25° = 200, etc.
84
- _LSM9DS0_REGISTER_WHO_AM_I_G = const (0x0F )
85
- _LSM9DS0_REGISTER_CTRL_REG1_G = const (0x20 )
86
- _LSM9DS0_REGISTER_CTRL_REG3_G = const (0x22 )
87
- _LSM9DS0_REGISTER_CTRL_REG4_G = const (0x23 )
88
- _LSM9DS0_REGISTER_OUT_X_L_G = const (0x28 )
89
- _LSM9DS0_REGISTER_OUT_X_H_G = const (0x29 )
90
- _LSM9DS0_REGISTER_OUT_Y_L_G = const (0x2A )
91
- _LSM9DS0_REGISTER_OUT_Y_H_G = const (0x2B )
92
- _LSM9DS0_REGISTER_OUT_Z_L_G = const (0x2C )
93
- _LSM9DS0_REGISTER_OUT_Z_H_G = const (0x2D )
94
- _LSM9DS0_REGISTER_TEMP_OUT_L_XM = const (0x05 )
95
- _LSM9DS0_REGISTER_TEMP_OUT_H_XM = const (0x06 )
96
- _LSM9DS0_REGISTER_STATUS_REG_M = const (0x07 )
97
- _LSM9DS0_REGISTER_OUT_X_L_M = const (0x08 )
98
- _LSM9DS0_REGISTER_OUT_X_H_M = const (0x09 )
99
- _LSM9DS0_REGISTER_OUT_Y_L_M = const (0x0A )
100
- _LSM9DS0_REGISTER_OUT_Y_H_M = const (0x0B )
101
- _LSM9DS0_REGISTER_OUT_Z_L_M = const (0x0C )
102
- _LSM9DS0_REGISTER_OUT_Z_H_M = const (0x0D )
103
- _LSM9DS0_REGISTER_WHO_AM_I_XM = const (0x0F )
104
- _LSM9DS0_REGISTER_INT_CTRL_REG_M = const (0x12 )
105
- _LSM9DS0_REGISTER_INT_SRC_REG_M = const (0x13 )
106
- _LSM9DS0_REGISTER_CTRL_REG1_XM = const (0x20 )
107
- _LSM9DS0_REGISTER_CTRL_REG2_XM = const (0x21 )
108
- _LSM9DS0_REGISTER_CTRL_REG5_XM = const (0x24 )
109
- _LSM9DS0_REGISTER_CTRL_REG6_XM = const (0x25 )
110
- _LSM9DS0_REGISTER_CTRL_REG7_XM = const (0x26 )
111
- _LSM9DS0_REGISTER_OUT_X_L_A = const (0x28 )
112
- _LSM9DS0_REGISTER_OUT_X_H_A = const (0x29 )
113
- _LSM9DS0_REGISTER_OUT_Y_L_A = const (0x2A )
114
- _LSM9DS0_REGISTER_OUT_Y_H_A = const (0x2B )
115
- _LSM9DS0_REGISTER_OUT_Z_L_A = const (0x2C )
116
- _LSM9DS0_REGISTER_OUT_Z_H_A = const (0x2D )
117
- _GYROTYPE = True
118
- _XMTYPE = False
119
- _SENSORS_GRAVITY_STANDARD = 9.80665
67
+ _LSM9DS0_ADDRESS_ACCELMAG = const (0x1D ) # 3B >> 1 = 7bit default
68
+ _LSM9DS0_ADDRESS_GYRO = const (0x6B ) # D6 >> 1 = 7bit default
69
+ _LSM9DS0_XM_ID = const (0b01001001 )
70
+ _LSM9DS0_G_ID = const (0b11010100 )
71
+ _LSM9DS0_ACCEL_MG_LSB_2G = 0.061
72
+ _LSM9DS0_ACCEL_MG_LSB_4G = 0.122
73
+ _LSM9DS0_ACCEL_MG_LSB_6G = 0.183
74
+ _LSM9DS0_ACCEL_MG_LSB_8G = 0.244
75
+ _LSM9DS0_ACCEL_MG_LSB_16G = 0.732 # Is this right? Was expecting 0.488
76
+ _LSM9DS0_MAG_MGAUSS_2GAUSS = 0.08
77
+ _LSM9DS0_MAG_MGAUSS_4GAUSS = 0.16
78
+ _LSM9DS0_MAG_MGAUSS_8GAUSS = 0.32
79
+ _LSM9DS0_MAG_MGAUSS_12GAUSS = 0.48
80
+ _LSM9DS0_GYRO_DPS_DIGIT_245DPS = 0.00875
81
+ _LSM9DS0_GYRO_DPS_DIGIT_500DPS = 0.01750
82
+ _LSM9DS0_GYRO_DPS_DIGIT_2000DPS = 0.07000
83
+ _LSM9DS0_TEMP_LSB_DEGREE_CELSIUS = 8 # 1°C = 8, 25° = 200, etc.
84
+ _LSM9DS0_REGISTER_WHO_AM_I_G = const (0x0F )
85
+ _LSM9DS0_REGISTER_CTRL_REG1_G = const (0x20 )
86
+ _LSM9DS0_REGISTER_CTRL_REG3_G = const (0x22 )
87
+ _LSM9DS0_REGISTER_CTRL_REG4_G = const (0x23 )
88
+ _LSM9DS0_REGISTER_OUT_X_L_G = const (0x28 )
89
+ _LSM9DS0_REGISTER_OUT_X_H_G = const (0x29 )
90
+ _LSM9DS0_REGISTER_OUT_Y_L_G = const (0x2A )
91
+ _LSM9DS0_REGISTER_OUT_Y_H_G = const (0x2B )
92
+ _LSM9DS0_REGISTER_OUT_Z_L_G = const (0x2C )
93
+ _LSM9DS0_REGISTER_OUT_Z_H_G = const (0x2D )
94
+ _LSM9DS0_REGISTER_TEMP_OUT_L_XM = const (0x05 )
95
+ _LSM9DS0_REGISTER_TEMP_OUT_H_XM = const (0x06 )
96
+ _LSM9DS0_REGISTER_STATUS_REG_M = const (0x07 )
97
+ _LSM9DS0_REGISTER_OUT_X_L_M = const (0x08 )
98
+ _LSM9DS0_REGISTER_OUT_X_H_M = const (0x09 )
99
+ _LSM9DS0_REGISTER_OUT_Y_L_M = const (0x0A )
100
+ _LSM9DS0_REGISTER_OUT_Y_H_M = const (0x0B )
101
+ _LSM9DS0_REGISTER_OUT_Z_L_M = const (0x0C )
102
+ _LSM9DS0_REGISTER_OUT_Z_H_M = const (0x0D )
103
+ _LSM9DS0_REGISTER_WHO_AM_I_XM = const (0x0F )
104
+ _LSM9DS0_REGISTER_INT_CTRL_REG_M = const (0x12 )
105
+ _LSM9DS0_REGISTER_INT_SRC_REG_M = const (0x13 )
106
+ _LSM9DS0_REGISTER_CTRL_REG1_XM = const (0x20 )
107
+ _LSM9DS0_REGISTER_CTRL_REG2_XM = const (0x21 )
108
+ _LSM9DS0_REGISTER_CTRL_REG5_XM = const (0x24 )
109
+ _LSM9DS0_REGISTER_CTRL_REG6_XM = const (0x25 )
110
+ _LSM9DS0_REGISTER_CTRL_REG7_XM = const (0x26 )
111
+ _LSM9DS0_REGISTER_OUT_X_L_A = const (0x28 )
112
+ _LSM9DS0_REGISTER_OUT_X_H_A = const (0x29 )
113
+ _LSM9DS0_REGISTER_OUT_Y_L_A = const (0x2A )
114
+ _LSM9DS0_REGISTER_OUT_Y_H_A = const (0x2B )
115
+ _LSM9DS0_REGISTER_OUT_Z_L_A = const (0x2C )
116
+ _LSM9DS0_REGISTER_OUT_Z_H_A = const (0x2D )
117
+ _GYROTYPE = True
118
+ _XMTYPE = False
119
+ _SENSORS_GRAVITY_STANDARD = 9.80665
120
120
121
121
# User facing constants/module globals.
122
- ACCELRANGE_2G = ( 0b000 << 3 )
123
- ACCELRANGE_4G = ( 0b001 << 3 )
124
- ACCELRANGE_6G = ( 0b010 << 3 )
125
- ACCELRANGE_8G = ( 0b011 << 3 )
126
- ACCELRANGE_16G = ( 0b100 << 3 )
127
- MAGGAIN_2GAUSS = ( 0b00 << 5 ) # +/- 2 gauss
128
- MAGGAIN_4GAUSS = ( 0b01 << 5 ) # +/- 4 gauss
129
- MAGGAIN_8GAUSS = ( 0b10 << 5 ) # +/- 8 gauss
130
- MAGGAIN_12GAUSS = ( 0b11 << 5 ) # +/- 12 gauss
131
- GYROSCALE_245DPS = ( 0b00 << 4 ) # +/- 245 degrees per second rotation
132
- GYROSCALE_500DPS = ( 0b01 << 4 ) # +/- 500 degrees per second rotation
133
- GYROSCALE_2000DPS = ( 0b10 << 4 ) # +/- 2000 degrees per second rotation
122
+ ACCELRANGE_2G = 0b000 << 3
123
+ ACCELRANGE_4G = 0b001 << 3
124
+ ACCELRANGE_6G = 0b010 << 3
125
+ ACCELRANGE_8G = 0b011 << 3
126
+ ACCELRANGE_16G = 0b100 << 3
127
+ MAGGAIN_2GAUSS = 0b00 << 5 # +/- 2 gauss
128
+ MAGGAIN_4GAUSS = 0b01 << 5 # +/- 4 gauss
129
+ MAGGAIN_8GAUSS = 0b10 << 5 # +/- 8 gauss
130
+ MAGGAIN_12GAUSS = 0b11 << 5 # +/- 12 gauss
131
+ GYROSCALE_245DPS = 0b00 << 4 # +/- 245 degrees per second rotation
132
+ GYROSCALE_500DPS = 0b01 << 4 # +/- 500 degrees per second rotation
133
+ GYROSCALE_2000DPS = 0b10 << 4 # +/- 2000 degrees per second rotation
134
134
# pylint: enable=bad-whitespace
135
135
136
136
@@ -144,16 +144,19 @@ def _twos_comp(val, bits):
144
144
145
145
class LSM9DS0 :
146
146
"""Driver for the LSM9DS0 accelerometer, magnetometer, gyroscope."""
147
+
147
148
# Class-level buffer for reading and writing data with the sensor.
148
149
# This reduces memory allocations but means the code is not re-entrant or
149
150
# thread safe!
150
151
_BUFFER = bytearray (6 )
151
152
152
153
def __init__ (self ):
153
154
# Check ID registers.
154
- if self ._read_u8 (_XMTYPE , _LSM9DS0_REGISTER_WHO_AM_I_XM ) != _LSM9DS0_XM_ID or \
155
- self ._read_u8 (_GYROTYPE , _LSM9DS0_REGISTER_WHO_AM_I_G ) != _LSM9DS0_G_ID :
156
- raise RuntimeError ('Could not find LSM9DS0, check wiring!' )
155
+ if (
156
+ self ._read_u8 (_XMTYPE , _LSM9DS0_REGISTER_WHO_AM_I_XM ) != _LSM9DS0_XM_ID
157
+ or self ._read_u8 (_GYROTYPE , _LSM9DS0_REGISTER_WHO_AM_I_G ) != _LSM9DS0_G_ID
158
+ ):
159
+ raise RuntimeError ("Could not find LSM9DS0, check wiring!" )
157
160
# Enable the accelerometer continous
158
161
self ._write_u8 (_XMTYPE , _LSM9DS0_REGISTER_CTRL_REG1_XM , 0x67 )
159
162
self ._write_u8 (_XMTYPE , _LSM9DS0_REGISTER_CTRL_REG5_XM , 0b11110000 )
@@ -163,7 +166,7 @@ def __init__(self):
163
166
self ._write_u8 (_GYROTYPE , _LSM9DS0_REGISTER_CTRL_REG1_G , 0x0F )
164
167
# enable the temperature sensor (output rate same as the mag sensor)
165
168
temp_reg = self ._read_u8 (_XMTYPE , _LSM9DS0_REGISTER_CTRL_REG5_XM )
166
- self ._write_u8 (_XMTYPE , _LSM9DS0_REGISTER_CTRL_REG5_XM , temp_reg | (1 << 7 ))
169
+ self ._write_u8 (_XMTYPE , _LSM9DS0_REGISTER_CTRL_REG5_XM , temp_reg | (1 << 7 ))
167
170
# Set default ranges for the various sensors
168
171
self ._accel_mg_lsb = None
169
172
self ._mag_mgauss_lsb = None
@@ -186,8 +189,13 @@ def accel_range(self):
186
189
187
190
@accel_range .setter
188
191
def accel_range (self , val ):
189
- assert val in (ACCELRANGE_2G , ACCELRANGE_4G , ACCELRANGE_6G ,
190
- ACCELRANGE_8G , ACCELRANGE_16G )
192
+ assert val in (
193
+ ACCELRANGE_2G ,
194
+ ACCELRANGE_4G ,
195
+ ACCELRANGE_6G ,
196
+ ACCELRANGE_8G ,
197
+ ACCELRANGE_16G ,
198
+ )
191
199
reg = self ._read_u8 (_XMTYPE , _LSM9DS0_REGISTER_CTRL_REG2_XM )
192
200
reg = (reg & ~ (0b00111000 )) & 0xFF
193
201
reg |= val
@@ -216,8 +224,7 @@ def mag_gain(self):
216
224
217
225
@mag_gain .setter
218
226
def mag_gain (self , val ):
219
- assert val in (MAGGAIN_2GAUSS , MAGGAIN_4GAUSS , MAGGAIN_8GAUSS ,
220
- MAGGAIN_12GAUSS )
227
+ assert val in (MAGGAIN_2GAUSS , MAGGAIN_4GAUSS , MAGGAIN_8GAUSS , MAGGAIN_12GAUSS )
221
228
reg = self ._read_u8 (_XMTYPE , _LSM9DS0_REGISTER_CTRL_REG6_XM )
222
229
reg = (reg & ~ (0b01100000 )) & 0xFF
223
230
reg |= val
@@ -262,9 +269,8 @@ def read_accel_raw(self):
262
269
accelerometer property!
263
270
"""
264
271
# Read the accelerometer
265
- self ._read_bytes (_XMTYPE , 0x80 | _LSM9DS0_REGISTER_OUT_X_L_A , 6 ,
266
- self ._BUFFER )
267
- raw_x , raw_y , raw_z = struct .unpack_from ('<hhh' , self ._BUFFER [0 :6 ])
272
+ self ._read_bytes (_XMTYPE , 0x80 | _LSM9DS0_REGISTER_OUT_X_L_A , 6 , self ._BUFFER )
273
+ raw_x , raw_y , raw_z = struct .unpack_from ("<hhh" , self ._BUFFER [0 :6 ])
268
274
return (raw_x , raw_y , raw_z )
269
275
270
276
@property
@@ -273,7 +279,9 @@ def acceleration(self):
273
279
m/s^2 values.
274
280
"""
275
281
raw = self .read_accel_raw ()
276
- return (x * self ._accel_mg_lsb / 1000.0 * _SENSORS_GRAVITY_STANDARD for x in raw )
282
+ return (
283
+ x * self ._accel_mg_lsb / 1000.0 * _SENSORS_GRAVITY_STANDARD for x in raw
284
+ )
277
285
278
286
def read_mag_raw (self ):
279
287
"""Read the raw magnetometer sensor values and return it as a
@@ -282,9 +290,8 @@ def read_mag_raw(self):
282
290
magnetometer property!
283
291
"""
284
292
# Read the magnetometer
285
- self ._read_bytes (_XMTYPE , 0x80 | _LSM9DS0_REGISTER_OUT_X_L_M , 6 ,
286
- self ._BUFFER )
287
- raw_x , raw_y , raw_z = struct .unpack_from ('<hhh' , self ._BUFFER [0 :6 ])
293
+ self ._read_bytes (_XMTYPE , 0x80 | _LSM9DS0_REGISTER_OUT_X_L_M , 6 , self ._BUFFER )
294
+ raw_x , raw_y , raw_z = struct .unpack_from ("<hhh" , self ._BUFFER [0 :6 ])
288
295
return (raw_x , raw_y , raw_z )
289
296
290
297
@property
@@ -302,9 +309,8 @@ def read_gyro_raw(self):
302
309
gyroscope property!
303
310
"""
304
311
# Read the gyroscope
305
- self ._read_bytes (_GYROTYPE , 0x80 | _LSM9DS0_REGISTER_OUT_X_L_G , 6 ,
306
- self ._BUFFER )
307
- raw_x , raw_y , raw_z = struct .unpack_from ('<hhh' , self ._BUFFER [0 :6 ])
312
+ self ._read_bytes (_GYROTYPE , 0x80 | _LSM9DS0_REGISTER_OUT_X_L_G , 6 , self ._BUFFER )
313
+ raw_x , raw_y , raw_z = struct .unpack_from ("<hhh" , self ._BUFFER [0 :6 ])
308
314
return (raw_x , raw_y , raw_z )
309
315
310
316
@property
@@ -321,8 +327,9 @@ def read_temp_raw(self):
321
327
want to use the temperature property!
322
328
"""
323
329
# Read temp sensor
324
- self ._read_bytes (_XMTYPE , 0x80 | _LSM9DS0_REGISTER_TEMP_OUT_L_XM , 2 ,
325
- self ._BUFFER )
330
+ self ._read_bytes (
331
+ _XMTYPE , 0x80 | _LSM9DS0_REGISTER_TEMP_OUT_L_XM , 2 , self ._BUFFER
332
+ )
326
333
temp = ((self ._BUFFER [1 ] << 8 ) | self ._BUFFER [0 ]) >> 4
327
334
return _twos_comp (temp , 12 )
328
335
@@ -331,7 +338,7 @@ def temperature(self):
331
338
"""The temperature of the sensor in degrees Celsius."""
332
339
# This is just a guess since the starting point (21C here) isn't documented :(
333
340
temp = self .read_temp_raw ()
334
- temp = 21.0 + temp / 8
341
+ temp = 21.0 + temp / 8
335
342
return temp
336
343
337
344
def _read_u8 (self , sensor_type , address ):
@@ -393,6 +400,7 @@ def _write_u8(self, sensor_type, address, val):
393
400
394
401
class LSM9DS0_SPI (LSM9DS0 ):
395
402
"""Driver for the LSM9DS0 connected over SPI."""
403
+
396
404
# pylint: disable=no-member
397
405
def __init__ (self , spi , xmcs , gcs ):
398
406
gcs .direction = Direction .OUTPUT
0 commit comments