bno055 — Ovladač IMU BNO055

Tento modul poskytuje ovladač pro 9osý senzor absolutní orientace Bosch BNO055 přes I2C. BNO055 fúzuje data z akcelerometru, magnetometru a gyroskopu přímo na čipu a kromě surových senzorových kanálů poskytuje výstupy v podobě kvaternionu, Eulerových úhlů, lineárního zrychlení a gravitace.

Příklad použití:

import time
from machine import I2C
import bno055

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

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

Třídy

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

Vytvoří instanci ovladače BNO055.

  • bus je nakonfigurovaný objekt sběrnice machine.I2C použitý ke komunikaci se senzorem.

  • address je 7bitová I2C adresa zařízení. Výchozí hodnota je 0x28.

  • mode je provozní režim, do kterého je zařízení uvedeno po resetu. Viz konstanty provozního režimu níže. Výchozí hodnota je NDOF_MODE.

  • axis je 2bajtová hodnota konfigurace přemapování os. Viz konstanty umístění os níže. Výchozí hodnota je AXIS_P4.

Konstruktor ověří ID čipu, provede softwarový reset, přepne na normální napájení, aplikuje konfiguraci os a vstoupí do požadovaného provozního režimu s použitím externího oscilátoru. Vyvolá RuntimeError, pokud nejsou přečteny očekávané hodnoty ID registrů.

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

Přečte size bajtů z daného registru zařízení a vrátí je jako objekt bytes.

write_registers(register: int, data: bytes) None

Zapíše dané bajty data do zařízení počínaje registrem register.

operation_mode(mode: int = None) int

Získá nebo nastaví registr provozního režimu. Bez argumentu vrátí aktuální režim jako int. S argumentem mode zapíše nový režim do zařízení. Viz konstanty provozního režimu níže.

system_trigger(data: int) None

Zapíše data do registru systémového triggeru (0x3F). To se interně používá k vyvolání softwarového resetu (0x20) a k výběru externího oscilátoru (0x80).

power_mode(mode: int = None) bytes

Získá nebo nastaví registr režimu napájení. Bez argumentu vrátí aktuální obsah registru režimu napájení. S argumentem mode zapíše nový režim napájení do zařízení.

page(num: int = None) None

Získá nebo nastaví stránku registru. Bez argumentu přečte aktuální registr stránky. S argumentem num vybere stránku.

temperature() int

Vrátí hodnotu registru teploty čipu jako unsigned bajt.

read_id() bytes

Vrátí 4bajtový blok ID přečtený z registru 0x00. Očekávaná hodnota je b'\xA0\xFB\x32\x0F'.

axis(placement: bytes = None) bytes

Získá nebo nastaví konfiguraci přemapování os. Bez argumentu vrátí aktuální 2bajtovou konfiguraci os. S argumentem placement zapíše dodanou 2bajtovou konfiguraci os. Použijte jednu z konstant AXIS_P0..AXIS_P7 níže.

quaternion() list

Vrátí fúzovanou orientaci jako 4prvkový seznam [w, x, y, z] čísel s plovoucí desetinnou čárkou škálovaných do rozsahu jednotkového kvaternionu.

euler() list

Vrátí fúzovanou orientaci jako 3prvkový seznam [yaw, roll, pitch] čísel s plovoucí desetinnou čárkou ve stupních.

accelerometer() list

Vrátí naměřenou hodnotu akcelerometru jako 3prvkový seznam [x, y, z] čísel s plovoucí desetinnou čárkou v m/s^2.

magnetometer() list

Vrátí naměřenou hodnotu magnetometru jako 3prvkový seznam [x, y, z] čísel s plovoucí desetinnou čárkou v mikroteslách.

gyroscope() list

Vrátí naměřenou hodnotu gyroskopu jako 3prvkový seznam [x, y, z] čísel s plovoucí desetinnou čárkou ve stupních za sekundu.

linear_acceleration() list

Vrátí gravitačně kompenzované lineární zrychlení jako 3prvkový seznam [x, y, z] čísel s plovoucí desetinnou čárkou v m/s^2.

gravity() list

Vrátí vektor gravitace jako 3prvkový seznam [x, y, z] čísel s plovoucí desetinnou čárkou v m/s^2.

Konstanty

Provozní režimy

bno055.CONFIG_MODE: int

Konfigurační režim (0x00). Aby bylo možné měnit konfigurační registry, musí být zařízení v tomto režimu.

bno055.ACCONLY_MODE: int

Nefúzní režim pouze s akcelerometrem (0x01).

bno055.MAGONLY_MODE: int

Nefúzní režim pouze s magnetometrem (0x02).

bno055.GYRONLY_MODE: int

Nefúzní režim pouze s gyroskopem (0x03).

bno055.ACCMAG_MODE: int

Nefúzní režim akcelerometr + magnetometr (0x04).

bno055.ACCGYRO_MODE: int

Nefúzní režim akcelerometr + gyroskop (0x05).

bno055.MAGGYRO_MODE: int

Nefúzní režim magnetometr + gyroskop (0x06).

bno055.AMG_MODE: int

Nefúzní režim akcelerometr + magnetometr + gyroskop (0x07).

bno055.IMUPLUS_MODE: int

Fúzní režim IMU využívající akcelerometr + gyroskop (0x08).

bno055.COMPASS_MODE: int

Fúzní režim kompasu využívající akcelerometr + magnetometr (0x09).

bno055.M4G_MODE: int

Fúzní režim magnet-pro-gyroskop (0x0A).

bno055.NDOF_FMC_OFF_MODE: int

Fúzní režim 9-DOF s vypnutou rychlou kalibrací magnetometru (0x0B).

bno055.NDOF_MODE: int

Fúzní režim 9-DOF se zapnutou rychlou kalibrací magnetometru (0x0C). Toto je výchozí režim používaný konstruktorem.

Umístění os

Následující 2bajtové hodnoty se předávají metodě BNO055.axis() k přemapování souřadnicového systému zařízení. Každá konstanta je dvojicí registrů (AXIS_MAP_CONFIG, AXIS_MAP_SIGN) z datasheetu BNO055 (sekce 3.4, Axis remap), předem zakódovanou pro jednu z osmi standardních orientací umístění.

Vyberte konstantu, jejíž výstupní osy odpovídají tomu, jak je čip fyzicky namontován na hostitelské desce plošných spojů:

Konstanta

Výstup X

Výstup Y

Výstup Z

Bajty

Montáž

AXIS_P0

-Yc

+Xc

+Zc

21 04

lícem nahoru, 90° proti směru hodinových ručiček od P1

AXIS_P1

+Xc

+Yc

+Zc

24 00

lícem nahoru, výchozí dle datasheetu

AXIS_P2

-Xc

-Yc

+Zc

24 06

lícem nahoru, otočeno o 180°

AXIS_P3

+Yc

-Xc

+Zc

21 02

lícem nahoru, 90° po směru hodinových ručiček od P1

AXIS_P4

+Xc

-Yc

-Zc

24 03

lícem dolů, překlopeno kolem osy X (výchozí pro konstruktor)

AXIS_P5

+Yc

+Xc

-Zc

21 01

lícem dolů, otočeno o 90° proti směru hodinových ručiček od P4

AXIS_P6

-Yc

-Xc

-Zc

21 07

lícem dolů, otočeno o 180° od P4

AXIS_P7

-Xc

+Yc

-Zc

24 05

lícem dolů, otočeno o 90° po směru hodinových ručiček od P4

Xc / Yc / Zc označují vnitřní osy čipu (jak jsou vytištěny v datasheetu BNO055). Sloupce „Výstup“ jsou osy, které zařízení poskytuje přes BNO055.euler(), BNO055.gyro() atd. P0P3 jsou čtyři 90° rotace čipu v orientaci stranou součástek nahoru; P4P7 jsou stejné čtyři rotace po překlopení čipu na záda.

bno055.AXIS_P0: bytes

Čip lícem nahoru, otočený o 90° proti směru hodinových ručiček od AXIS_P1. Výstupní osy: X = -Yc, Y = +Xc, Z = +Zc.

bno055.AXIS_P1: bytes

Čip lícem nahoru ve výchozí orientaci dle datasheetu BNO055. Není aplikováno žádné přemapování: X = +Xc, Y = +Yc, Z = +Zc.

bno055.AXIS_P2: bytes

Čip lícem nahoru, otočený o 180° od AXIS_P1. Výstupní osy: X = -Xc, Y = -Yc, Z = +Zc.

bno055.AXIS_P3: bytes

Čip lícem nahoru, otočený o 90° po směru hodinových ručiček od AXIS_P1. Výstupní osy: X = +Yc, Y = -Xc, Z = +Zc.

bno055.AXIS_P4: bytes

Čip překlopený na záda (stranou součástek dolů) vůči AXIS_P1. Výstupní osy: X = +Xc, Y = -Yc, Z = -Zc. Toto je umístění používané konstruktorem BNO055, když není dodán argument axis.

bno055.AXIS_P5: bytes

Čip lícem dolů, otočený o 90° proti směru hodinových ručiček od AXIS_P4. Výstupní osy: X = +Yc, Y = +Xc, Z = -Zc.

bno055.AXIS_P6: bytes

Čip lícem dolů, otočený o 180° od AXIS_P4. Výstupní osy: X = -Yc, Y = -Xc, Z = -Zc.

bno055.AXIS_P7: bytes

Čip lícem dolů, otočený o 90° po směru hodinových ručiček od AXIS_P4. Výstupní osy: X = -Xc, Y = +Yc, Z = -Zc.