6464
6565# Internal constants and register values:
6666# 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
120120
121121# 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
134134# pylint: enable=bad-whitespace
135135
136136
@@ -144,16 +144,19 @@ def _twos_comp(val, bits):
144144
145145class LSM9DS0 :
146146 """Driver for the LSM9DS0 accelerometer, magnetometer, gyroscope."""
147+
147148 # Class-level buffer for reading and writing data with the sensor.
148149 # This reduces memory allocations but means the code is not re-entrant or
149150 # thread safe!
150151 _BUFFER = bytearray (6 )
151152
152153 def __init__ (self ):
153154 # 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!" )
157160 # Enable the accelerometer continous
158161 self ._write_u8 (_XMTYPE , _LSM9DS0_REGISTER_CTRL_REG1_XM , 0x67 )
159162 self ._write_u8 (_XMTYPE , _LSM9DS0_REGISTER_CTRL_REG5_XM , 0b11110000 )
@@ -163,7 +166,7 @@ def __init__(self):
163166 self ._write_u8 (_GYROTYPE , _LSM9DS0_REGISTER_CTRL_REG1_G , 0x0F )
164167 # enable the temperature sensor (output rate same as the mag sensor)
165168 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 ))
167170 # Set default ranges for the various sensors
168171 self ._accel_mg_lsb = None
169172 self ._mag_mgauss_lsb = None
@@ -186,8 +189,13 @@ def accel_range(self):
186189
187190 @accel_range .setter
188191 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+ )
191199 reg = self ._read_u8 (_XMTYPE , _LSM9DS0_REGISTER_CTRL_REG2_XM )
192200 reg = (reg & ~ (0b00111000 )) & 0xFF
193201 reg |= val
@@ -216,8 +224,7 @@ def mag_gain(self):
216224
217225 @mag_gain .setter
218226 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 )
221228 reg = self ._read_u8 (_XMTYPE , _LSM9DS0_REGISTER_CTRL_REG6_XM )
222229 reg = (reg & ~ (0b01100000 )) & 0xFF
223230 reg |= val
@@ -262,9 +269,8 @@ def read_accel_raw(self):
262269 accelerometer property!
263270 """
264271 # 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 ])
268274 return (raw_x , raw_y , raw_z )
269275
270276 @property
@@ -273,7 +279,9 @@ def acceleration(self):
273279 m/s^2 values.
274280 """
275281 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+ )
277285
278286 def read_mag_raw (self ):
279287 """Read the raw magnetometer sensor values and return it as a
@@ -282,9 +290,8 @@ def read_mag_raw(self):
282290 magnetometer property!
283291 """
284292 # 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 ])
288295 return (raw_x , raw_y , raw_z )
289296
290297 @property
@@ -302,9 +309,8 @@ def read_gyro_raw(self):
302309 gyroscope property!
303310 """
304311 # 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 ])
308314 return (raw_x , raw_y , raw_z )
309315
310316 @property
@@ -321,8 +327,9 @@ def read_temp_raw(self):
321327 want to use the temperature property!
322328 """
323329 # 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+ )
326333 temp = ((self ._BUFFER [1 ] << 8 ) | self ._BUFFER [0 ]) >> 4
327334 return _twos_comp (temp , 12 )
328335
@@ -331,7 +338,7 @@ def temperature(self):
331338 """The temperature of the sensor in degrees Celsius."""
332339 # This is just a guess since the starting point (21C here) isn't documented :(
333340 temp = self .read_temp_raw ()
334- temp = 21.0 + temp / 8
341+ temp = 21.0 + temp / 8
335342 return temp
336343
337344 def _read_u8 (self , sensor_type , address ):
@@ -393,6 +400,7 @@ def _write_u8(self, sensor_type, address, val):
393400
394401class LSM9DS0_SPI (LSM9DS0 ):
395402 """Driver for the LSM9DS0 connected over SPI."""
403+
396404 # pylint: disable=no-member
397405 def __init__ (self , spi , xmcs , gcs ):
398406 gcs .direction = Direction .OUTPUT
0 commit comments