Ciao a tutti
vorrei leggere dei dati in linea CAN da una centralina per auto (non commerciale), ho qualche riferimento nel datasheet, tra cui la velocità a 1 MB.
Qualcuno ha già fatto qualcosa? Sa che librerie ci sono funzionanti? Come si fa a sapere se c'è una comunicazione? Uso un MEGA2560 e una shield per linea CAN; ho provato programmi di esempio, ma non vedo nulla....
grazie, ciao
Ciao,
nessuno ha fatto qualcosa? Vi allego il link del modulo che ho acquistato:
http://www.ebay.it/itm/311379482437?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT
Ho trovato qualche libreria, con qualche esempio, ma non capisco il funzionamento, e non mi pare funzioni...
Spero in qualcuno che abbia fatto qualcosa di funzionante; grazie a tutti
Un saluto
interessebbe anche a me ma non saprei
Ciao,
per comunicare con centralina dovresti sapere quali messaggi mandare in modo che lei ti risponda.
Hai idea di come sia il protocollo della centralina?
Ciao ragazzi, qualcuno si è fatto vivo, avevo perso le speranze...
Allora, io devo leggere dei dati da una centralina per uso sportivo, quindi nulla a che fare con le centraline di serie... Qualcosa in giro ho trovato per le centraline di serie, ma ancora devo provare se funziona... Intanto mi accontenterei di quello, di avere una comunicazione, poi i vari dati in qualche modo (con difficoltà) si estrapolano...
Vi riporto quello che dice il datasheet di questa mia centralina, riguardo alla comunicazione CAN:
CAN bus Baud Rate 1 MBd
Identifiers All 29Bit
6 Data Packets All 8 Byte Ea
Send Frequency 10-50 Hz
All Dat a Values 16 Bit Signed Sent LSB First (Little Endian)
Data Packets
Identifier Data1 Data2 Data3 Data4
0x2000 RPM TPS % Water Temp C Air Temp C
0x2001 MAP Kpa Lambdax1000 KPH x 10 Oil P Kpa
0x2002 Fuel P Kpa Oil Temp C Volt s x 10 Fuel Con. L/Hr x 10
0x2003 Gear Advance Degx10 Inject ion msx100 Fuel Con. L/100Km x 10
0x2004 Ana1 mV Ana2 mV Ana3 mV Cam Advance x 10
0x2005 Cam Targx10 Cam PWM x 10 Crank Errors Cam Errors
Questo è tutto quello che ho, non so se basta per fare qualcosa, nel caso, posso scrivere alla ditta costruttrice, non penso facciano problemi, in quanto sono concessionario dei loro prodotti a livello Italia...
Appena ho tempo provo uno dei programmi che ho trovato, per vedere almeno se tutto l'aggeggio si collega a una centralina di serie.
Grazie a tutti
Ciao,
una particorità che vedo immediatamente è che usa la versione estesa (identifier 29 bit: vedi Controller Area Network - Wikipedia per capire cos'è), per cui bisogna essere sicuri che la scheda ed le librerie SW che usi lo supportino (e magari configurarli se necessario).
Sicuramente con queste informazioni dovresti poter comunicare col device. Unica cosa che non mi è chiara (non so se puoi chiederlo a loro o se è scritto già sul manuale): tutti questi dati li invia in continuazione da solo o li manda solo su richiesta (es. tu mandi un messaggio che significa "mandami il pacchetto 0x2000" e lui, appena lo ha ricevuto, lo invia).
Ho usato CAN a lavoro, ma purtroppo mai con Arduino, comunque se ti posso esser d'aiuto chiedi pure.
Ciao,
non credo che i dati siano inviati da soli, ho provato a collegare un oscilloscopio alla Can, ma non c'è attività, sicuramente serve una richiesta... L'unica cosa, da dove partire? Delle librerie trovate, nessuna si compila o funziona, quindi diventa complicato..... L'unico programma che ho fatto che almeno si compila e trova la shield provo ad allegarlo quà...
#include <SPI.h>
#include "mcp_can.h"
const int SPI_CS_PIN = 53;
const int LED=13;
boolean ledON=1;
MCP_CAN CAN(SPI_CS_PIN); // Set CS pin
unsigned char Flag_Recv = 0;
unsigned char len = 0;
unsigned char buf[8];
char str[20];
#define PID_SUPPORT00 0x00
#define MIL_CODE 0x01
#define FREEZE_DTC 0x02
#define FUEL_STATUS 0x03
#define LOAD_VALUE 0x04
#define COOLANT_TEMP 0x05
#define STFT_BANK1 0x06
#define LTFT_BANK1 0x07
#define STFT_BANK2 0x08
#define LTFT_BANK2 0x09
#define FUEL_PRESSURE 0x0A
#define MAN_PRESSURE 0x0B
#define ENGINE_RPM 0x0C
void setup()
{
Serial.begin(115200);
pinMode(LED,OUTPUT);
START_INIT:
if(CAN_OK == CAN.begin(CAN_1000KBPS)) // init can bus : baudrate = 500k
{
Serial.println("CAN BUS inizializzazione OK");
}
else
{
Serial.println("CAN BUS fallita inizializzazione");
Serial.println("Init CAN BUS Shield again");
delay(100);
goto START_INIT; // manda indietroper inizializzazione fallita shield
}
}
void loop()
{
/*
unsigned char stmp[8] = {0, 1, 2, 3, 4, 5, 6, 7};
CAN.sendMsgBuf(0x00, 0, 8, stmp); // send data: id = 0x00, standrad flame, data len = 8, stmp: data buf
delay(10); // when the delay less than 20ms, you shield use receive_interrupt
*/
if(MCP_STAT_RXIF_MASK == CAN.checkReceive()) // check if data coming
{
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
for(int i = 0; i<len; i++) // print the data
{
Serial.print(buf[i]);Serial.print("\t");
}
Serial.println();
}
}
Ma il protocollo che hai serve per inviare dati ad una aquisizione o cruscotto digitale dotato di linea can ci devi anche scrivere?
No, io devo leggere questi dati dalla centralina, poi con arduino li farò visualizzare su un display
Sembra strano che non ci sia attività.
Sicuro di averlo connesso nel modo corretto? L'inizializzazione fatta all'inizio dice tutto ok?
Ricorda che la linea CAN su cui è collegata ha bisogno di essere terminata con delle resistenze opportune (vedi es. http://www.ti.com/lit/an/slla270/slla270.pdf pagina 5)
120 ohm la resistenza da applicare ai capi di can Low can high, o per lo meno va portata a 120.
Ciao,
sapevo della resistenza di terminazione, e ovviamente l'ho messa... il programma sulla seriale mi restituisce solo l'ok della inizializzazione della shield, dopo di chè non vedo altro... Non so che comando o che cosa devo inviare, per far si di ricevere una risposta...
La centralina va programmata in can o rs232? Hai l'interfaccia di programmazione?
matita_76:
La centralina va programmata in can o rs232? Hai l'interfaccia di programmazione?
Attualmente la centralina la programmo con RS232 per via seriale direttamente, il programma è fornito dalla ditta costruttrice, la ditta fornisce anche un'interfaccia CAN per fare le stesse cose con il pc, ma costa molto di più...
thedrifter:
Attualmente la centralina la programmo con RS232 per via seriale direttamente, il programma è fornito dalla ditta costruttrice, la ditta fornisce anche un'interfaccia CAN per fare le stesse cose con il pc, ma costa molto di più...
Nel sito ufficiale si possono trovare tutte le info, i manuali e il software si può scaricare liberamente...
www.dtafast.co.uk
Ragazzi, vi aggiorno, pare che una qualche comunicazione ci sia, al programma sopra ho aggiunto la parte che era un commento:
/*
unsigned char stmp[8] = {0, 1, 2, 3, 4, 5, 6, 7};
CAN.sendMsgBuf(0x00, 0, 8, stmp); // send data: id = 0x00, standrad flame, data len = 8, stmp: data buf
delay(10); // when the delay less than 20ms, you shield use receive_interrupt
*/
In questo modo mi si va a bloccare la comunicazione al cruscotto della vettura (sto provando con vetture di serie (Fiat)) Ciò dovrebbe significare che il tutto funziona, e ho mandato un comando che alla centralina non va bene... Comunque non ricevo nessuna risposta, da seriale non appare nulla...
Ora c'è da capire che comandi inviare alla MIA centralina per avere qualche risposta..... Appena ho tempo, intanto provo a vedere se da sola spara qualcosa.....
ciao a tutti
Acc.. non avevo fatto caso che la parte che inviava era commentata: adesso il discorso torna già decisamente di più! Il fatto che interrompa il resto della comunicazione sul cruscotto è normale: a vedere lo scketch stai mandando comandi ogni 10ms e quindi intasando il bus, impedendo alle altre centraline di comunicare (prova magari a mettere delay(1000) per ridurre la frequenza della comunicazione)
Credo che a questo punto è solo più una questione di protocollo q quali messaggi inviare: se hai contatto privilegiato con loro, forse puoi chiedergli info in più. Magari prova a verificare come impostare gli id a 29 bit sulla tua scheda.
Ecco, giusto, non avevo fatto caso che era nel loop..... Tutto torna quindi...
Bella domanda, chi lo sa come impostare gli id a 29 bit??
Ma per avere una risposta basterebbe mandare comandi come nell'esempio, mettendo l'indirizzo che ha scritto la ditta nel datasheet? Dovrebbe arrivare una risposta con quei dati? Oppure la cosa è più complicata?
Grazie
Ciao,
ho dato uno sguardo alla libreria. Premetto che solo guardando il codice è difficile dire, ma sembra che basti semplicemente cambiare il secondo parametro nelle chiamate di invia e ricevi mettendo 1 invece di 0
es. invece di
CAN.sendMsgBuf(0x00, 0, 8, stmp);
fare:
CAN.sendMsgBuf(0x00, 1, 8, stmp);
ovviamente poi mettendo gli id giusti: 0x2000, 0x2001 etc..
Per il protocollo difficile dire.. purtroppo ogni centralina è un caso a sè e dipende dalle scelte del costruttore, per questo suggerivo di rivolgersi a loro. Forse in automotive c'è un qualche standard, ma non ho documenti a riguardo..
Solo una curiosità: quei messaggi sono diagnostica che deve arrivare dalla centralina o parametri che devi impostare tu a lei? Nel secondo casi si, sicuramente per come è scritto basta inviarli perchè lei li prenda
Ciao,
farò delle prove, e vedo se viene fuori qualcosa..... Si, su automotive, anche se difficilmente, ma qualche parametro si trova, su questa da uso sportivo non so cosa abbiano fatto, quindi devo provare, ed eventualmente provare a chiedere a loro...
Io devo ricevere diversi dati dalla centralina, per poi visualizzarli tramite arduino su un display, nel normale funzionamento del motore; invece tutta la parte di programmazione della centralina avviene con il software fornito dalla ditta tramite porta RS232... Non sos e sono riuscito a spiegarmi