Hi,
I have a seeed XIAO nrf52840 (sense) and try to lower the ODR to 13hz of the IMU with the mbed 2.9.1 board.
I try to use the low level example as test code.
I have only changed the code
dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_104Hz;
to
dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_13Hz;
as dispayed in the LSM6DS3.h libary. However the sample rate is still not altered. Determined by counting the number of outputs in the serial monitor.
Hope you can help?
/*****************************************************************************/
// LowLevelExample.ino
// Hardware: Grove - 6-Axis Accelerometer&Gyroscope
// Arduino IDE: Arduino-1.65
// Author: Lambor
// Date: Oct,2015
// Version: v1.0
//
// Modified by:
// Data:
// Description:
//
// by www.seeedstudio.com
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
//
/*******************************************************************************/
#include "LSM6DS3.h"
#include "Wire.h"
#include "SPI.h"
uint16_t errorsAndWarnings = 0;
//Create instance of LSM6DS3Core
LSM6DS3Core myIMU(I2C_MODE, 0x6A); //I2C device address 0x6A
void setup() {
//Init Serial port
Serial.begin(9600);
while (!Serial);
//Call .beginCore() to configure the IMU
if (myIMU.beginCore() != 0) {
Serial.print("\nDevice Error.\n");
} else {
Serial.print("\nDevice OK.\n");
}
uint8_t dataToWrite = 0; //Temporary variable
//Setup the accelerometer******************************
dataToWrite = 0; //Start Fresh!
dataToWrite |= LSM6DS3_ACC_GYRO_BW_XL_100Hz;
dataToWrite |= LSM6DS3_ACC_GYRO_FS_XL_8g;
//dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_104Hz;
dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_13Hz; // changed from 104 to 13 as show in the
//Now, write the patched together data
errorsAndWarnings += myIMU.writeRegister(LSM6DS3_ACC_GYRO_CTRL1_XL, dataToWrite);
//Set the ODR bit
errorsAndWarnings += myIMU.readRegister(&dataToWrite, LSM6DS3_ACC_GYRO_CTRL4_C);
dataToWrite &= ~((uint8_t)LSM6DS3_ACC_GYRO_BW_SCAL_ODR_ENABLED);
}
void loop() {
int16_t temp;
//Get all parameters
Serial.print("\nAccelerometer Counts:\n");
//Acelerometer axis X
if (myIMU.readRegisterInt16(&temp, LSM6DS3_ACC_GYRO_OUTX_L_XL) != 0) {
errorsAndWarnings++;
}
Serial.print(" X = ");
Serial.println(temp);
//Acelerometer axis Y
if (myIMU.readRegisterInt16(&temp, LSM6DS3_ACC_GYRO_OUTY_L_XL) != 0) {
errorsAndWarnings++;
}
Serial.print(" Y = ");
Serial.println(temp);
//Acelerometer axis Z
if (myIMU.readRegisterInt16(&temp, LSM6DS3_ACC_GYRO_OUTZ_L_XL) != 0) {
errorsAndWarnings++;
}
Serial.print(" Z = ");
Serial.println(temp);
Serial.println();
Serial.print("Total reported Errors and Warnings: ");
Serial.println(errorsAndWarnings);
delay(1000);
}
Try the following sketch.
Read new valid data when ready.
/*****************************************************************************/
// LowLevelExample.ino
// Hardware: Grove - 6-Axis Accelerometer&Gyroscope
// Arduino IDE: Arduino-1.65
// Author: Lambor
// Date: Oct,2015
// Version: v1.0
//
// Modified by:
// Data:
// Description:
//
// by www.seeedstudio.com
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
//
/*******************************************************************************/
#include "LSM6DS3.h"
#include "Wire.h"
#include "SPI.h"
uint16_t errorsAndWarnings = 0;
uint8_t readData = 0;
//Create instance of LSM6DS3Core
LSM6DS3Core myIMU(I2C_MODE, 0x6A); //I2C device address 0x6A
void setup() {
//Init Serial port
Serial.begin(9600);
while (!Serial);
//Call .beginCore() to configure the IMU
if (myIMU.beginCore() != 0) {
Serial.print("\nDevice Error.\n");
} else {
Serial.print("\nDevice OK.\n");
}
uint8_t dataToWrite = 0; //Temporary variable
//Setup the accelerometer******************************
dataToWrite = 0; //Start Fresh!
dataToWrite |= LSM6DS3_ACC_GYRO_BW_XL_100Hz;
dataToWrite |= LSM6DS3_ACC_GYRO_FS_XL_8g;
dataToWrite |= LSM6DS3_ACC_GYRO_ODR_XL_13Hz;
//Now, write the patched together data
errorsAndWarnings += myIMU.writeRegister(LSM6DS3_ACC_GYRO_CTRL1_XL, dataToWrite);
//Set the ODR bit
errorsAndWarnings += myIMU.readRegister(&dataToWrite, LSM6DS3_ACC_GYRO_CTRL4_C);
dataToWrite &= ~((uint8_t)LSM6DS3_ACC_GYRO_BW_SCAL_ODR_ENABLED);
}
void loop() {
unsigned long timestamp = micros();
do {
myIMU.readRegister(&readData, LSM6DS3_ACC_GYRO_STATUS_REG); // 0,0,0,0,0,TDA,GDA,XLDA
} while ((readData & 0x01) != 0x01);
int16_t temp;
//Get all parameters
Serial.print("\nAccelerometer Counts:\n");
//Acelerometer axis X
if (myIMU.readRegisterInt16(&temp, LSM6DS3_ACC_GYRO_OUTX_L_XL) != 0) {
errorsAndWarnings++;
}
Serial.print(" X = ");
Serial.println(temp);
//Acelerometer axis Y
if (myIMU.readRegisterInt16(&temp, LSM6DS3_ACC_GYRO_OUTY_L_XL) != 0) {
errorsAndWarnings++;
}
Serial.print(" Y = ");
Serial.println(temp);
//Acelerometer axis Z
if (myIMU.readRegisterInt16(&temp, LSM6DS3_ACC_GYRO_OUTZ_L_XL) != 0) {
errorsAndWarnings++;
}
Serial.print(" Z = ");
Serial.println(temp);
Serial.println();
Serial.print("Total reported Errors and Warnings: ");
Serial.println(errorsAndWarnings);
// delay(1000);
Serial.print("*************LOOP TIME[uS] = "); Serial.println(micros() - timestamp);
}
Hi, thanks. It works great.
Would it be possible to change the setting to 13 HZ and also set it in low power mode using the high level example?
I have tried the:
myIMU.settings.accelSampleRate(13);
/*****************************************************************************/
// HighLevelExample.ino
// Hardware: Grove - 6-Axis Accelerometer&Gyroscope
// Arduino IDE: Arduino-1.65
// Author: Lambor
// Date: Oct,2015
// Version: v1.0
//
// Modified by:
// Data:
// Description:
//
// by www.seeedstudio.com
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
//
/*******************************************************************************/
#include "LSM6DS3.h"
#include "Wire.h"
//Create a instance of class LSM6DS3
LSM6DS3 myIMU(I2C_MODE, 0x6A); //I2C device address 0x6A
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
while (!Serial);
myIMU.settings.accelSampleRate(13);
//Call .begin() to configure the IMUs
if (myIMU.begin() != 0) {
Serial.println("Device error");
} else {
Serial.println("Device OK!");
}
}
void loop() {
unsigned long timestamp = micros();
//Accelerometer
Serial.print("\nAccelerometer:\n");
Serial.print(" X1 = ");
Serial.println(myIMU.readFloatAccelX(), 4);
Serial.print(" Y1 = ");
Serial.println(myIMU.readFloatAccelY(), 4);
Serial.print(" Z1 = ");
Serial.println(myIMU.readFloatAccelZ(), 4);
Serial.print("*************LOOP TIME[uS] = "); Serial.println(micros() - timestamp);
}
To set the sample rate to 13 Hz, write the following BEFORE myIMU.begin().
myIMU.settings.accelSampleRate = 13;
myIMU.settings.gyroSampleRate = 13;
To put it in low power mode, write the following AFTER myIMU.begin()
myIMU.readRegister(&readData, LSM6DS3_ACC_GYRO_CTRL6_G);
myIMU.writeRegister(LSM6DS3_ACC_GYRO_CTRL6_G, readData |= LSM6DS3_ACC_GYRO_LP_XL_ENABLED); // 0x10
myIMU.readRegister(&readData, LSM6DS3_ACC_GYRO_CTRL7_G);
myIMU.writeRegister(LSM6DS3_ACC_GYRO_CTRL7_G, readData |= LSM6DS3_ACC_GYRO_LP_EN_ENABLED); // 0x80
And to do Serial.print() at 13Hz, need “do-while”
do {
myIMU.readRegister(&readData, LSM6DS3_ACC_GYRO_STATUS_REG); // 0,0,0,0,0,TDA,GDA,XLDA
} while ((readData & 0x07) != 0x07);
Thanks for the help, it works great!