El watchdog que te vigilaba ahorita no, ¿Ahorita ya?
Y creo que mi vuelta ha de ser de esta guisa, lenta, hawaiana, suavesita…. ¿Hablamos de ese ahorita voy ahorita llego de la programación? ¿Saquen a los perros, ya no hay vuelta atrás!
¿Watchdog o temporizador?
Cuando hablamos de tiempos es habitual hablar de temporizadores o timers. Y en el fondo lo de hoy no es más que un temporizador… Un temporizador lo suficientemente extraño para llamarse (literalmente) “perro guardián“. Aunque entre la jerga electrónica y tal lo llaman watchdog. Ya sabes que las palabras en inglés siempre nos suenan mejor a los hispanohablantes….
La función del watchdog es vigilar al sistema, de manera que cuando el sistema se queda bloqueado (‘Pajarito’ que diríamos en España), el watchdog (siempre vigilante y fiel) se encarga de volver al sistema a un punto estable. Este punto estable en un avión no es apagarlo todo, pero en un Arduino sí. Así que nada de controlar aviones con Arduinos…
La verdad es que yo no suelo utilizar el watchdog en mis proyectos, seguramente porque no manejo cosas importantes ni de larga duración. Pero supongo que alguien que tiene la casa domotizada con Arduinos, le sentará un poco mal que su casa deje de estar trabajando para él por un simple error de bits que se colaron cuando no tocaban…
Cómo funciona un watchdog
Ahorita, a lo que toca, cómo funciona esto del watchdog. Un watchdog es un temporizador independiente. Los temporizadores no son más que contadores que van restando hasta llegar a cero. Lo que tienen los temporizadores es que sabiendo la frecuencia del reloj que estamos utilizando podemos saber el tiempo de espera que estamos poniendo.
Pues el watchdog es eso, una cuenta hacia atrás. pero no nos importa nada el tiempo, vamos sobrados de tiempo, vamos con calma mi vida con calma…. Lo que nos importa es detectar que algo está fallando. Para ello lo que pasa es que este contador lo vamos actualizando con un número. Si el programa se bloquea y no pasa por esa actualización, el contador va restando poco a poco y si llega a cero, el propio Arduino sabe que ha habido un problema.
Es decir, tenemos una cuenta atrás, si estamos bien, le avisamos en plan: “Hola! Qué tal? Todo bien por acá”. Si nos pasa algo y no decimos que todo está bien, el contador llegará a cero y Arduino sabrá que algo fue terriblemente mal (Estoy de un intensito desde que he vuelto…).
La solución de Arduino ante esto es reiniciarse ya que como el programa es un bucle continuo, la única manera que tiene de volver a un estado base es reiniciarse y poner todos los valores de las variables a cero.
Dolores de cabeza con los vigilantes de Arduino
Es decir, hemos encontrado algo que nos permite tener un Arduino encendido de manera continuada ya que si hay algún fallo y el Arduino está a 500km de distancia, él solo será capaz de reiniciarse a un estado estable y volver al inicio. Seguramente haya alguna pérdida de información pero no tiene por qué pasar nada grave.
O sí… Ya que puede que no hayamos sido lo suficientemente precavidos en el inicio y si teniamos un motor con una palanca desplazada hacia adelante, esto interfiera en el reinicio de la máquina. Moraleja: hagamos una inicialización perfecta que lleve a todo el sistema a un punto totalmente estable. Sino se puede liar más que si el Arduino se quedara colapsado y no respondiese a nada de nada.
Otros problemilla que puede surgir es que no refresquemos el tiempo de manera adecuada. Puede que le digamos al watchdog que su tiempo es de 1 segundo, pero nuestro programa refresque cada dos segundos. Ahí tenemos un problema ya que Arduino entrará en un bucle de catastróficas desdichas y se reiniciará constantemente sin que podamos hacer nada para evitarlo.
Otro problema podría ser que pusiésemos alguna condición para refrescar el watchdog. Si se diese un caso inesperado que no controlamos podría ser que, cuando este caso sucediera, el watchdog no se refrescara y se reiniciara. Si no estuviésemos atentos, nos podría parecer que es algo aleatorio que nos volvería un poco más locos si cabe…
Información básica sobre Proteción de datos
Responsable ➥ Sergio Luján Cuenca
Finalidad ➥ Gestionar el envío de correos electrónicos con artículos, noticias y publicidad. Todo relacionado con los temas de rufianenlared.com
Legitimación ➥ Consentimiento del interesado
Destinatarios ➥ Estos datos se comunicarán a MailRelay para gestionar el envío de los correos electrónicos
Derechos ➥ Acceder, rectificar y suprimir los datos, así como otros derechos, como se explica en la política de privacidad
Plazo de conservación de los datos ➥ Hasta que se solicite la supresión por parte del interesado
Información adicional ➥ Puedes encontrarla en la política de privacidad y el aviso legal
Un poco de código para Arduino…
Sé que esto parece una despedida, pero aún queda lo más importante: ¿Cómo utilizo el watchdog en Arduino? Lo primero será añadir la librería que nos permite controlar el watchdog a nuestro programa de Arduino. Para ello hay que añadir este código al inicio:
#include <avr/wdt.h>
Las funciones que contiene esta librería son realmente sencillas, ya que en realidad el mecanismo no es demasiado complejo. Hay que activar la alarma, refrescarle los tiempos y desactivarla. Para activarla utilizaremos al función wdt_enable():
wdt_enable(WDTO_15MS);
Como ves, se le añade un parámetro a la función. Este parámetro marca el tiempo que esperará el reloj antes de comprobar si su valor es 0 (y no se ha refrescado) o es superior (y el sistema funciona establemente). Como ves, este parámetro tiene una nomenclatura extraña.
Al final es WDTO_tiempo, donde tiempo puede ser 15MS, 30MS, 60MS, 120MS, 250MS, 500MS, 1S, 2S, 4S, 8S. Por si aún no lo has imaginado, MS significa milisegundos y S segundos. Por lo que somos capaces de crear temporizadores desde 15 milisegundos a 8 segundos.
A partir de añadir esta línea en nuestro código, empezará la cuenta atrás del watchdog para vigilar que todo va bien. Puede que esta cuenta no nos interese en ciertas partes por alguna razón. Por ello podemos añadir la línea:
wdt_disable();
A partir de esta línea se desconectará el watchdog. Al volver a pasar por la línea de activación, el watchdog se reactivará con normalidad. Esta línea puede ser utilizada al inicio del setup, de manera que al reiniciarse Arduino, no tenga ya activo el watchdog ya que puede suponer algún problemilla… O no…
Por último, habrá que refrescar el valor del watchdog, esa es la tarea más importante para que todo funcione bien y detectar que no han habido fallos por el camino. Para ello utilizaremos al línea de código:
wdt_reset();
Esta línea hay que ponerla en algún lugar dónde tenga sentido el reinicio y siempre teniendo en cuenta que nunca llegamos al tiempo de referencia que marcaste en el wdt_enable().
Ahoraita vine, ahorita me voy…
Pues aquí, ahorita mismo, llegamos a nuestro querido final. Siento la espera y gracias a aquellos que estáis detrás apretando lentamente para que siga empujando y saque tiempo para escribir tan solo unas líneas que siempre me alegran cuando puso el botón ‘Publicar’.
¿Nos vemos pronto? ¿Serás capaz de no quemar nada con el watchdog en mi ausencia?