Curso Arduino y robótica: Eventos y estrategias antibloqueo en bucle

Uno de los problemas asociados a la programación secuencial es su dependencia temporal. Existen muchos problemas asociados a la ejecución correcta de cada una de las tareas en el tiempo y que ejecutamos habitualmente en bucle.

La mayoría de tutoriales de iniciación no profundizan en este aspecto, ya que nuestros programas se convierten en algo más largo y más abstracto. Pero tener en cuenta estos modelos, nos permiten diferenciar el grado de conocimiento de un programador que invierte un tiempo para añadir calidad al desarrollo de sus programas.

 

La primera regla a aplicar en las estrategias antibloqueo es:

NO USAR DELAYS NUNCA

Pero nunca, nunca, nunca

Quizás en algunas aplicaciones se usen delays con un tiempo muy pequeño en una acción concreta que solo ocurra una vez fuera de bucles, per se han de evitar en la medida de lo posible.

Un delay, bloquea el desarrollo normal de nuestro programa. En un sistema en el que tenemos sensores que actualizan la información del exterior, esta acción provocaría errores entre la lectura y las acciones a procesar.


Por ello, vamos a estudiar los distintos modos antibloqueo que podemos elaborar para mejorar nuestros programas. Abordaremos 3 modos antibloqueo que mejorarán la calidad de procesamiento de nuestros programas.

Eventos discretos

Si nos hemos fijado en los ejercicios anteriores, al realizar una acción en bucle, estabamos mandando una acción a ejecutar en cada iteración, aunque esta fuera la misma.

Esto es innecesario, y suele estar relacionado con las máquinas de estados finitos. Una máquina de estados es aquella que evoluciona de un estado a otro, cuando detecta una bandera ( flag ); que puede ser interpretado como la activación de un sensor; y que le permite evolucionar al siguiente estado esperando al siguiente flag.

Los eventos discretos se pueden representar de la siguiente manera, en la que el estado S1 al S2 al recibir una señal 1 ó 0.

Si le proporcionamos un título o significado a cada uno de los estados y transiciones, podremos modelar una máquina funcional.

Estos modelos son independientes del tiempo y solo deben activarse una sola vez de transición en transición. Por lo que nuestro funcionamiento anterior en bucle habría que depurarlo.

Eventos Temporales

Los eventos temporales son aquellos que dependen del tiempo y deben ejecutarse en el bucle, pero requieren de un control de tiempos, ya que nuestra placa Arduino realiza operaciones a 16Mhz ( 16 millones de operaciones por segundo ). Es decir que quizás no hace falta leer sensores o ejecutar acciones en cada iteración.

Estos modelos son la base de los sistemas de tiempo real, en el que una serie de taréas deben repartise el trabajo y los recursos para poder asumir las complejidades de un programa. Pero en nuestra placa Arduino no vamos a aplicar un gestor de taréas, ni tampoco tiene la capacidad de realizar tareas en paralelo o multihilo.

Pero por ejemplo, si que podemos aplicar eventos temporales cuando:

  • Una acción depende de un reloj o cronómetro.
  • Una acción depende de un sensor y la lectura requiere de un tiempo excesivo que bloquea la lectura de otros sensores.
  • Una acción de actualización ( o refresh ) bloquea las lecturas de sensores.
  • Se requiere de una conexión inalámbrica y los datos no se transmiten de forma instantánea.

Ejemplos reales

Un sensor que tarda en hacer lecturas es el sensor de color TCS3200. Cada lectura necesita procesar durante unos millisegundos distintas lecturas, calcular la media y comparar respecto a unos colores de referencia para obtener el color que lee es el correcto. Para más información aquí.

Una pantalla TFT conectada a nuestro Arduino requiere procesar muchos pixeles en cada cambio. Si realizamos la ejecución de una acción en cada iteración que tarda demasiado en propagarse, en el momento que leamos un sensor, ese valor no se ajustaría a la realidad. Al fin y al cabo los cambios que puede apreciar un ser humano es de 30 fps, por lo que ni siquiera valorariamos el cambio de un estado a otro tan rápido como su operación en bucle.

Imaginaros si no, como habríamos conseguido este efecto navideño.

 

Interrupciones

Un modelo muy útil para superar los modelos anteriores es la declaración de interrupciones. Nuestra placa Arduino dispone de un procesador que atiende al cambio de algunas señales para darles prioridad.

Las interrupciones son señales que permiten al chip parar y salir del flujo normal de un programa y manejar tareas que requieren una atención inmediata antes de continuar con lo que estaba haciendo.

Las interrupciones suelen ser funciones muy breves, ya que una interrupción que se prolonga mucho tiempo puede causar que otras interrupciones se retrasen.

 



¿Qué estrategia antibloqueo es la que quieres aprender?

Puedes acceder además a los ejemplos de código que desarrollaremos durante el curso a través de nuestro Github.

Documentacion ZaragozaMakerSpace Github

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

2 × cuatro =

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.