«Hackeando» el CAN bus de un Peugeot 5008 y un Opel Astra

El maldito Start&Stop (S&S)

Hay una cosa que me molesta de los coches nuevos : con la intención de reducir el consumo y la contaminación en ciudad se inventaron el mecanismo del Start&Stop (S&S). Cuando el coche se detiene este invento para el motor del coche, y cuando  soltamos el freno para volver a movernos lo arranca de nuevo.

La idea puede ser medio buena y efectiva cuando el coche se detiene un rato largo (p.e. en un semaforo que se nos pone en rojo), pero cuando la parada es muy corta (p.e. cuando dejamos pasar a otro coche), es contraproducente: en lugar de consumir a bajas revoluciones p.e. 5 segundos, el motor se para esos 5 sg, pero debe poner en marcha el motor de arranque y arrancar para seguir la marcha (y el arranque es un momento de consumo y contaminación altos). Esto lo hace además «machacando» la bateria y probablemente algún otro elemento del coche (por eso los coches con S&S necesitan baterías más potentes, que cascan antes, y que cuando bajan de un cierto voltaje deshabilitan el S&S).

Pero no es sólo por los daños a la batería y su probable inutilidad (yo vivo en las afueras de una gran ciudad por lo que poco semáforo me encuentro), al menos en paradas cortas,  lo que me molesta, no. La primera vez que lo sufrí fue en una rotonda que hay en una autovía con 4 carriles, 2 en cada sentido. Al llegar a la rotonda desde una carretera lateral me paré un momento porque pasaba un coche, con la intención de continuar antes de que llegara el siguiente, y hete aquí que el coche se para y cuando voy a salir, con la prisa de aprovechar el hueco,  todavía tiene que arrancar… En esta ocasión provocó que me parara, manteniendo el embrague apretado para que no entrara de nuevo el S&S dichoso y esperara el siguiente hueco, pero bien podía haber provocado un accidente.

Lo otro que no me gusta es que, aunque el S&S se puede desactivar, está activado por defecto al arrancar el coche. En el Opel Astra hay un botón para desactivarlo, pero p.e. en el Peugeot 5008 no lo hay, hay que navegar por los menús de la pantalla para llegar al punto en que se puede deshabilitar.

Y los fabricantes no han puesto una opción para configurar si lo quieres activado o desactivado por defecto (en mi caso claramente estaría desactivado). Supongo que es cosa de la legislación anticontaminación, porque no creo que lo hagan por fastidiar al conductor/cliente.

Llegados hasta aquí empecé a pensar en maneras de librarme del engorro (y poder activarlo sólo cuando bajara a Madrid), y se me ocurrieron 3 alternativas:

    • En el Astra, dado que hay un botón, podía poner un pequeño circuito que activara el botón (un relé entre sus 2 contactos) al poco rato de encender el coche. Esto habría funcionado (con la necesidad de desmontar, ubicar los contactos del pulsador y montar un circuito con su alimentación), pero no es solución para el 5008.
    • Dado que en ciertas situaciónes el S&S no se activa (batería baja, luneta térmica encendida, mucho calor,…), podía forzar o fingir alguna de estas situaciones. Todas son válidas por lo que pensé en la batería y la luneta como las más sencillas (activo la luneta pero le pongo un interruptor en el cable que la alimenta, de manera que no le llegue energía si no la quiero). Esto debería funcionar en cualquier coche pero parece que lleva más cableado y toqueteo en más sitios para dejar un «buen acabado y usabilidad».
    • Dado que existe una manera de desactivar el S&S en todos los coches, esta instrucción debe llegarle de alguna manera a la centralita. En los coches moderno a través de una red interna. Si pudiera identificar el mensaje podía intentar reproducirlo al poco de arrancar el coche y así desactivar el S&S automáticamente.

Ha sido esta última alternativa la que me ha convencido más (juntandola a mi gusto por el cacharreo) y me he puesto a ello (todavía no he llegado al final del camino y no sé si tendré o no éxito).

Para andar este camino, me he «subido (cómo no) a hombros de gigantes», he aprovechado cosas que ya existen para no reinventar la rueda (intentaré mencionar las fuentes según pase por su uso).

El CAN bus

Qué es el CAN bus?

Antiguamente, si un elemento del coche se tenía que conectar a otro se tiraban un par de cables de uno a otro y asunto resuelto. Cuando apareció la centralita electrónica (que se tiene que hablar con casi todo), la maraña de cables que iba de la centralita a cada uno de los elementos era impresionante, y se añadía además los cables entre elementos que se conectaban sin pasar por la centralita. Todos queriendo hablar a la vez. Un lio.

Hacia 1985 Bosch diseño una red de comunicaciones específica para coches: el bus CAN (Controller Area Network). La red físicamente consiste en un único par de cables que van de un elemento a otro y que permite que todos los elementos puedan enviar y recibir mensajes. La señal en los 2 cables es diferencial, para reducir el ruido al recibir interferencias. Cada elemento tiene un identificador (ID) y cuanto más bajo sea éste mayor prioridad tendrán sus mensajes en caso de conflicto en el acceso al medio.

La definición del procolo se ha estandarizado y ha ido evolucionando. Una versión común es la v2.0 (aunque posteriormente se ha definido CAN FD que permite alcanzar mayores velocidades y que ésta no sea constante ). En la v2.0 la comunicación se establece mediante tramas cortas de longitud variable que se pueden emitir en broadcast o esperando respuesta de un dispositivo concreto. La trama típica contiene el ID del dispositivo emisor, la longitud de los datos a enviar y los datos.

Por desgracia para mi solución, el coche tiene más de un bus CAN (para aislar «temáticas») y hay que meterse en el adecuado para escuchar e intentar reproducir el mensaje que desactive el S&S. El bus CAN más accesible es el de diagnóstico, que se ubica en ambos coches debajo del volante (a la izquierda en el Astra y a la derecha en el 3008/5008), por lo que empezaré por ahí. Hay otros buses, como el de Comfort o el de Sistema.

Hay que tener en cuenta que desde 1991 es obligatorio que todos los coches nuevos vengan con un conector ODB (actualmente ODB2=ODBII) que dispone de conexión al bus CAN de diagnóstico. De hecho, desde 2018 es obligatorio que la ITV se conecte al coche a través de este conector para ver si hay fallos registrados que puedan afectar a su resultado (p.e. contaminación).

Uno de los problemas que sé desde un inicio que voy a tener es la falta de información al respecto de los buses, los dispositivos y la mensajería. Esto se debe probablemente a 2 motivos : por un lado secretismo y deseo de confidencialidad por parte de los fabricantes, y por otro riesgo de afectar al funcionamiento del coche si el usuario se pone a tocar donde no debe ni sabe.

ADVERTENCIA (y disclaimer): jugar con los buses del coche podría provocar un mal funcionamiento de éste, averías, pérdida de la garantía y eventualmente un accidente. NO LO HAGAS EN NINGUN CASO CON UN COCHE EN MARCHA O QUE VAYA A CIRCULAR POR VIAS PUBLICAS. Si no haces caso de esta advertencia lo hacer a tu propio riesgo, y el de los demás si la aventura acaba en accidente. Esto incluye cualquier conexión no homologada a los sistemas internos del coche o la introducción en los buses de mensajes ajenos al diseño del coche. La lectura de mensajes en el bus de diagnóstico con un dispositivo homologado es mejor hacerlas con el coche parado.

Cacharrería

Hace unos años me compre una pequeña herramienta de análisis de diagnóstico para el coche : un conector ODB2 con conexión por bluetooth al teléfono. En mi caso fue un Mini ELM327 con Interfaz V2.1 Bluetooth, que puedes encontrar en amazon o aliexpress por unos 5€. Usando este dispositivo desde un teléfono android con aplicaciones como Torque puedes consultar unos cuantos elementos del coche o ver p.e. los fallos registrados. Pero este dispositivo no permite el cacharreo.

Lo primero que hice cuando empecé a interesarme por el tema de S&S fue comprar algunas piezas :

    • Un conector ODB2 con doble salida (de manera que pudiera conectar mi dispositivo y aún tener disponible un conector)
    • Un interface para poder conectar el coche a un arduino: por un lado se conecta al CAN bus (CAN-H y CAN-L) y por el otro tiene conexiones para montar un bus SPI con el arduino (SCK, MISO,MOSI,CS).
    • Un arduino nano. Mi idea original fue conectar un ESP32 (porque me gusta más, es más rápido, tiene wifi, etc), pero dado que al final (si tenía éxito) el dispositivo sería autónomo (no necesita conexión a PC o móvil), decidí pasar a Arduino para no tener que convertir niveles (3v3). Me decidí por un nano cuando buscando librerías para manejar la placa caí en esta página, donde se puede montar un circuito básico que comunica coche y PC (a través del monitor Serial de arduino).

En esta imagen podéis ver mi dispositivo completo tras comprobar que funciona (se comunica con el PC).

Además de los elementos anteriores tiene un 7805, para sacar 5v a partir de los 12v que hay en el ODB2, y le pondré un interruptor, para poder apagarlo o poder desconectar el 7805 cuando la alimentación le llegue por el USB.

El Software

Para escuchar en el bus he partido del programa de ejemplo que viene con la libreria (se conecta al bus y saca por el puerto serie los mensajes que recibe) y un programa en python de alguien que ha jugado con el bus antes que yo.

He modificado ambos programas (y más que los tocaré), pero en mi primera prueba ya he conseguido ver información del Astra

Ahora toca empezar a investigar…

Codillo a la mostaza con miel

Ingredientes

2 codillos en salmuera (unos 400gr de codillo por persona)
2 cebollas
4 cucharadas de mostaza antigua
4 cucharadas de miel

Opcional: puré de patata, col cocida y/o compota de manzana

 

Poner los codillos en remojo durante unas 10 horas, para reducir el nivel de sal (si no saldrían muy salados; con este lavado tampoco hará falta añadir sal al cocinar). Cambiar el agua 1 o 2 veces.

Desalar codillo

Transcurridas las 10 horas, secarlos y huntarlos con la miel y la mostaza. Dejarlos reposar el mayor tiempo posible (si pueden ser 4-6 horas mejor, en la nevera).

Macerar con miel y mostaza

Cortar las cebollas en tiras o trozos pequeños y pocharlas.

Poner la cebolla pochada en la crockpot, y encima los codillos, con toda la miel y mostaza que les habíamos puesto.

Poner la crockpot en low, durante 10-12 horas.

Al cabo de las 10 horas los huesos deberían quedar sueltos y poder sacarse sin destrozar el codillo. Sacarlos y reservarlos para hacer una buena sopa otro día.

crockpot 10 horas después

Poner los codillos en una bandeja, sin la salsa (suelta bastante, muy sabrosa), y meterlos en el horno durante 15 minutos a 200º, para tostar la piel e intentar que se quede crujiente (yo no lo he conseguido). Se pueden proteger las partes sin piel con un poco de papel de aluminio.

La salsa es bastante abundante y la podemos reducir poniéndola al fuego fuerte durante 15 minutos, o hasta que veamos que la cantidad es la adecuada.

Para acompañar se puede hacer un puré de patata, una compota de manzana o añadir un trozo de col cocida (he probado a meter la col junto con el codillo para que se hagan juntos, pero le da demasiado sabor, mejor cocerla aparte).

Sacar del horno y servir con la salsa y el acompañamiento.

Y si sobra lgo siempre puedes hacer unas ricas croquetas de codillo a la mostaza con miel!

Arduino y ESP32

Hace unos años empecé a conocer el mundo arduino y a construir y programar mis primeros circuitos útiles (principalmente 2):

    • Un monitor de una instalación fotovoltaica aislada, que me enviaba por GPRS el estado de las baterías junto con información de temperatura, humedad, carga desde un pequeño molinillo,etc. Mediante SMSs podía también enviarle comandos (rearrancar el inversor, cortar el riego,…)
    • Un monitor doméstico para control de apertura de la puerta principal, de la puerta del garage,sensores de movimiento, temperatura,… enviando también mediante un ESP8266 información que recogía en una BD.

Las principales ventajas de arduino para mí han sido siempre su bajo coste, la disponibilidad de accesorios, sensores, actuadores,…, el gran número de pines de I/O (siempre he utilizado una placa Mega, generalmente con una pantalla), la facilidad de programación,etc

El principal problema que me he encontrado con arduino ha sido la iteración con las placas de comunicaciones. Tanto la comunicación con la placa GPRS como con el ESP8266 era a través de comandos AT, que no dejaban de dar problemas. En algún momento intenté también algo con una placa bluetooth, pero tras varios fracasos acabé desistiendo.

Al poco de enterarme de que el ESP8266 se podía programar y usar como microcontrolador (que ignorante antes, eh?) conocí la existencia del ESP32, y ahí acabó para mi la relación con las placas arduino.

El ESP32 es más potente que las placas arduino, tiene más velocidad, más memoria, 2 cores de procesamiento, incorpora wifi y bluetooth y tiene librerias que te evitan el angorroso mundo AT. Su único inconveniente (al menos hasta ahora), es que dispones de menos pines de I/O, y eso se nota en algunas aplicaciones (pero afortunadamente no es problema en muchas otras).

En mi caso lo estoy utilizando para todas mis nuevas ocurrencias, y aún mantengo mi monitor de baterías sobre arduino, pero quien envía la información ahora es un ESP32 via wifi, y me he quitado la placa GPRS.

Me mantengo en el entorno IDE de arduino por comodidad, y he probado varias placas:

    • Placa de Heltec con pequeña pantalla incorporada
    • Placa DevKit v1
    • Placa de TTGO con pequeña pantalla a color
    • Placa DevKitC, con antena incorporada o antena externa

Pero me he encontrado problemas. El principal ha sido en una aplicación relativamente compleja (unas 3000 líneas de código, varios sensores y actuadores, envío de información a BD, control via wifi de los dispositivos desde una aplicacion en el móvil, e incorporando ahora control via bluetooth).

Los problemas:

    • Tiene menos pines que el arduino MEGA, pero además algunos de ellos tienen limitaciones (principalmente de cara al arranque, el 0, el 12, el 15).
    • Hice uso de los contactos touch que tiene, pero el umbral de disparo es variable y tenía demasiados falsos positivos a pesar de filtrar las lecturas. Al final decidí cambiarlos por pulsadores.
    • Es un dispositivo que internamente y en los pines I/O funciona con 3,3v, lo que implica revisar los sensores y usar adaptadores de nivel (p.e. en mi caso para los relés y algún led -con 3,3v hay que ser más esquisito con el voltaje de caída del led y la resistencia-), 1€ el shifter de 8 circuitos.
    • De vez en cuando rearrancaba al encender cosas. Es más sensible a los picos en la alimentación que el arduino. El problema se ha resuelto añadiendo un condensador entre Vcc y GND, y en algunos casos separando algunas  cargas altas a una 2ª fuente de alimentación. De los 3 posibles modos de alimentarlo [por el USB,  por el pin de 3,3v o por el pin de 5v] yo lo alimento por los pines 5v-GND.
    • Al cabo de varias horas o varios días de repente se colgaba. Por supuesto el primer sospechoso es el código, pero no encontré nada raro. A pesar de eso hice algunas mejoras que no resolvieron el problema:
      • Eliminación de la mayoría de usos del tipo String, dado que fragmenta la memoria.
      • Control del espacio libre de heap, stack y máximo bloque asignable.
      • Añadir un watchdog para loop().
      • Añadir en el Core-0 un control sobre el funcionamiento de loop (que corre en el Core-1)

Nada de esto funcionó, el watchdog tampoco, ni el control desde el Core-0. Seguía el hanging total del dispositivo, a pesar de que el programa corría sin problemas en un TTGO que no tenía nada conectado.

Esto y el hecho de que se colgaba siempre al desactivar un relé, me ayudo a encontrar al culpable: el pico de tensión que causaba el relé al desconectar la carga inductiva que había detrás (un transformador). Las cargas inductivas intentan mantener la corriente en el momento de desactivar el relé. Esto suele provocar una chispa entre los contactos del relé, pero lo que yo notaba era ese cuelgue en una de cada n desactivaciones.

La solución: un circuito snubber colocado en paralelo a la carga en cada uno de los relés que actúan cargas inductivas (en mi caso un transformador y unas electroválvulas), por 0,50€.

Cambiar Disco Basico en Synology

Tengo un Synology 218 con 2 bahías, con 2 discos de 3TB en modo básico (sin redundancia) que se están llenando.

Después de buscar discos compatibles, que tuvieran capacidad, robustez y precio razonable, he comprado por amazon un disco WD-Gold de 12TB para sustituir el volume1 y no sabía cómo hacerlo (he encontrado instrucciones para cuando están en RAID, pero pocas cuando el tipo es básico).

El procedimiento sería hacer una copia de seguridad (dónde?), meter el nuevo disco sustituyendo al antiguo, configurarlo y restaurar la copia.

For Basic or RAID 0 volume on two and more bays models:

      1. Back up all data stored on the Synology Product.
      2. Turn off the Synology Product.
      3. Replace the internal hard drives with larger ones.
      4. Turn on the Synology Product.
      5. Reinstall the system.
      6. Copy the backed up data to the new volume.

Otros métodos tienen el problema de cambiar el orden de volume1 y volume2, lo que obliga a reconfiogurarlos o modificar las carpetas compartidas y las aplicaciones.

Buscando por internet he encontrado este método (gracias Mathieu), que tiene sentido y parece que funciona bien. Me he puesto con ello y os lo describo de manera más detallada (léelo completo antes de empezar a ejecutar pasos):

0- Siempre que vayas a tocar los discos, es conveniente hacer un backup de los datos importantes (deberías hacerlo con cierta frecuencia aunque no lo toques, un disco siempre se puede estropear cuando menos te lo esperas)

1- En DSM, desde el administrador de almacenamiento->HDD puedes dar a localizar unidad para confirmar en qué bandeja está un volumen determinado. Apagar el DS. Abrirlo y extraer de su bandeja/bahía el disco que vamos a querer dejar sin modificar (en mi caso el Volume2, en la bandeja2. El volume1 es el que quiero pasar al disco nuevo, lo dejo donde estaba). Puedes rearrancar para que reconozca la nueva situación, aunque no es necesario. Para no estar abriendo y cerrando la unidad a cada paso la he dejado abierta,tumbada sobre la cara que no se mueve. Al meter un disco estoy poniendo solo un par de tornillos en cada disco en lugar de todos, hasta que en el último paso llegue a la situación final,en que ya sí apretaré todos. Aprovecho esta operación para limpiar de polvo el interior (estaba lleno).

2- Insertar disco nuevo en la bandeja 2. Arrancar. En el gestor de almacenamiento vemos que ya no aparece el disco que hemos quitado, y en HDDs aparece el nuevo disco, sin inicializar (no le hacemos nada,lo hará el sistema en el próximo paso)

3- Convertir volume1 a RAID1. (Gestor de almacenamiento->grupo de almacenamiento->cambiar tipo RAID, no a SHR, sino RAID1). Dejarle que haga la copia al otro disco (podemos ir viendo el avance en Grupo de Almacenamiento. Tardará bastante -después de inicializar el disco nuevo, debe montar el RAID y copiar el S.O. y todos los datos. Para 2,5TB me ha tardado casi 8 horas con la mejora que indico abajo-).

Si desde un terminal ejecutamos cat /proc/mdstat podremos ver el avance, la velocidad de sincronización y el tiempo estimado para acabar (en mi caso inicialmente 100MB/sg y unas 8 horas).

$ cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md2 : active raid1 sdb3[1] sda3[0]
2925444544 blocks super 1.2 [2/1] [U_]
[===>.................] recovery = 19.1% (560982528/2925444544) finish=301.5min speed=130669K/sec

md1 : active raid1 sdb2[1] sda2[0]
2097088 blocks [2/2] [UU]

md0 : active raid1 sdb1[1] sda1[0]
2490176 blocks [2/2] [UU]

unused devices: <none>

En Gestor de almacenamiento->grupo de almacenamiento->configuración podemos decirle que priorice la sincronización sobre el uso normal para que la haga más rápido (en mi caso ha pasado a 130MB/sg, un 30% más rápido). Mientras copia el DS sigue activo, cuanto menos lo utilicemos para otras cosas mejor.

4- Apagar. Intercambiar de bandeja los discos 1 y 2 (para que el disco nuevo ocupe la posición en la que vamos a querer dejarlo definitivamente -podemos ponerle ya todos los tornillos-) y arrancar para que reconozca las nuevas posiciones.

5- Apagar y quitar el disco antiguo de la bandeja 2 y arrancar (arranca en modo degradado, y el nuevo disco ya está en el sistema y tiene toda la información). El sistema empezará a pitar para avisar de la falta de un disco del RAID (se puede apagar el pitido desde la consola o ejecutando el siguiente paso).

6- Desde el terminal ejecutar:

sudo mdadm  –grow  –raid-devices=1  –force  /dev/mdX

donde /dev/mdX es el device que corresponde al nuevos disco RAID (en mi caso /dev/md2).  Puedes usar  cat /proc/mdstat para listar todos los dispositivos RAID disponibles (los dispositivos RAID de 2 discos aparecerám como [UU] si están los 2 discos y [_U] o [U_] si sólo hay un disco de los 2 que lo forman).

Para entrar por terminal debes habilitarlo antes en el panel de control y usar una aplicación como p.e. putty para entrar por ssh (no olvides deshabilitarlo después para incrementar la seguridad de tu equipo evitando que te entren hackers -que lo intentan con frecuencia-)

Este comando le dice a  mdadm que ese dispositivo RAID usa sólo 1 disco en lugar de 2, y aparecerá como básico, como queríamos.

7- Se habrá apagado el pitido. En DSM, desde el administrador de almacenamiento->Grupo de Almacenamiento, veremos que el volumen ya es básico en lugar de RAID, pero su tamaño es el del antiguo disco. Hay una opción para expandir el volumen1 a ocupar todo el espacio disponible. Hacerlo y esperar a que acabe (serán unos pocos minutos). Deberá aparecer el volumen1 ocupando todo el espacio disponible, como RAID básico.

8- Apagar, insertar el disco2 (el que habíamos sacado para hacer hueco, pero que queremos conservar) en la bandeja2, como estaba  al inicio. Ya podemos poner todos los tornillos y cerrar la carcasa. Arrancar.

Deberíamos haber llegado a la situación que queríamos. Al arrancar me ha dado un aviso diciendo que había un fallo en la copia del sistema (cada disco contiene una copia del sistema DSM). En DSM->Gestor de almacenamiento->Visión General se puede ver el mensje y una opción Reparar que tarda unos segundos.

El disco que hemos sacado lo podemos meter en una carcasa de 3.5″ y conectarlo por USB al DS o usarlo como disco externo en otros equipos (PC, etc).