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(" ");
}
}