Skip to content

Commit ccd73bf

Browse files
committed
sensor-api compatible!
1 parent a4ea582 commit ccd73bf

File tree

3 files changed

+126
-87
lines changed

3 files changed

+126
-87
lines changed

Adafruit_LSM9DS0.cpp

Lines changed: 83 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -134,16 +134,19 @@ void Adafruit_LSM9DS0::read()
134134
while (Wire.available() < 6);
135135

136136
uint8_t xlo = Wire.read();
137-
uint8_t xhi = Wire.read();
137+
int16_t xhi = Wire.read();
138138
uint8_t ylo = Wire.read();
139-
uint8_t yhi = Wire.read();
139+
int16_t yhi = Wire.read();
140140
uint8_t zlo = Wire.read();
141-
uint8_t zhi = Wire.read();
141+
int16_t zhi = Wire.read();
142142

143143
// 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;
147150

148151
// Read the magnetometer
149152
Wire.beginTransmission((byte)LSM9DS0_ADDRESS_ACCELMAG);
@@ -163,9 +166,12 @@ void Adafruit_LSM9DS0::read()
163166
zhi = Wire.read();
164167

165168
// 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;
169175

170176
// Read gyro
171177
Wire.beginTransmission((byte)LSM9DS0_ADDRESS_GYRO);
@@ -182,9 +188,14 @@ void Adafruit_LSM9DS0::read()
182188
yhi = Wire.read();
183189
zlo = Wire.read();
184190
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;
188199

189200
// Read temp sensor
190201
Wire.beginTransmission((byte)LSM9DS0_ADDRESS_ACCELMAG);
@@ -197,26 +208,17 @@ void Adafruit_LSM9DS0::read()
197208

198209
xlo = Wire.read();
199210
xhi = Wire.read();
200-
211+
212+
xhi <<= 8; xhi |= xlo;
213+
201214
// Shift values to create properly formed integer (low byte first)
202-
temperature = (xlo | (xhi << 8));
215+
temperature = xhi;
203216
}
204217

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
218218
}
219219

220+
221+
220222
void Adafruit_LSM9DS0::setupAccel ( lsm9ds0AccelRange_t range )
221223
{
222224
uint8_t reg = read8(XMTYPE, LSM9DS0_REGISTER_CTRL_REG2_XM);
@@ -239,7 +241,7 @@ void Adafruit_LSM9DS0::setupAccel ( lsm9ds0AccelRange_t range )
239241
_accel_mg_lsb = LSM9DS0_ACCEL_MG_LSB_8G;
240242
break;
241243
case LSM9DS0_ACCELRANGE_16G:
242-
_accel_mg_lsb = LSM9DS0_ACCEL_MG_LSB_16G;
244+
_accel_mg_lsb =LSM9DS0_ACCEL_MG_LSB_16G;
243245
break;
244246
}
245247
}
@@ -254,16 +256,16 @@ void Adafruit_LSM9DS0::setupMag ( lsm9ds0MagGain_t gain )
254256
switch(gain)
255257
{
256258
case LSM9DS0_MAGGAIN_2GAUSS:
257-
_mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_LSB_2GAUSS;
259+
_mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_2GAUSS;
258260
break;
259261
case LSM9DS0_MAGGAIN_4GAUSS:
260-
_mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_LSB_4GAUSS;
262+
_mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_4GAUSS;
261263
break;
262264
case LSM9DS0_MAGGAIN_8GAUSS:
263-
_mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_LSB_8GAUSS;
265+
_mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_8GAUSS;
264266
break;
265267
case LSM9DS0_MAGGAIN_12GAUSS:
266-
_mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_LSB_12GAUSS;
268+
_mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_12GAUSS;
267269
break;
268270
}
269271
}
@@ -304,48 +306,63 @@ void Adafruit_LSM9DS0::getEvent(sensors_event_t *accelEvent,
304306
sensors_event_t *tempEvent )
305307
{
306308
/* 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));
311313

312314
/* update the sensor data */
313315
read();
314316
uint32_t timestamp = millis();
315317

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+
325332
/* 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+
334346
/* 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+
343357
/* 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+
}
349366
}
350367

351368
/**************************************************************************/

Adafruit_LSM9DS0.h

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,19 @@
2929
#define LSM9DS0_XM_ID (0b01001001)
3030
#define LSM9DS0_G_ID (0b11010100)
3131

32+
3233
// Linear Acceleration: mg per LSB
33-
#define LSM9DS0_ACCEL_MG_LSB_2G (0.061F)
34-
#define LSM9DS0_ACCEL_MG_LSB_4G (0.122F)
35-
#define LSM9DS0_ACCEL_MG_LSB_6G (0.183F)
36-
#define LSM9DS0_ACCEL_MG_LSB_8G (0.244F)
37-
#define LSM9DS0_ACCEL_MG_LSB_16G (0.732F) // Is this right? Was expecting 0.488F
38-
39-
// Magnetic Field Strength: mgauss per LSB
40-
#define LSM9DS0_MAG_MGAUSS_LSB_2GAUSS (0.08F)
41-
#define LSM9DS0_MAG_MGAUSS_LSB_4GAUSS (0.16F)
42-
#define LSM9DS0_MAG_MGAUSS_LSB_8GAUSS (0.32F)
43-
#define LSM9DS0_MAG_MGAUSS_LSB_12GAUSS (0.48F)
34+
#define LSM9DS0_ACCEL_MG_LSB_2G (0.061F)
35+
#define LSM9DS0_ACCEL_MG_LSB_4G (0.122F)
36+
#define LSM9DS0_ACCEL_MG_LSB_6G (0.183F)
37+
#define LSM9DS0_ACCEL_MG_LSB_8G (0.244F)
38+
#define LSM9DS0_ACCEL_MG_LSB_16G (0.732F) // Is this right? Was expecting 0.488F
39+
40+
// Magnetic Field Strength: gauss range
41+
#define LSM9DS0_MAG_MGAUSS_2GAUSS (0.08F)
42+
#define LSM9DS0_MAG_MGAUSS_4GAUSS (0.16F)
43+
#define LSM9DS0_MAG_MGAUSS_8GAUSS (0.32F)
44+
#define LSM9DS0_MAG_MGAUSS_12GAUSS (0.48F)
4445

4546
// Angular Rate: dps per LSB
4647
#define LSM9DS0_GYRO_DPS_DIGIT_245DPS (0.00875F)

examples/sensorapi/sensorapi.pde

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
===========
2020
Connect SCL to analog 5
2121
Connect SDA to analog 4
22-
Connect VDD to 3.3V DC
22+
Connect VDD to 5V DC
2323
Connect GROUND to common ground
2424
2525
History
@@ -122,13 +122,13 @@ void setup(void)
122122
Serial.println(F("LSM9DS0 9DOF Sensor Test")); Serial.println("");
123123

124124
/* Initialise the sensor */
125-
// if(!lsm.begin())
126-
// {
127-
// /* There was a problem detecting the LSM9DS0 ... check your connections */
128-
// Serial.print(F("Ooops, no LSM9DS0 detected ... Check your wiring or I2C ADDR!"));
129-
// while(1);
130-
// }
131-
// Serial.println(F("Found LMS9DS0 9DOF"));
125+
if(!lsm.begin())
126+
{
127+
/* There was a problem detecting the LSM9DS0 ... check your connections */
128+
Serial.print(F("Ooops, no LSM9DS0 detected ... Check your wiring or I2C ADDR!"));
129+
while(1);
130+
}
131+
Serial.println(F("Found LSM9DS0 9DOF"));
132132

133133
/* Display some basic information on this sensor */
134134
displaySensorDetails();
@@ -150,7 +150,28 @@ void loop(void)
150150
{
151151
/* Get a new sensor event */
152152
sensors_event_t accel, mag, gyro, temp;
153-
lsm.getEvent(&accel, &mag, &gyro, &temp);
154-
153+
154+
lsm.getEvent(&accel, &mag, &gyro, &temp);
155+
156+
// print out accelleration data
157+
Serial.print("Accel X: "); Serial.print(accel.acceleration.x); Serial.print(" ");
158+
Serial.print("\tY: "); Serial.print(accel.acceleration.y); Serial.print(" ");
159+
Serial.print("\tZ: "); Serial.print(accel.acceleration.z); Serial.println("\tm/s^2");
160+
161+
// print out magnetometer data
162+
Serial.print("Magn. X: "); Serial.print(mag.magnetic.x); Serial.print(" ");
163+
Serial.print("\tY: "); Serial.print(mag.magnetic.y); Serial.print(" ");
164+
Serial.print("\tZ: "); Serial.print(mag.magnetic.z); Serial.println("\tgauss");
165+
166+
// print out gyroscopic data
167+
Serial.print("Gyro X: "); Serial.print(gyro.gyro.x); Serial.print(" ");
168+
Serial.print("\tY: "); Serial.print(gyro.gyro.y); Serial.print(" ");
169+
Serial.print("\tZ: "); Serial.print(gyro.gyro.z); Serial.println("\tdps");
170+
171+
// print out temperature data
172+
Serial.print("Temp: "); Serial.print(temp.temperature); Serial.println(" *C");
173+
174+
Serial.println("**********************\n");
175+
155176
delay(250);
156177
}

0 commit comments

Comments
 (0)