bno055 — BNO055 IMU Driver#

Deze module biedt een driver voor de Bosch BNO055 9-assige absolute oriëntatiesensor via I2C. De BNO055 fuseert accelerometer-, magnetometer- en gyroscoopgegevens op de chip zelf en levert naast de ruwe sensorkanalen ook quaternion-, Euler-hoek-, lineaire-versnellings- en zwaartekrachtuitvoer.

Voorbeeldgebruik:

import time
from machine import I2C
import bno055

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

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

Klassen#

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

Construeert een BNO055-driverinstantie.

  • bus is een geconfigureerd machine.I2C busobject dat wordt gebruikt om met de sensor te communiceren.

  • address is het 7-bits I2C-adres van het apparaat. Standaard 0x28.

  • mode is de bedrijfsmodus waarin het apparaat na een reset wordt geplaatst. Zie de bedrijfsmodusconstanten hieronder. Standaard NDOF_MODE.

  • axis is een 2-byte asomwisselconfiguratiewaarde. Zie de asplaatsingsconstanten hieronder. Standaard AXIS_P4.

De constructor verifieert de chip-ID, voert een softwarereset uit, schakelt over naar normaal vermogen, past de asconfiguratie toe en gaat de gevraagde bedrijfsmodus binnen met behulp van de externe oscillator. Veroorzaakt een RuntimeError als de verwachte ID-registerwaarden niet worden teruggelezen.

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

Leest size bytes uit het opgegeven apparaatregister en retourneert ze als een bytes object.

write_registers(register: int, data: bytes) None#

Schrijft de opgegeven data bytes naar het apparaat, beginnend bij register.

operation_mode(mode: int = None) int#

Leest of stelt het bedrijfsmodusregister in. Zonder argument retourneert het de huidige modus als een int. Met een mode argument schrijft het de nieuwe modus naar het apparaat. Zie de bedrijfsmodusconstanten hieronder.

system_trigger(data: int) None#

Schrijft data naar het systeemtriggerregister (0x3F). Dit wordt intern gebruikt om een softwarereset (0x20) uit te voeren en om de externe oscillator (0x80) te selecteren.

power_mode(mode: int = None) bytes#

Leest of stelt het vermogensmodusregister in. Zonder argument retourneert het de huidige inhoud van het vermogensmodusregister. Met een mode argument schrijft het de nieuwe vermogensmodus naar het apparaat.

page(num: int = None) None#

Leest of stelt de registerpagina in. Zonder argument leest het het huidige pagina-register. Met een num argument selecteert het de pagina.

temperature() int#

Retourneert de waarde van het chiptemperatuurregister als een byte zonder teken.

read_id() bytes#

Retourneert het 4-byte ID-blok dat uit register 0x00 is gelezen. De verwachte waarde is b'\xA0\xFB\x32\x0F'.

axis(placement: bytes = None) bytes#

Leest of stelt de asomwisselconfiguratie in. Zonder argument retourneert het de huidige 2-byte asconfiguratie. Met een placement argument schrijft het de opgegeven 2-byte asconfiguratie. Gebruik een van de AXIS_P0..AXIS_P7 constanten hieronder.

quaternion() list#

Retourneert de gefuseerde oriëntatie als een lijst met 4 elementen [w, x, y, z] van floats geschaald naar het bereik van het eenheidsquaternion.

euler() list#

Retourneert de gefuseerde oriëntatie als een lijst met 3 elementen [yaw, roll, pitch] van floats in graden.

accelerometer() list#

Retourneert de accelerometermeting als een lijst met 3 elementen [x, y, z] van floats in m/s^2.

magnetometer() list#

Retourneert de magnetometermeting als een lijst met 3 elementen [x, y, z] van floats in micro-Tesla.

gyroscope() list#

Retourneert de gyroscoopmeting als een lijst met 3 elementen [x, y, z] van floats in graden per seconde.

linear_acceleration() list#

Retourneert de zwaartekrachtgecompenseerde lineaire versnelling als een lijst met 3 elementen [x, y, z] van floats in m/s^2.

gravity() list#

Retourneert de zwaartekrachtvector als een lijst met 3 elementen [x, y, z] van floats in m/s^2.

Constanten#

Bedrijfsmodi#

bno055.CONFIG_MODE: int#

Configuratiemodus (0x00). Het apparaat moet zich in deze modus bevinden om configuratieregisters te wijzigen.

bno055.ACCONLY_MODE: int#

Niet-fusiemodus met alleen accelerometer (0x01).

bno055.MAGONLY_MODE: int#

Niet-fusiemodus met alleen magnetometer (0x02).

bno055.GYRONLY_MODE: int#

Niet-fusiemodus met alleen gyroscoop (0x03).

bno055.ACCMAG_MODE: int#

Niet-fusiemodus met accelerometer + magnetometer (0x04).

bno055.ACCGYRO_MODE: int#

Niet-fusiemodus met accelerometer + gyroscoop (0x05).

bno055.MAGGYRO_MODE: int#

Niet-fusiemodus met magnetometer + gyroscoop (0x06).

bno055.AMG_MODE: int#

Niet-fusiemodus met accelerometer + magnetometer + gyroscoop (0x07).

bno055.IMUPLUS_MODE: int#

IMU-fusiemodus met accelerometer + gyroscoop (0x08).

bno055.COMPASS_MODE: int#

Kompasfusiemodus met accelerometer + magnetometer (0x09).

bno055.M4G_MODE: int#

Magneet-voor-gyroscoop-fusiemodus (0x0A).

bno055.NDOF_FMC_OFF_MODE: int#

9-DOF-fusiemodus met snelle magnetometerkalibratie uitgeschakeld (0x0B).

bno055.NDOF_MODE: int#

9-DOF-fusiemodus met snelle magnetometerkalibratie ingeschakeld (0x0C). Dit is de standaardmodus die door de constructor wordt gebruikt.

Asplaatsingen#

De volgende 2-byte waarden worden doorgegeven aan BNO055.axis() om het coördinatensysteem van het apparaat om te wisselen. Elke constante is het (AXIS_MAP_CONFIG, AXIS_MAP_SIGN) registerpaar uit het BNO055-datasheet (sectie 3.4, Axis remap), voorgecodeerd voor een van de acht standaard plaatsingsoriëntaties.

Kies de constante waarvan de uitvoerassen overeenkomen met de manier waarop de chip fysiek op de host-PCB is gemonteerd:

Constante

Uitvoer X

Uitvoer Y

Uitvoer Z

Bytes

Montage

AXIS_P0

-Yc

+Xc

+Zc

21 04

naar boven gericht, 90° linksom vanaf P1

AXIS_P1

+Xc

+Yc

+Zc

24 00

naar boven gericht, datasheetstandaard

AXIS_P2

-Xc

-Yc

+Zc

24 06

naar boven gericht, 180° gedraaid

AXIS_P3

+Yc

-Xc

+Zc

21 02

naar boven gericht, 90° rechtsom vanaf P1

AXIS_P4

+Xc

-Yc

-Zc

24 03

naar beneden gericht, omgeklapt om X (constructorstandaard)

AXIS_P5

+Yc

+Xc

-Zc

21 01

naar beneden gericht, 90° linksom gedraaid vanaf P4

AXIS_P6

-Yc

-Xc

-Zc

21 07

naar beneden gericht, 180° gedraaid vanaf P4

AXIS_P7

-Xc

+Yc

-Zc

24 05

naar beneden gericht, 90° rechtsom gedraaid vanaf P4

Xc / Yc / Zc duiden de intrinsieke assen van de chip aan (zoals afgedrukt in het BNO055-datasheet). De “Uitvoer”-kolommen zijn de assen die het apparaat levert via BNO055.euler(), BNO055.gyro(), enz. P0 tot en met P3 zijn de vier 90°-rotaties van de chip met de componentzijde naar boven; P4 tot en met P7 zijn diezelfde vier rotaties nadat de chip op zijn rug is gekanteld.

bno055.AXIS_P0: bytes#

Chip naar boven gericht, 90° linksom gedraaid vanaf AXIS_P1. Uitvoerassen: X = -Yc, Y = +Xc, Z = +Zc.

bno055.AXIS_P1: bytes#

Chip naar boven gericht in de standaardoriëntatie van het BNO055-datasheet. Er wordt geen omwisseling toegepast: X = +Xc, Y = +Yc, Z = +Zc.

bno055.AXIS_P2: bytes#

Chip naar boven gericht, 180° gedraaid vanaf AXIS_P1. Uitvoerassen: X = -Xc, Y = -Yc, Z = +Zc.

bno055.AXIS_P3: bytes#

Chip naar boven gericht, 90° rechtsom gedraaid vanaf AXIS_P1. Uitvoerassen: X = +Yc, Y = -Xc, Z = +Zc.

bno055.AXIS_P4: bytes#

Chip op zijn rug gekanteld (componentzijde naar beneden) ten opzichte van AXIS_P1. Uitvoerassen: X = +Xc, Y = -Yc, Z = -Zc. Dit is de plaatsing die door de BNO055 constructor wordt gebruikt wanneer geen axis argument wordt opgegeven.

bno055.AXIS_P5: bytes#

Chip naar beneden gericht, 90° linksom gedraaid vanaf AXIS_P4. Uitvoerassen: X = +Yc, Y = +Xc, Z = -Zc.

bno055.AXIS_P6: bytes#

Chip naar beneden gericht, 180° gedraaid vanaf AXIS_P4. Uitvoerassen: X = -Yc, Y = -Xc, Z = -Zc.

bno055.AXIS_P7: bytes#

Chip naar beneden gericht, 90° rechtsom gedraaid vanaf AXIS_P4. Uitvoerassen: X = -Xc, Y = +Yc, Z = -Zc.