Bits im Gänsemarsch. Der Datenbus der V-Rod

  • Seit einiger Zeit versuche ich schon den Datenbus der V-Rod zu entschlüsseln, eine Zeit lang leider vergebens. Ich hab das Projekt zurückgestellt und immer mal wieder angefasst, leider aber immer erfolglos. Die letzten Diskussionen über eine Ganganzeige haben mich motiviert das Thema nochmal aufzugreifen. Für mich war es unverständlich dass eine Ganganzeige „angelernt“ werden muss. Wozu denn? Unsere Maschine weiß doch in welchem Gang sie fährt. Also warum fragen wir sie nicht einfach? Also Thema wieder aufgegriffen und, was soll ich sagen? Es hat geklappt.


    Natürlich ergeben sich jetzt 2 Fragen:

    1. Wozu? Es gibt für’n paar Euro OBD Adapter die das können.

    2. Warum hier? Viele hier stehen mit Bits und Bytes auf dem Kriegsfuß und verstehen das doch eh nicht.


    Zu 1.

    Klar gibt es die. Jeder kann sich die Adapter kaufen und auf dem Handy die Daten anzeigen lassen. Aaaaber was mache ich damit? Ansehen und gut reicht mir nicht.


    Ich möchte eine Ganganzeige die mir den Gang anhand einer LED anzeigt. Eine Farbe für jeden Gang. Keine klobige Anzeige am Lenker sondern nur eine kleine LED irgendwo, im Tacho?


    Ich möchte Einen Tacho oder Drehzahlmesser als LED-Band und natürlich soll er mit auch signalisieren dass ich mir der Drehzahl oder der Geschwindigkeit übertreibe ohne dauernd die Instrumente zu beobachten.


    Ich möchte eine Temperaturanzeige und nicht nur eine LED die mir signalisiert dass der Hobel jetzt zu heiß ist und ich anhalten muss.


    Dabei kann ich viel mehr auslesen… Momentanen Verbrauch, zurückgelegte Strecke, Kupplung, Blinker, Tankinhalt, Reserve… und für mich persönlich auswerten.

    Das alles lässt sich mit einem OBD Adapter auslesen aber nicht verarbeiten.


    Zu 2.

    Wo sonst wenn nicht hier? Wenn ich was wegen der V-Rod google kommt das Forum immer unter den ersten Treffern. Das bedeutet für mich dass sich hier schon jetzt geballtes Wissen angesammelt hat. In so fern passt dieses Thema genau hier rein. Und warum sollen Interessierte das Rad neu erfinden? Wenn alle hier so hilfsbereit sind und ihr Wissen weiter geben, warum nicht auch ich? Auch auf die Gefahr hin dass der eine oder andere Chinese anhand der Informationen bessere Anzeigen bauen kann und noch mehr verdient.

    Wackawackawackawackawackawackawacka...

  • Gleich vorweg, ich kenne nicht den ganzen Datenverkehr und kann den Datenbus auch nicht steuern. Ich weiß dass manche OBD Adapter das können aber das war auch nicht meine Intension. Mir genügt es ihn zu lesen und die Daten auszuwerten.


    Jeder der sich schon mal mit dem Verdrahtungplan beschäftigt hat, hat sicher schon mal die Leitung „serial Data“ gesehen und sich gefragt was das genau ist. Das ist sozusagen die Telefonleitung über die die Computer unserer Rods miteinander quatschen. Hierrüber werden Messwerte, Steuersignale, Befehle und Abfragen ausgetauscht. Die serielle Datenübertragung erfolgt, indem Bits nacheinander über eine Leitung übertragen werden. Im Gegensatz zur parallelen Kommunikation, bei der mehrere Bits gleichzeitig übertragen werden, erfolgt die serielle Übertragung bitweise. Dies ermöglicht eine fehlerfreie Nachrichtenübermittlung über große Distanzen, obwohl der Datendurchsatz geringer ist. Es gibt verschiedene Protokolle für eine serielle Übertragung, eines davon nennt sich SAE J1850, welches auch bei unserer Rod zum Einsatz kommt.


    Die Grundlagen:

    SAE J1850 VPW ist eines von mehreren Signalprotokollen, die von der OBD2/EOBD-Gesetzgebung vorgeschrieben sind, die von Automobilherstellern aus den Jahren 1996 (USA) oder 2001 (Europa) verlangt, den Zugriff auf den Fahrzeugdatenbus über einen standardmäßigen 16-poligen SAE J1962-Stecker zu ermöglichen. Der ursprüngliche Zweck bestand darin, Tests und Diagnosen aus den "On-Board-Diagnosefunktionen" (die auch von der Gesetzgebung vorgeschrieben waren) des für das Abgasreinigungssystem des Fahrzeugs verantwortlichen Steuergeräts (typischerweise PCM, Powertrain Control Module) zu ermöglichen. Der VPW-Datenbus dient aber auch vielen anderen Zwecken.


    SAE J1850 gab es in 2 Varianten:

    · PWM (Pulsweitenmodulation), 41,6 kb/s, typischerweise von Ford verwendet.

    · VPW (Variable Pulse Width), 10,4 kb/s, typischerweise von General Motors verwendet.


    Die Art und Weise, wie die Bits auf dem Bus dargestellt werden, und der Spannungspegel unterscheiden sich zwischen ihnen.


    Frame.jpg

    Das Bild stellt einen Frame, also ein Informationspaket dar wie es übertragen wird.

    Wackawackawackawackawackawackawacka...

  • Der Bus der V-Rod basiert auf der VPW Variante. Im Internet gibt es Anleitungen wie man sich „mit wenig Mühe“ einen Umsetzer für den PC bauen kann. Mit wenig Mühe stimmt so nicht ganz. Die Bastelprojekte passen nur die Spannungspegel an damit sie die serielle Schnittstelle des PC nicht killen oder benutzen einen OBD Chip (ELM327 oder STN1110). Leider sind diese Chips nicht mehr bis kaum noch erhältlich. Die Firma ELM Electronics, die den Chip hergestellt hat, hatte in der ersten Version vergessen einen Ausleseschutz zu implementieren. Das hat dazu geführt dass dieser Chip massenweise kopiert wurde und die Firma letztendlich bankrott ging. Dummerweise hatte die erste Version des Chips einige gravierende Fehler, was bedeutet dass alle Adapter mit dem ELM diese Fehler auch haben. Habt ihr auch einen günstigen ELM Adapter vom Chinesen? Glückwunsch!


    Das Problem ist aber auch dass die serielle Datenübertragung von Computer völlig anders funktioniert wie bei der Rod. Beim Computer gibt es eine Sendeleitung (TxD) und eine Empfangsleitung (RxD). Bei der Rod wird alles über eine Leitung gemacht. Außerdem ist die Signalfolge komplett verschieden.


    Ich möchte das mal an dem Bild darstellen.

    Datenstrom.jpg


    Man erkennt dass beim PC die Bits=1 und =0 ihre eindeutigen Pegel haben. Bit=1 hat immer „Low“ und Bit=0 hat immer „High“ Pegel. Zudem hat jedes Bit auch die gleiche Dauer. Wenn wir uns jetzt den J1850 Bus anschauen stellen wir fest das Bit=1 sowohl „High“ als auch „Low“ haben kann. Außerdem fällt auf dass die Bits nicht mehr die gleiche Dauer haben. Es gibt kürzere und längere. Die kürzeren dauern 64µS und die längeren dauern 128µS (das ist extrem kurz, glaubt es mir). Deswegen wird das Protokoll auch variable Pulsweitenmodulation genannt. Um es aber noch komplizierter zu machen, es wird jedes Bit alternierend übertragen. Das bedeutet dass sich der Pegel des Bits nach jedem übertragenen Bit ändert. Was heißt das konkret? Die „High“ sind plötzlich nicht mehr „0“ und umgekehrt und auch die langen und kurzen Bits haben keine eindeutige Zuordnung sondern die vergangene Zeit entscheidet auch welchen Wert das Bit hat.


    Fassen wir zusammen: Bit=1 ist 64µS „High“ oder 128µS „Low“. Im Umkehrschluss ist Bit=0 64µS „Low“ oder 128µS „High“. Hinzu kommen noch weitere Signale die den Datenstrom Kennzeichnen. SOF (Start of Frame) = 200µS „High“. EOD (End of Data) =200µS „Low“. EOF (End of Frame) =280µS „Low“. Um dem Ganzen eine gewisse Störsicherheit zu geben gibt es natürlich Toleranzen. Das bedeutet dass das Bit >49, <70µS oder >112, <145µS sein kann. SOF >182, <218µS, EOD >182, <218µS und EOF >261, <239µS.


    Puhhh, ganz schön schwierig, nicht wahr? Falls Ihr es nicht verstanden habt, nicht schlimm. Ich hab’s auch nicht.

    Wackawackawackawackawackawackawacka...

  • Kommen wir zum nächsten Problem. Die Rod hat zwar einen OBD(?) Anschluss aber natürlich nicht so wie alle Anderen. Damit will ich sagen dass wir nicht einfach einen Wert (z.B. RPM) abfragen können. Alle Anfragen seitens des OBD Adapters laufen ins Leere und werden mit der Meldung „no Data“ beantwortet. Warum? Weil unsere ECU sich einen Scheiß drum schert wenn sie etwas gefragt wird (erinnert mich irgendwie an meine Frau). Sie labert einfach die ganze Zeit mit ihren Modulen (TSSM, IM, ABS) und gut. Aber nicht nur unser in Blech gepacktes Mysterium labert. Alle Module labern, dauernd, und das auch noch gleichzeitig. Eine Kollisionserkennung sorgt dafür das ein Modul die Klappe hält wenn gerade ein anderes labert oder aber sich durchsetzen darf. Was also tun? Na ganz einfach. Einfach mal zuhören was sie so labern. Dabei verraten sie uns natürlich auch alles das was wir wissen möchten.


    Anbei eine Übersicht der Daten die ich geprüft hab:

    RPM 28 1B 10 02 xx xx (xx xx/4)

    Speed 48 29 10 02 xx xx (xx xx/128)

    Gear A8 3B 10 03 xx (2,4,8,15,32=1,2,3,4,5)

    Motor Temp. A8 49 10 10 xx (xx-40 in Grad Celsius)

    Blinker 48 DA 40 39 xx xx (0=aus, 1=links, 2=rechts, 3=beide)

    Weg A8 69 10 06 xx xx (xx xx =0,4 Meter)

    Verbrauch A8 83 10 0A xx xx (xx xx=0,00005 Liter)


    Das sind natürlich nur ein winzig kleiner Teil der Informationen. Der Datenstrom reißt nie ab. Alles was wichtig und unwichtig ist wird praktisch im Millisekundentakt hin und her geschoben. Leider ist das Protokoll nicht dokumentiert und im Internet gibt es teilweise widersprüchliche Angaben und natürlich überträgt jede Harley die Daten die sie braucht. Das bedeutet dass man sich mühsam den Datenstrom am lebenden Objekt anschauen muss und entschlüsseln was die Information bedeutet.

    Wackawackawackawackawackawackawacka...

  • Soweit so gut, jetzt wissen wir ein bisschen wie das Ganze funktioniert, aber wie nutzen wir das jetzt?


    Indem wir einen Mikrocontroller nehmen und ihn programmieren. Auf der einen Seite soll er den Datenbus abhören und auf der anderen Seite soll er uns die Daten entsprechend anzeigen. Damit wir unseren 300KG Eisenhobel nicht noch schwerer machen, packen wir das Ganze in einen Chip mit gerade mal 5x7mm. Na gut, ein bisschen Peripherie gehört auch dazu. Als Anzeige verwenden wir alternative Instrumente oder LEDs vom Typ WS2812. Das sind RGB LEDs die ebenfalls über einen Datenbus (hoppla, bald brauchen wir noch einen Busbahnhof) gesteuert werden. Das hat den Vorteil dass man zur Ansteuerung nur eine Leitung braucht. Über diese eine Leitung können zig LEDs in ihrer Farbe und Helligkeit gesteuert werden. Anbei ein Schaltplan von der Sache.


    Schaltplan.jpg


    Links haben wir den Eingang vom Datenbus. Links oben einen Chip der die Spannung von der Rod unserem Attiny (Mitte) erträglich macht und rechts der Ausgang zur LED oder zum Treiber eines Instruments. Rechts unten ist der Programmierstecker (unwichtig). Die beiden Widerstände R1 und R2 dienen als Spannungsteiler weil die Rod am Ausgang des OBD Steckers 7V hat. Diese wären für unseren kleinen Rechenknecht schwer verdaulich. Das ist alles? Ja, in der Tat.


    Jetzt besorgt man sich einfach einen Lötkolben und lötet das zusammen und gut. Das heiße Ende erkennt man übrigens wenn man daran leckt. Dann stöpselt man es zusammen und stellt fest dass es ja gar nicht funktioniert. Kann ja auch nicht. Unser Tiny weiß ja auch gar nicht was er tun soll. Hierzu brauchen wir noch ein bisschen Software.

    Wackawackawackawackawackawackawacka...

  • Was benötigen wir hierbei?


    Einen Pinchange Interrupt der die Flankenwechsel am Bus erkennt. Einen Timer der im Mikrosekundentackt zählt und nach 240µS einen Interrupt auslöst. Eine Routine die aus Bits Bytes und eine die aus Bytes einen Frame macht. Eine Routine die den Frame auswertet.


    Die Software habe ich in BASCOM, eine Art Basic Programmiersprache für Mikrocontroller geschrieben. Um ein Portieren in eine andere Sprache zu erleichtern stelle ich einfach den Quellcode rein und erläutere ihn so dass es nicht schwierig sein sollte es in eine andere Sprache zu portieren.


    Prozessor: ATTiny85

    Tackt: Intern, 8MHZ


    'PCINT0

    Pcmsk0 = &B00000001

    Enable Pcint0

    On Pcint0 Read_bit

    PCINT0 wird initialisiert und frei gegeben. Bei jeder Flanke an PortB.0 wird ein Interrupt ausgelöst. Dieser verzweigt in die Erkennung der Bits.




    Dim Myframe(8) As Byte

    Read_bit:

    Timerwert = Timer0


    Select Case Timerwert

    Case Is < 40

    Start Timer0

    Case Is < 96 ' 34µs bis 96µs (nominell 64µs)

    If Bus_in = 1 Then

    Mybyte = Mybyte * 2

    Else

    Mybyte = Mybyte * 2

    Incr Mybyte

    End If

    Incr Bitcounter

    Case Is < 163 ' 96µs bis 163µs (nominell 128µs)

    If Bus_in = 1 Then

    Mybyte = Mybyte * 2

    Incr Mybyte

    Else

    Mybyte = Mybyte * 2

    End If

    Incr Bitcounter

    Case Is < 239 ' 163µs bis 239µs

    If Bus_in = 0 Then

    Bitcounter = 0

    Mybyte = 0

    End If

    End Select



    If Bitcounter = 8 Then 'Byte komplett empfangen

    Bitcounter = 0

    If Bytecounter < 8 Then Incr Bytecounter

    Myframe(bytecounter) = Mybyte

    End If

    Return

    Hier wird die Zeit gemessen wie lange das Bit gedauert hat und welchen Pegel das Bit vor dem Interrupt hatte. Wir erinnern uns, ein Bit kann 64 oder 128µS dauern und „High“ und „Low“ Pegel haben. Diese Routine addiert die 8 Bits zu einem Byte. Wenn 8 Bits addiert wurden wird das erhaltene Byte zum Frame addiert. Ein Frame beinhaltet die Information (zwischen SOF und EOD) welche wir brauchen. SOF wird erkannt und das Ganze wird gestartet. Myframe ist ein Array von 8 Bytes. Bitcounter ein Zähler für die Bits. Bytecounter ein Zähler für die Bytes.



    Do

    If Frame_da = 1 Then

    Frame_da = 0

    Frame_bearbeiten

    End If

    Loop

    Hauptschleife wartet auf das Ende des Frames und springt dann zum bearbeiten. Ansonsten wir Däumchen gedreht.

    Wackawackawackawackawackawackawacka...

  • Timer0, Prescale=8, , Clear Timer = 1 , Compare A = Disconnect '1µS

    Ocr0a=240


    Timer_0:

    Stop Timer0

    Bytecounter = 0

    Frame_da = 1

    Return

    Verwendet wird Timer 0. Prescale=8 bedeutet bei 8MHz das er alle 1µS weiter zählt. Compare wird mit 240 vorgeladen. Alle 240µS ( EOD erkannt, Ganzer Frame wurde übertragen) löst er einen Interrupt aus. Timer wird gestoppt damit der die weitere Verarbeitung nicht stört, Bytecounter wird zurück gesetzt und das Flag für das Frameende gesetzt. Dieses wird in der Hauptschleife erkannt.




    Dim Frameheader As Word At Myframe Overlay

    Sub Frame_bearbeiten


    Select Case Frameheader

    ' 281B RPM

    Case $1b28

    Dataresult = Makeint(myframe(6) , Myframe(5))

    Dataresult = Dataresult / 4

    ' Mach jetzt was aus den Daten

    End Sub

    Der Frameheader sind die ersten beiden Bytes des Frames. Anhand dieser beiden Bytes erkennen wir was die Module miteinander quatschen. In diesem Fall wurde gerade die Drehzahl übertragen. In Byte 5 und 6 steckt die Information die übertragen wird. Aus diesen Bytes machen wir eine Zahl zum weiter verarbeiten. Dann kann man dann die entsprechende Aktion auslösen. Zum Beispiel ein LED-Band ansteuern, eine Displayanzeige oder eine Uhr (externen Drehzahlmesser). So kann man die gewünschten Informationen raus filtern und darauf reagieren.



    Ich habe ein paar Videos gemacht um das Ganze zu demonstrieren.



    Ich möchte mich ganz herzlich für die Hilfe welche ich in einem anderen Forum erhalten habe bedanken. Wie auch hier sind dort viele nette Leute die selbstlos helfen und Tipps geben. Ohne die hätte ich es wahrscheinlich nicht geschafft.


    Wenn jemand Fragen hat, bitte in einem anderen Thread fragen. Ich werde diesen Thread weiter nutzen und eventuelle Erkenntnisse anfügen. Wenn das Thema jemanden interessiert sollte die ganze Information nicht durch Kommentare zerstückelt sein.

    Wackawackawackawackawackawackawacka...

  • Willkommen im Club. Als ich früh angefangen habe mich mit der Möglichkeit einer Ganganzeige zu beschäftigen, bin ich natürlich mechanisch vorgegangen. Erst im Laufe der Zeit hat sich dann der Einblick in die Datenbus Technik ergeben. Und schon damals trennten sich die Geister. Das ist eine veraltete Version die mal von Ford angewendet wurde... hieß es.

    Ich hatte bald eine Version eines OBD gefunden die an den 4Pin Stecker passte, aber erst eine Kontakt nach Polen zu Gromotto versetze mich in die Lage weiter zu träumen.

    Dort gab es ein Programm für Android mit dem sich der Tacho und noch ganz andere Dinge abbilden ließen. Die Idee die Blumenvase (Tachogehäuse der alten Kisten) so umzubauen, das er als Handyhalterung dient war geboren.

    Leider machte da noch der Gesetzgeber nicht mit. bestimmte Anzeigen müssen immer konstant angezeigt werden. Aber egal. Tacho bleibt und Handy wird adaptiert. Hab angefangen mit Daten für den 3D Drucker zu basteln. Und hab es dann wegen immer neuer Probleme irgendwann mal fallen gelassen.


    Gut geholfen hat das Programm beim Ausfall des Kühlers. Hatte ja ein Loch drin und immer Angst die Kiste überhitzt. Die Rod weiß ganz genau welche Wassertemperatur gerade im Kreislauf ist und ich konnte mir das anzeigen lassen.

    Hatte nie Fotos gemacht. Wie denn auch wenn das Handy als Tacho angeschlossen war. Ich hab den ganzen Krempel noch und eigentlich braucht es nur einen Adapter zum 6 Poligen Stecker von Martin und eine alte Android Version. Mit neueren Handys funktioniert das nicht mehr. Die CD mit der Software hab ich irgendwo aber auch noch. Hilft dir das irgendwie?

    IMG_20240707_093738.jpg

    IMG_20240707_094803.jpg

    Kann zZ nicht anschließen und die ca 6 weiteren Displays zu zeigen.

  • Hallo PacMan,


    Es ist immer wieder genial, wie tief du in mir vollständig fremde Gefielde eintauchst.
    In diesem Fall geht es glaube ich etwas einfacher.
    Von Motogadget gibt es ja für deren Instrumente schon einen „Übersetzer“ der Datenbus-Daten.
    Kannst du dort nicht alles direkt so auslesen, wie du es brauchst?



    [Blockierte Grafik: https://uploads.tapatalk-cdn.com/20240707/945e053df330914a6bf9f813470dd6fd.jpg]



    Gesendet von iPhone mit Tapatalk

    Wenn man rechts dreht wird die Landschaft schneller 8)

  • Von Motogadget gibt es ja für deren Instrumente

    Für deren Instrumente und ab 150€. Hinzu kommen noch die Instrumente. Was aber wenn ich andere Instrumente möchte oder z.B. nur eine Temperaturanzeige oder Ganganzeige?


    Meine Platine ist 13x18mm groß und passt fast in den OBD Stecker. Ich wollte unabhängig sein von fremden Entwicklungen weil ich bei Erweiterungen dann immer auf die fremde Hard- und Software angewiesen bin.

    Wackawackawackawackawackawackawacka...

  • Ich hatte mir zum Durchlesen dieses Threads extra einen größeren Augenblick der Ruhe gesucht, weil ich das allgemein sehr spannend finde. Martin hatte mir bereits bei unserem Treffen davon erzählt und deswegen wollte ich dies wirklich in Ruhe lesen.

    Aber mir geht es beim durchlesen wie Albi... Wann kommt der Bus oder Zug am Bahnhof an? Ich möchte gerne mitfahren...:P:LOL:


    Meinen größten Respekt hast du jedenfalls, ebenso für die ausführliche Erläuterung! :thumbup::thumbup:

    Respekt ist kein Privileg, sondern die einfachste Sache mit Menschen umzugehen.

  • Naja, der Bericht muss nicht von jedem verstanden werden. Er soll ja vordergründig als "Wissen" in einem Forum vorhanden sein in dem schon viel Wissen verfügbar ist. Wenn in einigen Jahren sich irgend jemand mit den Thema befassen muss findet er ihn hier und muss nicht nochmal von vorne anfangen.

    Wackawackawackawackawackawackawacka...