bno055 — Driver IMU BNO055

Questo modulo fornisce un driver per il sensore di orientamento assoluto a 9 assi Bosch BNO055 tramite I2C. Il BNO055 fonde sul chip i dati di accelerometro, magnetometro e giroscopio ed espone, oltre ai canali grezzi del sensore, le uscite di quaternione, angoli di Eulero, accelerazione lineare e gravità.

Esempio di utilizzo:

import time
from machine import I2C
import bno055

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

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

Classi

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

Costruisce un’istanza del driver BNO055.

  • bus è un oggetto bus machine.I2C configurato, utilizzato per comunicare con il sensore.

  • address è l’indirizzo I2C a 7 bit del dispositivo. Il valore predefinito è 0x28.

  • mode è la modalità operativa in cui viene posto il dispositivo dopo il reset. Vedi le costanti delle modalità operative riportate di seguito. Il valore predefinito è NDOF_MODE.

  • axis è un valore di configurazione di rimappatura degli assi a 2 byte. Vedi le costanti di posizionamento degli assi riportate di seguito. Il valore predefinito è AXIS_P4.

Il costruttore verifica l’ID del chip, esegue un soft reset, passa all’alimentazione normale, applica la configurazione degli assi ed entra nella modalità operativa richiesta utilizzando l’oscillatore esterno. Genera un RuntimeError se i valori attesi dei registri ID non vengono letti.

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

Legge size byte dal registro del dispositivo indicato e li restituisce come oggetto bytes.

write_registers(register: int, data: bytes) None

Scrive i byte data indicati nel dispositivo a partire da register.

operation_mode(mode: int = None) int

Legge o imposta il registro della modalità operativa. Senza argomenti, restituisce la modalità corrente come int. Con un argomento mode, scrive la nuova modalità nel dispositivo. Vedi le costanti delle modalità operative riportate di seguito.

system_trigger(data: int) None

Scrive data nel registro di trigger di sistema (0x3F). Viene utilizzato internamente per eseguire un soft reset (0x20) e per selezionare l’oscillatore esterno (0x80).

power_mode(mode: int = None) bytes

Legge o imposta il registro della modalità di alimentazione. Senza argomenti, restituisce il contenuto corrente del registro della modalità di alimentazione. Con un argomento mode, scrive la nuova modalità di alimentazione nel dispositivo.

page(num: int = None) None

Legge o imposta la pagina dei registri. Senza argomenti, legge il registro della pagina corrente. Con un argomento num, seleziona la pagina.

temperature() int

Restituisce il valore del registro della temperatura del chip come byte senza segno.

read_id() bytes

Restituisce il blocco ID a 4 byte letto dal registro 0x00. Il valore atteso è b'\xA0\xFB\x32\x0F'.

axis(placement: bytes = None) bytes

Legge o imposta la configurazione di rimappatura degli assi. Senza argomenti, restituisce la configurazione corrente degli assi a 2 byte. Con un argomento placement, scrive la configurazione degli assi a 2 byte fornita. Utilizza una delle costanti AXIS_P0..AXIS_P7 riportate di seguito.

quaternion() list

Restituisce l’orientamento fuso come lista di 4 elementi [w, x, y, z] di float scalati nell’intervallo del quaternione unitario.

euler() list

Restituisce l’orientamento fuso come lista di 3 elementi [yaw, roll, pitch] di float in gradi.

accelerometer() list

Restituisce la lettura dell’accelerometro come lista di 3 elementi [x, y, z] di float in m/s^2.

magnetometer() list

Restituisce la lettura del magnetometro come lista di 3 elementi [x, y, z] di float in micro-Tesla.

gyroscope() list

Restituisce la lettura del giroscopio come lista di 3 elementi [x, y, z] di float in gradi al secondo.

linear_acceleration() list

Restituisce l’accelerazione lineare compensata della gravità come lista di 3 elementi [x, y, z] di float in m/s^2.

gravity() list

Restituisce il vettore di gravità come lista di 3 elementi [x, y, z] di float in m/s^2.

Costanti

Modalità operative

bno055.CONFIG_MODE: int

Modalità di configurazione (0x00). Il dispositivo deve essere in questa modalità per modificare i registri di configurazione.

bno055.ACCONLY_MODE: int

Modalità non-fusione solo accelerometro (0x01).

bno055.MAGONLY_MODE: int

Modalità non-fusione solo magnetometro (0x02).

bno055.GYRONLY_MODE: int

Modalità non-fusione solo giroscopio (0x03).

bno055.ACCMAG_MODE: int

Modalità non-fusione accelerometro + magnetometro (0x04).

bno055.ACCGYRO_MODE: int

Modalità non-fusione accelerometro + giroscopio (0x05).

bno055.MAGGYRO_MODE: int

Modalità non-fusione magnetometro + giroscopio (0x06).

bno055.AMG_MODE: int

Modalità non-fusione accelerometro + magnetometro + giroscopio (0x07).

bno055.IMUPLUS_MODE: int

Modalità di fusione IMU che utilizza accelerometro + giroscopio (0x08).

bno055.COMPASS_MODE: int

Modalità di fusione bussola che utilizza accelerometro + magnetometro (0x09).

bno055.M4G_MODE: int

Modalità di fusione magnetometro-per-giroscopio (0x0A).

bno055.NDOF_FMC_OFF_MODE: int

Modalità di fusione a 9 gradi di libertà con calibrazione rapida del magnetometro disabilitata (0x0B).

bno055.NDOF_MODE: int

Modalità di fusione a 9 gradi di libertà con calibrazione rapida del magnetometro abilitata (0x0C). Questa è la modalità predefinita utilizzata dal costruttore.

Posizionamenti degli assi

I seguenti valori a 2 byte vengono passati a BNO055.axis() per rimappare il sistema di coordinate del dispositivo. Ogni costante è la coppia di registri (AXIS_MAP_CONFIG, AXIS_MAP_SIGN) del datasheet del BNO055 (Sezione 3.4, Axis remap), pre-codificata per uno degli otto orientamenti di posizionamento standard.

Scegli la costante le cui uscite degli assi corrispondono al modo in cui il chip è montato fisicamente sul PCB host:

Costante

Uscita X

Uscita Y

Uscita Z

Byte

Montaggio

AXIS_P0

-Yc

+Xc

+Zc

21 04

rivolto verso l’alto, 90° in senso antiorario rispetto a P1

AXIS_P1

+Xc

+Yc

+Zc

24 00

rivolto verso l’alto, predefinito da datasheet

AXIS_P2

-Xc

-Yc

+Zc

24 06

rivolto verso l’alto, ruotato di 180°

AXIS_P3

+Yc

-Xc

+Zc

21 02

rivolto verso l’alto, 90° in senso orario rispetto a P1

AXIS_P4

+Xc

-Yc

-Zc

24 03

rivolto verso il basso, capovolto attorno a X (predefinito del costruttore)

AXIS_P5

+Yc

+Xc

-Zc

21 01

rivolto verso il basso, ruotato di 90° in senso antiorario rispetto a P4

AXIS_P6

-Yc

-Xc

-Zc

21 07

rivolto verso il basso, ruotato di 180° rispetto a P4

AXIS_P7

-Xc

+Yc

-Zc

24 05

rivolto verso il basso, ruotato di 90° in senso orario rispetto a P4

Xc / Yc / Zc indicano gli assi intrinseci del chip (come riportato nel datasheet del BNO055). Le colonne «Uscita» sono gli assi che il dispositivo fornisce tramite BNO055.euler(), BNO055.gyro(), ecc. Da P0 a P3 sono le quattro rotazioni di 90° del chip con il lato componenti rivolto verso l’alto; da P4 a P7 sono le stesse quattro rotazioni dopo aver capovolto il chip sul retro.

bno055.AXIS_P0: bytes

Chip rivolto verso l’alto, ruotato di 90° in senso antiorario rispetto a AXIS_P1. Assi di uscita: X = -Yc, Y = +Xc, Z = +Zc.

bno055.AXIS_P1: bytes

Chip rivolto verso l’alto nell’orientamento predefinito del datasheet del BNO055. Non viene applicata alcuna rimappatura: X = +Xc, Y = +Yc, Z = +Zc.

bno055.AXIS_P2: bytes

Chip rivolto verso l’alto, ruotato di 180° rispetto a AXIS_P1. Assi di uscita: X = -Xc, Y = -Yc, Z = +Zc.

bno055.AXIS_P3: bytes

Chip rivolto verso l’alto, ruotato di 90° in senso orario rispetto a AXIS_P1. Assi di uscita: X = +Yc, Y = -Xc, Z = +Zc.

bno055.AXIS_P4: bytes

Chip capovolto sul retro (lato componenti rivolto verso il basso) rispetto a AXIS_P1. Assi di uscita: X = +Xc, Y = -Yc, Z = -Zc. Questo è il posizionamento utilizzato dal costruttore BNO055 quando non viene fornito alcun argomento axis.

bno055.AXIS_P5: bytes

Chip rivolto verso il basso, ruotato di 90° in senso antiorario rispetto a AXIS_P4. Assi di uscita: X = +Yc, Y = +Xc, Z = -Zc.

bno055.AXIS_P6: bytes

Chip rivolto verso il basso, ruotato di 180° rispetto a AXIS_P4. Assi di uscita: X = -Yc, Y = -Xc, Z = -Zc.

bno055.AXIS_P7: bytes

Chip rivolto verso il basso, ruotato di 90° in senso orario rispetto a AXIS_P4. Assi di uscita: X = -Xc, Y = +Yc, Z = -Zc.