MotoNav_Pi: Reifendruck im Blick (TPMS)

Viele Motorradfahrer kennen das Gefühl: Ein kurzer Blick auf die Reifen vor der Fahrt ist Pflicht, aber während der Tour wünscht man sich eine kontinuierliche Überwachung des Reifendrucks. Genau hier setzt MotoNav_Pi an! In diesem Beitrag zeige ich dir, wie ich die Reifendrucküberwachung (TPMS) in mein DIY-Motorrad-GPS-System integriert, konfiguriert und getestet habe.

Wie im vorherigen Übersichtsartikel bereits erwähnt, ist die Echtzeit-Überwachung von Reifendruck und Temperatur ein wichtiger Baustein von MotoNav_Pi. Durch die Einbindung eines Bluetooth-basierten TPMS-Moduls können wir diese Daten direkt am Raspberry Pi erfassen und in unserer Web-Oberfläche anzeigen lassen.

Anschluss des TPMS-Moduls

Da es sich um ein Bluetooth-TPMS handelt, erfolgt der „Anschluss“ primär drahtlos. Die TPMS-Sensoren werden an den Ventilen der Reifen angebracht und senden ihre Messdaten per Bluetooth aus. Der Raspberry Pi mit seinem integrierten oder einem externen Bluetooth-Adapter dient als Empfänger dieser Daten.

Es ist wichtig sicherzustellen, dass Bluetooth auf dem Raspberry Pi aktiviert ist. Dies kann in der Regel über die Raspberry Pi Konfiguration oder über die Befehlszeile (sudo bluetoothctl) erfolgen.

Konfiguration der TPMS-Erfassung in Python

Die Hauptarbeit der TPMS-Integration erfolgt in der Python-Backend-Software von MotoNav_Pi. Hier verwenden wir die bleak-Bibliothek, um Bluetooth Low Energy (BLE) Geräte zu scannen und uns mit den TPMS-Sensoren zu verbinden.

Der Kern der TPMS-Erfassung ist die Callback-Funktion, die aufgerufen wird, wenn ein Bluetooth-Gerät in der Nähe entdeckt wird. Hier filtern wir nach unseren TPMS-Sensoren und verarbeiten deren Daten. Im Laufe der Entwicklung haben wir verschiedene Ansätze zur Dateninterpretation getestet, da die genaue Struktur der RAW-Daten herstellerspezifisch sein kann.

Hier ein Code-Schnipsel der finalen tpms_callback-Funktion, die die RAW-Daten der Sensoren interpretiert und Druck, Temperatur und Batteriestand extrahiert:

def tpms_callback(device, advertisement_data):
    for data in advertisement_data.manufacturer_data.values():
        hexstr = data.hex().upper()
        for sid, pos in SENSOR_IDS.items():
            if sid in hexstr:
                logger.debug(f"TPMS {pos}: RAW={hexstr}")

                # Druck-Rohwert aus Byte-Offset 7–8 (little-endian)
                raw = int.from_bytes(data[7:9], 'little')

                # Temperatur-Rohwert aus Byte-Offset 11–12 (big-endian)
                raw_temp = int.from_bytes(data[11:13], 'big')

                # Batterie-Rohwert aus Byte-Offset 13–14 (big-endian)
                raw_batt = int.from_bytes(data[13:15], 'big')

                # Druck berechnen (kalibrierte Formel)
                A = 0.0025687730837279364
                B = -0.009808234936620981
                DEAD_BAND = 0.01
                bar = A * raw + B
                if bar < DEAD_BAND:
                    bar = 0.0

                # Temperatur berechnen
                temp_c = raw_temp / 100.0

                # Batterie-Prozent
                batt_pct = raw_batt

                last_tpms[sid].update({'bar': bar, 'temp': temp_c, 'batt': batt_pct})
                logger.info(
                    f"TPMS {pos}: raw={raw}, bar={bar:.2f} bar, "
                    f"temp={temp_c:.2f} °C, batt={batt_pct}%"
                )
                return

Dieser Code-Schnipsel zeigt, wie die relevanten Byte-Bereiche aus den Herstellerdaten extrahiert und in Druck (bar), Temperatur (°C) und Batteriestand (%) umgewandelt werden. Die hier verwendete Druckberechnung (bar = A * raw + B) ist das Ergebnis einer Kalibrierungsphase, die im nächsten Abschnitt genauer erläutert wird.

Die SENSOR_IDS Variable enthält eine Zuordnung der Bluetooth-Identifier der Sensoren zu ihren Positionen (z.B. ‚234745‘: ‚Vorne Rechts‘).

Testen und Kalibrieren des TPMS

Das Testen und die Kalibrierung sind entscheidende Schritte, um sicherzustellen, dass die angezeigten Werte korrekt sind. Da die technischen Daten der Sensoren nicht verfügbar waren, musste die Umrechnungsformel empirisch ermittelt werden.

output (2)
Erste Berechnungen waren sehr daneben

Der Testprozess umfasste:

  1. Relevante Daten: Durch ein Script das die raw Daten live anzeigt und durch einfaches reinpusten in die TPMs habe ich die vermutlich relevanten Btyes identifiziert (6-8).
  2. Auslesen der RAW-Daten: Zuerst wurden die rohen Byte-Arrays, die von den Sensoren gesendet wurden, protokolliert.
  3. Manuelle Messungen: Parallel dazu wurde der Reifendruck mit einem geeichten Manometer manuell gemessen.
  4. Analyse und Korrelation: Die manuellen Messwerte wurden den entsprechenden RAW-Daten zugeordnet, um Muster und Zusammenhänge zu erkennen.
  5. Entwicklung einer Umrechnungsformel: Basierend auf den gesammelten Daten wurde eine mathematische Formel entwickelt, um die RAW-Werte in Bar umzurechnen. Anfänglich wurde eine einfache lineare Formel getestet (Druck = Rohwert / 440), später wurde eine präzisere lineare Regression angewendet.
  6. Byte-Offset-Identifizierung: Durch systematisches Testen wurde ermittelt, welche Bytes im RAW-Datenstrom tatsächlich den Druck-, Temperatur- und Batteriestand repräsentieren.
  7. Verfeinerung der Formel: Durch mehrere Messpunkte und Vergleich mit manuellen Werten wurde die Umrechnungsformel kontinuierlich verfeinert.

Die Entwicklung der korrekten Byte-Offsets und der Kalibrierungsformel war ein iterativer Prozess, bei dem zahlreiche Testläufe und Anpassungen des Python-Codes erforderlich waren.

output (1)
Hier sieht man das 6-7 keinen Sinn ergaben, die 7-8 Bytes waren die Lösung diese müssen jetzt nur noch ausgelsen werden.

Einige Code-Schnipsel aus der Testphase zeigen die Entwicklung der Druckberechnung:

  • Erster Ansatz (Näherung): pressure_bytes = bytestr[13:15] # Annahme: Druck in Byte 13 und 14 pressure_val = int.from_bytes(pressure_bytes, byteorder="little") pressure_bar = pressure_val / 440
  • Verwendung einer linearen Regression: bar = 0.00418 * raw - 2.43
  • Finale kalibrierte Formel basierend auf Bytes 7-8: A = 0.0025687730837279364 B = -0.009808234936620981 bar = A * raw + B

Ähnliche Testreihen wurden durchgeführt, um die Byte-Offsets und Skalierungsfaktoren für Temperatur und Batteriestand zu ermitteln.

Integration in das MotoNav_Pi System

Nachdem die TPMS-Daten zuverlässig erfasst und interpretiert werden können, erfolgt die Integration in das restliche MotoNav_Pi System. Die aktuellen Reifendruck- und Temperaturwerte werden in der last_tpms Variable gespeichert und können von anderen Modulen (z.B. der Web-Oberfläche oder der Alarmierungslogik) abgerufen werden.

Die erfassten TPMS-Daten werden zusammen mit den GPS-Daten in einer CSV-Datei protokolliert und optional an einen Server hochgeladen. Hierbei wurde darauf geachtet, den Overhead gering zu halten und die Daten nicht unnötig oft zu übertragen.

Auch die Datenbankstruktur wurde angepasst, um die TPMS-Werte (Druck, Temperatur, Batterie) zu speichern.

Erste echte Werte der TPMs auf der WebUI!
Erste echte Werte der TPMs auf der WebUI!

Fazit

Die Integration des TPMS in MotoNav_Pi ermöglicht eine wertvolle Erweiterung der Funktionalitäten. Durch die kontinuierliche Überwachung des Reifendrucks erhöht sich die Sicherheit während der Fahrt. Die Konfiguration und das Testen des TPMS waren zwar aufwendig, da keine direkten Herstellerinformationen vorlagen, aber durch systematisches Vorgehen und die Analyse der RAW-Daten konnte eine zuverlässige Lösung realisiert werden.

Bleibt dran für weitere Updates und Anleitungen rund um das MotoNav_Pi Projekt!

Dominik W.
Dominik W.

Ich bin ein begeisterter Motorradfahrer mit einer Ausbildung in Elektrotechnik und IT. Seit über 12 Jahren erkunde ich auf zwei Rädern die Welt, von Island bis zum Balkan. Meine technische Expertise und die Liebe zum Motorradfahren motivieren mich, die besten Motorradprodukte zu erforschen und zu bewerten, um anderen Fahrern zu helfen, ihre Fahrerlebnisse zu verbessern.

We will be happy to hear your thoughts

Hinterlasse einen Kommentar

Alpen Motorrad
Logo