Я пытаюсь получить чтение из IMU BNO055, реализация из ADA Fruit ниже.
https://cdn-learn.adafruit.com/downloads/pdf/adafruit-bno055-absolute-orientation-sensor.pdf
Кажется, я не могу пройти этап калибровки.
Руководство по BNO055 можно найти ниже: https://cdn-shop.adafruit.com/datasheets/BST_BNO055_DS000_12.pdf
Я не использую библиотеки, но общаюсь по I2 C напрямую и читаю и запись из регистров устройства.
Я выполняю следующую конфигурацию:
// The opening of the device and so on, works, so the line below is not a problem.
if (ioctl(data_exchange->file_imu_sensor, I2C_SLAVE, data_exchange->imu_addr) < 0) {
printf("Impossible to communicate with the IMU in the i2c. Make sure that the address you have is correct!\n");
exit(1);
}
// Here is where I start with the configuration. First I reset the device.
//SYS_TRIGGER Register. ADD 3F
//CLK_SEL (0 internal oscillator) REST_INT(reset interrumptions)RST_SYS(1 to reset) x x x x Self_TEST(1 to make a self test.)
// 00xxxx0
buf[0] = 0x3F;
buf[1] = 0x20; //00100000
write_buf(data_exchange,buf,3);
printf("IMU WAS COMMANDED TO RESET");
sleep(1); //It needs some time to reset. With one sec should be sufficient.
// Here I start with the real configuration.
// G range 2G xxxxxx00
// BW 7.81Hz xxx000xx
// Op mod normal 000xxxxx
//So I will write a 0 to the register ACC_condfi
buf[0] = 0x0D;
buf[1] = 0x00;
write_buf(data_exchange,buf,3);
// Now unit selection.UNIT_SEL Page 30.
//Accelaration m/s2 xxxxxxx0b
// Magnetic field in micro Teslas (always)
// Angular rate defrees ps xxxxxx0xb
// Euler angles Degress> xxxxxxxb
// Quaternion in Quaernion units always.
//Temperatyre deg xxx0xxxxb
// NPI The data output format can be selected by writing to the UNIT_SEL register, this allows user to switch between the orientation definition described by Windows and Android operating systems
// Windows> 0xxxxxxxb
// Android> 1xxxxxxxb. Page 30.
// Bits 5 and 6 are reserved. So it does not matter. So we write a 0.
buf[0] = 0x03;
buf[1] = 0x00;
write_buf(data_exchange,buf,3);
//We now need to set the operation mode:
//Register OPR_MODE Page 21.
//Fusion mode NDOF. xxxx1100b
buf[0] = 0x1C;
buf[1] = 0x0C; //00001100
write_buf(data_exchange,buf,3);
// GYR_Config_0
buf[0] = 0x0B;
buf[1] = 0x00; //00001100
write_buf(data_exchange,buf,3);
// PWR_MODE. Normal mode is xxxxxx00b
buf[0] = 0x3E;
buf[1] = 0x00; //00000000
write_buf(data_exchange,buf,3);
Теперь я должен дождаться внутренней калибровки чипа. Но кажется, что это не заканчивается sh.
Я проверяю это посредством проверки регистра 0x35, который должен быть> 0, если калибровка была завершена.
char buf[10];
int status=0;
read_buf(dataset_pointer,0x35,3,buf);
status=buf[0];
if(status>0){
//Here is where I perform all the reading and so on.
}
Я что-то упустил в конфигурации? Я проверил на Inte rnet и нашел несколько предложений (согласно руководству IMU) о создании 8 символов в воздухе с устройством, что я и сделал, но калибровка все равно не завершена.
Я не думаю, что это проблема с питанием (я нашел некоторые упоминания об этом на форумах Bo sh), потому что я подключил VIN к 5,0 В, 3 В к 3,3 В и GND к GND.
Любой комментарий по этому вопросу будет очень полезен. Я неправильно настраиваю устройство? Я пропустил какой-либо регистр?
Спасибо!