bno055 — Драйвер IMU BNO055

Цей модуль надає драйвер для 9-осьового датчика абсолютної орієнтації Bosch BNO055 через I2C. BNO055 поєднує дані акселерометра, магнітометра та гіроскопа на чіпі та надає виводи кватерніону, кутів Ейлера, лінійного прискорення та гравітації, окрім каналів необробленого датчика.

Приклад використання:

import time
from machine import I2C
import bno055

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

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

Класи

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

Створює екземпляр драйвера BNO055.

  • bus — налаштований об’єкт шини machine.I2C, який використовується для зв’язку з датчиком.

  • address — 7-бітна I2C-адреса пристрою. За замовчуванням 0x28.

  • mode — режим роботи, до якого пристрій переходить після скидання. Дивіться константи режиму роботи нижче. За замовчуванням NDOF_MODE.

  • axis — 2-байтове значення конфігурації переназначення осей. Дивіться константи розміщення осей нижче. За замовчуванням AXIS_P4.

Конструктор перевіряє ідентифікатор чіпа, виконує програмне скидання, перемикається на нормальне живлення, застосовує конфігурацію осей та переходить у запитаний режим роботи, використовуючи зовнішній генератор. Викликає RuntimeError, якщо очікувані значення регістрів ідентифікаторів не зчитуються назад.

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

Зчитує size байтів із заданого регістру пристрою та повертає їх як об’єкт bytes.

write_registers(register: int, data: bytes) None

Записує задані байти data до пристрою, починаючи з register.

operation_mode(mode: int = None) int

Отримує або встановлює регістр режиму роботи. Без аргументу повертає поточний режим як int. З аргументом mode записує новий режим до пристрою. Дивіться константи режиму роботи нижче.

system_trigger(data: int) None

Записує data до регістру системного тригера (0x3F). Використовується внутрішньо для виконання програмного скидання (0x20) та вибору зовнішнього генератора (0x80).

power_mode(mode: int = None) bytes

Отримує або встановлює регістр режиму живлення. Без аргументу повертає вміст поточного регістру режиму живлення. З аргументом mode записує новий режим живлення до пристрою.

page(num: int = None) None

Отримує або встановлює сторінку регістрів. Без аргументу зчитує поточний регістр сторінки. З аргументом num вибирає сторінку.

temperature() int

Повертає значення регістру температури чіпа як беззнаковий байт.

read_id() bytes

Повертає 4-байтовий блок ідентифікатора, зчитаний із регістру 0x00. Очікуване значення: b'\xA0\xFB\x32\x0F'.

axis(placement: bytes = None) bytes

Отримує або встановлює конфігурацію переназначення осей. Без аргументу повертає поточну 2-байтову конфігурацію осей. З аргументом placement записує надану 2-байтову конфігурацію осей. Використовуйте одну з констант AXIS_P0..AXIS_P7 нижче.

quaternion() list

Повертає злиту орієнтацію як 4-елементний список [w, x, y, z] чисел з плаваючою точкою, масштабованих до діапазону одиничного кватерніону.

euler() list

Повертає злиту орієнтацію як 3-елементний список [yaw, roll, pitch] чисел з плаваючою точкою в градусах.

accelerometer() list

Повертає показання акселерометра як 3-елементний список [x, y, z] чисел з плаваючою точкою в м/с².

magnetometer() list

Повертає показання магнітометра як 3-елементний список [x, y, z] чисел з плаваючою точкою в мікротеслах.

gyroscope() list

Повертає показання гіроскопа як 3-елементний список [x, y, z] чисел з плаваючою точкою в градусах за секунду.

linear_acceleration() list

Повертає лінійне прискорення з компенсацією гравітації як 3-елементний список [x, y, z] чисел з плаваючою точкою в м/с².

gravity() list

Повертає вектор гравітації як 3-елементний список [x, y, z] чисел з плаваючою точкою в м/с².

Константи

Режими роботи

bno055.CONFIG_MODE: int

Режим конфігурації (0x00). Для зміни регістрів конфігурації пристрій має перебувати в цьому режимі.

bno055.ACCONLY_MODE: int

Режим без злиття лише з акселерометром (0x01).

bno055.MAGONLY_MODE: int

Режим без злиття лише з магнітометром (0x02).

bno055.GYRONLY_MODE: int

Режим без злиття лише з гіроскопом (0x03).

bno055.ACCMAG_MODE: int

Режим без злиття акселерометр + магнітометр (0x04).

bno055.ACCGYRO_MODE: int

Режим без злиття акселерометр + гіроскоп (0x05).

bno055.MAGGYRO_MODE: int

Режим без злиття магнітометр + гіроскоп (0x06).

bno055.AMG_MODE: int

Режим без злиття акселерометр + магнітометр + гіроскоп (0x07).

bno055.IMUPLUS_MODE: int

Режим злиття IMU з використанням акселерометра + гіроскопа (0x08).

bno055.COMPASS_MODE: int

Режим злиття компаса з використанням акселерометра + магнітометра (0x09).

bno055.M4G_MODE: int

Режим злиття магніту-для-гіроскопа (0x0A).

bno055.NDOF_FMC_OFF_MODE: int

9-ступеневий режим злиття з вимкненим швидким калібруванням магнітометра (0x0B).

bno055.NDOF_MODE: int

9-ступеневий режим злиття з увімкненим швидким калібруванням магнітометра (0x0C). Це режим за замовчуванням, що використовується конструктором.

Розміщення осей

Наступні 2-байтові значення передаються до BNO055.axis() для переназначення системи координат пристрою. Кожна константа є парою регістрів (AXIS_MAP_CONFIG, AXIS_MAP_SIGN) з технічної документації BNO055 (розділ 3.4, Axis remap), попередньо закодованою для одного з восьми стандартних орієнтацій розміщення.

Оберіть константу, вихідні осі якої відповідають фізичному монтажу чіпа на платі:

Константа

Вихід X

Вихід Y

Вихід Z

Байти

Монтаж

AXIS_P0

-Yc

+Xc

+Zc

21 04

лицем вгору, 90° проти год. стрілки від P1

AXIS_P1

+Xc

+Yc

+Zc

24 00

лицем вгору, стандартне положення згідно з документацією

AXIS_P2

-Xc

-Yc

+Zc

24 06

лицем вгору, повернутий на 180°

AXIS_P3

+Yc

-Xc

+Zc

21 02

лицем вгору, 90° за год. стрілкою від P1

AXIS_P4

+Xc

-Yc

-Zc

24 03

лицем вниз, перевернутий відносно осі X (стандарт конструктора)

AXIS_P5

+Yc

+Xc

-Zc

21 01

лицем вниз, повернутий на 90° проти год. стрілки від P4

AXIS_P6

-Yc

-Xc

-Zc

21 07

лицем вниз, повернутий на 180° від P4

AXIS_P7

-Xc

+Yc

-Zc

24 05

лицем вниз, повернутий на 90° за год. стрілкою від P4

Xc / Yc / Zc позначають власні осі чіпа (як надруковано в технічній документації BNO055). Колонки «Вихід» — це осі, що надаються пристроєм через BNO055.euler(), BNO055.gyro() тощо. P0 по P3 — чотири повороти на 90° чіпа в орієнтації лицем вгору; P4 по P7 — ті самі чотири повороти після перевертання чіпа лицем вниз.

bno055.AXIS_P0: bytes

Чіп лицем вгору, повернутий на 90° проти год. стрілки від AXIS_P1. Вихідні осі: X = -Yc, Y = +Xc, Z = +Zc.

bno055.AXIS_P1: bytes

Чіп лицем вгору у стандартній орієнтації згідно з документацією BNO055. Переназначення не застосовується: X = +Xc, Y = +Yc, Z = +Zc.

bno055.AXIS_P2: bytes

Чіп лицем вгору, повернутий на 180° від AXIS_P1. Вихідні осі: X = -Xc, Y = -Yc, Z = +Zc.

bno055.AXIS_P3: bytes

Чіп лицем вгору, повернутий на 90° за год. стрілкою від AXIS_P1. Вихідні осі: X = +Yc, Y = -Xc, Z = +Zc.

bno055.AXIS_P4: bytes

Чіп перевернутий лицем вниз (компонентна сторона вниз) відносно AXIS_P1. Вихідні осі: X = +Xc, Y = -Yc, Z = -Zc. Це розміщення, яке використовується конструктором BNO055, коли аргумент axis не надано.

bno055.AXIS_P5: bytes

Чіп лицем вниз, повернутий на 90° проти год. стрілки від AXIS_P4. Вихідні осі: X = +Yc, Y = +Xc, Z = -Zc.

bno055.AXIS_P6: bytes

Чіп лицем вниз, повернутий на 180° від AXIS_P4. Вихідні осі: X = -Yc, Y = -Xc, Z = -Zc.

bno055.AXIS_P7: bytes

Чіп лицем вниз, повернутий на 90° за год. стрілкою від AXIS_P4. Вихідні осі: X = -Xc, Y = +Yc, Z = -Zc.