bno055 — Driver IMU BNO055#

Acest modul oferă un driver pentru senzorul de orientare absolută pe 9 axe Bosch BNO055 prin I2C. BNO055 combină pe cip datele de la accelerometru, magnetometru și giroscop și expune ieșiri de cuaternion, unghiuri Euler, accelerație liniară și gravitație, pe lângă canalele de senzor brute.

Exemplu de utilizare:

import time
from machine import I2C
import bno055

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

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

Clase#

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

Construiește o instanță de driver BNO055.

  • bus este un obiect de magistrală machine.I2C configurat, folosit pentru a comunica cu senzorul.

  • address este adresa I2C pe 7 biți a dispozitivului. Valoarea implicită este 0x28.

  • mode este modul de operare în care este pus dispozitivul după resetare. Vezi constantele modurilor de operare de mai jos. Valoarea implicită este NDOF_MODE.

  • axis este o valoare de configurare a remapării axelor pe 2 octeți. Vezi constantele de plasare a axelor de mai jos. Valoarea implicită este AXIS_P4.

Constructorul verifică ID-ul cipului, efectuează o resetare software, comută la alimentarea normală, aplică configurația axelor și intră în modul de operare solicitat folosind oscilatorul extern. Generează RuntimeError dacă valorile așteptate ale registrului de ID nu sunt citite înapoi.

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

Citește size octeți din registrul dat al dispozitivului și îi returnează ca obiect bytes.

write_registers(register: int, data: bytes) None#

Scrie octeții data dați în dispozitiv, începând de la register.

operation_mode(mode: int = None) int#

Obține sau setează registrul modului de operare. Fără argument, returnează modul curent ca int. Cu un argument mode, scrie noul mod în dispozitiv. Vezi constantele modurilor de operare de mai jos.

system_trigger(data: int) None#

Scrie data în registrul de declanșare a sistemului (0x3F). Acesta este folosit intern pentru a emite o resetare software (0x20) și pentru a selecta oscilatorul extern (0x80).

power_mode(mode: int = None) bytes#

Obține sau setează registrul modului de alimentare. Fără argument, returnează conținutul curent al registrului modului de alimentare. Cu un argument mode, scrie noul mod de alimentare în dispozitiv.

page(num: int = None) None#

Obține sau setează pagina de registre. Fără argument, citește registrul paginii curente. Cu un argument num, selectează pagina.

temperature() int#

Returnează valoarea registrului de temperatură al cipului ca octet fără semn.

read_id() bytes#

Returnează blocul de ID pe 4 octeți citit din registrul 0x00. Valoarea așteptată este b'\xA0\xFB\x32\x0F'.

axis(placement: bytes = None) bytes#

Obține sau setează configurația de remapare a axelor. Fără argument, returnează configurația curentă a axelor pe 2 octeți. Cu un argument placement, scrie configurația axelor pe 2 octeți furnizată. Folosește una dintre constantele AXIS_P0..AXIS_P7 de mai jos.

quaternion() list#

Returnează orientarea combinată ca listă cu 4 elemente [w, x, y, z] de numere în virgulă mobilă scalate la intervalul cuaternionului unitar.

euler() list#

Returnează orientarea combinată ca listă cu 3 elemente [yaw, roll, pitch] de numere în virgulă mobilă în grade.

accelerometer() list#

Returnează citirea accelerometrului ca listă cu 3 elemente [x, y, z] de numere în virgulă mobilă în m/s^2.

magnetometer() list#

Returnează citirea magnetometrului ca listă cu 3 elemente [x, y, z] de numere în virgulă mobilă în micro-Tesla.

gyroscope() list#

Returnează citirea giroscopului ca listă cu 3 elemente [x, y, z] de numere în virgulă mobilă în grade pe secundă.

linear_acceleration() list#

Returnează accelerația liniară compensată pentru gravitație ca listă cu 3 elemente [x, y, z] de numere în virgulă mobilă în m/s^2.

gravity() list#

Returnează vectorul gravitațional ca listă cu 3 elemente [x, y, z] de numere în virgulă mobilă în m/s^2.

Constante#

Moduri de operare#

bno055.CONFIG_MODE: int#

Mod de configurare (0x00). Dispozitivul trebuie să fie în acest mod pentru a modifica registrele de configurare.

bno055.ACCONLY_MODE: int#

Mod fără fuziune doar cu accelerometru (0x01).

bno055.MAGONLY_MODE: int#

Mod fără fuziune doar cu magnetometru (0x02).

bno055.GYRONLY_MODE: int#

Mod fără fuziune doar cu giroscop (0x03).

bno055.ACCMAG_MODE: int#

Mod fără fuziune accelerometru + magnetometru (0x04).

bno055.ACCGYRO_MODE: int#

Mod fără fuziune accelerometru + giroscop (0x05).

bno055.MAGGYRO_MODE: int#

Mod fără fuziune magnetometru + giroscop (0x06).

bno055.AMG_MODE: int#

Mod fără fuziune accelerometru + magnetometru + giroscop (0x07).

bno055.IMUPLUS_MODE: int#

Mod de fuziune IMU folosind accelerometru + giroscop (0x08).

bno055.COMPASS_MODE: int#

Mod de fuziune busolă folosind accelerometru + magnetometru (0x09).

bno055.M4G_MODE: int#

Mod de fuziune magnet-pentru-giroscop (0x0A).

bno055.NDOF_FMC_OFF_MODE: int#

Mod de fuziune 9-DOF cu calibrarea rapidă a magnetometrului dezactivată (0x0B).

bno055.NDOF_MODE: int#

Mod de fuziune 9-DOF cu calibrarea rapidă a magnetometrului activată (0x0C). Acesta este modul implicit folosit de constructor.

Plasări ale axelor#

Următoarele valori pe 2 octeți sunt transmise către BNO055.axis() pentru a remapa sistemul de coordonate al dispozitivului. Fiecare constantă este perechea de registre (AXIS_MAP_CONFIG, AXIS_MAP_SIGN) din fișa tehnică BNO055 (Secțiunea 3.4, Axis remap), pre-codificată pentru una dintre cele opt orientări de plasare standard.

Alege constanta ale cărei axe de ieșire corespund modului în care cipul este montat fizic pe PCB-ul gazdă:

Constantă

Ieșire X

Ieșire Y

Ieșire Z

Octeți

Montare

AXIS_P0

-Yc

+Xc

+Zc

21 04

cu fața în sus, 90° CCW față de P1

AXIS_P1

+Xc

+Yc

+Zc

24 00

cu fața în sus, valoarea implicită din fișa tehnică

AXIS_P2

-Xc

-Yc

+Zc

24 06

cu fața în sus, rotit 180°

AXIS_P3

+Yc

-Xc

+Zc

21 02

cu fața în sus, 90° CW față de P1

AXIS_P4

+Xc

-Yc

-Zc

24 03

cu fața în jos, întors în jurul axei X (valoarea implicită a constructorului)

AXIS_P5

+Yc

+Xc

-Zc

21 01

cu fața în jos, rotit 90° CCW față de P4

AXIS_P6

-Yc

-Xc

-Zc

21 07

cu fața în jos, rotit 180° față de P4

AXIS_P7

-Xc

+Yc

-Zc

24 05

cu fața în jos, rotit 90° CW față de P4

Xc / Yc / Zc denotă axele intrinseci ale cipului (așa cum sunt tipărite în fișa tehnică BNO055). Coloanele „Ieșire” reprezintă axele pe care dispozitivul le livrează prin BNO055.euler(), BNO055.gyro() etc. P0 până la P3 sunt cele patru rotații de 90° ale cipului în orientarea cu partea componentelor în sus; P4 până la P7 sunt aceleași patru rotații după întoarcerea cipului pe spate.

bno055.AXIS_P0: bytes#

Cip cu fața în sus, rotit 90° CCW față de AXIS_P1. Axe de ieșire: X = -Yc, Y = +Xc, Z = +Zc.

bno055.AXIS_P1: bytes#

Cip cu fața în sus în orientarea implicită din fișa tehnică BNO055. Nu se aplică nicio remapare: X = +Xc, Y = +Yc, Z = +Zc.

bno055.AXIS_P2: bytes#

Cip cu fața în sus, rotit 180° față de AXIS_P1. Axe de ieșire: X = -Xc, Y = -Yc, Z = +Zc.

bno055.AXIS_P3: bytes#

Cip cu fața în sus, rotit 90° CW față de AXIS_P1. Axe de ieșire: X = +Yc, Y = -Xc, Z = +Zc.

bno055.AXIS_P4: bytes#

Cip întors pe spate (partea componentelor în jos) față de AXIS_P1. Axe de ieșire: X = +Xc, Y = -Yc, Z = -Zc. Aceasta este plasarea folosită de constructorul BNO055 atunci când nu este furnizat niciun argument axis.

bno055.AXIS_P5: bytes#

Cip cu fața în jos, rotit 90° CCW față de AXIS_P4. Axe de ieșire: X = +Yc, Y = +Xc, Z = -Zc.

bno055.AXIS_P6: bytes#

Cip cu fața în jos, rotit 180° față de AXIS_P4. Axe de ieșire: X = -Yc, Y = -Xc, Z = -Zc.

bno055.AXIS_P7: bytes#

Cip cu fața în jos, rotit 90° CW față de AXIS_P4. Axe de ieșire: X = -Xc, Y = +Yc, Z = -Zc.