Accediendo al bus CAN

La 'médula espinal' del toyobaru y de cualquier otro coche moderno

Desde hace mucho tiempo he querido acceder al bus CAN de mi GT86 desde mi portátil corriendo Linux. De vez en cuando, navegando por las webs buscando accesorios para el coche, veía un cable ODB2-USB (o parecido) y lo compraba con la intención de poder conectarme a dicho bus. Bajaba al coche con mi portátil y el cable, lo conectaba a la salida OBD2 y al ordenador, pero no conseguía establecer ningún tipo de conexión.

Lo que si conseguía, normalmente, era que se encendiera el testigo de avería en mi panel de instrumentos.

Entonces se me pasaban las ganas de seguir cacharreando, pero afortunadamente no era una avería permanente y no tenía consecuencias para el coche. Uno o dos días después, el coche detectaba que lo que 'hubiera pasado' ya no pasaba y apagaba el testigo de avería, para mi alivio.

Pero pasaban los meses, veía un nuevo cable, atisbaba una hipotética explicación de lo que podía haber pasado la última vez y me lanzaba de nuevo a intentarlo, siempre con idénticos resultados y con el testigo de avería acompañándome unas horas luciendo en el panel. Lo intenté de varias formas por USB, RS-232, bluetooth (sin testigo de avería esta vez) y no lograba nada.

Hace un par de meses decidí volver a intentarlo, pero cambiando de estrategia: Iba a documentarme antes ...

Así que empecé a leer sobre SocketCAN (la bibliotecas de funciones que me propongo usar) y experiencias de gente usando dicho componente.

Entonces vi que era necesario disponer de un adaptador CAN-USB. Había varios dispositivos soportados por el kernel, y al final me incliné por el fabricado por 8devices, que tiene una entrada DB-9, que viene del coche, y una salida USB, que va al ordenador.

Ya tenía el cable ODB2-DB9, así que encargué el adaptador CAN-USB.

Cuando llegó el dispositivo, me bajé con los 'bártulos' al coche dispuesto a conectarme ... y lo de siempre. Para mi decepción, nueva luz de testigo de avería iluminando el cuadro de instrumentos.

¿ Qué demonios pasaba ahora ? Me descargué la hoja de características del adaptador CAN-USB y mapeé con un polimetro las conexiones entre el conector ODB2 y el conector DB9. Aquello no coincidía ...

Después de leer por ahí varias cosas llegué a la conclusión que mi cable ODB2-DB9 era conforme a la norma SAE J1962, y mi adaptador CANUSB esperaba la norma CiA Draft Standard 102 versión 2.0.

Así que tuve que comprar dos conectores DB-9 (macho y hembra), coger un cable, el soldador y hacer un cable puente que me convirtiera el nivel físico de un protocolo en el del otro. Según la información, basta que las señales CAN_H, CAN_L y tierra lleguen desde el coche al conversor CANUSB, y en los pines del conector DB9 donde el dispositivo los espera.

Y una vez más bajé al coche.

Conecté el ODB2 al coche y de ahí al dispositivo CANUSB a través de mi conversor.

Conecté el USB del dispositivo al PC.

Arranqué el PC

La luz del dispositivo se encendió en rojo.

Accedí al PC y abrí una sesión como root -superusuario- (esto debería evitarse, pero no quería tener problemas de permisos)

# lsmod

indica que todos los módulos del kernel para el dispositivo USBCAN están cargados.

# lsusb

detecta el dispositivo conectado al PC

# ip link show dev can0

muestra que el driver está presente, así que procedemos a configurarlo. Lo que he leido por los foros dicen que la velocidad del bus es de 500. kb/s, así que pasamos a configurar el dispositivo can0 como uno de tipo can, con una velocidad de 500000 bits/s y en modo de solo lectura.

# ip link set can0 type can bitrate 500000 listen-only on

Y levantamos el dispositivo

# ip link set can0 up

Y la luz del dispositivo USBCAN, que estaba en rojo, pasa a verde ...

Pulso el botón de encendido del coche, para que haya 'chicha' en el bus del coche.

Ya estamos listos para acceder.

Vamos allá ...

# candump -cae can0,0:0,#FFFFFFFF

y entonces la luz verde del dispositivo empieza a parpadear y en la consola aparecen multitud de mensajes del tipo

  can0  20000008  [8] 00 00 04 00 00 00 00 7F   ERRORFRAME
        protocol-violation{{bit-stuffing-error}{}}
        bus error
        error-counter-tx-rx {{0}{127}}

Vaya ... esto no era lo esperado ...

Busco el error en internet y lo que comentan al respecto es que se trata de un problema de configuración ... que la velocidad especificada es incorrecta ... ¿?

Recomiendan bajar el interfaz, reconfigurar con distintas velocidades y volver a levantarlo, hasta dar con la velocidad adecuada ...

Pero todos los foros que he leido dicen que el toyobaru tiene un bus de 500 kb/s, que es lo que he configurado ...

Bajo el interfaz

# ip link set can0 down

Pero no se muy bien que hacer ... así que vuelvo a levantarlo sin tocar nada

# ip link set can0 up

Y lo intento otra vez ...

# candump -cae can0,0:0,#FFFFFFFF

Y ahora si ... la consola se llena de datos ...

Por fin!

Superado este punto, todo debería ser más fácil ... la idea es hacer un programa para ir capturando datos y tratar de hacer "ingeniería inversa" sobre ellos a ver que puedo sacar ... Os seguiré contando ...

Añadir un comentario

El código HTML se muestra como texto y las direcciones web se transforman automáticamente.

Page top