[menu name=“Bordcomputer“]

Beschreibung

Ganz am Anfang steht das Auslesen der OBD2-Werte aus dem Auto. Dazu muss der RaspberryPi mit dem Fahrzeug verbunden werden.
Hierfür wird 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):

# sudo 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

Dieses Projekt ist eine gute Ausgangsbasis um nachvollziehen zu können, wie mit dem Fahrzeug kommuniziert wird.

Ablauf der Kommunikation

Für die Kommunikation zwischen Python und dem OBD2-Port des Autos wird zunächst der serielle Anschluss des Raspberry Pi geöffnet.
In der Init-Methode der Klasse OBDPort im Skript 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 und meinem verwendeten Fahrzeug (Ford Focus, Bj. 2003) 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. ate0 (echo off)
  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

Und der komplette Ablauf:

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.