MCU & FPGA Sensores BNO055: Guia Completo de Orientação Absoluta, I2C, Calibração e Driver Robusto em C

BNO055: Guia Completo de Orientação Absoluta, I2C, Calibração e Driver Robusto em C


2. Arquitetura Interna, Modos de Operação e Sequência Correta de Inicialização

O BNO055 não é apenas um conjunto de três sensores MEMS colocados no mesmo encapsulamento. Ele contém quatro blocos principais: acelerômetro triaxial, giroscópio triaxial, magnetômetro triaxial e um microcontrolador interno que executa o algoritmo de fusão. Esse microcontrolador interno é o elemento que diferencia o BNO055 de sensores tradicionais como MPU9250 ou LSM9DS1, pois ele abstrai completamente a complexidade matemática da fusão (quaternions, filtros não lineares, compensação de deriva, calibração dinâmica).

No datasheet da Bosch, o dispositivo é descrito como um “System in Package (SiP)”, ou seja, um sistema completo encapsulado, incluindo clock interno, gerenciador de energia, EEPROM interna para calibração e a máquina de estados responsável pelos modos operacionais. Isso implica que o firmware do microcontrolador hospedeiro não controla diretamente os sensores brutos quando o modo de fusão está ativo; ele apenas configura e lê resultados processados.

2.1 Organização de Registradores

O mapa de registradores é dividido em duas páginas. A página ativa é selecionada pelo registrador PAGE_ID (0x07).

  • Page 0: dados de sensores, dados de fusão, status, modo de operação
  • Page 1: configuração detalhada do acelerômetro, giroscópio e magnetômetro

Esse mecanismo exige disciplina no firmware. Antes de acessar qualquer registrador, deve-se garantir que a página correta está selecionada. Muitas falhas relatadas com o BNO055 são resultado de escrita na página errada.

2.2 Modos de Operação

O registrador OPR_MODE (0x3D) define o modo de operação. Entre os principais modos:

  • CONFIGMODE (0x00) – modo de configuração obrigatório antes de alterar parâmetros críticos
  • ACCONLY – apenas acelerômetro
  • GYROONLY – apenas giroscópio
  • MAGONLY – apenas magnetômetro
  • IMU – fusão de acelerômetro + giroscópio
  • NDOF – fusão completa de 9 eixos

O modo NDOF é o mais utilizado quando se deseja orientação absoluta.

Um ponto crítico do datasheet: toda alteração de configuração exige que o dispositivo esteja previamente em CONFIGMODE. A sequência correta é:

  1. Escrever 0x00 em OPR_MODE
  2. Aguardar pelo menos 19 ms
  3. Realizar alterações desejadas
  4. Escrever novo modo operacional
  5. Aguardar novamente 7 a 19 ms (dependendo do modo)

Ignorar esses tempos pode causar comportamento errático.

2.3 Sequência Correta de Inicialização

A biblioteca oficial da Adafruit (Adafruit_BNO055.cpp no repositório GitHub) segue exatamente essa sequência:

  1. Verificar o registrador CHIP_ID (0x00) — deve retornar 0xA0
  2. Colocar o sensor em CONFIGMODE
  3. Executar soft reset escrevendo 0x20 em SYS_TRIGGER (0x3F)
  4. Aguardar até o sensor reinicializar
  5. Selecionar fonte de clock (interno ou externo)
  6. Configurar unidade de medida (graus ou radianos, m/s² ou mg) via UNIT_SEL
  7. Selecionar modo de operação (normalmente NDOF)

Essa sequência é obrigatória. Se o firmware pular o reset ou mudar o modo muito rapidamente, o sensor pode travar.

2.4 Exemplo de Inicialização em C (Bare-Metal)

Abaixo um exemplo didático em C para microcontrolador STM32 ou similar. Assume-se que já exista uma função:

void BNO055_Write(uint8_t reg, uint8_t value);
uint8_t BNO055_Read(uint8_t reg);
void delay_ms(uint32_t ms);

Verificação do CHIP_ID

uint8_t id = BNO055_Read(0x00);

if (id != 0xA0)
{
    // erro de comunicação
}

Entrar em modo CONFIG

BNO055_Write(0x3D, 0x00);  // OPR_MODE = CONFIGMODE
delay_ms(25);

Reset

BNO055_Write(0x3F, 0x20);  // SYS_TRIGGER reset
delay_ms(650);            // tempo seguro após reset

Selecionar modo NDOF

BNO055_Write(0x3D, 0x0C);  // NDOF
delay_ms(25);

Observe que não estamos ainda configurando escalas individuais porque no modo NDOF o algoritmo interno assume controle da fusão. Caso quiséssemos alterar, por exemplo, faixa do acelerômetro, seria necessário:

  1. Entrar em CONFIGMODE
  2. Mudar para Page 1
  3. Escrever no registrador ACC_CONFIG
  4. Voltar para Page 0
  5. Retornar ao modo desejado

2.5 Conversão de Dados

Os dados de orientação são armazenados em dois bytes por eixo (LSB + MSB), em complemento de dois, com fator de escala definido no datasheet.

Por exemplo, para Euler:

  • Endereços 0x1A a 0x1F
  • Fator de escala: 1° = 16 LSB

Conversão:

int16_t raw = (msb << 8) | lsb;
float angle_deg = raw / 16.0f;

Para quaternions:

  • Fator de escala: 1 = 2^14 LSB
float q = raw / 16384.0f;

Essa abordagem elimina necessidade de implementar filtros de Madgwick ou Mahony externamente.


Na próxima seção, aprofundaremos o funcionamento matemático da fusão interna, a interpretação de quaternions e ângulos de Euler, além da trigonometria envolvida na reconstrução de orientação espacial. Também abordaremos o processo de calibração e armazenamento de offsets.

0 0 votos
Classificação do artigo
Inscrever-se
Notificar de
guest
0 Comentários
mais antigos
mais recentes Mais votado
Feedbacks embutidos
Ver todos os comentários

Related Post

Sistema de Ronda com OneWire e iButton DS1904 usando ESP32: Implementação Completa, Multithread e à Prova de FalhasSistema de Ronda com OneWire e iButton DS1904 usando ESP32: Implementação Completa, Multithread e à Prova de Falhas

Este artigo apresenta uma implementação completa e profissional de um sistema de ronda baseado no barramento OneWire e no iButton DS1904, utilizando o microcontrolador ESP32 com FreeRTOS. Explicamos de forma

0
Adoraria saber sua opinião, comente.x