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, если ожидаемые значения регистра ID не считываются.

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-байтовый блок ID, считанный из регистра 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] чисел с плавающей запятой в м/с^2.

magnetometer() list#

Возвращает показания магнитометра в виде списка из 3 элементов [x, y, z] чисел с плавающей запятой в микротеслах.

gyroscope() list#

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

linear_acceleration() list#

Возвращает линейное ускорение с компенсацией гравитации в виде списка из 3 элементов [x, y, z] чисел с плавающей запятой в м/с^2.

gravity() list#

Возвращает вектор гравитации в виде списка из 3 элементов [x, y, z] чисел с плавающей запятой в м/с^2.

Константы#

Режимы работы#

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-DOF с отключённой быстрой калибровкой магнитометра (0x0B).

bno055.NDOF_MODE: int#

Режим объединения 9-DOF с включённой быстрой калибровкой магнитометра (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.