bno055 — Driver 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 dados de acelerómetro, magnetómetro e giroscópio no chip e expõe saídas de quaternião, ângulo de Euler, aceleração linear e gravidade, além dos canais brutos do sensor.

Exemplo de utilização:

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 BNO055.

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

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

  • mode é o modo de operação em que o dispositivo é colocado após o reset. Consulte as constantes de modo de operação abaixo. Por omissão é NDOF_MODE.

  • axis é um valor de configuração de remapeamento de eixos de 2 bytes. Consulte as constantes de posicionamento de eixos abaixo. Por omissão é AXIS_P4.

O construtor verifica o ID do chip, efetua um reset por software, muda para alimentação normal, aplica a configuração de eixos e entra no modo de operação solicitado utilizando o oscilador externo. Lança RuntimeError se os valores esperados do registo de ID não forem lidos de volta.

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

size bytes a partir do registo de dispositivo indicado e retorna-os como um objeto bytes.

write_registers(register: int, data: bytes) None

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

operation_mode(mode: int = None) int

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

system_trigger(data: int) None

Escreve data no registo de acionamento do sistema (0x3F). Utilizado internamente para emitir um reset por software (0x20) e para selecionar o oscilador externo (0x80).

power_mode(mode: int = None) bytes

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

page(num: int = None) None

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

temperature() int

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

read_id() bytes

Retorna o bloco de ID de 4 bytes lido a partir do registo 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 atual de 2 bytes. Com um argumento placement, escreve a configuração de eixos de 2 bytes fornecida. Utilize 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 quaternião 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 com compensação de 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 registos de configuração.

bno055.ACCONLY_MODE: int

Modo de não fusão apenas com acelerómetro (0x01).

bno055.MAGONLY_MODE: int

Modo de não fusão apenas com magnetómetro (0x02).

bno055.GYRONLY_MODE: int

Modo de não fusão apenas com giroscópio (0x03).

bno055.ACCMAG_MODE: int

Modo de não fusão com acelerómetro + magnetómetro (0x04).

bno055.ACCGYRO_MODE: int

Modo de não fusão com acelerómetro + giroscópio (0x05).

bno055.MAGGYRO_MODE: int

Modo de não fusão com magnetómetro + giroscópio (0x06).

bno055.AMG_MODE: int

Modo de não fusão com acelerómetro + magnetómetro + giroscópio (0x07).

bno055.IMUPLUS_MODE: int

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

bno055.COMPASS_MODE: int

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

bno055.M4G_MODE: int

Modo de fusão de magnetómetro como giroscópio (0x0A).

bno055.NDOF_FMC_OFF_MODE: int

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

bno055.NDOF_MODE: int

Modo de fusão de 9 graus de liberdade com calibração rápida do magnetómetro ativada (0x0C). Este é o modo predefinido utilizado pelo construtor.

Posicionamentos de eixos

Os seguintes valores de 2 bytes são passados a BNO055.axis() para remapear o sistema de coordenadas do dispositivo. Cada constante é o par de registos (AXIS_MAP_CONFIG, AXIS_MAP_SIGN) da folha de dados do BNO055 (Secção 3.4, Axis remap), pré-codificados para uma das oito orientações de posicionamento padrão.

Escolha a constante cujos eixos de saída correspondem à forma como o chip está fisicamente montado no PCB anfitrião:

Constante

Saída X

Saída Y

Saída Z

Bytes

Montagem

AXIS_P0

-Yc

+Xc

+Zc

21 04

virado para cima, 90° CCW em relação a P1

AXIS_P1

+Xc

+Yc

+Zc

24 00

virado para cima, orientação predefinida da folha de dados

AXIS_P2

-Xc

-Yc

+Zc

24 06

virado para cima, rodado 180°

AXIS_P3

+Yc

-Xc

+Zc

21 02

virado para cima, 90° CW em relação a P1

AXIS_P4

+Xc

-Yc

-Zc

24 03

virado para baixo, invertido em torno de X (predefinição do construtor)

AXIS_P5

+Yc

+Xc

-Zc

21 01

virado para baixo, rodado 90° CCW em relação a P4

AXIS_P6

-Yc

-Xc

-Zc

21 07

virado para baixo, rodado 180° em relação a P4

AXIS_P7

-Xc

+Yc

-Zc

24 05

virado para baixo, rodado 90° CW em relação a P4

Xc / Yc / Zc designam os eixos intrínsecos do chip (conforme indicado na folha de dados do BNO055). As colunas «Saída» são os eixos que o dispositivo fornece via BNO055.euler(), BNO055.gyro(), etc. P0 a P3 são as quatro rotações de 90° do chip na orientação com o lado de componentes para cima; P4 a P7 são as mesmas quatro rotações após virar o chip para o lado contrário.

bno055.AXIS_P0: bytes

Chip virado para cima, rodado 90° CCW em relação a AXIS_P1. Eixos de saída: X = -Yc, Y = +Xc, Z = +Zc.

bno055.AXIS_P1: bytes

Chip virado para cima na orientação predefinida da folha de dados do BNO055. Nenhum remapeamento é aplicado: X = +Xc, Y = +Yc, Z = +Zc.

bno055.AXIS_P2: bytes

Chip virado para cima, rodado 180° em relação a AXIS_P1. Eixos de saída: X = -Xc, Y = -Yc, Z = +Zc.

bno055.AXIS_P3: bytes

Chip virado para cima, rodado 90° CW em relação a AXIS_P1. Eixos de saída: X = +Yc, Y = -Xc, Z = +Zc.

bno055.AXIS_P4: bytes

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

bno055.AXIS_P5: bytes

Chip virado para baixo, rodado 90° CCW em relação a AXIS_P4. Eixos de saída: X = +Yc, Y = +Xc, Z = -Zc.

bno055.AXIS_P6: bytes

Chip virado para baixo, rodado 180° em relação a AXIS_P4. Eixos de saída: X = -Yc, Y = -Xc, Z = -Zc.

bno055.AXIS_P7: bytes

Chip virado para baixo, rodado 90° CW em relação a AXIS_P4. Eixos de saída: X = -Xc, Y = +Yc, Z = -Zc.