Skip to content

Commit df31805

Browse files
author
microbuilder
committed
Added range settings
1 parent 6f9a682 commit df31805

File tree

3 files changed

+110
-6
lines changed

3 files changed

+110
-6
lines changed

Adafruit_LSM9DS0.cpp

Lines changed: 78 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,11 @@ bool Adafruit_LSM9DS0::begin()
9898
}
9999
*/
100100

101+
// Set default ranges for the various sensors
102+
setupAccel(LSM9DS0_ACCELRANGE_2G);
103+
setupMag(LSM9DS0_MAGGAIN_2GAUSS);
104+
setupGyro(LSM9DS0_GYROSCALE_245DPS);
105+
101106
return true;
102107
}
103108

@@ -185,22 +190,91 @@ void Adafruit_LSM9DS0::read()
185190
temperature = (xlo | (xhi << 8));
186191
}
187192

193+
// ToDo: Move to Unified object, but for now convert to SI direct
194+
accelData.x *= _accel_mg_lsb;
195+
accelData.y *= _accel_mg_lsb;
196+
accelData.z *= _accel_mg_lsb;
197+
magData.x *= _mag_mgauss_lsb;
198+
magData.y *= _mag_mgauss_lsb;
199+
magData.z *= _mag_mgauss_lsb;
200+
gyroData.x *= _gyro_dps_digit;
201+
gyroData.y *= _gyro_dps_digit;
202+
gyroData.z *= _gyro_dps_digit;
203+
temperature /= LSM9DS0_TEMP_LSB_DEGREE_CELSIUS;
204+
188205
// ToDo: Calculate orientation
189206
}
190207

191-
void Adafruit_LSM9DS0::setupAccel ( lsm9ds0AccelRange_t range, lm9ds0AccelDataRate_t datarate )
208+
void Adafruit_LSM9DS0::setupAccel ( lsm9ds0AccelRange_t range )
192209
{
210+
uint8_t reg = read8(XMTYPE, LSM9DS0_REGISTER_CTRL_REG2_XM);
211+
reg &= ~(0b00111000);
212+
reg |= range;
213+
write8(XMTYPE, LSM9DS0_REGISTER_CTRL_REG2_XM, reg );
193214

215+
switch (range)
216+
{
217+
case LSM9DS0_ACCELRANGE_2G:
218+
_accel_mg_lsb = LSM9DS0_ACCEL_MG_LSB_2G;
219+
break;
220+
case LSM9DS0_ACCELRANGE_4G:
221+
_accel_mg_lsb = LSM9DS0_ACCEL_MG_LSB_4G;
222+
break;
223+
case LSM9DS0_ACCELRANGE_6G:
224+
_accel_mg_lsb = LSM9DS0_ACCEL_MG_LSB_6G;
225+
break;
226+
case LSM9DS0_ACCELRANGE_8G:
227+
_accel_mg_lsb = LSM9DS0_ACCEL_MG_LSB_8G;
228+
break;
229+
case LSM9DS0_ACCELRANGE_16G:
230+
_accel_mg_lsb = LSM9DS0_ACCEL_MG_LSB_16G;
231+
break;
232+
}
194233
}
195234

196-
void Adafruit_LSM9DS0::setupMag ( lsm9ds0MagGain_t gain, lsm9ds0MagDataRate_t datarate )
235+
void Adafruit_LSM9DS0::setupMag ( lsm9ds0MagGain_t gain )
197236
{
198-
237+
uint8_t reg = read8(XMTYPE, LSM9DS0_REGISTER_CTRL_REG6_XM);
238+
reg &= ~(0b01100000);
239+
reg |= gain;
240+
write8(XMTYPE, LSM9DS0_REGISTER_CTRL_REG6_XM, reg );
241+
242+
switch(gain)
243+
{
244+
case LSM9DS0_MAGGAIN_2GAUSS:
245+
_mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_LSB_2GAUSS;
246+
break;
247+
case LSM9DS0_MAGGAIN_4GAUSS:
248+
_mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_LSB_4GAUSS;
249+
break;
250+
case LSM9DS0_MAGGAIN_8GAUSS:
251+
_mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_LSB_8GAUSS;
252+
break;
253+
case LSM9DS0_MAGGAIN_12GAUSS:
254+
_mag_mgauss_lsb = LSM9DS0_MAG_MGAUSS_LSB_12GAUSS;
255+
break;
256+
}
199257
}
200258

201259
void Adafruit_LSM9DS0::setupGyro ( lsm9ds0GyroScale_t scale )
202260
{
203-
261+
uint8_t reg = read8(GYROTYPE, LSM9DS0_REGISTER_CTRL_REG4_G);
262+
reg &= ~(0b00110000);
263+
reg |= scale;
264+
write8(GYROTYPE, LSM9DS0_REGISTER_CTRL_REG4_G, reg );
265+
266+
switch(scale)
267+
{
268+
case LSM9DS0_GYROSCALE_245DPS:
269+
_gyro_dps_digit = LSM9DS0_GYRO_DPS_DIGIT_245DPS;
270+
break;
271+
case LSM9DS0_GYROSCALE_500DPS:
272+
_gyro_dps_digit = LSM9DS0_GYRO_DPS_DIGIT_500DPS;
273+
break;
274+
case LSM9DS0_GYROSCALE_2000DPS:
275+
_gyro_dps_digit = LSM9DS0_GYRO_DPS_DIGIT_2000DPS;
276+
break;
277+
}
204278
}
205279

206280
/***************************************************************************

Adafruit_LSM9DS0.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class Adafruit_LSM9DS0
6464
LSM9DS0_REGISTER_WHO_AM_I_G = 0x0F,
6565
LSM9DS0_REGISTER_CTRL_REG1_G = 0x20,
6666
LSM9DS0_REGISTER_CTRL_REG3_G = 0x22,
67+
LSM9DS0_REGISTER_CTRL_REG4_G = 0x23,
6768
LSM9DS0_REGISTER_OUT_X_L_G = 0x28,
6869
LSM9DS0_REGISTER_OUT_X_H_G = 0x29,
6970
LSM9DS0_REGISTER_OUT_Y_L_G = 0x2A,
@@ -87,7 +88,9 @@ class Adafruit_LSM9DS0
8788
LSM9DS0_REGISTER_INT_CTRL_REG_M = 0x12,
8889
LSM9DS0_REGISTER_INT_SRC_REG_M = 0x13,
8990
LSM9DS0_REGISTER_CTRL_REG1_XM = 0x20,
91+
LSM9DS0_REGISTER_CTRL_REG2_XM = 0x21,
9092
LSM9DS0_REGISTER_CTRL_REG5_XM = 0x24,
93+
LSM9DS0_REGISTER_CTRL_REG6_XM = 0x25,
9194
LSM9DS0_REGISTER_CTRL_REG7_XM = 0x26,
9295
LSM9DS0_REGISTER_OUT_X_L_A = 0x28,
9396
LSM9DS0_REGISTER_OUT_X_H_A = 0x29,
@@ -160,8 +163,8 @@ class Adafruit_LSM9DS0
160163

161164
bool begin ( void );
162165
void read ( void );
163-
void setupAccel ( lsm9ds0AccelRange_t range, lm9ds0AccelDataRate_t datarate );
164-
void setupMag ( lsm9ds0MagGain_t gain, lsm9ds0MagDataRate_t datarate );
166+
void setupAccel ( lsm9ds0AccelRange_t range );
167+
void setupMag ( lsm9ds0MagGain_t gain );
165168
void setupGyro ( lsm9ds0GyroScale_t scale );
166169
void write8 ( boolean type, byte reg, byte value );
167170
byte read8 ( boolean type, byte reg );
@@ -171,6 +174,9 @@ class Adafruit_LSM9DS0
171174
boolean _i2c;
172175
int8_t _csg, _csxm, _mosi, _miso, _clk;
173176
uint8_t mySPCR, SPCRback;
177+
float _accel_mg_lsb;
178+
float _mag_mgauss_lsb;
179+
float _gyro_dps_digit;
174180
};
175181

176182
#endif

examples/lsm9doftest/lsm9doftest.ino

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,27 @@ Adafruit_LSM9DS0 lsm;
88
// SPI
99
//Adafruit_LSM9DS0 lsm = Adafruit_LSM9DS0(A5, 12, A4, 10, 9);
1010

11+
void setupSensor()
12+
{
13+
// 1.) Set the accelerometer range
14+
lsm.setupAccel(lsm.LSM9DS0_ACCELRANGE_2G);
15+
//lsm.setupAccel(lsm.LSM9DS0_ACCELRANGE_4G);
16+
//lsm.setupAccel(lsm.LSM9DS0_ACCELRANGE_6G);
17+
//lsm.setupAccel(lsm.LSM9DS0_ACCELRANGE_8G);
18+
//lsm.setupAccel(lsm.LSM9DS0_ACCELRANGE_16G);
19+
20+
// 2.) Set the magnetometer sensitivity
21+
lsm.setupMag(lsm.LSM9DS0_MAGGAIN_2GAUSS);
22+
//lsm.setupMag(lsm.LSM9DS0_MAGGAIN_4GAUSS);
23+
//lsm.setupMag(lsm.LSM9DS0_MAGGAIN_8GAUSS);
24+
//lsm.setupMag(lsm.LSM9DS0_MAGGAIN_12GAUSS);
25+
26+
// 3.) Setup the gyroscope
27+
lsm.setupGyro(lsm.LSM9DS0_GYROSCALE_245DPS);
28+
//lsm.setupGyro(lsm.LSM9DS0_GYROSCALE_500DPS);
29+
//lsm.setupGyro(lsm.LSM9DS0_GYROSCALE_2000DPS);
30+
}
31+
1132
void setup()
1233
{
1334
while (!Serial); // flora & leonardo
@@ -22,6 +43,9 @@ void setup()
2243
while (1);
2344
}
2445
Serial.println("Found LMS9DS0 9DOF");
46+
Serial.println("");
47+
Serial.println("Acceleration in mg, Mag field in gauss, angular velocity in DPS");
48+
Serial.println("");
2549
}
2650

2751
void loop()

0 commit comments

Comments
 (0)