Hallo zusammen,
ich habe neben meiner Dakar eine Xchallenge, die weder Drehzahlmesser, Aussentemperatur noch Motortemperaturanzeige hat und einen Tacho mit einem Fehler von ca. 8%. Ich möchte deshalb später mit einem ESP32 (Mikrocontroller wie Arduino, aber mit Bluetooth und WLAN) ein kleines Display bauen, wo diese Informationen angezeigt werden. Ich habe den ESP32 bereits für Navigations-Tasten (vorgestellt im G650X-Forum) eingesetzt. Statt Drehzahl, Geschwindigkeit und Motor- und Ansaugtemperatur einzeln abzugreifen, möchte ich diese Werte aus dem Motorsteuergerät auslesen. Motoscan kann das ja mit einem billigen 10 EUR-Adapter. Diese Adapter konvertieren die Fahrzeugschnittstelle in eine serielle Schnittstelle (über Bluetooth, WLAN oder USB) und können mit dem ELM327-Protokoll konfiguriert werden. Das Motorsteuergerät der Xchallange (sollte gleich wie das der F 650 GS Twinspark sein, ein Hella BMS COMPACT 2) kann per K-Leitung mit KWP2000 ausgelesen werden. Diese K-Leitung ist entweder am Diagnoseport oder am Steuergerät am braun-schwarzen Kabel verfügbar.
Leider funktionieren normale OBD II-Befehle nicht, weshalb auch ein normaler OBD-Scanner mit unseren alten BMW-Motorräder nicht funktioniert. So viel ich weiss, wurde das verwendete Protokoll das erste Mal mit dem Hex GS-911 ausserhalb von BMW implementiert. Ich weiss nicht, wie der Hersteller des Hex GS-911 an die nötigen Informationen gekommen sind, da die wahrscheinlich nicht öffentlich sind. Ich vermute, dass er entweder auf die BMW-Dokumentation Zugriff hatten oder ein offizielles BMW-Diagnosegerät reverse engineered hat. Grundsätzlich ist es auch denkbar, dass man mit den verfügbaren Informationen über das ISO 14230-4 KWP 2000-Protokoll und ausprobieren so etwas entwicklen könnte. Motoscan als neueres Produkt hätte auch ein GS-911 analysieren können.
Ich brauche für mein Display nur die Informationen, wie sie Motoscan in der Gratisversion unter "Echtzeitdaten" darstellt. Ich habe deshalb bei meinem Android-Tablet alle Bluetooth-Pakete geloggt und mit Wireshark und Python analysiert. Man muss folgende ELM327-AT-Befehle (z.B. mit Putty) an die virtuelle serielle Schnittstelle senden, um den Adapter für unser Steuergerät zu konfigurieren (nur das in den Anführungszeichen):
"AT L1" # write newlines after every response. If not needed, use 'AT L0'
"AT AL" # Allow Long (>7 byte) messages
"AT SH 81 12 F1"# set header to 81 12 F1
"AT WM 81 12 F1 3E" # set wakeup message to header + 3E
"AT ST 50"# timeout is 50*4 msec
"AT SP 5" # set protocol to 5, (ISO 14230-4 KWP (fast init, 10.4 kbaud))
"AT RV" # read voltage in adapter to test it
Jetzt kann man "81" senden. Da kein "AT" davor steht, sendet der Adapter das weiter an das Motorsteuergerät, man sollte eine Meldung "BUS INIT: OK" zurückbekommen.
Jetzt sendet man '2110'. Laut der ISO-Dokumentation bedeutet das readDataByLocalIdentifier für das Steuerergerät '10', das das Motorsteuergerät sein muss.
Zurück bekomme ich auf meinem Computer mit Putty eine 114 Zeichen lange Zeichenfolge wie diese:
61 10 00 00 5C 5C 5E 5E 84 84 00 15 00 87 21 15 00 00 80 80 5D 00 AE 07 C8 C2 00 00 00 00 E8 00 00 80 00 76 00 40 06 7F 00 00 10 00 00 00 00 00 00 00 00 00 00 40 00 00 00
Komischerweise hat diese Zeichenfolge im Bluetooth-Log von Motoscan auf meinem Tablet noch die Zeichen 'B9 F1 12' davor und zwei weitere Zeichen am Schluss, die aber nicht relevant sind (Header und Checksumme?).
Diese Zeichen in Zweiergruppen (deshalb die Leerzeichen in der Zeichenfolge) sind Zahlen im Hexdezimalsystem. Im Dezimalsystem ist es so:
forenbeitrag.png
Durch herumprobieren konnte ich einige Werte zuordnen:
An der blauen Stelle ist die Motordrehzahl / 10 gespeichert. An den beiden roten Stellen ist die Motortemperatur codiert. Man bekommt sie durch "blauer Wert"*0.748-47.7. An den beiden grünen Stellen ist die Ansaugtemperatur codiert. Man bekommt sie mit "grüner Wert"*0.748-47.7. Die Batteriespannung ist an den beiden pinken Stellen codiert. Man bekommt sie ungefähr, wenn man durch 10.6 teilt. An der braunen Stelle ist der Drosselklappenwinkel * 2 gespeichert. Bei geschlossenem Gasgriff ist der Wert 0, bei voll geöffnetem ca. 180. An der gelb markierten Stelle ist die Geschwindigkeit in km/h gespeichert. Ich habe noch nicht ausprobiert, ob das die richtig Geschwindigkeit oder BMW-typisch mit Vorlauf für den Tacho ist.
Ich hoffe, dass diese Informationen nützlich sind, falls jemand auch so etwas basteln will oder irgend eine App für das Motorsteuergerät programmieren will.
Gruss Fabian