@@ -134,16 +134,19 @@ void Adafruit_LSM9DS0::read()
134
134
while (Wire.available () < 6 );
135
135
136
136
uint8_t xlo = Wire.read ();
137
- uint8_t xhi = Wire.read ();
137
+ int16_t xhi = Wire.read ();
138
138
uint8_t ylo = Wire.read ();
139
- uint8_t yhi = Wire.read ();
139
+ int16_t yhi = Wire.read ();
140
140
uint8_t zlo = Wire.read ();
141
- uint8_t zhi = Wire.read ();
141
+ int16_t zhi = Wire.read ();
142
142
143
143
// Shift values to create properly formed integer (low byte first)
144
- accelData.x = (xlo | (xhi << 8 )) >> 4 ;
145
- accelData.y = (ylo | (yhi << 8 )) >> 4 ;
146
- accelData.z = (zlo | (zhi << 8 )) >> 4 ;
144
+ xhi <<= 8 ; xhi |= xlo;
145
+ yhi <<= 8 ; yhi |= ylo;
146
+ zhi <<= 8 ; zhi |= zlo;
147
+ accelData.x = xhi;
148
+ accelData.y = yhi;
149
+ accelData.z = zhi;
147
150
148
151
// Read the magnetometer
149
152
Wire.beginTransmission ((byte)LSM9DS0_ADDRESS_ACCELMAG);
@@ -163,9 +166,12 @@ void Adafruit_LSM9DS0::read()
163
166
zhi = Wire.read ();
164
167
165
168
// Shift values to create properly formed integer (low byte first)
166
- magData.x = (xlo | (xhi << 8 ));
167
- magData.y = (ylo | (yhi << 8 ));
168
- magData.z = (zlo | (zhi << 8 ));
169
+ xhi <<= 8 ; xhi |= xlo;
170
+ yhi <<= 8 ; yhi |= ylo;
171
+ zhi <<= 8 ; zhi |= zlo;
172
+ magData.x = xhi;
173
+ magData.y = yhi;
174
+ magData.z = zhi;
169
175
170
176
// Read gyro
171
177
Wire.beginTransmission ((byte)LSM9DS0_ADDRESS_GYRO);
@@ -182,9 +188,14 @@ void Adafruit_LSM9DS0::read()
182
188
yhi = Wire.read ();
183
189
zlo = Wire.read ();
184
190
zhi = Wire.read ();
185
- gyroData.x = (xlo | (xhi << 8 ));
186
- gyroData.y = (ylo | (yhi << 8 ));
187
- gyroData.z = (zlo | (zhi << 8 ));
191
+ // Shift values to create properly formed integer (low byte first)
192
+ xhi <<= 8 ; xhi |= xlo;
193
+ yhi <<= 8 ; yhi |= ylo;
194
+ zhi <<= 8 ; zhi |= zlo;
195
+
196
+ gyroData.x = xhi;
197
+ gyroData.y = yhi;
198
+ gyroData.z = zhi;
188
199
189
200
// Read temp sensor
190
201
Wire.beginTransmission ((byte)LSM9DS0_ADDRESS_ACCELMAG);
@@ -197,26 +208,17 @@ void Adafruit_LSM9DS0::read()
197
208
198
209
xlo = Wire.read ();
199
210
xhi = Wire.read ();
200
-
211
+
212
+ xhi <<= 8 ; xhi |= xlo;
213
+
201
214
// Shift values to create properly formed integer (low byte first)
202
- temperature = (xlo | ( xhi << 8 )) ;
215
+ temperature = xhi;
203
216
}
204
217
205
- // ToDo: Move to Unified object, but for now convert to SI direct
206
- accelData.x *= _accel_mg_lsb;
207
- accelData.y *= _accel_mg_lsb;
208
- accelData.z *= _accel_mg_lsb;
209
- magData.x *= _mag_mgauss_lsb;
210
- magData.y *= _mag_mgauss_lsb;
211
- magData.z *= _mag_mgauss_lsb;
212
- gyroData.x *= _gyro_dps_digit;
213
- gyroData.y *= _gyro_dps_digit;
214
- gyroData.z *= _gyro_dps_digit;
215
- temperature /= LSM9DS0_TEMP_LSB_DEGREE_CELSIUS;
216
-
217
- // ToDo: Calculate orientation
218
218
}
219
219
220
+
221
+
220
222
void Adafruit_LSM9DS0::setupAccel ( lsm9ds0AccelRange_t range )
221
223
{
222
224
uint8_t reg = read8 (XMTYPE, LSM9DS0_REGISTER_CTRL_REG2_XM);
@@ -239,7 +241,7 @@ void Adafruit_LSM9DS0::setupAccel ( lsm9ds0AccelRange_t range )
239
241
_accel_mg_lsb = LSM9DS0_ACCEL_MG_LSB_8G;
240
242
break ;
241
243
case LSM9DS0_ACCELRANGE_16G:
242
- _accel_mg_lsb = LSM9DS0_ACCEL_MG_LSB_16G;
244
+ _accel_mg_lsb =LSM9DS0_ACCEL_MG_LSB_16G;
243
245
break ;
244
246
}
245
247
}
@@ -254,16 +256,16 @@ void Adafruit_LSM9DS0::setupMag ( lsm9ds0MagGain_t gain )
254
256
switch (gain)
255
257
{
256
258
case LSM9DS0_MAGGAIN_2GAUSS:
257
- _mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_LSB_2GAUSS ;
259
+ _mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_2GAUSS ;
258
260
break ;
259
261
case LSM9DS0_MAGGAIN_4GAUSS:
260
- _mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_LSB_4GAUSS ;
262
+ _mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_4GAUSS ;
261
263
break ;
262
264
case LSM9DS0_MAGGAIN_8GAUSS:
263
- _mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_LSB_8GAUSS ;
265
+ _mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_8GAUSS ;
264
266
break ;
265
267
case LSM9DS0_MAGGAIN_12GAUSS:
266
- _mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_LSB_12GAUSS ;
268
+ _mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_12GAUSS ;
267
269
break ;
268
270
}
269
271
}
@@ -304,48 +306,63 @@ void Adafruit_LSM9DS0::getEvent(sensors_event_t *accelEvent,
304
306
sensors_event_t *tempEvent )
305
307
{
306
308
/* Clear the events */
307
- memset (accelEvent, 0 , sizeof (sensors_event_t ));
308
- memset (magEvent, 0 , sizeof (sensors_event_t ));
309
- memset (gyroEvent, 0 , sizeof (sensors_event_t ));
310
- memset (tempEvent, 0 , sizeof (sensors_event_t ));
309
+ if (accelEvent) memset (accelEvent, 0 , sizeof (sensors_event_t ));
310
+ if (magEvent) memset (magEvent, 0 , sizeof (sensors_event_t ));
311
+ if (gyroEvent) memset (gyroEvent, 0 , sizeof (sensors_event_t ));
312
+ if (tempEvent) memset (tempEvent, 0 , sizeof (sensors_event_t ));
311
313
312
314
/* update the sensor data */
313
315
read ();
314
316
uint32_t timestamp = millis ();
315
317
316
- /* Update the accelerometer data */
317
- accelEvent->version = sizeof (sensors_event_t );
318
- accelEvent->sensor_id = _lsm9dso_sensorid_accel;
319
- accelEvent->type = SENSOR_TYPE_ACCELEROMETER;
320
- accelEvent->timestamp = timestamp;
321
- accelEvent->acceleration .x = accelData.x ;
322
- accelEvent->acceleration .y = accelData.y ;
323
- accelEvent->acceleration .z = accelData.z ;
324
-
318
+ /* Update the accelerometer data */
319
+ if (accelEvent) {
320
+ accelEvent->version = sizeof (sensors_event_t );
321
+ accelEvent->sensor_id = _lsm9dso_sensorid_accel;
322
+ accelEvent->type = SENSOR_TYPE_ACCELEROMETER;
323
+ accelEvent->timestamp = timestamp;
324
+ accelEvent->acceleration .x = accelData.x * _accel_mg_lsb;
325
+ accelEvent->acceleration .x /= 1000 ;
326
+ accelEvent->acceleration .y = accelData.y * _accel_mg_lsb;
327
+ accelEvent->acceleration .y /= 1000 ;
328
+ accelEvent->acceleration .z = accelData.z * _accel_mg_lsb;
329
+ accelEvent->acceleration .z /= 1000 ;
330
+ }
331
+
325
332
/* Update the magnetometer data */
326
- magEvent->version = sizeof (sensors_event_t );
327
- magEvent->sensor_id = _lsm9dso_sensorid_mag;
328
- magEvent->type = SENSOR_TYPE_MAGNETIC_FIELD;
329
- magEvent->timestamp = timestamp;
330
- magEvent->magnetic .x = magData.x ;
331
- magEvent->magnetic .y = magData.y ;
332
- magEvent->magnetic .z = magData.z ;
333
-
333
+ if (magEvent) {
334
+ magEvent->version = sizeof (sensors_event_t );
335
+ magEvent->sensor_id = _lsm9dso_sensorid_mag;
336
+ magEvent->type = SENSOR_TYPE_MAGNETIC_FIELD;
337
+ magEvent->timestamp = timestamp;
338
+ magEvent->magnetic .x = magData.x * _mag_mgauss_lsb;
339
+ magEvent->magnetic .x /= 1000 ;
340
+ magEvent->magnetic .y = magData.y * _mag_mgauss_lsb;
341
+ magEvent->magnetic .y /= 1000 ;
342
+ magEvent->magnetic .z = magData.z * _mag_mgauss_lsb;
343
+ magEvent->magnetic .z /= 1000 ;
344
+ }
345
+
334
346
/* Update the gyroscope data */
335
- gyroEvent->version = sizeof (sensors_event_t );
336
- gyroEvent->sensor_id = _lsm9dso_sensorid_accel;
337
- gyroEvent->type = SENSOR_TYPE_GYROSCOPE;
338
- gyroEvent->timestamp = timestamp;
339
- gyroEvent->gyro .x = gyroData.x ;
340
- gyroEvent->gyro .y = gyroData.y ;
341
- gyroEvent->gyro .z = gyroData.z ;
342
-
347
+ if (gyroEvent) {
348
+ gyroEvent->version = sizeof (sensors_event_t );
349
+ gyroEvent->sensor_id = _lsm9dso_sensorid_accel;
350
+ gyroEvent->type = SENSOR_TYPE_GYROSCOPE;
351
+ gyroEvent->timestamp = timestamp;
352
+ gyroEvent->gyro .x = gyroData.x * _gyro_dps_digit;
353
+ gyroEvent->gyro .y = gyroData.y * _gyro_dps_digit;
354
+ gyroEvent->gyro .z = gyroData.z * _gyro_dps_digit;
355
+ }
356
+
343
357
/* Update the temperature data */
344
- tempEvent->version = sizeof (sensors_event_t );
345
- tempEvent->sensor_id = _lsm9dso_sensorid_temp;
346
- tempEvent->type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
347
- tempEvent->timestamp = timestamp;
348
- tempEvent->temperature = temperature;
358
+ if (tempEvent) {
359
+ tempEvent->version = sizeof (sensors_event_t );
360
+ tempEvent->sensor_id = _lsm9dso_sensorid_temp;
361
+ tempEvent->type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
362
+ tempEvent->timestamp = timestamp;
363
+ tempEvent->temperature = temperature;
364
+ // tempEvent->temperature /= LSM9DS0_TEMP_LSB_DEGREE_CELSIUS;
365
+ }
349
366
}
350
367
351
368
/* *************************************************************************/
0 commit comments