4289

Die Software macht aus einem Raspberry Pi mit 7‘‘ Display sowie einem Tiny-CAN ein OBD2 Diagnose Tool. Da viele heute bevorzugt mit dem Smartphone oder Tablet arbeiten, bietet die Software zwei Schnittstellen in die IoT-Welt.

Die wichtigsten Fahrzeugdaten werden als HTML5-Seite über einen Apache-Webserver bereitgestellt und für Apps steht eine „JSON over TCP/IP“ Schnittstelle zur Verfügung. Das verwendete „JSON“-Message-Format ist kompatibel zum Open-Source-Projekt „OpenXC“ von „Ford Bug Labs“, somit können die Android, iOS Librarys und Apps von „OpenXC“, wie in Kapitel 4 beschrieben, verwendet werden.

OBD2 Features
  • Abfrage von Messdaten (SID 0x01)
    • Konfigurierbare Anzeige der PID-Werte von 0x00 bis 0x4E
  • Abfrage Fahrzeuginformationen (SID 0x09)
    • Aufschlüsselung der Fahrgestellnummer (VIN – Vehicle Identification Number) in Hersteller, Land, Modelljahr, Seriennummer, ...)
  • Fehlercodes lesen (DTC – Diagnostic Trouble Codes) (SID 0x03)
    • Klartext-Anzeige der Fehlercodes mittels Datenbank
  • CAN-Rohdaten anzeigen (CAN-Trace)
  • Automatische Erkennung der CAN-Hardware und CAN Bitrate

Liste aller unterstützten PIDs: „obd_display_pid_list.pdf“

1. Die SoftwareDer Programmablauf grob in vier Schritten – „obd_display_program_flow.jpg“:
  1. CAN-API-Treiber „libmhstcan.so“ laden, Informationen zum Treiber und der Tiny-CAN-Hardware abfragen. CAN-Schnittstelle öffnen, konfigurieren, empfangene CAN-Nachrichten weiterleiten und CAN-Nachrichten senden (can_device.c)
  2. An- und Abstecken des Tiny-CAN Interfaces überwachen (can_dev_pnp.c)
  3. Treiber für das ISO-TP Protokoll (isotp.c), Versand von Single und segmentierten ISO-TP Nachrichten mit Datenflusskontrolle. Empfang von Single- und segmentierten ISO-TP-Nachrichten, inklusive CAN-Messages zur Datenflusskontrolle generieren.
  4. OBD-Verbindung aufbauen, VIN und Supported PIDs lesen, Live-Daten zyklisch lesen und den Fehlerspeicher abfragen.
Das Modul „vin_db.c“ enthält Hilfsfunktionen zum Aufschlüsseln der VIN in Hersteller, Land usw. Der Herstellercode wird mithilfe der Datenbank „wmi.db“ aufgeschlüsselt. Das Modul „dtc_db.c“ wandelt „Diagnostic Trouble Codes“ in Klartext um. Dazu wird die Fehlerdatenbank „dtc.db“ geladen.

Das Modul „xml_database.c“ schreibt über die Funktion „XMLDatabaseUpdate“ zyklisch die Dateien „dashboard.xml“ und „status.xml“ mit den aktuellen Messwerten.
Hier ein Auszug aus dem XML-File:


    0
      0
  ....

Da es sich bei den XML-Files lediglich um einfache statische eindimensionale Strukturen handelt, wird zum Schreiben der Dateien auf die Verwendung einer XML Library verzichtet. Stadtessen kommen „g_strdup_printf“ und die Standard File I/O Funktionen zum Einsatz. Ein Java-Skript der HTML-Seite löst zyklisch einen „GET“ Request aus, der entsprechend der angezeigten Seite das zugehörige XML-File einliest.

Für die TCP/IP Kommunikation sind die beiden Module „sock_lib.c“ und „open_xc.c“ zuständig. Das Modul „sock_lib.c“ erzeugt einen eigenen Thread, in dem neue Socket-Verbindungen hergestellt und empfangene Daten verarbeitet werden. Das Modul „open_xc.c“ erzeugt noch einen Hilfsthread, der das zyklische Senden der OBD-Daten auslöst. Sobald eine App den TCP/IP Socket öffnet, werden auch schon zyklisch die OBD-Daten übertragen. Beispiel für einen Datensatz:
{"name": "vehicle_speed", "value": 45}\0
Ein Datensatz wird mit „\0“ abgeschlossen. Es lassen sich auch mehrere Datensätze in einem Paket verschicken. Beispiel:
{"name": ...}\0{"name": ...}\0
Die App kann auch Kommandos an die Software senden. Hier ein Beispiel für ein Kommando und die dazugehörige Response:
{"command":"platform","unix_time":0,"bypass":false,"bus":0,"enabled":false}\0
{"command_response": "platform", "message":"Tiny-CAN & Pi", "status": true}\0


2. Die HardwareRaspberry Pi mit Raspberry Pi Touch-LCD 7‘‘ (die Software ist nicht fest an den Raspberry Pi gebunden, jeder Linux PC/Notebook ist geeignet)
Tiny-CAN z.B. Tiny-CAN I-XL, Bezugsquelle: http://www.mhs-elektronik.de
OBD-CAN-Kabel, Verdrahtung siehe „obd2_cable_connector.jpg“

3. InstallationZuerst muss das Tiny-CAN-Softwarepaket installiert werden, für den Betrieb der Software wird nur die „libmhstcan.so“ benötigt. „OBD-Display“ sucht diese Datei im Verzeichnis „/opt/tiny_can/can_api“.

Als Erstes müssen die Zugriffsrechte für das „/opt“-Verzeichnis, in dem die Software installiert werden soll, gesetzt werden. Die Datei „tiny_can_raspberry_XXX.tar.gz“ von „http://www.mhs-elektronik.de“ downloaden und im Verzeichnis „/opt“ entpacken. XXX durch die aktuellste Version ersetzen. Nach dem Entpacken kann das Archiv gelöscht werden. Hier die einzelnen Schritte:
> sudo chgrp pi /opt
> sudo chmod -R 775 /opt
> cd /opt
> mv /home/pi/tiny_can_raspberry_XXX.tar.gz .
> tar -xzvf  tiny_can_raspberry_XXX.tar.gz
> rm tiny_can_raspberry_XXX.tar.gz

Die Tiny-CAN API kompilieren: 
> cd /opt/tiny_can/can_api/src/mhstcan/linux
> make
> mv libmhstcan.so ../../..
Die Lib ist in dem Paket bereits enthalten. In der Regel ist das Kompilieren nicht notwendig.

„Git“ installieren:
> sudo apt-get install git

„ObdDisplay“ von „Git-Server“ holen:
> cd /opt
> git clone https://github.com/MHS-Elektronik/OBD-Display.git

Benötigte Libs installieren:
> sudo apt-get install apache2

Development Pakete installieren:
> sudo apt-get install gtk2.0-dev libxml2-dev

„ObdDisplay“ kompilieren:
> cd /opt/OBD-Display/linux
> make

Web-Page einrichten:
> cd /var/www
> sudo chown -R pi html
> sudo chgrp -R pi html
> cd html
> cp -R /opt/OBD-Display/www/* .

ObdDisplay starten:
> cd /opt/OBD-Display/linux/bin
> ./ObdDisplay

4. Android App „OpenXC Enabler“ installierenDownloads:
Das APK-Paket zur Installation: https://github.com/openxc/openxc-android/releases.
Alternativ kann der „OpenXC Enabler“ auch über Google Play installiert werden.
Quellen der App: https://github.com/openxc/openxc-android

Setup:
„Vehicle Interface“ auf „Network“ einstellen. „Network host address“ auf die Adresse des Computers, auf dem OBD Display ausgeführt wird, setzen. „Network port“ ist fest auf 50001 eingestellt, siehe „open_xc_setup.jpg“.

5. Quellen/LinksZwei der Kerndateien, „obd_db.c“ und „obd_decode.c“, in diesem Projekt basieren auf der OBD-II API von Ethan Vaughan, https://github.com/ejvaughan/obdii

Beim ISO-TP Treiber habe ich ein wenig aus dem ISP-TP Linux Kernel Treiber von Oliver Hartkopp gespickt, https://github.com/hartkopp/can-isotp

Die meisten Informationen habe ich diesem Dokument von emotive entnommen:
http://www.emotive.de/documents/WebcastsProtected/Transport-Diagnoseprotokolle.pdf
Wirklich sehr lesenswert, kann ich nur empfehlen!

Weitere Quellen, die ich benutzt habe:
https://github.com/iotlabsltd/pyvin/tree/master/pyvin
ftp://ftp.nhtsa.dot.gov/manufacture
https://de.wikipedia.org/wiki/Fahrzeug-Identifizierungsnummer
https://en.wikipedia.org/wiki/On-board_diagnostics
https://de.wikipedia.org/wiki/ISO_15765-2

6. Tipps und TricksDas Programm automatisch starten
Sollte keine Maus oder Tastatur an dem PI angeschlossen sein, ist es sinnvoll, das Programm automatisch zu starten. Kopieren Sie dazu die Datei „ObdDisplay.desktop“ aus dem Verzeichnis „tools“ ins Verzeichnis „/etc/xdg/autostart“.
> sudo cp /opt/ObdDisplay/tools/ObdDisplay.desktop /etc/xdg/autostart

Bildschirmschoner abschalten
Die Datei „/etc/lightdm/lightdm.conf“ im Editor als User „root“ öffnen.
> sudo leafpad /etc/lightdm/lightdm.conf
In der Sektion „SeatDefaults“ die Zeile „xserver-command“ wie folgt abändern oder – wenn nicht vorhanden – ergänzen.
[SeatDefaults]
....
xserver-command=X -s 0 -dpms
....

Bildschirm-Anzeige drehen
Die Datei „/boot/config.txt“ im Editor als User „root“ öffnen.
> sudo leafpad /boot/config.txt
In die Datei folgende Zeile eintragen
lcd_rotate=2
Nach dem Neustart sollte das Bild um 180° gedreht sein und Sie können das Display umdrehen, womit sich der microUSB-Stecker oben befindet.

Maus-Zeiger verschwinden lassen
Für unsere spezielle Anwendung ist der Mauszeiger störend. Um den Cursor ganz einfach zu entfernen, lässt sich ein Paket installieren, das diesen ausblendet:
sudo apt-get install unclutter
Nach einem Neustart ist der Cursor nicht mehr sichtbar.