Com Realitzar Tasques Paral·leles (fils) En Un Programa Arduino

Taula de continguts:

Com Realitzar Tasques Paral·leles (fils) En Un Programa Arduino
Com Realitzar Tasques Paral·leles (fils) En Un Programa Arduino

Vídeo: Com Realitzar Tasques Paral·leles (fils) En Un Programa Arduino

Vídeo: Com Realitzar Tasques Paral·leles (fils) En Un Programa Arduino
Vídeo: Fernanda Pistelli @ Universo Paralello Festival #15 2019/2020 2024, De novembre
Anonim

En tecnologia de microprocessadors, les tasques que s’executen en paral·lel s’anomenen fils. Això és molt convenient, perquè sovint és necessari realitzar diverses operacions alhora. És possible fer que el microcontrolador Arduino realitzi diverses tasques alhora, com un processador real? A veure.

Reproduccions paral·leles en un programa Arduino
Reproduccions paral·leles en un programa Arduino

És necessari

  • - Arduino;
  • - 1 LED;
  • - 1 brunzidor piezoelèctric.

Instruccions

Pas 1

En termes generals, Arduino no admet una veritable paral·lelització o multithreading.

Però podeu dir al microcontrolador que comprovi si ha arribat el moment d'executar alguna tasca addicional de fons a cada repetició del cicle "loop ()". En aquest cas, a l’usuari li semblarà que s’estan realitzant diverses tasques simultàniament.

Per exemple, parpellegem un LED a una freqüència determinada i, en paral·lel, emetem sons que pugen i baixen com una sirena d’un emissor piezoelèctric.

Hem connectat el LED i l’emissor piezo a l’Arduino més d’una vegada. Muntem el circuit com es mostra a la figura. Si esteu connectant un LED a un pin digital que no sigui "13", recordeu que teniu una resistència de limitació de corrent d'aproximadament 220 ohms.

Esquema de cablejat del brunzidor i del LED a Arduino
Esquema de cablejat del brunzidor i del LED a Arduino

Pas 2

Escrivim un esbós com aquest i el carreguem a Arduino.

Després de carregar el tauler, podeu veure que l’esbós no s’executa exactament com ho necessitem: fins que la sirena estigui completament operativa, el LED no parpellejarà i voldríem que el LED parpellegés DURANT que soni la sirena. Quin és el problema aquí?

El fet és que aquest problema no es pot resoldre de la manera habitual. El microcontrolador realitza les tasques estrictament seqüencialment. L'operador "delay ()" retarda l'execució del programa durant un període de temps especificat i, fins que expiri aquest temps, no s'executaran les ordres del programa següents. Per això, no podem establir una durada d'execució diferent per a cada tasca al "bucle ()" del programa.

Per tant, heu de simular d’alguna manera la multitarea.

Beeper i control LED en sèrie
Beeper i control LED en sèrie

Pas 3

L’opció en què Arduino realitzarà tasques en pseudo-paral·lel és suggerida pels desenvolupadors d’Arduino a l’article

L’essència del mètode és que amb cada repetició del bucle "loop ()", comprovem si és hora de parpellejar el LED (per realitzar una tasca de fons) o no. I si ho fa, invertim l’estat del LED. Es tracta d'una mena d'evitació de l'operador "delay ()".

Un desavantatge important d’aquest mètode és que la secció de codi situada davant de la unitat de control del LED s’ha d’executar més ràpidament que l’interval de temps de parpelleig del LED "ledInterval". En cas contrari, el parpelleig es produirà amb menys freqüència de la necessària i no obtindrem l’efecte d’una execució paral·lela de les tasques. En concret, al nostre esbós, la durada del canvi de so de la sirena és de 200 + 200 + 200 + 200 = 800 msec i establim l’interval de parpelleig del LED a 200 msec. Però el LED parpellejarà amb un període de 800 msec, que és 4 vegades diferent del que hem establert. En general, si s'utilitza l'operador "delay ()" al codi, és difícil simular el pseudo-paral·lelisme, per la qual cosa és recomanable evitar-lo.

En aquest cas, seria necessari que la unitat de control de so de sirena també comprovés si ha arribat el moment o no, i no utilitzar "delay ()". Però això augmentaria la quantitat de codi i empitjoraria la llegibilitat del programa.

LED parpellejant sense demora () operador
LED parpellejant sense demora () operador

Pas 4

Per solucionar aquest problema, utilitzarem la meravellosa biblioteca ArduinoThread, que us permet crear processos pseudo-paral·lels fàcilment. Funciona de manera similar, però us permet no escriure codi per comprovar l'hora, tant si heu d'executar la tasca en aquest bucle com si no. Això redueix la quantitat de codi i millora la llegibilitat de l'esbós. Vegem la biblioteca en acció.

En primer lloc, descarregueu l'arxiu de la biblioteca des del lloc oficial https://github.com/ivanseidel/ArduinoThread/archive/master.zip i descomprimiu-lo al directori "biblioteques" de l'IDE Arduino. A continuació, canvieu el nom de la carpeta "ArduinoThread-master" a "ArduinoThread".

Instal·lació de la biblioteca ArduinoThread
Instal·lació de la biblioteca ArduinoThread

Pas 5

El diagrama de connexió seguirà sent el mateix. Només canviarà el codi del programa. Ara serà el mateix que a la barra lateral.

Al programa, creem dos fluxos, cadascun realitza la seva pròpia operació: un parpelleja amb un LED, el segon controla el so de la sirena. En cada iteració del bucle, per a cada fil, comprovem si ha arribat el moment de la seva execució o no. Si arriba, s'inicia per a l'execució mitjançant el mètode "run ()". El més important és no utilitzar l'operador "delay ()".

Al codi es donen explicacions més detallades.

Carregem el codi a la memòria Arduino, executem-lo. Ara tot funciona exactament com hauria de ser!

Recomanat: