bno055 IMU Калибровка - PullRequest
       79

bno055 IMU Калибровка

0 голосов
/ 07 апреля 2020

Я пытаюсь получить чтение из 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.

Любой комментарий по этому вопросу будет очень полезен. Я неправильно настраиваю устройство? Я пропустил какой-либо регистр?

Спасибо!

1 Ответ

0 голосов
/ 16 апреля 2020

Я продолжил обсуждение на веб-странице ADAFruit.

См .:

https://forums.adafruit.com/viewtopic.php?f=19&t=164389&p=808106#p808106

В итоге подход будет следующим:

  1. Войдите в режим конфигурации ( OP_MODE (0x3D) установлен в 0x00)
  2. Мы выбираем карту регистра 0. (PAGE_ID (0x37) устанавливается в 0x00)
  3. Сбрасываем устройство (SYS_TRIGGER (0x3F) устанавливается в 0x20)
  4. Режим питания в нормальном режиме (POWER_MODE (0x3E) установлен на 0x00)
  5. Внутренние часы, выбранные в SYS_TRIGGER (SYS_TRIGGER (0x3F), установлены на 0x00)
  6. OP_MODE установлен в NDOF (потому что я хочу) (OP_MODE (0x3D) установлен в 0x0B)

Необязательно, в соответствии с рекомендациями фруктового форума Gammaburst ADA:

// AXIS_MAP_CONFIG 0x41 регистрируется в 0x21. // AXIS_MAP_SIGN 0x42 регистрируется в 0x02;

.

buf[0] = 0X3D; //OP_MODE;
buf[1] = 0x00; // Config mode
write_buf(data_exchange,buf,3);


buf[0] = 0x07; // BNO055_PAGE_ID_ADDR
buf[1] = 0x00; // We want to access the Register Map 0. See page 51 of the Manual https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bno055-ds000.pdf
write_buf(data_exchange,buf,3);

buf[0] = 0x3F; //(SYS_TRIGGER)
buf[1] = 0x20; //00100000 Reset!
write_buf(data_exchange,buf,3);
printf("IMU WAS COMMANDED TO RESET");
sleep(0.65); //It needs some time to reset. With one sec should be sufficient.


buf[0] = 0x3E; //(POWER_MODE)
buf[1] = 0x00; //00000000 Normal mode
write_buf(data_exchange,buf,3);


buf[0] = 0x3F; // SYS_TRIGGER
buf[1] = 0x00; //00000000 Iternal clock
write_buf(data_exchange,buf,3);

buf[0] = 0X3D; //OP_MODE;
buf[1] = 0x0B; //NDOF
write_buf(data_exchange,buf,3);

//These two are optional as per suggestion from gammaburst user in ADAFruit forums
//AXIS_MAP_CONFIG
buf[0] = 0x41;
buf[1] = 0x21;
write_buf(data_exchange,buf,3);


// AXIS_MAP_SIGN
 buf[0] = 0x42;
 buf[1] = 0x02;
 write_buf(data_exchange,buf,3);
...