bno055 — Sterownik IMU BNO055

Ten moduł udostępnia sterownik dla 9-osiowego sensora orientacji bezwzględnej Bosch BNO055 przez I2C. BNO055 łączy w układzie dane z akcelerometru, magnetometru i żyroskopu oraz udostępnia wyjścia kwaternionu, kątów Eulera, przyspieszenia liniowego i grawitacji obok surowych kanałów sensora.

Przykład użycia:

import time
from machine import I2C
import bno055

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

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

Klasy

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

Tworzy instancję sterownika BNO055.

  • bus to skonfigurowany obiekt magistrali machine.I2C używany do komunikacji z sensorem.

  • address to 7-bitowy adres I2C urządzenia. Domyślnie 0x28.

  • mode to tryb pracy, w którym umieszczane jest urządzenie po resecie. Zobacz stałe trybu pracy poniżej. Domyślnie NDOF_MODE.

  • axis to 2-bajtowa wartość konfiguracji przemapowania osi. Zobacz stałe umiejscowienia osi poniżej. Domyślnie AXIS_P4.

Konstruktor weryfikuje identyfikator układu, wykonuje miękki reset, przełącza na normalne zasilanie, stosuje konfigurację osi i wchodzi w żądany tryb pracy przy użyciu zewnętrznego oscylatora. Wywołuje RuntimeError, jeśli oczekiwane wartości rejestru ID nie zostaną odczytane zwrotnie.

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

Odczytuje size bajtów z podanego rejestru urządzenia i zwraca je jako obiekt bytes.

write_registers(register: int, data: bytes) None

Zapisuje podane bajty data do urządzenia, zaczynając od register.

operation_mode(mode: int = None) int

Pobiera lub ustawia rejestr trybu pracy. Bez argumentu zwraca bieżący tryb jako int. Z argumentem mode zapisuje nowy tryb do urządzenia. Zobacz stałe trybu pracy poniżej.

system_trigger(data: int) None

Zapisuje data do rejestru wyzwalacza systemowego (0x3F). Jest to używane wewnętrznie do wykonania miękkiego resetu (0x20) i wyboru zewnętrznego oscylatora (0x80).

power_mode(mode: int = None) bytes

Pobiera lub ustawia rejestr trybu zasilania. Bez argumentu zwraca bieżącą zawartość rejestru trybu zasilania. Z argumentem mode zapisuje nowy tryb zasilania do urządzenia.

page(num: int = None) None

Pobiera lub ustawia stronę rejestru. Bez argumentu odczytuje bieżący rejestr strony. Z argumentem num wybiera stronę.

temperature() int

Zwraca wartość rejestru temperatury układu jako bajt bez znaku.

read_id() bytes

Zwraca 4-bajtowy blok ID odczytany z rejestru 0x00. Oczekiwana wartość to b'\xA0\xFB\x32\x0F'.

axis(placement: bytes = None) bytes

Pobiera lub ustawia konfigurację przemapowania osi. Bez argumentu zwraca bieżącą 2-bajtową konfigurację osi. Z argumentem placement zapisuje dostarczoną 2-bajtową konfigurację osi. Użyj jednej ze stałych AXIS_P0..AXIS_P7 poniżej.

quaternion() list

Zwraca scaloną orientację jako 4-elementową listę [w, x, y, z] liczb zmiennoprzecinkowych przeskalowanych do zakresu jednostkowego kwaternionu.

euler() list

Zwraca scaloną orientację jako 3-elementową listę [yaw, roll, pitch] liczb zmiennoprzecinkowych w stopniach.

accelerometer() list

Zwraca odczyt akcelerometru jako 3-elementową listę [x, y, z] liczb zmiennoprzecinkowych w m/s^2.

magnetometer() list

Zwraca odczyt magnetometru jako 3-elementową listę [x, y, z] liczb zmiennoprzecinkowych w mikroteslach.

gyroscope() list

Zwraca odczyt żyroskopu jako 3-elementową listę [x, y, z] liczb zmiennoprzecinkowych w stopniach na sekundę.

linear_acceleration() list

Zwraca skompensowane grawitacyjnie przyspieszenie liniowe jako 3-elementową listę [x, y, z] liczb zmiennoprzecinkowych w m/s^2.

gravity() list

Zwraca wektor grawitacji jako 3-elementową listę [x, y, z] liczb zmiennoprzecinkowych w m/s^2.

Stałe

Tryby pracy

bno055.CONFIG_MODE: int

Tryb konfiguracji (0x00). Urządzenie musi znajdować się w tym trybie, aby zmieniać rejestry konfiguracji.

bno055.ACCONLY_MODE: int

Tryb bez fuzji, tylko akcelerometr (0x01).

bno055.MAGONLY_MODE: int

Tryb bez fuzji, tylko magnetometr (0x02).

bno055.GYRONLY_MODE: int

Tryb bez fuzji, tylko żyroskop (0x03).

bno055.ACCMAG_MODE: int

Tryb bez fuzji, akcelerometr + magnetometr (0x04).

bno055.ACCGYRO_MODE: int

Tryb bez fuzji, akcelerometr + żyroskop (0x05).

bno055.MAGGYRO_MODE: int

Tryb bez fuzji, magnetometr + żyroskop (0x06).

bno055.AMG_MODE: int

Tryb bez fuzji, akcelerometr + magnetometr + żyroskop (0x07).

bno055.IMUPLUS_MODE: int

Tryb fuzji IMU wykorzystujący akcelerometr + żyroskop (0x08).

bno055.COMPASS_MODE: int

Tryb fuzji kompasu wykorzystujący akcelerometr + magnetometr (0x09).

bno055.M4G_MODE: int

Tryb fuzji magnetometru zastępującego żyroskop (0x0A).

bno055.NDOF_FMC_OFF_MODE: int

Tryb fuzji 9-DOF z wyłączoną szybką kalibracją magnetometru (0x0B).

bno055.NDOF_MODE: int

Tryb fuzji 9-DOF z włączoną szybką kalibracją magnetometru (0x0C). Jest to domyślny tryb używany przez konstruktor.

Umiejscowienia osi

Następujące 2-bajtowe wartości są przekazywane do BNO055.axis() w celu przemapowania układu współrzędnych urządzenia. Każda stała to para rejestrów (AXIS_MAP_CONFIG, AXIS_MAP_SIGN) z karty katalogowej BNO055 (Sekcja 3.4, Axis remap), wstępnie zakodowana dla jednej z ośmiu standardowych orientacji umiejscowienia.

Wybierz stałą, której osie wyjściowe odpowiadają fizycznemu zamontowaniu układu na PCB hosta:

Stała

Wyjście X

Wyjście Y

Wyjście Z

Bajty

Montaż

AXIS_P0

-Yc

+Xc

+Zc

21 04

stroną do góry, 90° CCW od P1

AXIS_P1

+Xc

+Yc

+Zc

24 00

stroną do góry, domyślne wg karty katalogowej

AXIS_P2

-Xc

-Yc

+Zc

24 06

stroną do góry, obrócony o 180°

AXIS_P3

+Yc

-Xc

+Zc

21 02

stroną do góry, 90° CW od P1

AXIS_P4

+Xc

-Yc

-Zc

24 03

stroną do dołu, odwrócony względem osi X (domyślne dla konstruktora)

AXIS_P5

+Yc

+Xc

-Zc

21 01

stroną do dołu, obrócony o 90° CCW od P4

AXIS_P6

-Yc

-Xc

-Zc

21 07

stroną do dołu, obrócony o 180° od P4

AXIS_P7

-Xc

+Yc

-Zc

24 05

stroną do dołu, obrócony o 90° CW od P4

Xc / Yc / Zc oznaczają wewnętrzne osie układu (zgodnie z kartą katalogową BNO055). Kolumny „Wyjście” to osie, które urządzenie dostarcza poprzez BNO055.euler(), BNO055.gyro() itd. P0 do P3 to cztery obroty układu o 90° w orientacji stroną z komponentami do góry; P4 do P7 to te same cztery obroty po przewróceniu układu na grzbiet.

bno055.AXIS_P0: bytes

Układ stroną do góry, obrócony o 90° CCW od AXIS_P1. Osie wyjściowe: X = -Yc, Y = +Xc, Z = +Zc.

bno055.AXIS_P1: bytes

Układ stroną do góry w domyślnej orientacji karty katalogowej BNO055. Nie stosuje się przemapowania: X = +Xc, Y = +Yc, Z = +Zc.

bno055.AXIS_P2: bytes

Układ stroną do góry, obrócony o 180° od AXIS_P1. Osie wyjściowe: X = -Xc, Y = -Yc, Z = +Zc.

bno055.AXIS_P3: bytes

Układ stroną do góry, obrócony o 90° CW od AXIS_P1. Osie wyjściowe: X = +Yc, Y = -Xc, Z = +Zc.

bno055.AXIS_P4: bytes

Układ przewrócony na grzbiet (strona z komponentami w dół) względem AXIS_P1. Osie wyjściowe: X = +Xc, Y = -Yc, Z = -Zc. Jest to umiejscowienie używane przez konstruktor BNO055, gdy nie podano argumentu axis.

bno055.AXIS_P5: bytes

Układ stroną do dołu, obrócony o 90° CCW od AXIS_P4. Osie wyjściowe: X = +Yc, Y = +Xc, Z = -Zc.

bno055.AXIS_P6: bytes

Układ stroną do dołu, obrócony o 180° od AXIS_P4. Osie wyjściowe: X = -Yc, Y = -Xc, Z = -Zc.

bno055.AXIS_P7: bytes

Układ stroną do dołu, obrócony o 90° CW od AXIS_P4. Osie wyjściowe: X = -Xc, Y = +Yc, Z = -Zc.