Auslesen von Informationen aus dem Steuergerät der G 650 Xchallange (sollte gleich wie F 650 GS Twinspark sein)

  • 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

  • Hut ab! Da bist Du aber verdammt tief in die Materie eingestiegen. Bestimmt hilfreich für den der die Erfahrungen mitbringt und das entsprechende Equipment hat oder sich beschafft. TOP!

  • Es handelt sich um das BMW K-Bus Protokol.


    Arduino & BMW I/K Bus Interface – Resources & Downloads
    *** Project: Arduino & BMW K/I-Bus Interface *** ** Intro located here ***Downloads for this project are all available on my Google Drive, embedded below. If…
    curious.ninja

  • Es handelt sich um das BMW K-Bus Protokol.


    http://curious.ninja/blog/ardu…face-resources-downloads/

    Ich glaube, nach einigem Lesen, dass der BMW K-Bus etwas anderes ist. Es scheint sich um eine Implementierung basierend auf LIN-Bus zu handeln, die bei älteren BMW-Autos (z.B. 3er bis 2001) zur Kommunikation zwischen Steuergeräten (z.B. Radio, Leuchtweitenregulierung, ...) verwendet wurde.


    Welches Diagnosesystem ein BMW-Motorrad verwenden, sieht man auf https://www.motoscan.de/unterstuetzte-bmw-motorraeder/ wenn man beim Modell über den Link "Motorelektronik (MOT)" fährt. Es gibt "motorsteuerung-kwp-ma24", "motorsteuerung-kwp" (physisch K-Leitung nach ISO 9141 und 14230-1 [Protokoll nach 14230-1, auch KWP2000 genannt]) und "motorsteuerung-uds" (UDS, für Fahrzeuge mit CAN-Bus).


    KWP2000 des alten Motronic MA 2.4 (z.B. R1100/1150GS, K1100/1200GS) kann aufgrund des Alters relativ wenig, Motoscan zeigt nur Spannung und Ansaugtemperatur an, ein dritter Wert ist fälschlicherweise auch mit "Intake-air temperature" beschriftet, zeigt aber bei meiner K1200RS 2.25 V an.

    Hier bekommt man die ECU-Daten wie folgt:

    "AT L1" (nur in einem Terminal wie Putty nötig, damit der Cursor auf die nächste Linie geht)

    "AT AL" (erlaube Nachrichten über 7 byte)

    "AT SH 81 12 F3" (setzte Header "81 12 F3", keine Ahnung, weshalb Motoscan "F3" als Adresse für den Adapter statt "F1" verwendet, evtl. hat das Händler-Diagnosegerät "F3")

    "AT WM 81 12 F3 3E" (Wake-up-Adresse ist Header + "3E")

    "AT ST 50" (Timeout = 50*4 msec = 200 msec)

    "AT SP 5" (Protokol ist 5 [ISO 14230-4 KWP (fast init, 10.4 kbaud)])

    "81" (Initalisieren)

    "21A1" (liefert auch Bytestring mit Informationen, aber viel kürzer als beim F/G 650 GS-Steuergerät)


    Die moderneren Steuergeräte verwenden das im ersten Beitrag beschriebene Verfahren und liefern mehr Infos. Ich weiss nicht, ob man wirklich alle Motorräder der Kategorie "motorsteuerung-kwp" gleich ansteuert, glaube es aber.


    Ich habe aber oben geschrieben, dass die 2. Position (ab 0., blau) die Drezahl / 10 ist. Die geht natürlich nur bis 2550 1/s (da in einem Byte die grösste Zahl 255 ist). Man sollte deshalb die 3. Position, oben nicht markiert, verwenden, welche die Drezahl / 50 enhält und deshalb bis 12750 1/s geht. Die Formel für die Motortemperatur ist natürlich "roter (nicht blauer) Wert"*0.748-47.7.


    Die Geschwindigkeit hat im Gegensatz zum Tacho keinen Vorlauf, bezieht sich aber auf eine bestimmte Reifengrösse. Bei meiner Xchallenge mit 18"=Felge zeigt sie zu wenig an, da der Wert wohl für eine normale F 650 GS oder Xcountry ist.


    Einen Prototyp des Displays habe ich im G650-Forum vorgestellt.:

    final_new.jpgtft_display.jpg


    Gruss Fabian