Diagnostica auto centralina Arduino OBD-II

Salve a tutti ,
sto lavorando ad un progetto che si occupa della diagnostica dell'automobile. Volevo prendere i dati dalla centralina collegandomi alla presa OBD dell'automobile e prendere i dati grazie a questa shield:
http://www.seeedstudio.com/depot/CANBUS-Shield-p-1240.html
Ho caricato nel codice diverse librerie ma senza successo , spesso mi dice che alcune variabili globali non sono state definite o non riesce ad inizializzare la comunicazione seriale.
Il codice che sto provando ad utilizzare e' il seguente:

#include <SPI.h>
#include <MCP2515.h>
#include <OBDIICanbus.h>

#define SERIAL_DEBUG

void setup()
{
#ifdef SERIAL_DEBUG
 
  Serial.begin(9600);
  Serial.println("OBDIIReader");
#endif

  // Initialize the MCP2515
  if (!OBDIICanbus.init(500000))
  {
#ifdef SERIAL_DEBUG
    Serial.println("Failure:MCP2515 Initialization");
#endif    
  }
  else
  {
#ifdef SERIAL_DEBUG
    Serial.println("MCP2515 is Active");
#endif    
  }
}
 

void loop()
{
   
  if(Canbus.ecu_req(ENGINE_RPM,buffer) == 1)
  {
  } 
  digitalWrite(LED3, HIGH);
   /*
  if(Canbus.ecu_req(VEHICLE_SPEED,buffer) == 1)
  {
    sLCD.print(COMMAND,BYTE);
    sLCD.print(LINE0 + 9,BYTE);
    sLCD.print(buffer);
  }
  
  if(Canbus.ecu_req(ENGINE_COOLANT_TEMP,buffer) == 1)
  {
    sLCD.print(COMMAND,BYTE);
    sLCD.print(LINE1,BYTE);                     
    sLCD.print(buffer);
  }
  
  if(Canbus.ecu_req(THROTTLE,buffer) == 1)
  {
    sLCD.print(COMMAND,BYTE);
    sLCD.print(LINE1 + 9,BYTE);
    sLCD.print(buffer);
  }  
  */
//  Canbus.ecu_req(O2_VOLTAGE,buffer);
}

uint32_t parsedecimal(char *str)
{
  uint32_t d = 0;
  
  while (str[0] != 0) {
   if ((str[0] > '9') || (str[0] < '0'))
     return d;
   d *= 10;
   d += str[0] - '0';
   str++;
  }
  return d;
}

qualcuno di voi ha mai provato a fare la stessa cosa? Grazie!

Ciao,
lo sai che quella shield funziona soltanto con le auto dotate di CAN-bus?
Se la tua auto non utilizza questo protocollo non riuscirai a collegarti.

Hai provato ad utilizzare il codice presente sul wiki di quella shield?

si , la mia auto e' dotata di CAN bus e avevo gia' visto quel codice precedentemente solo che ho deciso di scartarlo in quanto nelle librerie non erano presenti i PID che servono a richiedere determinati dati alla centralina , Mentre in altre librerie sono gia definiti.

Non so se sono costretto a modificare le librerie inserendo queste costanti o se posso utilizzare altri codici. =( =( =(

VincenzoArd91:
avevo gia' visto quel codice precedentemente solo che ho deciso di scartarlo in quanto nelle librerie non erano presenti i PID che servono a richiedere determinati dati alla centralina , Mentre in altre librerie sono gia definiti.
OBD-II PIDs - Wikipedia

Si conosco l'argomento...
Allora avremmo bisogno di vedere le librerie che hai utilizzato o quanto meno metti i link dove vengono descritte... Senza qualche informazione in più sul codice da te utilizzato è un pochino difficile aiutarti...

questo e' il codice che avevo trovato ma non funziona

/*
*/

#include <SPI.h>
#include <MCP2515.h>
#include <OBDIICanbus.h>

#define SERIAL_DEBUG

void setup()
{
#ifdef SERIAL_DEBUG
  Serial.begin(9600);
  Serial.println("OBDIIReader");
#endif

  // Initialize the MCP2515
  if (!OBDIICanbus.init(SPEED_500_KBPS))
  {
#ifdef SERIAL_DEBUG
    Serial.println("Failure:MCP2515 Initialization");
#endif    
  }
  else
  {
#ifdef SERIAL_DEBUG
    Serial.println("MCP2515 is Active");
#endif    
  }
}
 

void loop()
{
/*    
  if(Canbus.ecu_req(ENGINE_RPM,buffer) == 1)
  {
  } 
  digitalWrite(LED3, HIGH);
   
  if(Canbus.ecu_req(VEHICLE_SPEED,buffer) == 1)
  {
    sLCD.print(COMMAND,BYTE);
    sLCD.print(LINE0 + 9,BYTE);
    sLCD.print(buffer);
  }
  
  if(Canbus.ecu_req(ENGINE_COOLANT_TEMP,buffer) == 1)
  {
    sLCD.print(COMMAND,BYTE);
    sLCD.print(LINE1,BYTE);                     
    sLCD.print(buffer);
  }
  
  if(Canbus.ecu_req(THROTTLE,buffer) == 1)
  {
    sLCD.print(COMMAND,BYTE);
    sLCD.print(LINE1 + 9,BYTE);
    sLCD.print(buffer);
  }  
  */
//  Canbus.ecu_req(O2_VOLTAGE,buffer);
}

uint32_t parsedecimal(char *str)
{
  uint32_t d = 0;
  
  while (str[0] != 0) {
   if ((str[0] > '9') || (str[0] < '0'))
     return d;
   d *= 10;
   d += str[0] - '0';
   str++;
  }
  return d;
}

non viene inizializzata la comunicazione seriale , questo e' stato scritto per un altro tipo di adattatore OBD e pensavo potesse andare bene.

Questo invece e' il codice che sto provando ad utilizzare

#include <SPI.h>
#include "mcp_can.h"


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);

START_INIT:

    if(CAN_OK == CAN.begin(CAN_500KBPS))                   // init can bus : baudrate = 500k
    {
        Serial.println("CAN BUS Shield init ok!");
    }
    else
    {
        Serial.println("CAN BUS Shield init fail");
        Serial.println("Init CAN BUS Shield again");
        delay(100);
        goto START_INIT;
    }
}


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();
    }
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

In questo caso la seriale viene inizializzata con successo ma non saprei come effettuare la richiesta , ho pensato di chiamare la CAN.sendMsgBuf(0x00, 0, 8, stmp); ma non credo sia la stessa cosa.

Ho caricato il secondo codice su arduino e l'ho provato collegandolo alla centralina. Vi allego i screen dei risultati ottenuti , qualcuno e' in grado di interpretarli?