bno055 — BNO055-IMU-Treiber¶
Dieses Modul stellt einen Treiber für den Bosch BNO055 9-Achsen-Absolutorientierungssensor über I2C bereit. Der BNO055 fusioniert Beschleunigungssensor-, Magnetometer- und Gyroskopdaten auf dem Chip und liefert neben den rohen Sensorkanälen Quaternion-, Euler-Winkel-, Linearbeschleunigungs- und Schwerkraftausgaben.
Beispielverwendung:
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)¶
Konstruiert eine BNO055-Treiberinstanz.
busist ein konfiguriertesmachine.I2C-Busobjekt, das zur Kommunikation mit dem Sensor verwendet wird.addressist die 7-Bit-I2C-Adresse des Geräts. Standardwert ist0x28.modeist der Betriebsmodus, in den das Gerät nach dem Reset versetzt wird. Siehe die Betriebsmodus-Konstanten unten. Standardwert istNDOF_MODE.axisist ein 2-Byte-Achsen-Remap-Konfigurationswert. Siehe die Achsenplatzierungskonstanten unten. Standardwert istAXIS_P4.
Der Konstruktor überprüft die Chip-ID, führt einen Soft-Reset durch, schaltet auf normalen Stromverbrauch um, wendet die Achsenkonfiguration an und tritt mithilfe des externen Oszillators in den angeforderten Betriebsmodus ein. Löst
RuntimeErroraus, wenn die erwarteten ID-Registerwerte nicht zurückgelesen werden.- read_registers(register: int, size: int = 1) bytes¶
Liest
sizeBytes aus dem angegebenen Geräteregister und gibt sie alsbytes-Objekt zurück.
- write_registers(register: int, data: bytes) None¶
Schreibt die angegebenen
data-Bytes abregisterauf das Gerät.
- operation_mode(mode: int = None) int¶
Liest oder setzt das Betriebsmodus-Register. Ohne Argument wird der aktuelle Modus als
intzurückgegeben. Mit einemmode-Argument wird der neue Modus auf das Gerät geschrieben. Siehe die Betriebsmodus-Konstanten unten.
- system_trigger(data: int) None¶
Schreibt
datain das System-Trigger-Register (0x3F). Dies wird intern verwendet, um einen Soft-Reset (0x20) auszulösen und den externen Oszillator (0x80) auszuwählen.
- power_mode(mode: int = None) bytes¶
Liest oder setzt das Energiemodus-Register. Ohne Argument wird der aktuelle Inhalt des Energiemodus-Registers zurückgegeben. Mit einem
mode-Argument wird der neue Energiemodus auf das Gerät geschrieben.
- page(num: int = None) None¶
Liest oder setzt die Registerseite. Ohne Argument wird das aktuelle Seitenregister gelesen. Mit einem
num-Argument wird die Seite ausgewählt.
- read_id() bytes¶
Gibt den 4-Byte-ID-Block zurück, der aus dem Register
0x00gelesen wird. Der erwartete Wert istb'\xA0\xFB\x32\x0F'.
- axis(placement: bytes = None) bytes¶
Liest oder setzt die Achsen-Remap-Konfiguration. Ohne Argument wird die aktuelle 2-Byte-Achsenkonfiguration zurückgegeben. Mit einem
placement-Argument wird die angegebene 2-Byte-Achsenkonfiguration geschrieben. Verwenden Sie eine der unten aufgeführten KonstantenAXIS_P0..``AXIS_P7``.
- quaternion() list¶
Gibt die fusionierte Orientierung als 4-elementige Liste
[w, x, y, z]von Gleitkommazahlen zurück, skaliert auf den Bereich des Einheitsquaternions.
- euler() list¶
Gibt die fusionierte Orientierung als 3-elementige Liste
[yaw, roll, pitch]von Gleitkommazahlen in Grad zurück.
- accelerometer() list¶
Gibt den Beschleunigungssensorwert als 3-elementige Liste
[x, y, z]von Gleitkommazahlen in m/s^2 zurück.
- magnetometer() list¶
Gibt den Magnetometerwert als 3-elementige Liste
[x, y, z]von Gleitkommazahlen in Mikrotesla zurück.
- gyroscope() list¶
Gibt den Gyroskopwert als 3-elementige Liste
[x, y, z]von Gleitkommazahlen in Grad pro Sekunde zurück.
Konstanten¶
Betriebsmodi¶
- bno055.CONFIG_MODE: int¶
Konfigurationsmodus (
0x00). Das Gerät muss sich in diesem Modus befinden, um die Konfigurationsregister zu ändern.
Achsenplatzierungen¶
Die folgenden 2-Byte-Werte werden an BNO055.axis() übergeben, um das Gerätekoordinatensystem neu zuzuordnen. Jede Konstante ist das Registerpaar (AXIS_MAP_CONFIG, AXIS_MAP_SIGN) aus dem BNO055-Datenblatt (Abschnitt 3.4, Axis remap), vorab codiert für eine der acht standardmäßigen Platzierungsorientierungen.
Wählen Sie die Konstante, deren Ausgabeachsen damit übereinstimmen, wie der Chip physisch auf der Host-Leiterplatte montiert ist:
Konstante |
Ausgabe X |
Ausgabe Y |
Ausgabe Z |
Bytes |
Montage |
|---|---|---|---|---|---|
|
|
|
|
Vorderseite oben, 90° gegen den Uhrzeigersinn von P1 |
|
|
|
|
|
Vorderseite oben, Datenblatt-Standard |
|
|
|
|
|
Vorderseite oben, um 180° gedreht |
|
|
|
|
|
Vorderseite oben, 90° im Uhrzeigersinn von P1 |
|
|
|
|
|
Vorderseite unten, um X gespiegelt (Konstruktor-Standard) |
|
|
|
|
|
Vorderseite unten, um 90° gegen den Uhrzeigersinn von P4 gedreht |
|
|
|
|
|
Vorderseite unten, um 180° von P4 gedreht |
|
|
|
|
|
Vorderseite unten, um 90° im Uhrzeigersinn von P4 gedreht |
Xc / Yc / Zc bezeichnen die intrinsischen Achsen des Chips (wie im BNO055-Datenblatt aufgedruckt). Die „Ausgabe“-Spalten sind die Achsen, die das Gerät über BNO055.euler(), BNO055.gyro() usw. liefert. P0 bis P3 sind die vier 90°-Drehungen des Chips in der Ausrichtung mit der Bauteilseite nach oben; P4 bis P7 sind dieselben vier Drehungen, nachdem der Chip auf seine Rückseite gedreht wurde.
- bno055.AXIS_P0: bytes¶
Chip-Vorderseite oben, um 90° gegen den Uhrzeigersinn von
AXIS_P1gedreht. Ausgabeachsen:X = -Yc,Y = +Xc,Z = +Zc.
- bno055.AXIS_P1: bytes¶
Chip-Vorderseite oben in der Standardausrichtung des BNO055-Datenblatts. Es wird kein Remap angewendet:
X = +Xc,Y = +Yc,Z = +Zc.
- bno055.AXIS_P2: bytes¶
Chip-Vorderseite oben, um 180° von
AXIS_P1gedreht. Ausgabeachsen:X = -Xc,Y = -Yc,Z = +Zc.
- bno055.AXIS_P3: bytes¶
Chip-Vorderseite oben, um 90° im Uhrzeigersinn von
AXIS_P1gedreht. Ausgabeachsen:X = +Yc,Y = -Xc,Z = +Zc.
- bno055.AXIS_P4: bytes¶
Chip auf die Rückseite gedreht (Bauteilseite unten) relativ zu
AXIS_P1. Ausgabeachsen:X = +Xc,Y = -Yc,Z = -Zc. Dies ist die vomBNO055-Konstruktor verwendete Platzierung, wenn keinaxis-Argument angegeben wird.
- bno055.AXIS_P5: bytes¶
Chip-Vorderseite unten, um 90° gegen den Uhrzeigersinn von
AXIS_P4gedreht. Ausgabeachsen:X = +Yc,Y = +Xc,Z = -Zc.