Einlesen der OBD2-Werte

Raspberry Pi mit dem OBD2-Port verbinden

Um den RaspberryPi mit dem Fahrzeug zu verbinden, kann ein ein EML327-kompatibler OBD2-USB oder OBD2-Bluetooth Stecker verwendet.

In meinem Falle per USB, da der Raspberry Pi später sowieso fest im Fahrzeug integriert wird.

Verbindung herstellen

Der ELM327 ist ein „OBD to RS232 Interpreter“
(https://www.elmelectronics.com/wp-content/uploads/2016/07/ELM327DS.pdf)

Zur Kommunikation wird ein serieller Port geöffnet und anschließend kommuniziert man wir mit einem Modem.
Also ein Frage-Antwort-Spiel. Befehl hin, Antwort zurück.

Glücklicherweise gibt es schon eine Python-Lib die sich genau damit befasst und auch die Antwort vom OBD2-Port umwandelt (https://github.com/peterh/pyobd).

Ich habe mich bei meiner Arbeit jedoch auf diesen Fork gestützt: https://github.com/Pbartek/pyobd-pi/blob/master/obd_io.py

Auf der dazugehörigen Projektseite (https://www.instructables.com/id/OBD-Pi/) wird beschrieben wie das Skript zum Laufen gebracht wird.

Die einzig wirkliche Abhängigkeit besteht jedoch zu python-serial. Da ich einen USB-Stecker verwende, entfällt für mich bluetooth bluez-utils blueman.
Die Pakete python-wxgtk2.8 python-wxtools wx2.8-i18n libwxgtk2.8-dev benötige ich auch nicht, da ich keine grafische Ausgabe verwendet.

Hier unterscheidet sich auch schon der Fork von Pbartek maßgeblich zum Original von peterh: im Original wird schon in der obd.io.py das Paket wx referenziert.
Der Fork von Pbartek entfernt diese Abhängigkeiten und bietet mit dem Skript obd_recorder.py einen schönen Einstiegspunkt um nachvollziehen zu können wie mit dem OBD2-Anschluss gerabeitet wird.

Um also das Paket von Pbartek auf den Raspberry Pi zu bekommen sind die folgenden Schritte notwendig:

Optional (räumt apt-get auf):

udo apt-get update
sudo apt-get upgrade
sudo apt-get autoremove
sudo reboot

Installiert python-serial und die Pakete für Bluetooth und der grafischen Ausgabe (wenn benötigt):

sudo apt-get install python-serial
sudo apt-get install bluetooth bluez-utils blueman
sudo apt-get install python-wxgtk2.8 python-wxtools wx2.8-i18n libwxgtk2.8-dev

Installiert den GIT-Client und holt im Anschluss das Paket.
Entfällt, wenn das Paket manuell geladen und auf den Raspberry Pi übertragen wird:

sudo apt-get install git-core
sudo reboot

git clone https://github.com/Pbartek/pyobd-pi.git

Ablauf der Kommunikation

Für die Kommunikation zwischen Python und dem OBD2-Port des Autos wird der serielle Anschluss des Raspberry Pi geöffnet.
In der Init-Methode der Klasse OBDPort (obd_io.py) ist definiert, wie der Port geöffnet wird und im Anschluss die Kommunikation zum ELM327 hergestellt wird.

Die genaue Bedeutung der einzelnen Befehle kann in der ELM327-Dokumentation nachgelesen werden.

pyOBD nutzt zur Initialisierung die folgende Befehlsabfolge:

  1. atz (reset)
  2. ate0 (echo off)
  3. 0100 (supported monitor ids)

Die ersten Versuche sind bei mir immer gescheitert.
Als Antwort nach dem Senden von 0100 kam stehts die Antwort:

0100SEARCHING……UNABLE TO CONNECT

Der Fehler kommt zum einen, wenn die Zündung am Fahrzeug nicht wenigstens auf Stufe 2 gestellt ist. In meinem Fall kam die Fehlermeldung aber immer.
Funktioniert hat es erst, nachdem ich im Anschluss an den Befehl ATZ die automatische Protokollerkennung aktiviert habe.

Ich hab die ganze Abfolge noch etwas ergänzt:

  1. atz (reset)
  2. ate1 (echo on)
  3. atsp0 (0 = automatic protocol detection)
  4. attp0 (0 = try protocol)
  5. atdp (display protocol)
  6. atdpn (protocol used by car)
  7. 0100 (supported monitor ids)

Und das Ergebnis sah schon gleich anders aus:

0100SEARCHING…41 00 BE 1F B0 10 68

Nach dem Herstellen der Verbindung werden entsprechend der OBD2-Befehlsliste die Kommandos geschickt (https://en.wikipedia.org/wiki/OBD-II_PIDs) und das Ergebnis verarbeitet.

Wer ähnliches vor hat, dem kann ich nur empfehlen, sich mit dem OBD2-Protokoll vertraut zu machen und die gesendeten/empfangenen Werte mit der OBD-II PID-Beschreibung zu vergleichen. Nur so entsteht am Ende auch ein Gefühl dafür, was hier eigentlich passiert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.