Hallo zusammen,
möchte gerne mit Hilfe eines Arduino Mega 2560 und einem
Seedstudio Can Bus Shield die Motordrehzahl von einem Golf 7 über den
serial Monitor anzeigen lassen. Ein passender OBD Stecker ist auch
vorhanden.
Mit welcher passenden library kann ich diesen Wert auslesen?
Und wo und wie setze ich die ID ein?
Habe mir über eine Software den dazugehörigen Identifier aus dem
Motorsteuergerät gezogen der angesrochen werden soll.
z.B Engine RPM $F40C
Wie kann ich das jetzt alles in einem Programm unterbringen das der HEX
Wert ausgelesen wird und mir über den serial Monitor angezeigt wird.
Die vorhandenen Beispielprogramme haben mir bisher leider nicht
geholfen, weil immer wieder irgendwelche Fehler auftreten beim
programmieren.
Vielen Dank im Voraus und hoffe auf zahlreiche antworten die mir
weiterhelfen
Im Allgemeinen würde ich sagen dass mit der Library und dem Shield das
ganze einfach zu bewerkstelligen ist. Notfalls hilft ein Logikanalysator
jedem Fehler auf die Schliche zu kommen...
Mfg,
Thomas
Viel Erfolg.
Achte auch drauf dass die Steckerbelegung passt (in dem ct hacks Artikel
ist sie nochmal abgebildet), denn je nachdem welches Kabel man gekauft
hat kann das durchaus anders belegt sein.
Thomas
@Prof
wäre dieses Produkt geeignet oder felht mir da noch was dann?
Muss ja zugeben bin echt ein richtiger Anfänger in diesem Gebiet :-)
https://www.sparkfun.com/products/9555
Danke dir Thomas,
hoffe das mich das weiterbringt.
habe ja noch einen Arduino MEGA 2560 zu Hause liegen.
mit dem sollte es ja auch funktionieren oder?
Habe ja auch ein beispiel Programm mal ausprobiert:
// demo: CAN-BUS Shield, receive data
#include "mcp_can.h"
#include <SPI.h>
#include <LiquidCrystal.h>
#include <stdio.h>
#define INT8U unsigned char
INT8U Flag_Recv = 0;
INT8U len = 0;
INT8U buf[8];
INT32U canId = 0x000;
char str[20];
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);
void setup()
{
lcd.begin(20, 4);
CAN.begin(CAN_500KBPS); // init can bus : baudrate = 500K
Serial.println("CAN Init ok");
attachInterrupt(0, MCP2515_ISR, FALLING); // start interrupt
Serial.begin(115200);
}
void MCP2515_ISR()
{
Flag_Recv = 1;
}
void loop()
{
if(Flag_Recv) // check if data was recieved
{
Flag_Recv = 0; // clear flag
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
canId = CAN.getCanId();
//Print data to the serial console
//and the LCD display
Serial.println("CAN_BUS GET DATA!");
Serial.print("CAN ID: ");
Serial.println(canId);
lcd.setCursor(0, 0);
lcd.print("CAN ID: ");
lcd.print(canId);
lcd.setCursor(0, 2);
Serial.print("data len = ");Serial.println(len);
//This loops through each byte of data and prints it
for(int i = 0; i<len; i++) // print the data
{
Serial.print(buf[i]);Serial.print("\t");
lcd.print(buf[i]);
lcd.print(" ");
}
Serial.println();
delay(50);
}
}
Nur hier zeigt er mir nur im serial MOnitor an " CAN INIT OK "
wie bekomme ich hier meinen Identifier für die Drehzahl untergebracht
oder geht das nicht einfach so? Engine RPM $F40C
Sorry für die vielen Fragen :(
Mfg
Ich gehe mal davon aus dass du ein Seed-Studio CAN_BUS_Shield verwendest
und das deine Verkabelung korrekt ist.
In dem Fall wirfst du das hier mal raus:
(am Anfang solltest du erstmal pollen, das ist einfacher, deshalb
brauchst du keine ISR)
Nun kannst du statt:
1
if(Flag_Recv)
mal das hier versuchen:
1
if (CAN::checkReceive() == 1)
Das hier:
1
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
2
canId = CAN.getCanId();
sieht eigentlich so aus als könnte es dann funktionieren.
Es ist auch gut möglich dass dein Programmcode nicht falsch ist, aber
die Verkabelung nicht stimmt, ich denke fast dass ist das Problem.
Bist du dir sicher dass du hier alles richtig verkabelt hast?
Fotos, fotos, fotos !
Thomas
ja, verwende das Seed Can bus Shield und abe es auf den ARduino Mega
gesteckt. Passt ja auch nur einmal drauf irgendwie.
werde aufjedenfall mal Fotos machen wenn ich zu Hause bin und sie dir
hier zukommen lassen.
vllt siehst du ja auf anhieb ob etwas falsch verkabelt ist.
aber wohin mit meinem Identifier?? "Engine RPM $F40C"
Danke dir schonmal für deine schnelle Antowrt..
MFG
Du scheinst hier etwas CAN und OBD durcheinander zu bringen.
CAN ist der Bus, OBD ist ein Protokoll was über den CAN-Bus übertragen
wird.
Auf dem CAN Bus kannst du theoretisch viel mehr hören und machen als nur
ODB.
Seis drum, das OBD Protokoll gibt im sog. MODE 1 die folgenden Daten
aus: http://en.wikipedia.org/wiki/OBD-II_PIDs#Mode_01
Deine Modordrehzahl ist also ein standardtisierter Wert mit der PID
0x0C.
Du musst also auf den BUS eine Nachricht schicken. Empfängeradresse ist
0x7df (Broadcast), length ist 2, mode 1 und pid 0x0C.
Daraufhin sollte das freundliche Steuergerät deiner Wahl (also welches
sich zuständig fühlt) dir antworten.
Diese Antwort kannst du dann auswerten.
Also erst freundlich fragen, dann eine Antwort bekommen.
Ich lege dir mal den ct Hacks Artikel (nochmal) ans Herz, da ist das
ganz gut erklärt. Zitieren daraus trau ich mich nicht.
Bei meinem Programmcode habe ich folgende Library verwendet:
https://code.google.com/p/mechanic/
(diese Library nutzt auch den Chip MCP2515, genauso wie die Library von
Seed)
Diese unterstütze den folgenden Aufruf:
Na das Shield ist schonmal richtig. Sonst hätte wohl auch der init nicht
geklappt.
Jetzt probier vielleicht mal meinen oben geposteten Beispielcode und die
mechanics-Library aus.
Viel Glück!
Thomas
ok super..
dann werde ich mich mal ransetzen und ein bisschen ausprobieren.
herzlichen dank für deine antworten Thomas..
werde über meinen fortschritt berichten...
mfg
Hallo Thomas,
habe jetzt die mechanic library mal reingeladen und dein Beispiel
Programm verwendet, nur nicht mit dem LCD Display sondern über den
Serial Monitor, sollte ja nichts ändern.
im Fehlerfeld unten taucht nun folgender Fehler auf:
> C:\Program Files (x86)\Arduino\libraries\can\mcp2515.c: In function
'mcp2515_init':
> C:\Program Files (x86)\Arduino\libraries\can\mcp2515.c:201: error: 'for' loop
initial declaration used outside C99 mode
kannst du mir da weiterhelfen?
mfg
Lag an der mechanic 0.5. Diese war nicht kompatibel mit dem Arduino Mega
Mit der mechanic 0.6 läuft es einwandfrei. Kann mir auch ohne Probleme
jetzt eine Drehzahl über die OBD Pids anzeigen lassen.
Mal schauen wir es jetzt mit den Werten vom Can Bus aussieht. Habe mir
noch einen Multoprotokoll Adapter bestellt, weil ich noch Werte
brauche, die nur auf dem Antriebs Can zu finden sind.
Möchte ja nur hören und nichts auf den Can senden.
Mehr als das oben zitierte Beispielprogramm und den Wikipedia Link kann
ich leider nicht bieten.
Damit kriegt man halt Motordrehzahl, Öltemperatur und sowas... das
reichte mir damals.
Finde experimentieren mit dem Auto immer etwas unbequem...
Thomas
Hallo,
habe viel ausprobiert wie auch mechanic 0.6
Mein Problem ist das ich bei den Beipielen keine Daten zurückbekomme
Ich habe Fahrzeuge hier stehen die mit 29bit kommunizieren.
Sende ich zb. 0x7DF kommt keine Antwort.
Bei 29bit muss ich aber 18DB33F1 senden.
Aber sämtliche Beispiele sind immer nur für 11bit.