domingo, 2 de enero de 2011

Comenzando con el ELM327

Para poder descifrar los mensajes del bus de confort necesito acceder a él con el cable OBD. En el conector OBD del coche están presentes los dos buses, el de motor (HS, High Speed 500kbps) y el de confort (MS, Medium Speed 125kbps), pero el cable OBD solo está conectado al de motor. Madox también especifica este bus de Medium Speed en uno de sus comentarios.
Conector OBD, vista trasera.

Para poder conmutar entre los dos buses, y no perder la conexión con el bus HS por si hace falta algún día para leer errores de la centralita de motor (ECU), he instalado un conmutador de 2 polos en el propio conector, respetando la polaridad H-L del interface CAN para los dos buses.
Conector OBD con conmutador de selección de buses CAN.
Con el cable listo he comenzado a evaluar diferentes softwares de diagnosis de coche en sus versiones para ELM (ScanMaster, ScanXL, OBDSpy, ScanTool, Digimoto,wOBD, EasyOBD, EEC Analyzer, etc...), ninguno de ellos me sirve para poder filtrar mensajes CAN, ya que se basan en el protocolo OBD para poder leer mensajes de la ECU pero para poder ver si funciona el hardware sirven.
Para poder comunicarnos con el ELM327 lo haremos a través de un terminal serie, en mi caso he usado TeraTerm pero se puede usar hyperterminal de windows o PuTTY o cualquier otro. Hay que tener a mano el manual del ELM327 para saber que comandos ATM usar. La velocidad por defecto es de 38400, aunque hay un pin del ELM que permite configurarla por hardware a 9600bps. Otro de los pines del ELM es el que introduce un LF (Line Feed) al final de la linea, pero en mi caso no esta activado por lo que para comunicarse correctamente el primer comando será un ATL1 para activar el line feed.
Primeros comandos del ELM
Otro comando para ver todos los mensajes es el ATMA (Monitor All), que nos muestra una serie de tramas hasta que el buffer de recepción se llena y da mensaje de error. Para saber el protocolo actual usaremos ATDP (Describe Protocol) y nos confirma que es un bus CAN con identificadores de 11bits y 500kbps de velocidad. Al conmutar al bus de confort y realizar un ATPC (Protocol Close) y un ATMA para reiniciar el sistema de escaneo de protocolos obtenemos esto:
Cambio al bus de confort.

Los errores de recepción me parecen extraños, por lo que al comprobar el protocolo elegido con ATDP veo que es el número 8: CAN 11bit ID- 250 kbaud. Consultando el manual veo que hay un par de protocolos ajustables, el B y que ya viene por defecto con el formato que me interesa: 11bit ID, 125 kbaud. Fijo este protocolo mediante  ATSPB (Set Protocol B) y con un ATDP y un ATMA compruebo que funciona correctamente:

Fijar velocidad correcta para el bus (11bit ID, 125 kbps).
Ahora ya puedo leer correctamente mensajes CAN del bus de confort, para ello utilizaré los comandos ATMA (Monitor All), ATMR (Monitor Receiver) y ATMT (Monitor Transmitter).

Mensajes enviados hacia la centralita 2 (ATMR02).
 Aún tengo que acabar de leerme el manual del ELM para poder configurarlo correctamente y ver los encabezados de los mensajes, lo que me permitirá saber los números de las centralitas que hay en el bus (emisoras y receptoras). Por ahora he podido observar que la centralita 02 recibe datos del clima (si está encendido, velocidad de ventilador, temperatura, etc..), así que es un buen comienzo!!. Espero ir descifrando mensajes poco a poco, si veo que hay muchos mensajes quizás opte por un script en linux o algún software en C que me permita ir viendo los cambios bit a bit conforme vaya actuando sobre los controles del coche, al igual que hizo Madox con PHP y Javascript. Primero me miraré mas a fondo la configuración del ELM e iré buscando el micro que usar (NEC, Microchip?). En el trabajo ahora estamos usando un embedded EXM32-IXM35 que tiene interfaz CAN, pero me parece demasiado pasado de especificaciones para lo que quiero, o no? ;).

18 comentarios:

  1. hola, soy mr.xkr, de solocarputer.

    Hace tiempo que sigo tus pasos para empezar a trabajar con mi Honda Accord.

    Esta tarde me he conectado al ELM327 y he lanzado algunos comandos AT, todos del bus de motor, que es lo que por defecto viene en todos, supongo.

    Aparte de que he visto que solo unos pocos PIDs están soportados en OBD modo 01, ahora ya me empiezo a aventurar a cambiar al modo confort.

    Cuando hago ATDP, 0100 y de nuevo ATDP, me marca AUTO, ISO 15765-4 (CAN 29/500), asi que veo que uso CAN extendido 500kbps, el de motor.

    Mi pregunta viene ahora en cómo mantener el modo monitor, (ATMA, ATMR y ATMT), puesto que apenas salen 20 lineas y el buffer se llena. Supongo que relanzando hasta llenar el buffer de nuevo.

    Otra pregunta, lanzando 0100 recibo:
    41 00 98 3B 00 11

    Del primer byte no se el significado, pero si he visto que coincide con el modo 41=1, 49=9 y algunos comandos no lo envían, p.e. 0904:
    023
    0: 49 XX XX XX XX XX
    1: 30 XX XX XX XX XX XX
    ... (hasta 5:)

    A ver si me lo puedes aclarar.

    La verdad es que el protocolo CAN es bastante más rápido que el ELM327, el UART, e incluso las CPUs de Arduino y algunos PIC.

    Voy a ver si encuentro el pinout del conector OBD de mi coche, y hago un selector para motor/confort, al menos para hacer las pruebas.

    Un saludo, y gracias por publicar tan valiosa información, a muchos nos ha sido de mucha ayuda.

    ResponderEliminar
  2. Hola, el problema de BUFFER FULL creo que es debido a las diferentes velocidades de comunicación. Es decir, el ELM327 no es capaz de enviar suficientes tramas hacia el terminal ya que su velocidad de comunicación serie/USB no es lo suficientemente rápìda. Una solución es solo escanear ciertos comandos con ATMR y ATMT (mensajes hacia una centralita determinada o provenientes de una centralita). También hay otros filtros como ATCF y ATCM, consulta el pdf del ELM327 y prueba a filtar solo un mensaje específico.
    Otra posibilidad es que tengas el baudrate del rs232 a 9600, el pin 6 del ELM327 fija la velocidad entre 38400 (pin 6 a 1 durante reset) o 9600 (pin 6 a 0 durante reset). También con el comando PP 0C puedes subir la velocidad del RS232 hasta 500 kbps (mira la pag 56 del manual del ELM327), pero hay que ir con cuidado al subir esta velocidad, ya que el bus rs232 luego va a para a un conversor serie-USB o bluetooth incluso (depende del lector que tengas) y este tiene un límite en las comunicaciones rs232.
    Sobre el mensaje 0100 ese es un código OBD y funciona diferente de los mensajes CAN entra centralitas, aunque comparte el mismo bus físico (CAN). No me he metido mucho en los mensajes OBD puesto que mi objetivo era descifrar los mensajes de la centralita de A/C. Los mensajes OBD son estandar entre marcas, a diferencia de los CAN entre centralitas y funcionan de otra manera. Los CAN entre centralitas se van enviando continuamente y los OBD son del tipo pregunta-respuesta y están enfocados a la diagnosis del motor (On Board Diagnosis). Además los OBD van dirigidos a la centralita de motor, por lo que es posible que desde el bus de confort no se puedan realizar, depende del cuadro de mandos que actua de Gateway entre las dos redes y deja pasar ciertos mensajes de una a otra.
    Para mas detalles sobre los mensajes OBD te paso algunos links de cuando estuve investigando:

    http://www.obd-codes.com
    http://www.obddiag.net/adapter.html
    https://www.scantool.net/support/index.php?_m=knowledgebase&_a=view&parentcategoryid=1&pcid=0&nav=0
    http://www.automecanico.com/auto2001/OBDcod.html
    http://www.gaw.ru/data/Interface/CAN_BUS.PDF
    http://www.obd2cables.com/products/

    ResponderEliminar
  3. Muchas gracias por responder, estuve con el datasheet del ELM327 pero no es pequeño, y esa información de cambio de velocidad es muy interesante.

    Sobre lo del filtrado de mensajes, es lo mismo que he estado leyendo, el coche envía demasiadas tramas, y llena el buffer.

    Tengo ahora mismo un ELM327 bluetooth, que por comodidad está genial, pero ya he pedido uno USB (puesto que realmente son RS232 con una FTDI) por 9$, ese lo destriparé y de ahí sacaré la interfaz RS232-CAN-BUS via ELM327 para las dos cosas que necesito (programar CAN-BUS en Arduino me da más palo).

    Gracias también por los enlaces, si consigo algo decente lo publicaré :)

    Saludos!

    ResponderEliminar
  4. Hola Xkr, sobre el ELM327 es un PIC con un periférico interno de gestión del bus CAN y un driver de acceso al bus físico. Este periférico interno también existe como chip externo: MCP2515.
    La ventaja del ELM327 es que tienes todo el software de acceso a bus ya escrito dentro del PIC, pero aún no he comprobado que pueda escribir fácilmente al bus simulando mensajes para cerrar puertas, subir cristales, etc.. (no supongo que haya ningún problema)
    Mi idea es en vez de usar el ELM327 es usar un PIC 18f2480 con este periférico interno y otro chip a modo de driver de acceso al bus: MCP2551.
    Ya tengo esquema y PCB diseñado en SMD, pero pedí presupuesto en mi empresa para 3 prototipos y me salía por un pico así que estoy pendiente de rehacer el PCB para poder insolar la placa en casa. Iba a subir una entrada al blog cuando rediseñase el PCB pero ahora mismo me estoy peleando con el Centrafuse y lo he dejado algo de lado. SI te puedo echar una mano cuando te llegue el ELM dímelo.

    ResponderEliminar
  5. Gracias Abel, es justo lo que conozco.

    Tengo precisamente dos placas de pruebas con PICs 18F + MCP2551 con el ejemplo de CCS CAN-BUS en mis manos, un amigo que las tenía me las ha prestado.

    Lo ideal es usar PIC, pero yo se que si me pongo a programar en el PIC, al final lo dejo plantado, como sucedió con el CarPC interface. Cuando conseguí hacer funcionar el USB nativo del PIC, ahí lo dejé, parado ¿por qué? Por perrería de no continuar con él, sabiendo que es laborioso el trabajo. Sin embargo con Arduino, programar se me hace más ligero, aunque no tenga (ni de lejos), la potencia de PIC.

    Seguramente al final acabe eligiendo el mismo esquema, puesto que -como siempre- Arduino se quedará quedando corto.

    A ver si sacan alguna versión de Arduino con CPU más potente (más RAM, CAN-BUS nativo, USB nativo, y un segundo UART o definibles, ya de paso, como trae el ATmega1280), porque sería lo que le falta a Arduino: potencia - puesto que facilidad de uso ya solo hay que ver cuanto ha crecido en tan poco tiempo.

    Bueno, por pedir que no sea ;)

    Saludos, y espero que soluciones pronto la configuración de CF y continues!

    ResponderEliminar
  6. Bueno, no se si son buenas o malas noticias xD

    La buena es que tengo el esquema de conectores del Honda Accord 2008,2009,2010,2011,2012 (keywords para el buscador xD), está en el Manual de Taller específico. Aquí lo dejo:

    http://xkr.es/accord/conectorOBDIIaccord.gif

    Lo malo es que no parece usar CAN para el bus de confort, si no K line of ISO 9141-2 and ISO 14230-4 (lo digo porque aparece UNIDAD DE SONIDO en la descripción).

    Esto segun el conector OBD principal. Segun el esquema del conector de la radio:

    http://xkr.es/accord/conectorRadioPart1accord.gif

    Aparte de la K-LINE, si te fijas, abajo derecha están el B-;CAN-H y B-;CAN-L que parecen ser DIFERENTES a los del motor, asi que es posible que haya CAN-H y CAN-L para confort, accesibles solo desde dichos conectores.

    Esto por probar la linea K-LINE, pero me da cague porque ahí entra todo: Airbags, Inmovilizador, etc.; aunque me da pereza abrir toda la radio para sacar estos cables xD

    ¿Pruebo con AT TP/SP 3 4 y 5 o intento probar el CAN de la radio directamente?

    Saludos!

    ResponderEliminar
  7. Es posible que el K-Line solo esté para diagnosis y no aparezcan mensajes de otras centralitas.
    Prueba con el CAN, seguramente el que va a la radio sea el de confort.

    ResponderEliminar
  8. Buenas nuevas Abel, he conseguido conectarme al B-CAN y monitorizar el tráfico satisfactoriamente, con el mismo protocolo que el Mazda (ATSPB), y he conseguido sacar algunos de los mensajes (velocidad, ...).

    Ahora lo que buscaría sería inyectar mensajes para provocar acciones, p.e. apertura/cierre de puertas, ¿cómo podría hacerlo con el ELM327? he visto lo de Set Headers, etc., pero todavía soy ducho en el tema.

    Lo que si he conseguido son algunos mensajes de acciones especiales, gracias a un amigo que lo ha conseguido hacer antes y trabaja para una empresa en Korea, pero obviamente él no trabaja con el ELM327.

    A ver si esta tarde avanzo un poco y pruebo alguna cosa más mientras me dure la batería del portátil.

    Saludos y gracias por tu ayuda!

    ResponderEliminar
  9. Ah, se me pasó preguntarte por las cabeceras, activando ATH1 y ATD1 algunos de los que recibo son lo siguientes:

    0E F8 20 13 1 00
    12 F8 A2 30 1 00
    12 F8 50 50 5 00 00 00 80 00
    12 F8 53 51 8 00 00 00 00 00 00 65 80
    12 F8 32 30 1 08
    0E F8 73 74 2 00 FF
    12 F8 50 50 5 00 00 00 80 00
    0A F8 72 74 1 00
    0E F8 14 96 1 00
    12 F8 31 30 1 08
    16 10 FF 96 0 RTR
    12 F8 44 30 1 00
    12 F8 51 50 5 00 03 40 00 00

    Pero ahora estoy "descifrando" puesto que tu en otro post indicabas "ID Receptor Emisor B0...".

    Además me parece que no todos los módulos envían información, p.e. si toco las teclas del volante no se envían mensajes nuevos.

    ResponderEliminar
  10. Hola, en teoría al activar las cabeceras ves la identificación del mensaje: normalmente consta de la dirección del emisor y la del receptor pero si una misma centralita envía varios mensajes diferentes, la dirección del receptor cambiará.
    Los mandos del volante van conectados directamente a la radio, simplemente son dos cables en los que se mide una resistencia en función de los botones pulsados.

    ResponderEliminar
  11. Esto es una platica avanzada...
    Solo quiero conectar mi tcode pro (programador de llaves) al puerto OBDII pero solo veo 2 conectores azules sueltos...

    ResponderEliminar
  12. Hola, puedes decir que coche es?

    ResponderEliminar
    Respuestas
    1. Un Accord 2002, legalizado, osea de origen Norteamericano...

      Eliminar
  13. BUenas noches compre un dispositivo elm327 bluetooth para conectarlo a mimazda 3 del año 2007. funciono dos dias y luego no volvio a conectar a la ecu. da error 104 odb2 protocol. Podrias ayudarme con esto para ver si es posible que vuelva a conectarse??

    Gracias de antemano.

    ResponderEliminar
  14. Lo siento, sobre códigos OBD no sé nada ya que no los he usado para nada. Ni en el manual del ELM327 sale nada del error 104.

    ResponderEliminar
  15. Buenas: la verdad que llevamos tiempo intentando sacar datos del coche por obd, nos hemos comprado un dispositivo por bluetooth y lo primero que vimos con 0100 es que... mi coche da los datos que necesitamos (estamos intentando ver el nivel de combustible).

    Así que hemos empezado con el bus CAN pero... lo primero que he visto en este foro me deja de piedra... como puedo saber si mi conector OBD de mi coche está conectado o no al bus de comfort? Mi coche es un Honda Civic.

    ResponderEliminar
  16. Hola Carlos, no se si necesitarás usar el bus de comfort para conseguir el nivel de combustible. Hay que buscar el mensaje OBD asociado (si existe, lo desconozco). Si no ir analizando las tramas CAN del bus de motor, si es el mismo que hay en el conector OBD,porque incluso es posible que en el conector OBD vaya un bus CAN desde la centralita específico y no aparezcan los mensajes entre centralitas. Haz pruebas a leer mensajes CAN y a enviar peticiones OBD.

    ResponderEliminar
  17. Can someone give me the list of CAN ids for ABS control module, airbag control module, EPS, BCM etc.?
    For example, for engine it is 7E0. So, if I send AT SH 7E0, then 18 00 FF 00, I receive DTCs in the engine. How do I get for the other modules?

    ResponderEliminar