Hi, I use a Bosch BMI160 sensor to measure the three-axis acceleration and orientation. This sensor is connected to a developer board. I read a total of 12 registers and expect 12 values each time (one LSB and MSB value per axis). The problem now is that in rare cases I have fewer or more values when I start the transmission, such as just now: //output:
"178,62"
"178,62 211,255,246,255,241,255,253"
"178,62 211,255,246,255,241,255,253,1,94,7,200,62" I would now like to know whether it is perhaps due to my code. Above all, the last two output lines show that there is a space in the second value ("62 211"), but I don't insert a space in the code. How can that be? Here is a piece of my code (the rest is just setting up the sensor and dev-board): void initBMI160()
{
// Start I2C Transmission ACC to the BMI160 sensor
Wire.beginTransmission(AddrBMI160);
// Select data register
Wire.write(0x00);
// Stop I2C Transmission
Wire.endTransmission();
Serial.println(F("Send done"));
// Request 1 byte of data
Wire.requestFrom(AddrBMI160, 1);
// Read 6 bytes of data
// xAccl lsb, xAccl msb, yAccl lsb, yAccl msb, zAccl lsb, zAccl msb
if (Wire.available() == 1)
{
byte data = Wire.read();
Serial.println(F("data available"));
Serial.println(data, HEX);
}
else {
Serial.println(F("No data available"));
}
//PMU mode
// Start I2C Transmission
Wire.beginTransmission(AddrBMI160);
// Set PMU for acc
Wire.write(0x7E);
// Set Acc to normal mode
Wire.write(0x11);
// Stop I2C Transmission
Wire.endTransmission();
//"You need to wait for at least 5ms and then you can write value of 0x15 to command register 0x7E to bring gyro to normal mode"
delay(50);
// Start I2C Transmission
Wire.beginTransmission(AddrBMI160);
// Set PMU for gyr
Wire.write(0x7E);
// Set Gyr to normal mode
Wire.write(0x15);
// Stop I2C Transmission
Wire.endTransmission();
//"You also need to wait at least 80ms for gyro to be stablized before you perform I2C read or write action"
delay(200);
//Range
// Start I2C Transmission
Wire.beginTransmission(AddrBMI160);
// Set ACC_RANGE
Wire.write(0x41);
// Set Acc range to +-2g
Wire.write(0x03);
// Stop I2C Transmission
Wire.endTransmission();
// Start I2C Transmission
Wire.beginTransmission(AddrBMI160);
// Set Range for Gyr
Wire.write(0x43);
// Set Gyr Range to 250dps
Wire.write(0x03);
// Stop I2C Transmission
Wire.endTransmission();
//Read PMU
// Start I2C Transmission
Wire.beginTransmission(AddrBMI160);
// PMU REG
Wire.write(0x03);
// Stop I2C Transmission
Wire.endTransmission();
// Request 1 byte of data
Wire.requestFrom(AddrBMI160, 1);
// Read PMU REG
if (Wire.available() == 1)
{
byte data = Wire.read();
Serial.println(F("PMU REG"));
Serial.println(data, HEX);
}
else {
Serial.println(F("No data available"));
}
//Read Range
// Start I2C Transmission
Wire.beginTransmission(AddrBMI160);
// ACC_RANGE
Wire.write(0x41);
// Stop I2C Transmission
Wire.endTransmission();
// Request 1 byte of data
Wire.requestFrom(AddrBMI160, 1);
// Read PMU REG
if (Wire.available() == 1)
{
byte data = Wire.read();
Serial.println(F("ACC_RANGE REG"));
Serial.println(data, HEX);
}
else {
Serial.println(F("No data available"));
}
// Start I2C Transmission
Wire.beginTransmission(AddrBMI160);
// GYR_RANGE
Wire.write(0x43);
// Stop I2C Transmission
Wire.endTransmission();
// Request 1 byte of data
Wire.requestFrom(AddrBMI160, 1);
// Read PMU REG
if (Wire.available() == 1)
{
byte data = Wire.read();
Serial.println(F("GYR_RANGE REG"));
Serial.println(data, HEX);
}
else {
Serial.println(F("No data available"));
}
Serial.println(F("BMI160 init done"));
} void loop() {
Wire.beginTransmission(AddrBMI160);
Wire.write(12);
Wire.endTransmission(true);
Wire.requestFrom(AddrBMI160, 12, true);
for (int i = 0; i < 12; i++) {
ble.print(Wire.read());
// Separator for further processing
if (i < 11) {
ble.print(",");
}
}
// A space so that the further program knows that the values can be plotted
ble.println();
delay(1000);
} So I always expect 12 values, that are seperated with a comma for the further processing of the data on my PC.
... View more