How to read IMU data via on I2C pins?
Hi all !
I am trying to read data from my BMI160 sensor. (Operating system is Ubuntu 16.04)
My wiring to UpBoard like this:
Sensor UpBoard
SCL I2C1_SCL(Pin5)
SDA I2C1_SDA(Pin3)
VCC 5V(Pin2)
GND Ground(Pin6)
Sensor Ground also connected to SAO pin of sensor.
After all doing this. I installed i2detect and rund the command i2cdetect -y -r 5 and here is the result image:
When I unplug the pins 68 in the table disappears so I think it detects my sensor. The problem is that I dont know how to read data from sensor. According to driver document I tried to use code but I couldnt read any data. Here is my code I tried. But i dont know which side I am doing wrong. The problem is about the code or about the upboard. How can I read I2C data from terminal.
#include "bmi160.h" #include <iostream> using namespace std; int main(int argc, char *argv[]) { struct bmi160_dev sensor; sensor.id = BMI160_I2C_ADDR; sensor.interface = BMI160_I2C_INTF; int8_t rslt = BMI160_OK; rslt = bmi160_init(&sensor); /* After the above function call, accel and gyro parameters in the device structure are set with default values, found in the datasheet of the sensor */ /* Select the Output data rate, range of accelerometer sensor */ sensor.accel_cfg.odr = BMI160_ACCEL_ODR_1600HZ; sensor.accel_cfg.range = BMI160_ACCEL_RANGE_2G; sensor.accel_cfg.bw = BMI160_ACCEL_BW_NORMAL_AVG4; /* Select the power mode of accelerometer sensor */ sensor.accel_cfg.power = BMI160_ACCEL_NORMAL_MODE; /* Select the Output data rate, range of Gyroscope sensor */ sensor.gyro_cfg.odr = BMI160_GYRO_ODR_3200HZ; sensor.gyro_cfg.range = BMI160_GYRO_RANGE_2000_DPS; sensor.gyro_cfg.bw = BMI160_GYRO_BW_NORMAL_MODE; /* Select the power mode of Gyroscope sensor */ sensor.gyro_cfg.power = BMI160_GYRO_NORMAL_MODE; /* Set the sensor configuration */ rslt = bmi160_set_sens_conf(&sensor); struct bmi160_sensor_data accel; struct bmi160_sensor_data gyro; /* To read only Accel data */ rslt = bmi160_get_sensor_data(BMI160_ACCEL_SEL, &accel, NULL, &sensor); cout<<accel.z<<endl; /* To read only Gyro data */ rslt = bmi160_get_sensor_data(BMI160_GYRO_SEL, NULL, &gyro, &sensor); /* To read both Accel and Gyro data */ bmi160_get_sensor_data((BMI160_ACCEL_SEL | BMI160_GYRO_SEL), &accel, &gyro, &sensor); /* To read Accel data along with time */ rslt = bmi160_get_sensor_data((BMI160_ACCEL_SEL | BMI160_TIME_SEL) , &accel, NULL, &sensor); /* To read Gyro data along with time */ rslt = bmi160_get_sensor_data((BMI160_GYRO_SEL | BMI160_TIME_SEL), NULL, &gyro, &sensor); /* To read both Accel and Gyro data along with time*/ bmi160_get_sensor_data((BMI160_ACCEL_SEL | BMI160_GYRO_SEL | BMI160_TIME_SEL), &accel, &gyro, &sensor); }
Comments
-
perhaps you should tell where to find your sensor ?!
char *fileName = "/dev/i2c-5"; // name of bmi160 i2c port
int address = 0x68; // Address of the bmi160
unsigned char buf[10]; // Buffer