Guten Tag,
ich hab ein Arduino Uno und das Sparkfun CAN Shield und würde gern die
Geschwindigkeit eines Wagens und Drehzahl von dessen Motors (Audi A3, BJ
2008) auslesen.
Ich hab CAN High, Can Low, 5V und GND hinterm Navi oder aus dem OBD2
Port.
Verbinde ich jeden der Pins vom Shield mit den jeweiligen Pins auf dem
Arduino? Dann ist der Uno nämlich komplett voll und ich muss mindestens
ein, besser ein paar mehr Pins frei haben für ein paar kontroll LEDs.
Braucht das Shield immer alle Pins oder kann man die ggf noch anders
benutzen, falls sie das Shield nicht braucht ?
Dann die wichtige Frage:
Wie kriege ich die Drehzahl und die Geschwindigkeit aus dem CAN
ausgelesen?
#include <Canbus.h>
if(Canbus.init(CANSPEED_500)) den Can Chip initialisieren
und dann mit Canbus.ecu_req(VEHICLE_SPEED,buffer) in einen puffer
schreiben ?
Ich hätte am liebsten so eine funktion wie
int rpm=Can.lese_rpm();
Ich wär für eine keine Hilfestellung dankbar!
VG
Daniel
Über OBD2 kann ich die Daten ja auch "quelloffen" und standarisiert
auslesen, und OBD2 läuft ja auch über CAN. Die gewünschten Infos müsste
ich also schon bekommen können.
Es gibt im Netz, auch rund um den Arduino, mehrere Projekte die genau
dies machen.
Allerdings musst Du dazu schon eine einfache Abfrage loslassen können.
Bing oder Google helfen z.B.
Hey DanielDuesentrieb,
dieses Projekt würde mich auch interessieren - wäre also nett wenn Du
Deine Fortschritte posten würdest!
Ohne konkretes Projektinteresse habe ich mir bisher nur mal
"vorsichtshalber" diese Adresse notiert:
http://www.canhack.de
Vl kommst Du da ja etwas weiter...
Prinzipiell weiß ich nur aus meinen Erfahrungen mit VAG-Codierungen daß
man zuerst ein bestimmtes Steuergerät adressieren muß (in Deinem Fall
mit der Drehzahl wäre dies das Motorsteuergerät, VAG-Adresse 01). Das
bietet wie alle anderen STGs verschiedene Modi - u.a. die Codierung
(Statusbytes lesen/schreiben) sowie die Meßwertblöcke (MWBs). Was für
Dich dann wohl interessant ist.
Bei meinem Golf 6, (den ich aber nicht mehr besitze) konnte man die
Drehzahl u.a. in MWB 117, Feld 0 einlesen. Könnte mir vorstellen daß das
bei Deinem 2008er-A3 identisch ist.
Dies beschreibt die Adressierung mit dem Codiersystem "VCDS", wie das
auf direkte CAN-Busabfrage umzusetzen ist weiß ich aber nicht.
Bei Interesse kann ich Dir aber z.B. eine exportierte VCDS-CSV-Datei
sowie die daraus erzeugte Grafik hochladen (da habe ich Ladedruck in
Abhängigkeit von Drehzahl und Gaspedalstellung aufgezeichnet).
Über die OBD(2)-API wirst Du an die gewünschten Parameter nur sehr
bedingt rankommen. OBD2 eignet sich grundsätzlich nur zum Auslesen von
TÜV-... äh CO2-... äh Weltrettungsdaten. Drehzahl solte man da zwar auch
finden, ansonsten aber wirklich nichts Interessantes.
Für alles andere muß man sich die VAG-spezifischen CAN-Bus-Daten
verschaffen - nur damit kann man auch die anderen STGs des Audis
auslesen bzw. ändern.
Ähem, also während der Fahrt einem Steuergerät Diagnose aufzudrücken
dürfte schon als Eingriff ins Bordnetz gelten, dazu sollte man echt
besser wissen was man da tut und nicht nur ich-klicks-mir-zusammen
Cowboy sein.
Im Grunde muss man beim CAN nur auf die passende Botschaft warten und
diese auswerten.
Für sowas dann am besten auch möglichst elektrisch neutral und im
Listen-Only Modus.
DanielDuesentrieb schrieb:> Ich hätte am liebsten so eine funktion wie>> int rpm=Can.lese_rpm();
Sowas gibt es in Zusammenhang mit CAN nicht, die Botschaft die man lesen
möchte liegt irgendwann mal auf dem Bus - oder auch nicht.
Eine Botschaft kann man im allgemeinen nicht anfordern und auf eine eine
bestimmt Botschaft zu warten ist gar keine gute Idee.
Der CAN-Controller wird konfiguriert auf eine Botschaft oder eine Gruppe
von Botschaften zu lauschen und wenn er was empfangen hat wird ein
Interrupt generiert und das ganze ausgelesen.
Wenns schnell geht verarbeitet man das gleich im Interrupt oder setzt
vielleicht noch ein Flag für das Hauptprogramm das die Daten mal wieder
neu und gültig sind.
An alle Kritiker:
Ich hab so ziemlich alles an meinem Auto verändert, was man nur
verändern kann und wir haben jede Schraube umgedreht. Es handelt sich um
einen TT RS mit gut 550PS für die Rennstrecke und den Straßenbetrieb.
Der Wagen ist komplett TÜV-abgenommen. Es gibt glaub ich weitaus größere
Dinge, an denen ich schon dran war. Ich hab ein abgeschlossenes Studium
und bin nicht auf den Kopf gefallen.
Wie auch immer. Ich bin einfach ein bisschen allergisch gegen so etwas
wie "ich klicks mir zusammen cowboy" und dann noch nichts der Sache
beizutragen.
Nun. Da der Wunsch geäußert wurde, dass ich meine Fortschritte poste:
Ich kann nun nach anfänglichen Schwierigkeiten die Daten alle über die
Serielle Schnittstelle auslesen, nur wollte ich zu Diagnosezwecken das
LCD anhängen. Ich hab ein HD44780 kompatiblen Controller und kann
damit ohne Probleme was anzeigen, nur bietet mir das Shield nur 3
Anschlüsse für den LCD, es muss sich also irgendwie um eine serielle
Datenübertragung handeln.
Shield und LCD sehen so aus.
Gibt es eine Möglichkeit das zu verarzten und miteinander zu verbinden
oder brauch ich ein anderes Display ?
MFG
Daniel
Bevor jetzt einer den unnützen kommentar sendet "da gabs noch gar keinen
RS" - stimmt. Die Basis ist ein TTS, aber die Bezeichnung wird dem nicht
mehr gerecht. Wie auch immer ;-)
Nimm doch einen Mikrocontroller mit integriertem CAN-Controller, da ist
das Ansprechen gleich viel einfacher. Externe Controller sind doch nur
Fummelei. Der vom STM32F103 zB sendet bei Kollisionen immer nochmal, wie
es vorgesehen ist (kann man aber abschalten). Wenn eine Nachricht
angekommen ist, gibts nen Interrupt.
Drehzahl und Geschwindigkeit findest du mehrmals die Sekunde auf dem
Bus, du musst nur wissen in welchem Paket es steht. Dann musst du in
deinem Controller einen Filter auf genau diese ID setzen.
kevin schrieb:> am besten den TXD Pin des> Transceivers gar nicht anschließen!!
Genau, um alle Störungen die dann am TXD Pin ankommen auf den Bus
rauszuhauen.
> Shield und LCD sehen so aus.
Wie? :)
> Gibt es eine Möglichkeit das zu verarzten und miteinander zu verbinden> oder brauch ich ein anderes Display ?
Ich kenne Dein Shield nicht, aber wenn die I2C-Schnittstelle an den Pins
A4 und A5 nicht benutzt wird kannst Du damit ein I2C-LCD-Display (sowie
weitere I2C-Module...) ansteuern - das Ganze begnügt sich dann mit
diesen 2 Pins + Stromversorgung.
Wie kann man das CAN-Shield denn ansprechen? Wird da eine Bibliothek
mitgeliefert?
Einen richtigen ODBII-Stecker musst du noch kaufen (gibts z.B. bei
Watterott) und richtig auf das Shield verbinden.
War glaub ich nur GND, VCC, CAN-H und CAN-L - kein Hexenwerk.
Meld dich bei Fragen.
Thomas