Author Topic: LSM9DS1 power consumption  (Read 12647 times)

savan8192

  • NewMember
  • *
  • Posts: 12
LSM9DS1 power consumption
« on: October 23, 2019, 12:19:51 PM »
Hi everyone,

I have been playing with LSM9DS1 for quite some time. Now I want to reduce its power consumption.

Currently Moteino + LSM9DS1 draws about 60mA. If I disabled gyro, mag and two of the axis of Accelerometer and the current draw has gone down to 35-40mA. On disconnecting the LSM9DS1 entirely, the same sketch consumes 2-10 mA. My Moteino draws about 10-50uA to send a data packet to a gateway.

LSM9DS1 should draw typically 4.5mA. Any idea where I am going wrong?

I have connected VDD, GND, SDA, and SCL directly.

Thanks in advance


Felix

  • Administrator
  • Hero Member
  • *****
  • Posts: 6866
  • Country: us
    • LowPowerLab
Re: LSM9DS1 power consumption
« Reply #1 on: October 23, 2019, 10:39:38 PM »
LSM9DS1 should draw typically 4.5mA. Any idea where I am going wrong?
The VDD you have is 3.3V, correct?
Is this the LSM9DS1 LPL Breakout ?
All boards go through some basic testing to ensure they power up and can yield valid readings. But I do not test for current draw.
Is there anything particularly visually suspect with the board (perhaps a bridge or something like that)?

savan8192

  • NewMember
  • *
  • Posts: 12
Re: LSM9DS1 power consumption
« Reply #2 on: October 24, 2019, 04:40:58 AM »
Hi Felix, thanks for your reply.

The VDD you have is 3.3V, correct?

Yes

Quote
Is this the LSM9DS1 LPL Breakout ?

Yes

Quote
All boards go through some basic testing to ensure they power up and can yield valid readings. But I do not test for current draw.

Board might be just fine, I may have to change the power mode in sketch?? - The datasheet mentions following

Quote
In the LSM9DS1 the accelerometer and gyroscope have two operating modes available:
only accelerometer active and gyroscope in power down or both accelerometer and
gyroscope sensors active at the same ODR. Switching from one mode to the other requires
one write operation: writing to CTRL_REG6_XL (20h), the accelerometer operates in
normal mode and the gyroscope is powered down, writing to CTRL_REG1_G (10h) both
accelerometer and gyroscope are activated at the same ODR.

Quote
Is there anything particularly visually suspect with the board (perhaps a bridge or something like that)?
Don't think so, attaching the picture for your reference - https://drive.google.com/file/d/1i1jMS1Yrxk49ASpEd0RGLaRP1JFHW6q_/view?usp=sharing

Felix

  • Administrator
  • Hero Member
  • *****
  • Posts: 6866
  • Country: us
    • LowPowerLab
Re: LSM9DS1 power consumption
« Reply #3 on: October 24, 2019, 10:39:55 AM »
Board looks good,
Have you tried it without the breadboard? Sometimes breadboards can cause all kinds of problems.

savan8192

  • NewMember
  • *
  • Posts: 12
Re: LSM9DS1 power consumption
« Reply #4 on: October 28, 2019, 05:08:08 AM »
Hi Felix, I have tried it without breadboard - on a Veroboard. I have sent you a PM.

jspitaels

  • NewMember
  • *
  • Posts: 1
Re: LSM9DS1 power consumption
« Reply #5 on: May 23, 2023, 11:43:13 AM »
Has this been solved meanwhile? If so, how?

I couldn't find the code to use the ST LSM9DS1 shield with the Moteino on https://github.com/LowPowerLab/LowPowerLab.github.io
Where is it?

Felix

  • Administrator
  • Hero Member
  • *****
  • Posts: 6866
  • Country: us
    • LowPowerLab
Re: LSM9DS1 power consumption
« Reply #6 on: May 23, 2023, 03:00:48 PM »
There is no example code published there.
Here's an example sketch:

Code: [Select]
/*****************************************************************
SFE_LSM9DS1 Library Simple Example Code - I2C Interface
The LSM9DS1 is a versatile 9DOF sensor. It has a built-in
accelerometer, gyroscope, and magnetometer. Very cool!

This Arduino sketch is a demo of the simple side of the SFE_LSM9DS1 library.
It'll demo the following:
* How to create a LSM9DS1 object, using a constructor (global variables section).
* How to use the begin() function of the LSM9DS1 class.
* How to read the gyroscope, accelerometer, and magnetometer
  using the readGryo(), readAccel(), readMag() functions and
  the gx, gy, gz, ax, ay, az, mx, my, and mz variables.
* How to calculate actual acceleration, rotation speed,
  magnetic field strength using the calcAccel(), calcGyro()
  and calcMag() functions.
* How to use the data from the LSM9DS1 to calculate
  orientation and heading.

This example demonstrates how to use I2C. The pin-out is as follows:
   LSM9DS1 --------- Moteino
SCL ------------- SCL (A5 on Moteino/Arduino)
SDA ------------- SDA (A4 on Moteino/Arduino)
VDD ------------- 3.3V
GND ------------- GND

The LSM9DS1 has a maximum voltage of 3.6V. Make sure you power it
off the 3.3V rail! I2C pins are open-drain, so you'll be
(mostly) safe connecting the LSM9DS1's SCL and SDA pins
directly to a Moteino/Arduino.

Code by Jim Lindblom @ SparkFun Electronics
Adapted for MoteinoM0 by Felix Rusu, LowPowerLab.com
Original Creation Date: April 30, 2015
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 Library Init
// Use the LSM9DS1 class to create an object
LSM9DS1 imu;

// Example I2C Setup
// SDO_XM and SDO_G are both pulled high, so our addresses are:
#define LSM9DS1_M 0x1E // Would be 0x1C if SDO_M is LOW
#define LSM9DS1_AG 0x6B // Would be 0x6A if SDO_AG is LOW

// Sketch Output Settings
#define PRINT_CALCULATED
//#define PRINT_RAW
#define PRINT_SPEED 400 // 250 ms between prints

// Earth's magnetic field varies by location. Add or subtract
// a declination to get a more accurate heading. Calculate
// your's here:
// http://www.ngdc.noaa.gov/geomag-web/#declination
#define DECLINATION -8.58 // Declination (degrees) in Boulder, CO.
 
void setup()
{
  pinMode(LED_BUILTIN,OUTPUT);
  Serial.begin(115200);
  delay(2000);
}

byte imuSetup() {
  // Before initializing the IMU, there are a few settings
  // we may need to adjust. Use the settings struct to set
  // the device's communication mode and addresses:
  imu.settings.device.commInterface = IMU_MODE_I2C;
  imu.settings.device.mAddress = LSM9DS1_M;
  imu.settings.device.agAddress = LSM9DS1_AG;
  // The above lines will only take effect AFTER calling
  // imu.begin(), which verifies communication with the IMU
  // and turns it on.
  if (!imu.begin())
  {
    Serial.println("Failed to communicate with LSM9DS1.");
    /*
    Serial.println("Double-check wiring.");
    Serial.println("Default settings in this sketch will " \
                  "work for an out of the box LSM9DS1 " \
                  "Breakout, but may need to be modified " \
                  "if the board jumpers are.");
    */
    return false;
  }
  return true;
}

void loop()
{
  if (imuSetup()) {
    printGyro();  // Print "G: gx, gy, gz"
    printAccel(); // Print "A: ax, ay, az"
    printMag();   // Print "M: mx, my, mz"
   
    // Print the heading and orientation for fun!
    // Call print attitude. The LSM9DS1's magnetometer x and y axes are opposite to the accelerometer, so my and mx are substituted for each other.
    printAttitude(imu.ax, imu.ay, imu.az, -imu.my, -imu.mx, imu.mz);
    Serial.println();
  }
  delay(PRINT_SPEED);
  //imu.sleepGyro();
}

void printGyro()
{
  // To read from the gyroscope, you must first call the
  // readGyro() function. When this exits, it'll update the
  // gx, gy, and gz variables with the most current data.
  imu.readGyro();
 
  // Now we can use the gx, gy, and gz variables as we please.
  // Either print them as raw ADC values, or calculated in DPS.
  Serial.print("G: ");
#ifdef PRINT_CALCULATED
  // If you want to print calculated values, you can use the
  // calcGyro helper function to convert a raw ADC value to
  // DPS. Give the function the value that you want to convert.
  Serial.print(imu.calcGyro(imu.gx), 2);
  Serial.print(", ");
  Serial.print(imu.calcGyro(imu.gy), 2);
  Serial.print(", ");
  Serial.print(imu.calcGyro(imu.gz), 2);
  Serial.println(" deg/s");
#elif defined PRINT_RAW
  Serial.print(imu.gx);
  Serial.print(", ");
  Serial.print(imu.gy);
  Serial.print(", ");
  Serial.println(imu.gz);
#endif
}

void printAccel()
{
  // To read from the accelerometer, you must first call the
  // readAccel() function. When this exits, it'll update the
  // ax, ay, and az variables with the most current data.
  imu.readAccel();
 
  // Now we can use the ax, ay, and az variables as we please.
  // Either print them as raw ADC values, or calculated in g's.
  Serial.print("A: ");
#ifdef PRINT_CALCULATED
  // If you want to print calculated values, you can use the
  // calcAccel helper function to convert a raw ADC value to
  // g's. Give the function the value that you want to convert.
  Serial.print(imu.calcAccel(imu.ax), 2);
  Serial.print(", ");
  Serial.print(imu.calcAccel(imu.ay), 2);
  Serial.print(", ");
  Serial.print(imu.calcAccel(imu.az), 2);
  Serial.println(" g");
#elif defined PRINT_RAW
  Serial.print(imu.ax);
  Serial.print(", ");
  Serial.print(imu.ay);
  Serial.print(", ");
  Serial.println(imu.az);
#endif
}

void printMag()
{
  // To read from the magnetometer, you must first call the
  // readMag() function. When this exits, it'll update the
  // mx, my, and mz variables with the most current data.
  imu.readMag();
 
  // Now we can use the mx, my, and mz variables as we please.
  // Either print them as raw ADC values, or calculated in Gauss.
  Serial.print("M: ");
#ifdef PRINT_CALCULATED
  // If you want to print calculated values, you can use the
  // calcMag helper function to convert a raw ADC value to
  // Gauss. Give the function the value that you want to convert.
  Serial.print(imu.calcMag(imu.mx), 2);
  Serial.print(", ");
  Serial.print(imu.calcMag(imu.my), 2);
  Serial.print(", ");
  Serial.print(imu.calcMag(imu.mz), 2);
  Serial.println(" gauss");
#elif defined PRINT_RAW
  Serial.print(imu.mx);
  Serial.print(", ");
  Serial.print(imu.my);
  Serial.print(", ");
  Serial.println(imu.mz);
#endif
}

// Calculate pitch, roll, and heading.
// Pitch/roll calculations take from this app note:
// http://cache.freescale.com/files/sensors/doc/app_note/AN3461.pdf?fpsp=1
// Heading calculations taken from this app note:
// http://www51.honeywell.com/aero/common/documents/myaerospacecatalog-documents/Defense_Brochures-documents/Magnetic__Literature_Application_notes-documents/AN203_Compass_Heading_Using_Magnetometers.pdf
void printAttitude(
float ax, float ay, float az, float mx, float my, float mz)
{
  float roll = atan2(ay, az);
  float pitch = atan2(-ax, sqrt(ay * ay + az * az));
 
  float heading;
  if (my == 0)
    heading = (mx < 0) ? 180.0 : 0;
  else
    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;
 
  Serial.print("Pitch, Roll: ");
  Serial.print(pitch, 2);
  Serial.print(", ");
  Serial.println(roll, 2);
  Serial.print("Heading: "); Serial.println(heading, 2);
}