Come Eseguire Attività Parallele (thread) In Un Programma Arduino

Sommario:

Come Eseguire Attività Parallele (thread) In Un Programma Arduino
Come Eseguire Attività Parallele (thread) In Un Programma Arduino

Video: Come Eseguire Attività Parallele (thread) In Un Programma Arduino

Video: Come Eseguire Attività Parallele (thread) In Un Programma Arduino
Video: How to do multiple tasks in Arduino | Beginners | millis() function 2024, Maggio
Anonim

Nella tecnologia a microprocessore, le attività eseguite in parallelo sono chiamate thread. Questo è molto conveniente, perché spesso è necessario eseguire più operazioni contemporaneamente. È possibile fare in modo che il microcontrollore Arduino esegua più attività contemporaneamente, come un vero processore? Vediamo.

Flussi paralleli in un programma Arduino
Flussi paralleli in un programma Arduino

È necessario

  • -Arduino;
  • - 1 LED;
  • - 1 cicalino piezoelettrico.

Istruzioni

Passo 1

In generale, Arduino non supporta la vera parallelizzazione o il multithreading.

Ma puoi dire al microcontrollore di controllare se è giunto il momento di eseguire qualche attività aggiuntiva in background ad ogni ripetizione del ciclo "loop()". In questo caso, all'utente sembrerà che diverse attività vengano eseguite contemporaneamente.

Ad esempio, facciamo lampeggiare un LED ad una data frequenza e, in parallelo, emettiamo suoni che salgono e scendono come una sirena da un emettitore piezoelettrico.

Abbiamo collegato sia il LED che l'emettitore piezoelettrico ad Arduino più di una volta. Assembliamo il circuito come mostrato in figura. Se stai collegando un LED a un pin digitale diverso da "13", ricorda di avere una resistenza di limitazione della corrente di circa 220 ohm.

Schema elettrico per cicalino e LED ad Arduino
Schema elettrico per cicalino e LED ad Arduino

Passo 2

Scriviamo uno schizzo come questo e carichiamolo su Arduino.

Dopo aver caricato la scheda, si può notare che lo sketch non viene eseguito esattamente come ci occorre: fino a quando la sirena non sarà completamente operativa, il LED non lampeggerà e vorremmo che il LED lampeggi DURANTE il suono della sirena. Qual è il problema qui?

Il fatto è che questo problema non può essere risolto nel solito modo. Le attività vengono eseguite dal microcontrollore rigorosamente in sequenza. L'operatore "delay()" ritarda l'esecuzione del programma per un periodo di tempo specificato e fino alla scadenza di questo tempo, i seguenti comandi del programma non verranno eseguiti. Per questo motivo, non possiamo impostare una durata di esecuzione diversa per ogni attività nel "loop()" del programma.

Pertanto, è necessario simulare in qualche modo il multitasking.

Segnale acustico e controllo LED in serie
Segnale acustico e controllo LED in serie

Passaggio 3

L'opzione in cui Arduino eseguirà attività in pseudo-parallelo è suggerita dagli sviluppatori Arduino nell'articolo

L'essenza del metodo è che con ogni ripetizione del ciclo "loop ()", controlliamo se è il momento di far lampeggiare il LED (per eseguire un'attività in background) o meno. E se lo fa, allora invertiamo lo stato del LED. Questo è un tipo di bypass dell'operatore "delay()".

Uno svantaggio significativo di questo metodo è che la sezione di codice davanti all'unità di controllo LED deve essere eseguita più velocemente dell'intervallo di tempo di lampeggio del LED "ledInterval". In caso contrario, il lampeggio si verificherà meno frequentemente del necessario e non si otterrà l'effetto dell'esecuzione parallela delle attività. In particolare, nel nostro sketch, la durata del cambio del suono della sirena è di 200 + 200 + 200 + 200 = 800 msec, e impostiamo l'intervallo di lampeggio del LED a 200 msec. Ma il LED lampeggerà con un periodo di 800 msec, che è 4 volte diverso da quello che abbiamo impostato. In generale, se nel codice viene utilizzato l'operatore "delay()", è difficile simulare lo pseudo-parallelismo, quindi è consigliabile evitarlo.

In questo caso sarebbe necessario che la centralina del suono della sirena verificasse anche se l'ora è giunta o meno, e non usare "ritardo ()". Ma questo aumenterebbe la quantità di codice e peggiorerebbe la leggibilità del programma.

LED lampeggiante senza ritardo () operatore
LED lampeggiante senza ritardo () operatore

Passaggio 4

Per risolvere questo problema, utilizzeremo la meravigliosa libreria ArduinoThread, che permette di creare facilmente processi pseudo-paralleli. Funziona in modo simile, ma consente di non scrivere codice per controllare l'ora, indipendentemente dal fatto che sia necessario eseguire l'attività in questo ciclo o meno. Ciò riduce la quantità di codice e migliora la leggibilità dello schizzo. Diamo un'occhiata alla libreria in azione.

Prima di tutto, scarica l'archivio della libreria dal sito ufficiale https://github.com/ivanseidel/ArduinoThread/archive/master.zip e decomprimilo nella directory "librerie" dell'IDE di Arduino. Quindi rinomina la cartella "ArduinoThread-master" in "ArduinoThread".

Installazione della libreria ArduinoThread
Installazione della libreria ArduinoThread

Passaggio 5

Lo schema di collegamento rimarrà lo stesso. Solo il codice del programma cambierà. Ora sarà lo stesso della barra laterale.

Nel programma creiamo due flussi, ognuno esegue la propria operazione: uno lampeggia con un LED, il secondo controlla il suono della sirena. In ogni iterazione del ciclo, per ogni thread, controlliamo se è giunto il momento per la sua esecuzione o meno. Se arriva, viene avviato per l'esecuzione utilizzando il metodo "run()". La cosa principale è non usare l'operatore "delay ()".

Spiegazioni più dettagliate sono fornite nel codice.

Carichiamo il codice nella memoria di Arduino, eseguiamolo. Ora tutto funziona esattamente come dovrebbe!

Consigliato: