Skip to content

Commit 6668ea3

Browse files
committed
Merge pull request #1 from adafruit/ahrs
Add individual Adafruit_Sensor instances for each of the LSM9DS0 board sensors to allow compatibility with AHRS algorithms.
2 parents af1f26c + b2771a5 commit 6668ea3

File tree

2 files changed

+237
-134
lines changed

2 files changed

+237
-134
lines changed

Adafruit_LSM9DS0.cpp

Lines changed: 165 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ Adafruit_LSM9DS0::Adafruit_LSM9DS0( int32_t sensorID ) {
2424
_lsm9dso_sensorid_mag = sensorID + 2;
2525
_lsm9dso_sensorid_gyro = sensorID + 3;
2626
_lsm9dso_sensorid_temp = sensorID + 4;
27+
_accelSensor = Sensor(this, &Adafruit_LSM9DS0::readAccel, &Adafruit_LSM9DS0::getAccelEvent, &Adafruit_LSM9DS0::getAccelSensor);
28+
_magSensor = Sensor(this, &Adafruit_LSM9DS0::readMag, &Adafruit_LSM9DS0::getMagEvent, &Adafruit_LSM9DS0::getMagSensor);
29+
_gyroSensor = Sensor(this, &Adafruit_LSM9DS0::readGyro, &Adafruit_LSM9DS0::getGyroEvent, &Adafruit_LSM9DS0::getGyroSensor);
30+
_tempSensor = Sensor(this, &Adafruit_LSM9DS0::readTemp, &Adafruit_LSM9DS0::getTempEvent, &Adafruit_LSM9DS0::getTempSensor);
2731
}
2832

2933
Adafruit_LSM9DS0::Adafruit_LSM9DS0(int8_t xmcs, int8_t gcs, int32_t sensorID ) {
@@ -36,6 +40,10 @@ Adafruit_LSM9DS0::Adafruit_LSM9DS0(int8_t xmcs, int8_t gcs, int32_t sensorID ) {
3640
_lsm9dso_sensorid_mag = sensorID + 2;
3741
_lsm9dso_sensorid_gyro = sensorID + 3;
3842
_lsm9dso_sensorid_temp = sensorID + 4;
43+
_accelSensor = Sensor(this, &Adafruit_LSM9DS0::readAccel, &Adafruit_LSM9DS0::getAccelEvent, &Adafruit_LSM9DS0::getAccelSensor);
44+
_magSensor = Sensor(this, &Adafruit_LSM9DS0::readMag, &Adafruit_LSM9DS0::getMagEvent, &Adafruit_LSM9DS0::getMagSensor);
45+
_gyroSensor = Sensor(this, &Adafruit_LSM9DS0::readGyro, &Adafruit_LSM9DS0::getGyroEvent, &Adafruit_LSM9DS0::getGyroSensor);
46+
_tempSensor = Sensor(this, &Adafruit_LSM9DS0::readTemp, &Adafruit_LSM9DS0::getTempEvent, &Adafruit_LSM9DS0::getTempSensor);
3947
}
4048

4149
Adafruit_LSM9DS0::Adafruit_LSM9DS0(int8_t clk, int8_t miso, int8_t mosi, int8_t xmcs, int8_t gcs, int32_t sensorID ) {
@@ -50,6 +58,10 @@ Adafruit_LSM9DS0::Adafruit_LSM9DS0(int8_t clk, int8_t miso, int8_t mosi, int8_t
5058
_lsm9dso_sensorid_mag = sensorID + 2;
5159
_lsm9dso_sensorid_gyro = sensorID + 3;
5260
_lsm9dso_sensorid_temp = sensorID + 4;
61+
_accelSensor = Sensor(this, &Adafruit_LSM9DS0::readAccel, &Adafruit_LSM9DS0::getAccelEvent, &Adafruit_LSM9DS0::getAccelSensor);
62+
_magSensor = Sensor(this, &Adafruit_LSM9DS0::readMag, &Adafruit_LSM9DS0::getMagEvent, &Adafruit_LSM9DS0::getMagSensor);
63+
_gyroSensor = Sensor(this, &Adafruit_LSM9DS0::readGyro, &Adafruit_LSM9DS0::getGyroEvent, &Adafruit_LSM9DS0::getGyroSensor);
64+
_tempSensor = Sensor(this, &Adafruit_LSM9DS0::readTemp, &Adafruit_LSM9DS0::getTempEvent, &Adafruit_LSM9DS0::getTempSensor);
5365
}
5466

5567
bool Adafruit_LSM9DS0::begin()
@@ -123,12 +135,19 @@ bool Adafruit_LSM9DS0::begin()
123135
***************************************************************************/
124136
void Adafruit_LSM9DS0::read()
125137
{
126-
byte buffer[6];
138+
/* Read all the sensors. */
139+
readAccel();
140+
readMag();
141+
readGyro();
142+
readTemp();
143+
}
127144

145+
void Adafruit_LSM9DS0::readAccel() {
128146
// Read the accelerometer
147+
byte buffer[6];
129148
readBuffer(XMTYPE,
130-
0x80 | LSM9DS0_REGISTER_OUT_X_L_A,
131-
6, buffer);
149+
0x80 | LSM9DS0_REGISTER_OUT_X_L_A,
150+
6, buffer);
132151

133152
uint8_t xlo = buffer[0];
134153
int16_t xhi = buffer[1];
@@ -144,19 +163,21 @@ void Adafruit_LSM9DS0::read()
144163
accelData.x = xhi;
145164
accelData.y = yhi;
146165
accelData.z = zhi;
147-
148-
166+
}
167+
168+
void Adafruit_LSM9DS0::readMag() {
149169
// Read the magnetometer
170+
byte buffer[6];
150171
readBuffer(XMTYPE,
151-
0x80 | LSM9DS0_REGISTER_OUT_X_L_M,
152-
6, buffer);
172+
0x80 | LSM9DS0_REGISTER_OUT_X_L_M,
173+
6, buffer);
153174

154-
xlo = buffer[0];
155-
xhi = buffer[1];
156-
ylo = buffer[2];
157-
yhi = buffer[3];
158-
zlo = buffer[4];
159-
zhi = buffer[5];
175+
uint8_t xlo = buffer[0];
176+
int16_t xhi = buffer[1];
177+
uint8_t ylo = buffer[2];
178+
int16_t yhi = buffer[3];
179+
uint8_t zlo = buffer[4];
180+
int16_t zhi = buffer[5];
160181

161182
// Shift values to create properly formed integer (low byte first)
162183
xhi <<= 8; xhi |= xlo;
@@ -165,18 +186,21 @@ void Adafruit_LSM9DS0::read()
165186
magData.x = xhi;
166187
magData.y = yhi;
167188
magData.z = zhi;
189+
}
168190

191+
void Adafruit_LSM9DS0::readGyro() {
169192
// Read gyro
193+
byte buffer[6];
170194
readBuffer(GYROTYPE,
171-
0x80 | LSM9DS0_REGISTER_OUT_X_L_G,
172-
6, buffer);
195+
0x80 | LSM9DS0_REGISTER_OUT_X_L_G,
196+
6, buffer);
173197

174-
xlo = buffer[0];
175-
xhi = buffer[1];
176-
ylo = buffer[2];
177-
yhi = buffer[3];
178-
zlo = buffer[4];
179-
zhi = buffer[5];
198+
uint8_t xlo = buffer[0];
199+
int16_t xhi = buffer[1];
200+
uint8_t ylo = buffer[2];
201+
int16_t yhi = buffer[3];
202+
uint8_t zlo = buffer[4];
203+
int16_t zhi = buffer[5];
180204

181205
// Shift values to create properly formed integer (low byte first)
182206
xhi <<= 8; xhi |= xlo;
@@ -186,24 +210,23 @@ void Adafruit_LSM9DS0::read()
186210
gyroData.x = xhi;
187211
gyroData.y = yhi;
188212
gyroData.z = zhi;
189-
213+
}
214+
215+
void Adafruit_LSM9DS0::readTemp() {
190216
// Read temp sensor
217+
byte buffer[2];
191218
readBuffer(XMTYPE,
192-
0x80 | LSM9DS0_REGISTER_TEMP_OUT_L_XM,
193-
2, buffer);
194-
xlo = buffer[0];
195-
xhi = buffer[1];
219+
0x80 | LSM9DS0_REGISTER_TEMP_OUT_L_XM,
220+
2, buffer);
221+
uint8_t xlo = buffer[0];
222+
int16_t xhi = buffer[1];
196223

197224
xhi <<= 8; xhi |= xlo;
198225

199226
// Shift values to create properly formed integer (low byte first)
200227
temperature = xhi;
201-
202-
203228
}
204229

205-
206-
207230
void Adafruit_LSM9DS0::setupAccel ( lsm9ds0AccelRange_t range )
208231
{
209232
uint8_t reg = read8(XMTYPE, LSM9DS0_REGISTER_CTRL_REG2_XM);
@@ -290,64 +313,15 @@ void Adafruit_LSM9DS0::getEvent(sensors_event_t *accelEvent,
290313
sensors_event_t *gyroEvent,
291314
sensors_event_t *tempEvent )
292315
{
293-
/* Clear the events */
294-
if (accelEvent) memset(accelEvent, 0, sizeof(sensors_event_t));
295-
if (magEvent) memset(magEvent, 0, sizeof(sensors_event_t));
296-
if (gyroEvent) memset(gyroEvent, 0, sizeof(sensors_event_t));
297-
if (tempEvent) memset(tempEvent, 0, sizeof(sensors_event_t));
298-
299-
/* update the sensor data */
316+
/* Grab new sensor reading and timestamp. */
300317
read();
301318
uint32_t timestamp = millis();
302319

303-
/* Update the accelerometer data */
304-
if (accelEvent) {
305-
accelEvent->version = sizeof(sensors_event_t);
306-
accelEvent->sensor_id = _lsm9dso_sensorid_accel;
307-
accelEvent->type = SENSOR_TYPE_ACCELEROMETER;
308-
accelEvent->timestamp = timestamp;
309-
accelEvent->acceleration.x = accelData.x * _accel_mg_lsb;
310-
accelEvent->acceleration.x /= 1000;
311-
accelEvent->acceleration.y = accelData.y * _accel_mg_lsb;
312-
accelEvent->acceleration.y /= 1000;
313-
accelEvent->acceleration.z = accelData.z * _accel_mg_lsb;
314-
accelEvent->acceleration.z /= 1000;
315-
}
316-
317-
/* Update the magnetometer data */
318-
if (magEvent) {
319-
magEvent->version = sizeof(sensors_event_t);
320-
magEvent->sensor_id = _lsm9dso_sensorid_mag;
321-
magEvent->type = SENSOR_TYPE_MAGNETIC_FIELD;
322-
magEvent->timestamp = timestamp;
323-
magEvent->magnetic.x = magData.x * _mag_mgauss_lsb;
324-
magEvent->magnetic.x /= 1000;
325-
magEvent->magnetic.y = magData.y * _mag_mgauss_lsb;
326-
magEvent->magnetic.y /= 1000;
327-
magEvent->magnetic.z = magData.z * _mag_mgauss_lsb;
328-
magEvent->magnetic.z /= 1000;
329-
}
330-
331-
/* Update the gyroscope data */
332-
if (gyroEvent) {
333-
gyroEvent->version = sizeof(sensors_event_t);
334-
gyroEvent->sensor_id = _lsm9dso_sensorid_accel;
335-
gyroEvent->type = SENSOR_TYPE_GYROSCOPE;
336-
gyroEvent->timestamp = timestamp;
337-
gyroEvent->gyro.x = gyroData.x * _gyro_dps_digit;
338-
gyroEvent->gyro.y = gyroData.y * _gyro_dps_digit;
339-
gyroEvent->gyro.z = gyroData.z * _gyro_dps_digit;
340-
}
341-
342-
/* Update the temperature data */
343-
if (tempEvent) {
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;
349-
//tempEvent->temperature /= LSM9DS0_TEMP_LSB_DEGREE_CELSIUS;
350-
}
320+
/* Update appropriate sensor events. */
321+
if (accelEvent) getAccelEvent(accelEvent, timestamp);
322+
if (magEvent) getMagEvent(magEvent, timestamp);
323+
if (gyroEvent) getGyroEvent(gyroEvent, timestamp);
324+
if (tempEvent) getTempEvent(tempEvent, timestamp);
351325
}
352326

353327
/**************************************************************************/
@@ -358,55 +332,11 @@ void Adafruit_LSM9DS0::getEvent(sensors_event_t *accelEvent,
358332
void Adafruit_LSM9DS0::getSensor(sensor_t *accel, sensor_t *mag,
359333
sensor_t *gyro, sensor_t *temp )
360334
{
361-
/* Clear the sensor_t objects */
362-
memset(accel, 0, sizeof(sensor_t));
363-
memset(mag, 0, sizeof(sensor_t));
364-
memset(gyro, 0, sizeof(sensor_t));
365-
memset(temp, 0, sizeof(sensor_t));
366-
367-
/* Insert the sensor name in the fixed length char array */
368-
strncpy (accel->name, "LSM9DS0_A", sizeof(accel->name) - 1);
369-
accel->name[sizeof(accel->name)- 1] = 0;
370-
accel->version = 1;
371-
accel->sensor_id = _lsm9dso_sensorid_accel;
372-
accel->type = SENSOR_TYPE_ACCELEROMETER;
373-
accel->min_delay = 0;
374-
accel->max_value = 0.0; // ToDo
375-
accel->min_value = 0.0; // ToDo
376-
accel->resolution = 0.0; // ToDo
377-
378-
/* Insert the sensor name in the fixed length char array */
379-
strncpy (mag->name, "LSM9DS0_M", sizeof(mag->name) - 1);
380-
mag->name[sizeof(mag->name)- 1] = 0;
381-
mag->version = 1;
382-
mag->sensor_id = _lsm9dso_sensorid_mag;
383-
mag->type = SENSOR_TYPE_MAGNETIC_FIELD;
384-
mag->min_delay = 0;
385-
mag->max_value = 0.0; // ToDo
386-
mag->min_value = 0.0; // ToDo
387-
mag->resolution = 0.0; // ToDo
388-
389-
/* Insert the sensor name in the fixed length char array */
390-
strncpy (gyro->name, "LSM9DS0_G", sizeof(gyro->name) - 1);
391-
gyro->name[sizeof(gyro->name)- 1] = 0;
392-
gyro->version = 1;
393-
gyro->sensor_id = _lsm9dso_sensorid_gyro;
394-
gyro->type = SENSOR_TYPE_GYROSCOPE;
395-
gyro->min_delay = 0;
396-
gyro->max_value = 0.0; // ToDo
397-
gyro->min_value = 0.0; // ToDo
398-
gyro->resolution = 0.0; // ToDo
399-
400-
/* Insert the sensor name in the fixed length char array */
401-
strncpy (temp->name, "LSM9DS0_T", sizeof(temp->name) - 1);
402-
temp->name[sizeof(temp->name)- 1] = 0;
403-
temp->version = 1;
404-
temp->sensor_id = _lsm9dso_sensorid_temp;
405-
temp->type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
406-
temp->min_delay = 0;
407-
temp->max_value = 0.0; // ToDo
408-
temp->min_value = 0.0; // ToDo
409-
temp->resolution = 0.0; // ToDo
335+
/* Update appropriate sensor metadata. */
336+
if (accel) getAccelSensor(accel);
337+
if (mag) getMagSensor(mag);
338+
if (gyro) getGyroSensor(gyro);
339+
if (temp) getTempSensor(temp);
410340
}
411341

412342
/***************************************************************************
@@ -516,3 +446,104 @@ uint8_t Adafruit_LSM9DS0::spixfer(uint8_t data) {
516446
return reply;
517447
}
518448
}
449+
450+
void Adafruit_LSM9DS0::getAccelEvent(sensors_event_t* event, uint32_t timestamp) {
451+
memset(event, 0, sizeof(sensors_event_t));
452+
event->version = sizeof(sensors_event_t);
453+
event->sensor_id = _lsm9dso_sensorid_accel;
454+
event->type = SENSOR_TYPE_ACCELEROMETER;
455+
event->timestamp = timestamp;
456+
event->acceleration.x = accelData.x * _accel_mg_lsb;
457+
event->acceleration.x /= 1000;
458+
event->acceleration.y = accelData.y * _accel_mg_lsb;
459+
event->acceleration.y /= 1000;
460+
event->acceleration.z = accelData.z * _accel_mg_lsb;
461+
event->acceleration.z /= 1000;
462+
}
463+
464+
void Adafruit_LSM9DS0::getMagEvent(sensors_event_t* event, uint32_t timestamp) {
465+
memset(event, 0, sizeof(sensors_event_t));
466+
event->version = sizeof(sensors_event_t);
467+
event->sensor_id = _lsm9dso_sensorid_mag;
468+
event->type = SENSOR_TYPE_MAGNETIC_FIELD;
469+
event->timestamp = timestamp;
470+
event->magnetic.x = magData.x * _mag_mgauss_lsb;
471+
event->magnetic.x /= 1000;
472+
event->magnetic.y = magData.y * _mag_mgauss_lsb;
473+
event->magnetic.y /= 1000;
474+
event->magnetic.z = magData.z * _mag_mgauss_lsb;
475+
event->magnetic.z /= 1000;
476+
}
477+
478+
void Adafruit_LSM9DS0::getGyroEvent(sensors_event_t* event, uint32_t timestamp) {
479+
memset(event, 0, sizeof(sensors_event_t));
480+
event->version = sizeof(sensors_event_t);
481+
event->sensor_id = _lsm9dso_sensorid_accel;
482+
event->type = SENSOR_TYPE_GYROSCOPE;
483+
event->timestamp = timestamp;
484+
event->gyro.x = gyroData.x * _gyro_dps_digit;
485+
event->gyro.y = gyroData.y * _gyro_dps_digit;
486+
event->gyro.z = gyroData.z * _gyro_dps_digit;
487+
}
488+
489+
void Adafruit_LSM9DS0::getTempEvent(sensors_event_t* event, uint32_t timestamp) {
490+
memset(event, 0, sizeof(sensors_event_t));
491+
event->version = sizeof(sensors_event_t);
492+
event->sensor_id = _lsm9dso_sensorid_temp;
493+
event->type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
494+
event->timestamp = timestamp;
495+
event->temperature = temperature;
496+
//event->temperature /= LSM9DS0_TEMP_LSB_DEGREE_CELSIUS;
497+
}
498+
499+
void Adafruit_LSM9DS0::getAccelSensor(sensor_t* sensor) {
500+
memset(sensor, 0, sizeof(sensor_t));
501+
strncpy (sensor->name, "LSM9DS0_A", sizeof(sensor->name) - 1);
502+
sensor->name[sizeof(sensor->name)- 1] = 0;
503+
sensor->version = 1;
504+
sensor->sensor_id = _lsm9dso_sensorid_accel;
505+
sensor->type = SENSOR_TYPE_ACCELEROMETER;
506+
sensor->min_delay = 0;
507+
sensor->max_value = 0.0; // ToDo
508+
sensor->min_value = 0.0; // ToDo
509+
sensor->resolution = 0.0; // ToDo
510+
}
511+
512+
void Adafruit_LSM9DS0::getMagSensor(sensor_t* sensor) {
513+
memset(sensor, 0, sizeof(sensor_t));
514+
strncpy (sensor->name, "LSM9DS0_M", sizeof(sensor->name) - 1);
515+
sensor->name[sizeof(sensor->name)- 1] = 0;
516+
sensor->version = 1;
517+
sensor->sensor_id = _lsm9dso_sensorid_mag;
518+
sensor->type = SENSOR_TYPE_MAGNETIC_FIELD;
519+
sensor->min_delay = 0;
520+
sensor->max_value = 0.0; // ToDo
521+
sensor->min_value = 0.0; // ToDo
522+
sensor->resolution = 0.0; // ToDo
523+
}
524+
525+
void Adafruit_LSM9DS0::getGyroSensor(sensor_t* sensor) {
526+
memset(sensor, 0, sizeof(sensor_t));
527+
strncpy (sensor->name, "LSM9DS0_G", sizeof(sensor->name) - 1);
528+
sensor->name[sizeof(sensor->name)- 1] = 0;
529+
sensor->version = 1;
530+
sensor->sensor_id = _lsm9dso_sensorid_gyro;
531+
sensor->type = SENSOR_TYPE_GYROSCOPE;
532+
sensor->min_delay = 0;
533+
sensor->max_value = 0.0; // ToDo
534+
sensor->min_value = 0.0; // ToDo
535+
sensor->resolution = 0.0; // ToDo
536+
}
537+
538+
void Adafruit_LSM9DS0::getTempSensor(sensor_t* sensor) {
539+
memset(sensor, 0, sizeof(sensor_t));
540+
strncpy (sensor->name, "LSM9DS0_T", sizeof(sensor->name) - 1);
541+
sensor->name[sizeof(sensor->name)- 1] = 0;
542+
sensor->version = 1;
543+
sensor->sensor_id = _lsm9dso_sensorid_temp;
544+
sensor->type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
545+
sensor->min_delay = 0;
546+
sensor->max_value = 0.0; // ToDo
547+
sensor->min_value = 0.0; // ToDo
548+
sensor->resolution = 0.0; // ToDo
549+
}

0 commit comments

Comments
 (0)