Bemerkung

Hallo, willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauchen Sie mit anderen Enthusiasten tiefer in Raspberry Pi, Arduino und ESP32 ein.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie Probleme nach dem Kauf und technische Herausforderungen mit Hilfe unserer Community und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Tutorials aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und Sneak Peeks.

  • Sonderrabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

👉 Bereit, mit uns zu entdecken und zu gestalten? Klicken Sie auf [here] und treten Sie noch heute bei!

2.15 10-Achsen-IMU-Sensormodul

Einführung

Das 10-Achsen-IMU-Modul (Inertial Measurement Unit) kombiniert mehrere Sensoren, um umfassende Bewegungs- und Umweltdaten bereitzustellen. Es integriert einen barometrischen Drucksensor (SPL06_001) zur Höhenmessung, einen 6-Achsen-Bewegungssensor (SH3001) für Beschleunigungs- und Rotationsmessungen sowie einen 3-Achsen-Magnetometer (QMC6310) zur Bestimmung der Kompassrichtung. Dieses leistungsfähige Modul eignet sich ideal für Robotik, Navigationssysteme und Anwendungen zur Bewegungserfassung.


Was Sie benötigen

Hier sind die für dieses Projekt erforderlichen Komponenten:

KOMPONENTENBESCHREIBUNG

KAUFLINK

Jumper-Kabel

BUY

10 Axis IMU module

-

Raspberry Pi

-


Verdrahtungsdiagramm

Verbinden Sie das IMU-Modul mit dem Raspberry Pi wie unten dargestellt:

../_images/2.15_10axis_bb.png

Stellen Sie sicher, dass die I2C-Verbindungen korrekt hergestellt sind:

  • VCC → 3.3V

  • GND → GND

  • SDA → GPIO 2 (SDA)

  • SCL → GPIO 3 (SCL)


Bibliothek installieren

Installieren Sie die 10-Achsen-Bibliothek:

sudo pip install git+https://github.com/sunfounder/sunfounder-imu-python.git --break-system-packages

IMU kalibrieren

Führen Sie das Kalibrierungsskript aus, um die IMU zu kalibrieren:

sudo python3 -m sunfounder_imu.calibrate

Folgen Sie anschließend den Anweisungen im Skript, um die Kalibrierung der IMU abzuschließen.


Beispiel ausführen

Der gesamte in diesem Tutorial verwendete Beispielcode befindet sich im Verzeichnis ai-lab-kit. Führen Sie die folgenden Schritte aus, um das Beispiel auszuführen:

cd ~/ai-lab-kit/python/
sudo python3 2.15_10axis_imu.py

Dieses Python-Skript liest umfassende Bewegungs- und Umweltdaten vom 10-Achsen-IMU-Modul aus. Bei der Ausführung:

  1. Das Skript initialisiert die Kommunikation mit allen drei integrierten Sensoren über I2C.

  2. Jeder Sensor wird erkannt und seine I2C-Adresse zur Überprüfung angezeigt.

  3. Die Hauptschleife liest kontinuierlich Daten aus und zeigt sie an, darunter:

    • Höhe (aus dem barometrischen Druck berechnet)

    • Kompassrichtung (Azimut)

    • 3-Achsen-Beschleunigung

    • 3-Achsen-Winkelgeschwindigkeit (Gyroskop)

    • 3-Achsen-Magnetfeldstärke

    • Temperatur und Luftdruck

  4. Die Daten werden alle 0,5 Sekunden aktualisiert und ermöglichen so eine Echtzeit-Bewegungsverfolgung.

  5. Das Programm läuft, bis es mit Ctrl+C unterbrochen wird, und beendet sich anschließend ordnungsgemäß.


Code

Nachfolgend ist der Python-Code zum Auslesen der Daten des 10-Achsen-IMU-Moduls aufgeführt:

#!/usr/bin/env python3
"""
Read data from all three sensors on the 10 Axis IMU module:
- SPL06_001: temperature, pressure, altitude
- SH3001: temperature, accelerometer, gyroscope
- QMC6310: compass heading

Gracefully exits when Ctrl+C is pressed.
"""

from time import sleep

# Import Sunfounder sensor modules
from sunfounder_imu import IMU

def main():
    imu = IMU()
    sensors = imu.find_sensor()
    if len(sensors) == 0:
        print("No sensor found.")
        return
    for address, class_type in sensors.items():
        name = class_type.__name__
        print(f"Found sensor {name} at address 0x{address:02X}")
    sleep(3)

    try:
        while True:
            data = imu.read()

            print(f"Altitude={data['altitude']:7.2f} m")
            print(f"Azimuth={data['azimuth']:7.2f} °")
            print(f"Acceleration:")
            print(f"  X={data['acceleration'].x:7.2f} m/s²")
            print(f"  Y={data['acceleration'].y:7.2f} m/s²")
            print(f"  Z={data['acceleration'].z:7.2f} m/s²")
            print(f"Gyroscrope:")
            print(f"  X={data['gyroscrope'].x:7.2f} °/s")
            print(f"  Y={data['gyroscrope'].y:7.2f} °/s")
            print(f"  Z={data['gyroscrope'].z:7.2f} °/s")
            print(f"Magenatic:")
            print(f"  X={data['magenatic'].x:7.2f} μT")
            print(f"  Y={data['magenatic'].y:7.2f} μT")
            print(f"  Z={data['magenatic'].z:7.2f} μT")
            print(f"Temperature={data['temperature']:7.2f} °C")
            print(f"Pressure={data['pressure']:7.2f} hPa")

            sleep(0.5)

    except KeyboardInterrupt:
        print("\nExiting program...")


if __name__ == "__main__":
    main()

Code verstehen

  1. Importe und Einrichtung:

    from time import sleep
    from sunfounder_imu import IMU
    

    Das Skript importiert die erforderlichen Module: sleep für Zeitverzögerungen und die Klasse IMU aus der Sunfounder-Bibliothek, um mit dem Sensormodul zu kommunizieren.

  2. Sensorinitialisierung:

    imu = IMU()
    sensors = imu.find_sensor()
    if len(sensors) == 0:
        print("No sensor found.")
        return
    

    Es wird ein IMU-Objekt erstellt und nach angeschlossenen Sensoren auf dem I2C-Bus gesucht. Wenn keine Sensoren gefunden werden, beendet das Programm die Ausführung.

  3. Sensorerkennung:

    for address, class_type in sensors.items():
        name = class_type.__name__
        print(f"Found sensor {name} at address 0x{address:02X}")
    

    Zeigt Informationen zu jedem erkannten Sensor an, einschließlich Sensortyp und I2C-Adresse, was besonders für Debugging-Zwecke hilfreich ist.

  4. Hauptschleife zum Auslesen der Daten:

    while True:
        data = imu.read()
        # Display all sensor readings with formatted output
        sleep(0.5)
    
    • Ruft imu.read() auf, um alle Sensordaten als ein einzelnes Dictionary zu erhalten

    • Formatiert und zeigt jeden Parameter mit einheitlicher Dezimalgenauigkeit an

    • Enthält eine Verzögerung von 0,5 Sekunden, um eine gute Balance zwischen Aktualisierungsrate und Lesbarkeit zu gewährleisten

  5. Sauberes Beenden:

    except KeyboardInterrupt:
        print("\nExiting program...")
    

    Fängt die Ausnahme KeyboardInterrupt ab, sodass das Programm sauber beendet werden kann, wenn Ctrl+C gedrückt wird.


Fehlerbehebung

  1. Keine Sensoren gefunden:

    • Ursache: Falsche Verdrahtung oder Probleme bei der I2C-Kommunikation.

    • Lösung:

      • Überprüfen Sie alle Verbindungen: VCC, GND, SDA, SCL

      • Prüfen Sie, ob I2C auf dem Raspberry Pi aktiviert ist: sudo raspi-config → Interface Options → I2C

      • Führen Sie i2cdetect -y 1 aus, um zu prüfen, ob die Sensoren unter ihren Adressen erkannt werden

  2. Unstabile oder fehlerhafte Messwerte:

    • Ursache: Elektrische Störungen oder Kalibrierungsprobleme der Sensoren.

    • Lösung:

      • Halten Sie das Modul von starken Magnetfeldern oder Motoren fern

      • Stellen Sie eine stabile Stromversorgung mit geeigneten Entkopplungskondensatoren sicher

      • Platzieren Sie das Modul während der Messung auf einer stabilen Oberfläche

  3. Falsche Höhenwerte:

    • Ursache: Nicht kalibrierter Referenzwert für den barometrischen Druck.

    • Lösung: Die Höhe wird relativ zum Luftdruck auf Meereshöhe berechnet. Für genauere Messungen sollten Sie mit einer bekannten Höhe kalibrieren oder den Referenzwert für den Luftdruck auf Meereshöhe anpassen.

  4. Ungenaue Kompassrichtung:

    • Ursache: Lokale magnetische Störungen oder unzureichende Kalibrierung.

    • Lösung:

      • Führen Sie eine Magnetometer-Kalibrierung durch, indem Sie das Modul in einer Achtbewegung (Figure-8) drehen

      • Halten Sie das Modul von Metallobjekten, Computern und anderen magnetischen Quellen fern


Erweiterungsideen

  1. Bewegungserkennungs-Alarm: Lösen Sie eine Warnung aus, wenn die Beschleunigung einen bestimmten Schwellenwert überschreitet:

    acceleration_magnitude = (data['acceleration'].x**2 +
                              data['acceleration'].y**2 +
                              data['acceleration'].z**2)**0.5
    if acceleration_magnitude > 2.0:  # 2G threshold
        print("Motion detected!")
    
  2. Orientierungserkennung: Bestimmen Sie die Ausrichtung des Geräts anhand kombinierter Sensordaten:

    # Simple orientation detection using accelerometer
    if abs(data['acceleration'].z) > 9.0:
        print("Device is flat")
    elif data['acceleration'].y > 8.0:
        print("Device is upright")
    
  3. Datenprotokollierung: Speichern Sie Sensordaten zur späteren Analyse in einer Datei:

    import csv
    with open('imu_data.csv', 'a') as f:
        writer = csv.writer(f)
        writer.writerow([data['temperature'], data['pressure'],
                        data['altitude'], data['azimuth']])
    
  4. Neigungskompensierter Kompass: Verbessern Sie die Genauigkeit der Richtungsbestimmung mithilfe der Beschleunigungsdaten:

    # Basic tilt compensation (simplified)
    pitch = math.asin(-data['acceleration'].x / 9.81)
    roll = math.asin(data['acceleration'].y / (9.81 * math.cos(pitch)))
    # Apply compensation to magnetometer readings
    

Fazit

Dieses Projekt zeigt, wie ein 10-Achsen-IMU-Modul verwendet werden kann, um umfassende Bewegungs- und Umweltdaten mit einem Raspberry Pi zu erfassen. Durch die Kombination von Druck-, Beschleunigungs-, Rotations- und Magnetfeldsensoren bietet dieses Modul eine vollständige Lösung zur Trägheitsmessung, die sich für fortgeschrittene Anwendungen wie Drohnenstabilisierung, Robotik-Navigation und Bewegungserfassungssysteme eignet. Die hier geschaffene Grundlage ermöglicht eine weiterführende Beschäftigung mit Sensor-Fusion-Algorithmen und komplexer Bewegungsanalyse.