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.