Cómo Realizar Tareas Paralelas (subprocesos) En Un Programa Arduino

Tabla de contenido:

Cómo Realizar Tareas Paralelas (subprocesos) En Un Programa Arduino
Cómo Realizar Tareas Paralelas (subprocesos) En Un Programa Arduino

Video: Cómo Realizar Tareas Paralelas (subprocesos) En Un Programa Arduino

Video: Cómo Realizar Tareas Paralelas (subprocesos) En Un Programa Arduino
Video: COMO PROGRAMAR MULTITAREAS USANDO FUNCIONES EN ARDUINO 2024, Noviembre
Anonim

En la tecnología de microprocesadores, las tareas que se ejecutan en paralelo se denominan subprocesos. Esto es muy conveniente, porque a menudo es necesario realizar varias operaciones al mismo tiempo. ¿Es posible hacer que el microcontrolador Arduino realice varias tareas a la vez, como un procesador real? Veamos.

Flujos paralelos en un programa Arduino
Flujos paralelos en un programa Arduino

Es necesario

  • - Arduino;
  • - 1 LED;
  • - 1 zumbador piezoeléctrico.

Instrucciones

Paso 1

En términos generales, Arduino no admite una verdadera paralelización o subprocesos múltiples.

Pero puede decirle al microcontrolador que verifique si ha llegado el momento de ejecutar alguna tarea adicional en segundo plano en cada repetición del ciclo "loop ()". En este caso, al usuario le parecerá que se están realizando varias tareas simultáneamente.

Por ejemplo, hagamos parpadear un LED a una frecuencia determinada y, en paralelo, emitamos sonidos que suben y bajan como una sirena de un emisor piezoeléctrico.

Hemos conectado tanto el LED como el emisor piezoeléctrico al Arduino más de una vez. Montemos el circuito como se muestra en la figura. Si está conectando un LED a un pin digital que no sea "13", recuerde tener una resistencia limitadora de corriente de aproximadamente 220 ohmios.

Diagrama de cableado para zumbador y LED a Arduino
Diagrama de cableado para zumbador y LED a Arduino

Paso 2

Vamos a escribir un boceto como este y subirlo a Arduino.

Después de cargar la placa, puede ver que el boceto no se ejecuta exactamente como lo necesitamos: hasta que la sirena esté completamente operativa, el LED no parpadeará y nos gustaría que el LED parpadee DURANTE el sonido de la sirena. ¿Cuál es el problema aquí?

El hecho es que este problema no se puede resolver de la forma habitual. Las tareas las realiza el microcontrolador de forma estrictamente secuencial. El operador "delay ()" retrasa la ejecución del programa durante un período de tiempo especificado, y hasta que este tiempo expire, los siguientes comandos del programa no se ejecutarán. Debido a esto, no podemos establecer una duración de ejecución diferente para cada tarea en el "loop ()" del programa.

Por lo tanto, necesita simular de alguna manera la multitarea.

Control de zumbador y LED en serie
Control de zumbador y LED en serie

Paso 3

La opción en la que Arduino realizará tareas en pseudo-paralelo es sugerida por los desarrolladores de Arduino en el artículo

La esencia del método es que con cada repetición del ciclo "loop ()", verificamos si es el momento de hacer parpadear el LED (para realizar una tarea en segundo plano) o no. Y si es así, invertimos el estado del LED. Se trata de una especie de omisión del operador "delay ()".

Una desventaja significativa de este método es que la sección de código delante de la unidad de control LED debe ejecutarse más rápido que el intervalo de tiempo de parpadeo del LED "ledInterval". De lo contrario, el parpadeo se producirá con menos frecuencia de la necesaria y no obtendremos el efecto de la ejecución paralela de tareas. En particular, en nuestro boceto, la duración del cambio de sonido de la sirena es 200 + 200 + 200 + 200 = 800 mseg, y establecemos el intervalo de parpadeo del LED en 200 mseg. Pero el LED parpadeará con un período de 800 mseg, que es 4 veces diferente de lo que configuramos. En general, si se usa el operador "delay ()" en el código, entonces es difícil simular el pseudo-paralelismo, por lo que es aconsejable evitarlo.

En este caso, sería necesario que la centralita de control del sonido de la sirena compruebe también si ha llegado el momento o no, y no utilizar "delay ()". Pero esto aumentaría la cantidad de código y empeoraría la legibilidad del programa.

LED parpadeando sin demora () operador
LED parpadeando sin demora () operador

Paso 4

Para resolver este problema, usaremos la maravillosa biblioteca ArduinoThread, que le permite crear fácilmente procesos pseudo-paralelos. Funciona de manera similar, pero le permite no escribir código para verificar la hora, ya sea que necesite ejecutar la tarea en este bucle o no. Esto reduce la cantidad de código y mejora la legibilidad del boceto. Echemos un vistazo a la biblioteca en acción.

En primer lugar, descargue el archivo de la biblioteca del sitio oficial https://github.com/ivanseidel/ArduinoThread/archive/master.zip y descomprímalo en el directorio "bibliotecas" del IDE de Arduino. Luego cambie el nombre de la carpeta "ArduinoThread-master" a "ArduinoThread".

Instalación de la biblioteca ArduinoThread
Instalación de la biblioteca ArduinoThread

Paso 5

El diagrama de conexión seguirá siendo el mismo. Solo cambiará el código del programa. Ahora será igual que en la barra lateral.

En el programa, creamos dos flujos, cada uno realiza su propia operación: uno parpadea con un LED, el segundo controla el sonido de la sirena. En cada iteración del bucle, para cada hilo, comprobamos si ha llegado el momento de su ejecución o no. Si llega, se lanza para su ejecución utilizando el método "run ()". Lo principal es no utilizar el operador "delay ()".

En el código se dan explicaciones más detalladas.

Carguemos el código en la memoria Arduino, ejecútelo. ¡Ahora todo funciona exactamente como debería!

Recomendado: