.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_10-axis:
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:
.. list-table::
:widths: 30 20
:header-rows: 1
* - KOMPONENTENBESCHREIBUNG
- KAUFLINK
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_10_axis_imu`
- \-
* - Raspberry Pi
- \-
.. ----------------------------------------------
.. **Schaltplan**
.. Das 10-Achsen-IMU-Modul wird über die I2C-Schnittstelle verbunden:
.. .. image:: img/fzz/2.14_sch.png
----------------------------------------------
**Verdrahtungsdiagramm**
Verbinden Sie das IMU-Modul mit dem Raspberry Pi wie unten dargestellt:
.. image:: img/fzz/2.15_10axis_bb.png
:width: 80%
:align: center
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:
.. raw:: html
.. code-block:: shell
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:
.. raw:: html
.. code-block:: shell
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:
.. raw:: html
.. code-block:: shell
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:
.. raw:: html
.. code-block:: python
#!/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:**
.. code-block:: python
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:**
.. code-block:: python
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:**
.. code-block:: python
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:**
.. code-block:: python
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:**
.. code-block:: python
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:
.. code-block:: python
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:
.. code-block:: python
# 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:
.. code-block:: python
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:
.. code-block:: python
# 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.