SparkFun Forums 

Where electronics enthusiasts find answers.

Have questions about a SparkFun product or board? This is the place to be.
By sam_loriault
I hooked up the Motion Shield to the ESP32 thing as described in the hookup guide.
I'm using the Arduino IDE and the SparkFun_LSM9DS1 library.

When I run the example script from the library (see code below), everything compiles and upload just fine.
The problem I have is the motion sensor LSM9DS1 returns only 0.00 on all axes for Gyro, Accel and Mag

The initialization in the void_setup seem to work since I don't get "Failed to communicate with LSM9DS1."
I also checked and imu.gyroAvailable() returns True.

If I run the I2C_scanner I get the same addresses used in the example.
LSM9DS1_M 0x1E

I connected an altitude sensor and gps receiver and they both work fine.
I'm also successfully logging all data to the shield sd card.

Should I be using a different library for this shield?
Is there onboard resistors I have to address somehow?

Thanks for your help.

Here's the code:

Code: Select all
Collecting IMU data as CSV for graphing

Original Creation: August 13, 2015 by Jim Lindblom
from the LSM9DS1_Basic_I2C.ino library example.

Hardware setup: This library is intended to be used with a 
ESP32 Motion shield connected directly to the ESP32 Thing.

Development environment specifics:
IDE: Arduino 1.8.2
Hardware Platform: ESP32 Arduion Board

This code is beerware. If you see me (or any other SparkFun 
employee) at the local, and you've found our code helpful, 
please buy us a round!

Distributed as-is; no warranty is given.
// The SFE_LSM9DS1 library requires both Wire and SPI be
// included BEFORE including the 9DS1 library.
#include <Wire.h>
#include <SPI.h>
#include <SparkFunLSM9DS1.h>

LSM9DS1 imu;  // Create an LSM9DS1 object

#define LSM9DS1_M   0x1E // Would be 0x1C if SDO_M is LOW
#define LSM9DS1_AG  0x6B // Would be 0x6A if SDO_AG is LOW

#define PRINT_SPEED 250 // 250 ms between prints
static unsigned long lastPrint = 0; // Keep track of print time

// Earth's magnetic field varies by location. Add or subtract 
// a declination to get a more accurate heading. Calculate 
// your's here:
#define DECLINATION -8.58 // Declination (degrees) in Boulder, CO.

//Internal variables
float roll;
float pitch;
float heading;
char csvBuffer[300];

void setup() 

// Configure LSM9DS1 library parameters
imu.settings.device.commInterface = IMU_MODE_I2C;
imu.settings.device.mAddress = LSM9DS1_M;
imu.settings.device.agAddress = LSM9DS1_AG;
imu.settings.mag.scale = 2;
// The above lines will only take effect AFTER calling
// imu.begin(), which verifies communication with the IMU
// and turns it on.

Serial.println("Starting Sketch");

if (!imu.begin())
    Serial.println("Failed to communicate with LSM9DS1.");
    Serial.println("Double-check connections.");
    while (1)


void loop()
// Update the sensor values whenever new data is available
if ( imu.gyroAvailable() )
    // To read from the gyroscope,  first call the
    // readGyro() function. When it exits, it'll update the
    // gx, gy, and gz variables with the most current data.
if ( imu.accelAvailable() )
    // To read from the accelerometer, first call the
    // readAccel() function. When it exits, it'll update the
    // ax, ay, and az variables with the most current data.
if ( imu.magAvailable() )
    // To read from the magnetometer, first call the
    // readMag() function. When it exits, it'll update the
    // mx, my, and mz variables with the most current data.

if ((lastPrint + PRINT_SPEED) < millis())
    // Print the collected data as CSV
    calcAttitude(, imu.ay,,,,;
    float data1 = imu.calcGyro(imu.gx);
    float data2 = imu.calcGyro(;
    float data3 = imu.calcGyro(imu.gz);
    float data4 = imu.calcAccel(;
    float data5 = imu.calcAccel(imu.ay);
    float data6 = imu.calcAccel(;
    float data7 = imu.calcMag(;
    float data8 = imu.calcMag(;
    float data9 = imu.calcMag(;

    sprintf(csvBuffer, "%4.3f,%4.3f,%4.3f,%4.3f,%4.3f,%4.3f,%4.3f,%4.3f,%4.3f,%4.3f,%4.3f,%4.3f,", data1, data2, data3, data4, data5, data6, data7, data8, data9, roll, pitch, heading);

    lastPrint = millis(); // Update lastPrint time

void calcAttitude(float ax, float ay, float az, float mx, float my, float mz)
roll = atan2(ay, az);
pitch = atan2(-ax, sqrt(ay * ay + az * az));

if (my == 0)
    heading = (mx < 0) ? PI : 0;
    heading = atan2(mx, my);

heading -= DECLINATION * PI / 180;

if (heading > PI) heading -= (2 * PI);
else if (heading < -PI) heading += (2 * PI);
else if (heading < 0) heading += 2 * PI;

// Convert everything from radians to degrees:
heading *= 180.0 / PI;
pitch *= 180.0 / PI;
roll  *= 180.0 / PI;