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 é:
- Escrever 0x00 em OPR_MODE
- Aguardar pelo menos 19 ms
- Realizar alterações desejadas
- Escrever novo modo operacional
- 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:
- Verificar o registrador CHIP_ID (0x00) — deve retornar 0xA0
- Colocar o sensor em CONFIGMODE
- Executar soft reset escrevendo 0x20 em SYS_TRIGGER (0x3F)
- Aguardar até o sensor reinicializar
- Selecionar fonte de clock (interno ou externo)
- Configurar unidade de medida (graus ou radianos, m/s² ou mg) via UNIT_SEL
- 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:
- Entrar em CONFIGMODE
- Mudar para Page 1
- Escrever no registrador ACC_CONFIG
- Voltar para Page 0
- 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.