11.02.2010, 13:15
Der ELM spricht ein sehr einfaches Protokoll, man übermittelt einfach, was man auslesen möchte, bsp. die Kühlwassertemperatur. Die Abfrage läuft im Mode 01 (Show current Data), und man will Wert 05 (Engine Coolant Temp) haben. Also ganz simpel ein:
01 05 (0105 geht auch) an den ELM geschickt, und es kommt beispielsweise die Antwort:
41 05 7B
Die läßt sich einfach auswerten:
41 ist die Antwort auf 01, und ist immer gleich. Zweite Zahl (05) entspricht dem abgefragten Wert 05. Die beiden ersten Zahlen kann man also als Fehlerkontrolle verwenden. Fragt man nach dem Wert 04 (Motorlast), kommt als Antwort ein 41 04 ..
Die dritte Zahl (es ist ein Wert zwischen 00 und FF, also genaugenomnen ein Byte) ist dann der eigentliche Wert, in Hex-Schreibweise. Hier ist es 7B, was dezimal 123 entspricht. Lt. der OBD-Code-Tabelle ist die Temperatur in Grad Celsius dieser Wert -40, also 87 Grad. Diese -40 wurde verwendet, um negative Zahlen ausgeben zu können.
Andere Werte liefern 2 Bytes zurück, um größere Zahlen als 255 darstellen zu können, bsp. die Motordrehzahl (0C). Die Abfrage:
01 0C bringt dann die Antwort :
41 0C 00 00.
41 0C ist wie im Beispiel oben die Rückmeldung des abgefragten Werts, danach kommen zwei Bytes 00 und 00, in der OBD2-Tabelle als A und B bezeichnet. Die Drehzahl errechnet sich lt. Tabelle so: ((A*256)+B)/4
Ergebnis hier: 0 RPM, Motor steht.
Ich lese die Werte mit einem Arduino Microcontroller (ATmega328, 8US$) aus, und lasse ein paar davon auf einem kleinen Display (4 Zeilen á 20 Zeichen) ausgeben. Auch lassen sich Relais oder LEDs schalten, wenn bestimmte Werte auftreten. So baue ich gerade eine RGB-LED, die bei kaltem Motor gelb leuchtet. Wenn das Motoröl über 85 Grad warm ist, und das Kühlwasser über 80 Grad hat, dann geht die Lampe auf grün. Ich suche noch nach einem Weg, die Getriebeöltemp auszulesen, wenn die oder das Motoröl zu heiß werden, soll die Lampe auf rot schalten.
Weitere Bastelsession: Window Valet nachbauen
01 05 (0105 geht auch) an den ELM geschickt, und es kommt beispielsweise die Antwort:
41 05 7B
Die läßt sich einfach auswerten:
41 ist die Antwort auf 01, und ist immer gleich. Zweite Zahl (05) entspricht dem abgefragten Wert 05. Die beiden ersten Zahlen kann man also als Fehlerkontrolle verwenden. Fragt man nach dem Wert 04 (Motorlast), kommt als Antwort ein 41 04 ..
Die dritte Zahl (es ist ein Wert zwischen 00 und FF, also genaugenomnen ein Byte) ist dann der eigentliche Wert, in Hex-Schreibweise. Hier ist es 7B, was dezimal 123 entspricht. Lt. der OBD-Code-Tabelle ist die Temperatur in Grad Celsius dieser Wert -40, also 87 Grad. Diese -40 wurde verwendet, um negative Zahlen ausgeben zu können.
Andere Werte liefern 2 Bytes zurück, um größere Zahlen als 255 darstellen zu können, bsp. die Motordrehzahl (0C). Die Abfrage:
01 0C bringt dann die Antwort :
41 0C 00 00.
41 0C ist wie im Beispiel oben die Rückmeldung des abgefragten Werts, danach kommen zwei Bytes 00 und 00, in der OBD2-Tabelle als A und B bezeichnet. Die Drehzahl errechnet sich lt. Tabelle so: ((A*256)+B)/4
Ergebnis hier: 0 RPM, Motor steht.
Ich lese die Werte mit einem Arduino Microcontroller (ATmega328, 8US$) aus, und lasse ein paar davon auf einem kleinen Display (4 Zeilen á 20 Zeichen) ausgeben. Auch lassen sich Relais oder LEDs schalten, wenn bestimmte Werte auftreten. So baue ich gerade eine RGB-LED, die bei kaltem Motor gelb leuchtet. Wenn das Motoröl über 85 Grad warm ist, und das Kühlwasser über 80 Grad hat, dann geht die Lampe auf grün. Ich suche noch nach einem Weg, die Getriebeöltemp auszulesen, wenn die oder das Motoröl zu heiß werden, soll die Lampe auf rot schalten.
Weitere Bastelsession: Window Valet nachbauen