martes, 29 de marzo de 2011

Comunicación OBD con Ford Focus 2007

.



El amigo Sergegsx nos envia unas fotos del proyecto que está haciendo basado en SECUduino. Se comunica a su Ford Focus del 2007 gracias al "brick" que puedes encontrar en nuestra tienda usando OBD (ISO).
Para hacerlo, basta con usar la información de wikipedia respecto OBD II PIDs.

Veámos un ejemplo de una trama estandard OBD:
CAN_TxMsg.id=0x7DF; 
CAN_TxMsg.header.rtr=0;
CAN_TxMsg.header.length=8;
CAN_TxMsg.data[0]=0x02;  //Número de bytes adicionales de datos
CAN_TxMsg.data[1]=0x01;  //MODO
CAN_TxMsg.data[2]=0x0C;  //PID (función a pedir, en este caso rpm)
CAN_TxMsg.data[3]=0x00;
CAN_TxMsg.data[4]=0x00;
CAN_TxMsg.data[5]=0x00;
CAN_TxMsg.data[6]=0x00;
CAN_TxMsg.data[7]=0x00;


Al enviar dicho mensaje, el coche nos responderá :
7E8 | 0x04 | 0x41 | 0x0C | 0x0D | 0x50 | 0x00 | 0x00 | 0x00 
donde ID=7E8 y los 8 bytes de datos=0x04 0x41 0x0C 0x0D 0x50 0x00 0x00 0x00  
  • El primer byte de datos indica el número de bytes adicionales (4 más).
  • El segundo byte (0x41) indica que se trata de datos actuales.
  • El tercer byte nos indica que función se trata (0x0C=rpm).
  • El cuarto y quinto byte, son las rpm=((Byte3*256)+Byte4)/4= 852 rpm. Es decir:
           rpm =  ((CAN_RxMsg.data[3]*256) + CAN_RxMsg.data[4])/4;

Para ampliar información sobre otros PID, sólo basta con leer el link de wikipedia indicando anteriormente.

Código de lectura velocidad motor (rpm) :
 
// ----------------------------------------------
// SECUDUINO
// http://secuduino.blogspot.com/
// ---------------------------------------------- 

#include <CAN.h>

long rpm;

void setup()
{
 Serial.begin(115200);
 Serial.println("Empezamos...");

 CAN.begin(500);

 CAN_TxMsg.id=0x7DF;   
 CAN_TxMsg.header.rtr=0;
 CAN_TxMsg.header.length=8;
 CAN_TxMsg.data[0]=0x02;
 CAN_TxMsg.data[1]=0x01;  //MODE 
 CAN_TxMsg.data[2]=0x0C;  //PID
 CAN_TxMsg.data[3]=0x00;
 CAN_TxMsg.data[4]=0x00;
 CAN_TxMsg.data[5]=0x00;
 CAN_TxMsg.data[6]=0x00;
 CAN_TxMsg.data[7]=0x00; 

}

void loop()
{


 CAN.send(&CAN_TxMsg);

 delay(5);


 if (CAN.CheckNew())
 {
 
   if ( CAN.ReadFromDevice(&CAN_RxMsg) )
   {
     if (CAN_RxMsg.data[2]==0x0C)   //PID=0x0C (rpm)
     {
       rpm =  ((CAN_RxMsg.data[3]*256) + CAN_RxMsg.data[4])/4;
           
       Serial.print(millis());
       Serial.print(";");
       Serial.print(CAN_RxMsg.id,HEX);
       Serial.print(";");
       Serial.print(CAN_RxMsg.data[0],HEX);
       Serial.print(";");
       Serial.print(CAN_RxMsg.data[1],HEX);
       Serial.print(";");
       Serial.print(CAN_RxMsg.data[2],HEX);
       Serial.print(";");
       Serial.print(CAN_RxMsg.data[3],HEX);
       Serial.print(";");
       Serial.print(CAN_RxMsg.data[4],HEX);
       Serial.print(";");
       Serial.print(CAN_RxMsg.data[5],HEX);
       Serial.print(";");
       Serial.print(CAN_RxMsg.data[6],HEX);
       Serial.print(";");
       Serial.print(CAN_RxMsg.data[7],HEX);
       Serial.print(";");
       Serial.print("RPM=");
       Serial.println(rpm,DEC);
     }
 }
 
 }else
 {
   
 }

}
















Un link interesante para ver que módelos Ford Focus disponen de diagnosis por CAN: http://www.aim-sportline.com/download/ecu/stock/ford/Ford_Focus_OBDII_connection_100_eng.pdf


Buen trabajo Sergegsx!!!





5 comentarios:

Anónimo dijo...

Tengo una dudilla. Llevo tiempo intentando incorporarle a mi toyota auris un velocimetro sin "desmontar" demasado el coche, acabo de encontrame con esta pagina y la verdad es que me interesa bastante el proyecto. He visto que el coche dispone de diagnosis por OBDII, si me hiciera con un brick de estos podria hacer algo parecido a lo que se muestra en el post??

Igor dijo...

Hola,

Necesitas confirmar que el bus de diagnosis del Toyota Auris es mediante CAN, ya que existen diferentes protocolos para la diagnosis.
Segun este documento => http://www.aim-sportline.com/download/ecu/stock/toyota/Toyota_auris_100_eng.pdf , parece que el Toyota Auris 2.2 TDI si que lo tiene.
Puedes medir la resistencia entre los pines 6 y 14 del conector OBD a ver si tienes 60 ohm.

Saludos

Anónimo dijo...

aiba... habia visto ese pdf pero no me habia dado cuenta de que ponia auris 2.2, el mio es el 2.0, no se si valdra tambien... si no da 60 ohmios que tendria que hacer?? gracias por contestar, a ver si me pillo el brick e investigo un poquillo...

Luis Antonio dijo...

Hola, ¿Por el OBD se puede mandar una petición? ¿O simplemente se podría recibir datos?

Juanma dijo...

Hola Igor, la pregunta de Luis Antonio me parece muy interesante,
si se pudiera mandar peticiones como habeis hecho con el VW (subir/bajar ventanillas, etc,)
se podria enviar peticiones??
si fuera asi, estaria interesadoun uno, para cauando los que llevan memoria incorporada? parace que no hay stock
Gracias.

Publicar un comentario en la entrada