I2C Test
Issues with I2C:
- I2C PWR is run on a separate bus for low-power functionality, so you must enable I2C_PWR pin, which is GPIO 6! (Pin 10 on the ESP Module)
- I2C default pins are 22 and 21, which do not work for our board. We are using pins 3 & 4 for SDA/SCL respectively.
This is what a working setup function looks like:
void setup() {
pinMode(6, OUTPUT); //Setup the I2C_PWR Pin
digitalWrite(6, HIGH); //Turn on the I2C Devices
Serial.begin(115200);
Wire.begin(3, 4); //Initialize I2C on pins 3 (SDA) and 4 (SCL)
}
LSM6DS3 (IMU) Test:¶
The IMU does not show up right away with the Adafruit example code because it is has the incorrect WHO_AM_I register value: 0x69 (nice) instead of the expected 0x6A (not to be confused with the I2C Address, which is also 0x6A). To fix this, we have to change the Chip ID variable in the Adafruit_LSM6DS3TRC.h file:
(this is normally set to 0x6A)
In the code, we also need to call "Wire.begin(3, 4)" before "lsm6ds3trc.begin_I2C()" and to set the I2C_PWR pin high:
pinMode(6, OUTPUT);
digitalWrite(6, HIGH);
Serial.begin(115200);
while (!Serial)
delay(10);
Serial.println("Starting I2C initialization...");
Wire.begin(3, 4);
delay(100); // Give I2C time to stabilize
With this, I was able to get a nice Serial Plotter output in Arduino:
The final working Arduino code: (note that this library file has already had its variables manually updated)
// Basic demo for accelerometer/gyro readings from Adafruit LSM6DS3TR-C
#include <Adafruit_LSM6DS3TRC.h>
// For SPI mode, we need a CS pin
#define LSM_CS 10
// For software-SPI mode we need SCK/MOSI/MISO pins
#define LSM_SCK 13
#define LSM_MISO 12
#define LSM_MOSI 11
Adafruit_LSM6DS3TRC lsm6ds3trc;
void setup(void) {
pinMode(6, OUTPUT);
digitalWrite(6, HIGH);
Serial.begin(115200);
while (!Serial)
delay(10);
Serial.println("Starting I2C initialization...");
Wire.begin(3, 4);
delay(100); // Give I2C time to stabilize
Serial.println("Scanning for I2C devices...");
for (byte address = 1; address < 127; address++) {
Wire.beginTransmission(address);
byte error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address < 16) {
Serial.print("0");
}
Serial.println(address, HEX);
// If this is our LSM6DS3TR-C address, try reading WHO_AM_I register
if (address == 0x6A) {
Wire.beginTransmission(0x6A);
Wire.write(0x0F); // WHO_AM_I register address
Wire.endTransmission(false);
Wire.requestFrom(0x6A, 1);
if (Wire.available()) {
byte whoAmI = Wire.read();
Serial.print("WHO_AM_I register value: 0x");
Serial.println(whoAmI, HEX);
// Should be 0x6A for LSM6DS3TR-C
}
}
}
}
Serial.println("Attempting to initialize LSM6DS3TR-C...");
if (!lsm6ds3trc.begin_I2C()) {
Serial.println("Failed to find LSM6DS3TR-C chip");
Serial.println("Check your wiring!");
while (1) {
delay(10);
}
}
Serial.println("LSM6DS3TR-C Found!");
// lsm6ds3trc.setAccelRange(LSM6DS_ACCEL_RANGE_2_G);
Serial.print("Accelerometer range set to: ");
switch (lsm6ds3trc.getAccelRange()) {
case LSM6DS_ACCEL_RANGE_2_G:
Serial.println("+-2G");
break;
case LSM6DS_ACCEL_RANGE_4_G:
Serial.println("+-4G");
break;
case LSM6DS_ACCEL_RANGE_8_G:
Serial.println("+-8G");
break;
case LSM6DS_ACCEL_RANGE_16_G:
Serial.println("+-16G");
break;
}
// lsm6ds3trc.setGyroRange(LSM6DS_GYRO_RANGE_250_DPS);
Serial.print("Gyro range set to: ");
switch (lsm6ds3trc.getGyroRange()) {
case LSM6DS_GYRO_RANGE_125_DPS:
Serial.println("125 degrees/s");
break;
case LSM6DS_GYRO_RANGE_250_DPS:
Serial.println("250 degrees/s");
break;
case LSM6DS_GYRO_RANGE_500_DPS:
Serial.println("500 degrees/s");
break;
case LSM6DS_GYRO_RANGE_1000_DPS:
Serial.println("1000 degrees/s");
break;
case LSM6DS_GYRO_RANGE_2000_DPS:
Serial.println("2000 degrees/s");
break;
case ISM330DHCX_GYRO_RANGE_4000_DPS:
break; // unsupported range for the DS33
}
// lsm6ds3trc.setAccelDataRate(LSM6DS_RATE_12_5_HZ);
Serial.print("Accelerometer data rate set to: ");
switch (lsm6ds3trc.getAccelDataRate()) {
case LSM6DS_RATE_SHUTDOWN:
Serial.println("0 Hz");
break;
case LSM6DS_RATE_12_5_HZ:
Serial.println("12.5 Hz");
break;
case LSM6DS_RATE_26_HZ:
Serial.println("26 Hz");
break;
case LSM6DS_RATE_52_HZ:
Serial.println("52 Hz");
break;
case LSM6DS_RATE_104_HZ:
Serial.println("104 Hz");
break;
case LSM6DS_RATE_208_HZ:
Serial.println("208 Hz");
break;
case LSM6DS_RATE_416_HZ:
Serial.println("416 Hz");
break;
case LSM6DS_RATE_833_HZ:
Serial.println("833 Hz");
break;
case LSM6DS_RATE_1_66K_HZ:
Serial.println("1.66 KHz");
break;
case LSM6DS_RATE_3_33K_HZ:
Serial.println("3.33 KHz");
break;
case LSM6DS_RATE_6_66K_HZ:
Serial.println("6.66 KHz");
break;
}
// lsm6ds3trc.setGyroDataRate(LSM6DS_RATE_12_5_HZ);
Serial.print("Gyro data rate set to: ");
switch (lsm6ds3trc.getGyroDataRate()) {
case LSM6DS_RATE_SHUTDOWN:
Serial.println("0 Hz");
break;
case LSM6DS_RATE_12_5_HZ:
Serial.println("12.5 Hz");
break;
case LSM6DS_RATE_26_HZ:
Serial.println("26 Hz");
break;
case LSM6DS_RATE_52_HZ:
Serial.println("52 Hz");
break;
case LSM6DS_RATE_104_HZ:
Serial.println("104 Hz");
break;
case LSM6DS_RATE_208_HZ:
Serial.println("208 Hz");
break;
case LSM6DS_RATE_416_HZ:
Serial.println("416 Hz");
break;
case LSM6DS_RATE_833_HZ:
Serial.println("833 Hz");
break;
case LSM6DS_RATE_1_66K_HZ:
Serial.println("1.66 KHz");
break;
case LSM6DS_RATE_3_33K_HZ:
Serial.println("3.33 KHz");
break;
case LSM6DS_RATE_6_66K_HZ:
Serial.println("6.66 KHz");
break;
}
lsm6ds3trc.configInt1(false, false, true); // accelerometer DRDY on INT1
lsm6ds3trc.configInt2(false, true, false); // gyro DRDY on INT2
}
void loop() {
// Get a new normalized sensor event
sensors_event_t accel;
sensors_event_t gyro;
sensors_event_t temp;
lsm6ds3trc.getEvent(&accel, &gyro, &temp);
// Serial.print("\t\tTemperature ");
// Serial.print(temp.temperature);
// Serial.println(" deg C");
/* Display the results (acceleration is measured in m/s^2) */
// Serial.print("\t\tAccel X: ");
// Serial.print(accel.acceleration.x);
// Serial.print(" \tY: ");
// Serial.print(accel.acceleration.y);
// Serial.print(" \tZ: ");
// Serial.print(accel.acceleration.z);
// Serial.println(" m/s^2 ");
/* Display the results (rotation is measured in rad/s) */
// Serial.print("\t\tGyro X: ");
// Serial.print(gyro.gyro.x);
// Serial.print(" \tY: ");
// Serial.print(gyro.gyro.y);
// Serial.print(" \tZ: ");
// Serial.print(gyro.gyro.z);
// Serial.println(" radians/s ");
// Serial.println();
delay(100);
// serial plotter friendly format
Serial.print(temp.temperature);
Serial.print(",");
Serial.print(accel.acceleration.x);
Serial.print(","); Serial.print(accel.acceleration.y);
Serial.print(","); Serial.print(accel.acceleration.z);
Serial.print(",");
Serial.print(gyro.gyro.x);
Serial.print(","); Serial.print(gyro.gyro.y);
Serial.print(","); Serial.print(gyro.gyro.z);
Serial.println();
delayMicroseconds(10000);
}