Zum Hauptinhalt springen

Inertiale Messeinheit - Gyroskop, Beschleunigungssensor und Magnetometer

Pololu Zumo 32u4 Library: Inertiale Messeinheit

Mit der Klasse Zumo32U4IMUType werden die Methoden für die inertiale Messeinheit bereitgestellt.

Sensortyp ermitteln

Zumo32U4IMU imu;                  // Objekt für die Inertialsensoren

Zumo32U4IMUType imuType;

imuType = imu.getType();
Serial.println("IMU Type:");
switch (imuType) {
case Zumo32U4IMUType::LSM303D_L3GD20H:
Serial.println("LSM303D (Kompass und Beschleunigungssensor) und L3GD20H (Gyro)");
break;
case Zumo32U4IMUType::LSM6DS33_LIS3MDL:
Serial.println("LSM6DS33 (Beschleunigungssensor und Gyro) und LIS3MDL (Kompass)");
break;
case Zumo32U4IMUType::Unknown:
Serial.println("Unknown");
break;
}

enableDefault()

Gyroskop

L3GD20H

  • output data rate: 189.4 Hz
  • Bandbreite Filter: 70 Hz bandwidth
  • Messbereich: +/- 245 Grad pro Sekunde (dps)
  • Empfindlichkeit: 8,75 mdps/LSB (milli degree per second / LSB)

LSM6DS33

  • output data rate: 208 Hz (high performance)
  • Messbereich: +/- 245 Grad pro Sekunde (dps)
  • Empfindlichkeit: 8,75 mdps/LSB (milli degree per second / LSB)

configureForTurnSensing()

Gyroskop

L3GD20H

  • output data rate: 757.6 Hz
  • Bandbreite Filter: 100 Hz bandwidth
  • Messbereich: +/- 2000 Grad pro Sekunde (dps)
  • Empfindlichkeit: 70 mdps/digit (milli degree per second / digit)

LSM6DS33

  • output data rate: 833 Hz
  • Messbereich: +/- 2000 Grad pro Sekunde (dps)
  • Empfindlichkeit: 70 mdps/LSB (milli degree per second / LSB)

configureForBalancing()

Gyroskop

L3GD20H

  • output data rate: 757.6 Hz
  • Bandbreite Filter: 100 Hz bandwidth
  • Messbereich: +/- 2000 Grad pro Sekunde (dps)
  • Empfindlichkeit: 70 mdps/LSB (milli degree per second / LSB)

LSM6DS33

  • output data rate: 833 Hz
  • Messbereich: +/- 2000 Grad pro Sekunde (dps)
  • Empfindlichkeit: 70 mdps/LSB (milli degree per second / LSB)

configureForFaceUphill()

Gyroskop

Siehe enableDefault()

void readAcc()

void readGyro()

Ließt die Werte des Gyroskops. Können anschließend mit g.x, g.y und g.z ausgelesen werden.

Zumo32U4IMU imu;          // Objekt für die Inertialsensoren

imu.readGyro(); // Auslesen der Gyroscopedaten (Zugriff auf Daten über das Objekt)
int x = imu.g.z; // Zugriff auf Gyro-Daten in x-Richtung
int y = imu.g.z; // Zugriff auf Gyro-Daten in y-Richtung
int z = imu.g.z; // Zugriff auf Gyro-Daten in z-Richtung (Drehung in der xy-Ebene)

void readMag()

void read()

bool accDataReady()

bool gyroDataReady()

Gibt true zurück, wenn das Gyroskop seit dem letzten Auslesen der Daten neu Daten hat.

Zumo32U4IMU imu;                  // Objekt für die Inertialsensoren

while (!imu.gyroDataReady()) {} // Warten auf neue Gyro-Daten

bool magDataReady()

Drehwinkel mit Gyroskop bestimmen

/* Das Beispielprogramm liest die Rohdaten des Gyroskops vom Zumo 32u4 über die I2C Schnittstelle 
ein und gibt den Drehwinkel auf dem LCD-Display aus. Der verwendete Sensor ist der L3GD20H oder
der LSM6DS33 von STMicroeletronics.
*/

#include <Wire.h> // I2C Bibliothek
#include <Zumo32U4.h>

Zumo32U4IMU imu; // Objekt für Inertialsensoren
Zumo32U4LCD lcd;

unsigned long lastTime = 0; // Display Update-Zeit
unsigned long gyroLastUpdate = 0; // Zeitdifferenz zwischen Gyro-Messung
float offSet = 0; // Offset-Fehler in mdps/digit (milli degree per second/digit)
float winkel = 0; // Einheit: deg (Gradmaß 0 ... 360°)

void setup(){
Serial.begin(115200);

lcd.clear(); lcd.print("Gyro Cal");
lcd.gotoXY(0, 1); lcd.print("ibration");

Wire.begin();
imu.init();
imu.configureForTurnSensing(); // Empfindlichkeit und Filter einstellen

// Ermitteln des Offset-Fehlers des Gyroskops
float sumGyro = 0;
for (long i = 0 ; i < 2000; i++) {
while (!imu.gyroDataReady()) {} // Warten auf neue Gyro-Daten
imu.readGyro(); // Einlesen der Gyro-Daten
sumGyro += imu.g.z; // imu.g.z: Winkelgeschwindigkeit der z-Achse in mdps/digit
}
offSet = sumGyro / 2000; // Offset-Fehler berechnen

gyroLastUpdate = micros();
lcd.clear(); lcd.print("Winkel:");
}

void loop()
{
unsigned long now = micros(); // Zeit in Mikrosekunden (µs)
long dt = now - gyroLastUpdate; // Zeitdifferenz in Mikrosekunden (µs)
gyroLastUpdate = now;

float drehRate, deltaWinkel;
imu.readGyro(); // Einlesen der Gyro-Daten
drehRate = (imu.g.z - offSet) * 0.07; // Winkelgeschwindigkeit umgerechnet in deg/s (Gradmaß/Sekunde)
deltaWinkel = drehRate * dt / 1e6; // Winkeländerung pro Zeitintervall (dt in Sekunden umrechnen)
winkel += deltaWinkel; // Drehwinkel als Summe aller Winkeländerung

if (millis() - lastTime > 200) {
lastTime = millis();
lcd.gotoXY(0, 1); lcd.print(winkel ); lcd.print(" ");
}
}