Comment Effectuer Des Tâches Parallèles (threads) Dans Un Programme Arduino

Table des matières:

Comment Effectuer Des Tâches Parallèles (threads) Dans Un Programme Arduino
Comment Effectuer Des Tâches Parallèles (threads) Dans Un Programme Arduino

Vidéo: Comment Effectuer Des Tâches Parallèles (threads) Dans Un Programme Arduino

Vidéo: Comment Effectuer Des Tâches Parallèles (threads) Dans Un Programme Arduino
Vidéo: PROGRAMMATION LADDER ➡ ARDUINO (MEGA/UNO/NANO ...) [FR] [RAPIDE] 2024, Novembre
Anonim

Dans la technologie des microprocesseurs, les tâches exécutées en parallèle sont appelées Threads. C'est très pratique, car il est souvent nécessaire d'effectuer plusieurs opérations en même temps. Est-il possible de faire en sorte que le microcontrôleur Arduino effectue plusieurs tâches à la fois, comme un vrai processeur ? Voyons voir.

Flux parallèles dans un programme Arduino
Flux parallèles dans un programme Arduino

Il est nécessaire

  • -Arduino;
  • - 1 LED;
  • - 1 buzzer piézo.

Instructions

Étape 1

De manière générale, Arduino ne prend pas en charge la véritable parallélisation ou le multithreading.

Mais vous pouvez demander au microcontrôleur de vérifier si le moment est venu d'exécuter une tâche supplémentaire en arrière-plan à chaque répétition du cycle "loop ()". Dans ce cas, il semblera à l'utilisateur que plusieurs tâches sont exécutées simultanément.

Par exemple, faisons clignoter une LED à une fréquence donnée et, en parallèle, émettons des sons qui montent et descendent comme une sirène d'un émetteur piézoélectrique.

Nous avons connecté à la fois la LED et l'émetteur piézo à l'Arduino plus d'une fois. Assemblons le circuit comme indiqué sur la figure. Si vous connectez une LED à une broche numérique autre que "13", n'oubliez pas d'avoir une résistance de limitation de courant d'environ 220 ohms.

Schéma de câblage pour buzzer et LED vers Arduino
Schéma de câblage pour buzzer et LED vers Arduino

Étape 2

Écrivons un croquis comme celui-ci et téléchargeons-le sur Arduino.

Après avoir chargé la carte, vous pouvez voir que le croquis n'est pas exécuté exactement comme nous en avons besoin: jusqu'à ce que la sirène soit pleinement opérationnelle, la LED ne clignotera pas, et nous aimerions que la LED clignote PENDANT le son de la sirène. Quel est le problème ici?

Le fait est que ce problème ne peut pas être résolu de la manière habituelle. Les tâches sont exécutées par le microcontrôleur de manière strictement séquentielle. L'opérateur "delay ()" retarde l'exécution du programme pendant une période de temps spécifiée, et jusqu'à ce que ce temps expire, les commandes de programme suivantes ne seront pas exécutées. De ce fait, nous ne pouvons pas définir une durée d'exécution différente pour chaque tâche dans la "boucle ()" du programme.

Par conséquent, vous devez en quelque sorte simuler le multitâche.

Avertisseur sonore et contrôle LED en série
Avertisseur sonore et contrôle LED en série

Étape 3

L'option dans laquelle l'Arduino effectuera des tâches en pseudo-parallèle est suggérée par les développeurs Arduino dans l'article

L'essence de la méthode est qu'à chaque répétition de la boucle "loop()", on vérifie s'il est temps de faire clignoter la LED (pour effectuer une tâche en arrière-plan) ou non. Et si c'est le cas, alors nous inversons l'état de la LED. C'est une sorte de contournement de l'opérateur "delay ()".

Un inconvénient important de cette méthode est que la section de code devant l'unité de commande LED doit être exécutée plus rapidement que l'intervalle de temps de clignotement de la LED "ledInterval". Sinon, le clignotement se produira moins fréquemment que nécessaire, et nous n'obtiendrons pas l'effet d'une exécution parallèle des tâches. En particulier, dans notre croquis, la durée du changement de son de la sirène est de 200 + 200 + 200 + 200 = 800 msec, et nous définissons l'intervalle de clignotement de la LED à 200 msec. Mais la LED clignotera avec une période de 800 msec, ce qui est 4 fois différent de ce que nous avons défini. En général, si l'opérateur "delay()" est utilisé dans le code, alors il est difficile de simuler le pseudo-parallélisme, il est donc conseillé de l'éviter.

Dans ce cas, il faudrait que la centrale du son de la sirène vérifie également si l'heure est venue ou non, et n'utilise pas "delay ()". Mais cela augmenterait la quantité de code et détériorerait la lisibilité du programme.

LED clignotant sans délai () opérateur
LED clignotant sans délai () opérateur

Étape 4

Pour résoudre ce problème, nous utiliserons la merveilleuse bibliothèque ArduinoThread, qui permet de créer facilement des processus pseudo-parallèles. Cela fonctionne de la même manière, mais cela vous permet de ne pas écrire de code pour vérifier l'heure - si vous devez ou non exécuter la tâche dans cette boucle. Cela réduit la quantité de code et améliore la lisibilité du croquis. Voyons la bibliothèque en action.

Tout d'abord, téléchargez l'archive de la bibliothèque sur le site officiel https://github.com/ivanseidel/ArduinoThread/archive/master.zip et décompressez-la dans le répertoire "libraries" de l'IDE Arduino. Renommez ensuite le dossier "ArduinoThread-master" en "ArduinoThread".

Installation de la bibliothèque ArduinoThread
Installation de la bibliothèque ArduinoThread

Étape 5

Le schéma de connexion restera le même. Seul le code du programme changera. Maintenant, ce sera la même chose que dans la barre latérale.

Au programme, nous créons deux flux, chacun effectue sa propre opération: l'un clignote avec une LED, le second contrôle le son de la sirène. A chaque itération de la boucle, pour chaque thread, nous vérifions si le moment est venu de son exécution ou non. S'il arrive, il est lancé pour exécution à l'aide de la méthode "run()". L'essentiel est de ne pas utiliser l'opérateur "delay ()".

Des explications plus détaillées sont données dans le code.

Chargeons le code dans la mémoire Arduino, exécutons-le. Maintenant, tout fonctionne exactement comme il se doit !

Conseillé: