OBD2 auslesen

Hallo,

ich habe mich vor kurzem hier angemeldet, also verzeiht mir sollte die frage mal aufgekommen sein.

Ich möchte mit einen Arduino meine OBD2 buchse auslesen, in meinen falle (BMW E46 3er) lediglich Pin7 (ISO K-Linie 1) da dort Öl Temperatur mit drauf ist.

wie stelle ich es an, besser, wie erkläre ich es dem Arduino das er mir diese Info "filtern" soll

Welchen Arduino hast du ?

Was hast du denn bisher mit dem Arduino gemacht ?

HotSystems:
Welchen Arduino hast du ?

...

Bis dato keinen, da ich nicht sicher bin welcher genau zu dem vorhaben passt.

Am ende soll er jedoch den wert auf einen kleinen Display anzeigen.

Ganz ohne Erfahrung solltest du mit einem Uno anfangen.

Und um die notwendigen Kenntnisse zu erlangen, empfehle ich dir ein Startset zu kaufen, mit dem du einige Versuche durcharbeiten kannst.

War sowieso das ziel, da es mein erstes projekt in diese richtung ist, bliebe dennoch das wie mit dem CAN Bus, kann wohl schlecht Pin7 anzapfen und an einen Pin vom Arduino stecken. Wird er wohl wenig mit anfangen können nehme ich an.

Bartho:
War sowieso das ziel, da es mein erstes projekt in diese richtung ist, bliebe dennoch das wie mit dem CAN Bus, kann wohl schlecht Pin7 anzapfen und an einen Pin vom Arduino stecken. Wird er wohl wenig mit anfangen können nehme ich an.

Das stimmt. In jedem fall sind die evtl. vorhandenen 12 Volt zu hoch. Am Pin des Arduino dürfen max. 5,5 Volt angelegt werden.

Da müsstest du in entsprechenden Unterlagen nachsehen, was an dem Pin genau anliegt.
Ich habe da leider keine Erfahrung, aber evtl. meldet sich hier jemand, der dir darüber Informationen liefern kann. Ist es ein analoges Signal, dann geht es rel. einfach über einen Spannungsteiler. Ist es ein Datensignal benötigst du das Datenprotokoll.

Die Spannung entspricht der Boardspannung, also kommen bis zu 14,4V da raus, wenn die Batterie gerade geladen wird

Das Protokoll wird man nicht öffentlich dokumentiert finden, weil Normungspaper gekauft werden müssen und es nicht erlaub ist sie zu veröffentlichen (Copyright blabla)

Wirst also ein Shield brauchen das dir die Spannungspegel reduziert und eine Lib die dir die Daten rausfummelt. Ist nicht ganz so einfach, aber machbar. Allerdings mich auch nur oberflächlich amit beschäftigt und aktuell keinen Plan wo es eine Lib für den Arduino gibt. Selbst wirst es nicht coden können als Anfänger.

Hallo,

es gibt dafür fertige Shields und Libs. Googeln hilft auf jeden Fall.

Hallo,

ja, ich denke da gibt es einiges oben im englischen Forum.

Ein paar Dinge zur Erklärung:

In diesen Diagnosesteckern können mehrere Dinge stecken, nicht immer ist alles belegt:

K-Line ist eine normale serielle Schnittstelle (UART), allerdings mit speziellen Pegeln (12 oder 24V). Man braucht also für einen Arduino einen Pegelwandler.
[Edit: Zuerst stand da normale RS232, das ist falsch.]

Auch wenn ich normalerweise einen Uno als ersten Arduino empfehlen würde, ist das mit 'ner seriellen Schnittstelle da dann natürlich ein Problem, da die einzige vorhandene als Programmierschnittstelle zum PC belegt ist.

KWP2000, oder heute eher UDS, arbeiten mit CAN und finden auf anderen Pins des Steckers statt.

Das Protokoll wird man nicht öffentlich dokumentiert finden, weil Normungspaper gekauft werden müssen

Ich habe die Normen auf der Arbeit. So viel spannendes steht da nicht drin. Es gibt ein Buch "Bussysteme in der Fahrzeugtechnik" da findet man eigentlich alles was man aus den Normen zum Programmieren braucht.

ArduFE:
Auch wenn ich normalerweise einen Uno als ersten Arduino empfehlen würde, ist das mit 'ner seriellen Schnittstelle da dann natürlich ein Problem, da die einzige vorhandene als Programmierschnittstelle zum PC belegt ist.

Und es gibt noch die SoftwareSerial oder AltSoftserial als Library.

Hardware-Technisch würde ich die Auswahl des Arduinos vom Display abhängig machen.
Bei KWP2000 ist festgelegt wie schnell Du Anfragen absenden und empfangen darfst. Das funktioniert ausreichend mit der Softwareserial.

Die K-Line kannst Du mit einem L9637D in ein serielles Signal umwandeln und gleichzeitig die Spannung senken.
Wahrscheinlich benötigst Du noch einen PullUp-Wiederstand um das Signal zu glätten.
Bestell Dir auf jeden Fall einen SOIC-Board dazu, damit Du die SMD vernünftig verlötet bekommst.

Eine wichtige Information wäre noch welchem ISO-Protokoll die Kommunikation entspricht.

Dann kannst Du Dir einfach einen Sniffer bauen, der alle Daten abgreift, die das Protokoll unterstützt. Im Anschluss kommt dann die Sisyphos-Arbeit herauszufinden welche PID welchen Wert darstellt und wie dieser sich berechnet.
Dazu gibt es aber sicherlich schon ein paar Informationen in irgendwelchen BMW-Foren.

Vielleicht hilft es Dir einen kleinen Überblick über die Thematik zu bekommen, wenn Du Dir mein Projekt anschaust. Dort lese ich ein Motorrad über die K-Line KWP2000 ISO-14230 aus und sende die Daten per Bluetooth weiter. Denke dort kannst Du einiges wiederverwenden, nur eben die Zuordnung der PIDs wird nicht stimmen.

@Ardufe

CAN ist eine Schnittstellendefinitionund ein Softwareprotokoll.

KWP2000 ist ein reines Softwareprotokoll und kann sowohl über den CAN-Bus als auch über die K-Leitung funktionieren bzw geschaltet sein.

Also stimmt deine Pauschalierung nicht so ganz, wird aber wohl zukünftig mehr mit CAN-Bus Topologie arbeiten. Momentan ist das alles noch gemischt am Markt unterwegs.

Stimmt, KWP2000 gab es auch für K-Line.

Bin halt kein Autoschrauber, ich muss nur gelegendlich Automobilelektronik zum Leben erwecken. Das sind dann Neuteile und KWP habe ich da schon einige Jahre nicht mehr gesehen. UDS ist normalerweise immer CAN, neuerdings auch Ethernet.

ArduFE:
Das sind dann Neuteile und KWP habe ich da schon einige Jahre nicht mehr gesehen. UDS ist normalerweise immer CAN, neuerdings auch Ethernet.

Da KFZ auch Motorräder umfasst, muss ich Dir da leider wiedersprechen :slight_smile:
Suzuki und Kawasaki setzen beiden noch auf KWP über die K-Line. Das erledigt sich erst 2017, wenn die EURO4 eine OBD II-Schnittstelle verpflichtend macht.
CAN verwenden beide Hersteller (noch) nicht. Soweit mit bekannt, ist BMW der einzige, der seit Jahren auf CAN setzt.

Unabhängig davon, würde ich bei der Anforderung des TE auf KWP gehen. Das Erfordert nur eine SMD und kein CAN-Shield. Was a) schweine teuer ist und b) deutlich mehr Einarbeitung erfordert.

Bin nun etwas weiter, ich werde es mit dem STN1110 versuchen und lediglich 3 Kabel zum Uno führen.

Möchte ungern ein OBD Stecker am OBD Port haben.

K-Line
Masse
12v+

soll an den Uno ran, nur welche Pins dabei am besten belegen. Masse auf GND das ist mir bewusst. Jedoch 12v da fängt es an, er hat lediglich ein 5V eingang.

Ebenso K-Line da werden wohl auch über 5V rüber gehen, steckt man das in den Digital Pin und wenn ja in welchen von den vielen?

Nein, außer eventuell Masse steckt man da von gar nichts von in den Arduino. Der würde von den Spannungen kaputt gehen.

Der oben erwähnte L9637D würde die Umsetzung der Spannung auf für den Arduino verträgliche Werte übernehemen.

STN1110 ist ein komplexes IC mit integriertem Prozessor, ich hoffe Du hast das auf irgendeinem Shield. Der arbeitet mit 3,3 V also noch empfindlicher als der Arduino. Wenn Du ein Shield hast, wird das auch eine Anleitung haben, wo die Signale vom Auto und der Arduino angeschlossen werden.

Bartho:
Möchte ungern ein OBD Stecker am OBD Port haben.

Verstehe ich nicht. Möchtest Du lieber das Kabel zerschneiden und den Arduino dazwischen setzen?
Du brauchst doch auch nur exakt die drei von Dir genannten Pins von dem Stecker abzugreifen. 12V, K-Line & Masse.
Wenn Du zur Werkstatt fährst, ziehst Du sie einfach ab.

Wie ArduFE mich bestätigt, der L9637D ist exakt das richtige für Dich. Der verträgt bis 40V am Eingang und reicht das Signal einfach mit der korrekten Spannung an die Serielle-Schnittstelle des Arduino weiter (Ob SoftwareSerial oder HW, spielt erst mal keine Rolle).