bno055 — Driver da IMU BNO055

Este módulo fornece um driver para o sensor de orientação absoluta de 9 eixos Bosch BNO055 via I2C. O BNO055 funde os dados do acelerômetro, magnetômetro e giroscópio no próprio chip e expõe saídas de quaternion, ângulo de Euler, aceleração linear e gravidade, além dos canais de sensor brutos.

Exemplo de uso:

import time
from machine import I2C
import bno055

bus = I2C(1)
imu = bno055.BNO055(bus)

while True:
    print(imu.euler())
    time.sleep_ms(100)

Classes

class bno055.BNO055(bus: machine.I2C, address: int = 0x28, mode: int = NDOF_MODE, axis: bytes = AXIS_P4)

Constrói uma instância do driver do BNO055.

  • bus é um objeto de barramento machine.I2C configurado, usado para se comunicar com o sensor.

  • address é o endereço I2C de 7 bits do dispositivo. O padrão é 0x28.

  • mode é o modo de operação no qual o dispositivo é colocado após o reset. Veja as constantes de modo de operação abaixo. O padrão é NDOF_MODE.

  • axis é um valor de configuração de remapeamento de eixos de 2 bytes. Veja as constantes de posicionamento de eixos abaixo. O padrão é AXIS_P4.

O construtor verifica o ID do chip, executa um soft reset, alterna para o modo de energia normal, aplica a configuração de eixos e entra no modo de operação solicitado usando o oscilador externo. Gera RuntimeError se os valores esperados dos registradores de ID não forem lidos de volta.

read_registers(register: int, size: int = 1) bytes

size bytes do registrador de dispositivo fornecido e os retorna como um objeto bytes.

write_registers(register: int, data: bytes) None

Escreve os bytes de data fornecidos no dispositivo a partir de register.

operation_mode(mode: int = None) int

Obtém ou define o registrador de modo de operação. Sem argumento, retorna o modo atual como um int. Com um argumento mode, escreve o novo modo no dispositivo. Veja as constantes de modo de operação abaixo.

system_trigger(data: int) None

Escreve data no registrador de gatilho do sistema (0x3F). Isso é usado internamente para emitir um soft reset (0x20) e para selecionar o oscilador externo (0x80).

power_mode(mode: int = None) bytes

Obtém ou define o registrador de modo de energia. Sem argumento, retorna o conteúdo atual do registrador de modo de energia. Com um argumento mode, escreve o novo modo de energia no dispositivo.

page(num: int = None) None

Obtém ou define a página de registradores. Sem argumento, lê o registrador de página atual. Com um argumento num, seleciona a página.

temperature() int

Retorna o valor do registrador de temperatura do chip como um byte sem sinal.

read_id() bytes

Retorna o bloco de ID de 4 bytes lido do registrador 0x00. O valor esperado é b'\xA0\xFB\x32\x0F'.

axis(placement: bytes = None) bytes

Obtém ou define a configuração de remapeamento de eixos. Sem argumento, retorna a configuração de eixos de 2 bytes atual. Com um argumento placement, escreve a configuração de eixos de 2 bytes fornecida. Use uma das constantes AXIS_P0..AXIS_P7 abaixo.

quaternion() list

Retorna a orientação fundida como uma lista de 4 elementos [w, x, y, z] de floats escalados para o intervalo do quaternion unitário.

euler() list

Retorna a orientação fundida como uma lista de 3 elementos [yaw, roll, pitch] de floats em graus.

accelerometer() list

Retorna a leitura do acelerômetro como uma lista de 3 elementos [x, y, z] de floats em m/s^2.

magnetometer() list

Retorna a leitura do magnetômetro como uma lista de 3 elementos [x, y, z] de floats em micro-Tesla.

gyroscope() list

Retorna a leitura do giroscópio como uma lista de 3 elementos [x, y, z] de floats em graus por segundo.

linear_acceleration() list

Retorna a aceleração linear compensada pela gravidade como uma lista de 3 elementos [x, y, z] de floats em m/s^2.

gravity() list

Retorna o vetor de gravidade como uma lista de 3 elementos [x, y, z] de floats em m/s^2.

Constantes

Modos de operação

bno055.CONFIG_MODE: int

Modo de configuração (0x00). O dispositivo deve estar neste modo para alterar os registradores de configuração.

bno055.ACCONLY_MODE: int

Modo somente acelerômetro, sem fusão (0x01).

bno055.MAGONLY_MODE: int

Modo somente magnetômetro, sem fusão (0x02).

bno055.GYRONLY_MODE: int

Modo somente giroscópio, sem fusão (0x03).

bno055.ACCMAG_MODE: int

Modo acelerômetro + magnetômetro, sem fusão (0x04).

bno055.ACCGYRO_MODE: int

Modo acelerômetro + giroscópio, sem fusão (0x05).

bno055.MAGGYRO_MODE: int

Modo magnetômetro + giroscópio, sem fusão (0x06).

bno055.AMG_MODE: int

Modo acelerômetro + magnetômetro + giroscópio, sem fusão (0x07).

bno055.IMUPLUS_MODE: int

Modo de fusão IMU usando acelerômetro + giroscópio (0x08).

bno055.COMPASS_MODE: int

Modo de fusão de bússola usando acelerômetro + magnetômetro (0x09).

bno055.M4G_MODE: int

Modo de fusão magnetômetro-para-giroscópio (0x0A).

bno055.NDOF_FMC_OFF_MODE: int

Modo de fusão de 9 graus de liberdade com a calibração rápida do magnetômetro desabilitada (0x0B).

bno055.NDOF_MODE: int

Modo de fusão de 9 graus de liberdade com a calibração rápida do magnetômetro habilitada (0x0C). Este é o modo padrão usado pelo construtor.

Posicionamentos de eixos

Os seguintes valores de 2 bytes são passados para BNO055.axis() para remapear o sistema de coordenadas do dispositivo. Cada constante é o par de registradores (AXIS_MAP_CONFIG, AXIS_MAP_SIGN) do datasheet do BNO055 (Seção 3.4, Axis remap), pré-codificado para uma das oito orientações de posicionamento padrão.

Escolha a constante cujos eixos de saída correspondam à forma como o chip está fisicamente montado na PCB do host:

Constante

Saída X

Saída Y

Saída Z

Bytes

Montagem

AXIS_P0

-Yc

+Xc

+Zc

21 04

voltado para cima, 90° no sentido anti-horário a partir de P1

AXIS_P1

+Xc

+Yc

+Zc

24 00

voltado para cima, padrão do datasheet

AXIS_P2

-Xc

-Yc

+Zc

24 06

voltado para cima, girado 180°

AXIS_P3

+Yc

-Xc

+Zc

21 02

voltado para cima, 90° no sentido horário a partir de P1

AXIS_P4

+Xc

-Yc

-Zc

24 03

voltado para baixo, invertido em torno de X (padrão do construtor)

AXIS_P5

+Yc

+Xc

-Zc

21 01

voltado para baixo, girado 90° no sentido anti-horário a partir de P4

AXIS_P6

-Yc

-Xc

-Zc

21 07

voltado para baixo, girado 180° a partir de P4

AXIS_P7

-Xc

+Yc

-Zc

24 05

voltado para baixo, girado 90° no sentido horário a partir de P4

Xc / Yc / Zc denotam os eixos intrínsecos do chip (conforme impressos no datasheet do BNO055). As colunas “Saída” são os eixos que o dispositivo entrega via BNO055.euler(), BNO055.gyro(), etc. P0 até P3 são as quatro rotações de 90° do chip na orientação com o lado dos componentes para cima; P4 até P7 são as mesmas quatro rotações após virar o chip de costas.

bno055.AXIS_P0: bytes

Chip voltado para cima, girado 90° no sentido anti-horário a partir de AXIS_P1. Eixos de saída: X = -Yc, Y = +Xc, Z = +Zc.

bno055.AXIS_P1: bytes

Chip voltado para cima na orientação padrão do datasheet do BNO055. Nenhum remapeamento é aplicado: X = +Xc, Y = +Yc, Z = +Zc.

bno055.AXIS_P2: bytes

Chip voltado para cima, girado 180° a partir de AXIS_P1. Eixos de saída: X = -Xc, Y = -Yc, Z = +Zc.

bno055.AXIS_P3: bytes

Chip voltado para cima, girado 90° no sentido horário a partir de AXIS_P1. Eixos de saída: X = +Yc, Y = -Xc, Z = +Zc.

bno055.AXIS_P4: bytes

Chip virado de costas (lado dos componentes para baixo) em relação a AXIS_P1. Eixos de saída: X = +Xc, Y = -Yc, Z = -Zc. Este é o posicionamento usado pelo construtor BNO055 quando nenhum argumento axis é fornecido.

bno055.AXIS_P5: bytes

Chip voltado para baixo, girado 90° no sentido anti-horário a partir de AXIS_P4. Eixos de saída: X = +Yc, Y = +Xc, Z = -Zc.

bno055.AXIS_P6: bytes

Chip voltado para baixo, girado 180° a partir de AXIS_P4. Eixos de saída: X = -Yc, Y = -Xc, Z = -Zc.

bno055.AXIS_P7: bytes

Chip voltado para baixo, girado 90° no sentido horário a partir de AXIS_P4. Eixos de saída: X = -Xc, Y = +Yc, Z = -Zc.