Interruptions externes et matérielles Arduino

Que sont les interruptions externes et matérielles dans Arduino? Comment utiliser les interruptions dans un programme? Voyons des exemples simples de la façon de travailler avec les interruptions dans l’IDE Arduino, dans quels cas vous pouvez utiliser attachInterrupt(). Nous présenterons quelques exemples de programmes avec des explications et les points importants auxquels il faut prêter attention lors de l’utilisation des interruptions.


Pour cette activité, nous aurons besoin:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • boutons-poussoirs
  • LEDs et résistance
  • breadboard
  • fils de connexion

Matériel supplémentaire sur ce sujet:

  1. Description des entrées / sorties Arduino Uno
  2. Description des entrées / sorties Arduino Nano
  3. Description des entrées / sorties Arduino Mega

Les interruptions peuvent être expliquées à l’aide d’un simple exemple tiré de la vie. Par exemple, le facteur doit apporter une lettre importante. Pour la lire plus rapidement, vous allez consulter votre boîte aux lettres toutes les 10 minutes. Vous perdrez ainsi votre temps de manière improductive. Dans le cas d’Arduino, cela ressemble à une interrogation constante d’un capteur, sur lequel le processeur gaspillera également des ressources.

La deuxième option consiste à laisser une note au facteur pour qu’il ne mette pas la lettre dans la boîte aux lettres, mais qu’il vous la remette en mains propres. Vous pouvez ainsi vaquer à vos occupations sans avoir à vérifier constamment la boîte aux lettres. Lorsque le facteur sonnera à la porte, vous devrez interrompre votre travail pour ouvrir la porte et prendre la lettre, puis retourner à vos affaires. C’est pourquoi on parle d’interruption.

Les interruptions dans l’IDE Arduino fonctionnent de manière similaire. Par exemple, le microcontrôleur peut attendre que l’utilisateur appuie sur un bouton. Pour ce faire, vous pouvez utiliser la commande digitalRead() dans le programme et surveiller le bouton à une fréquence élevée. Mais vous pouvez utiliser une interruption matérielle sans perdre de temps à interroger le bouton, mais dès que le bouton est enfoncé, la fonction d’interruption démarre.

Interruptions externes et matérielles Arduino

Le tableau suivant indique les broches qui peuvent être utilisées pour les interruptions. Si une broche de la carte n’est pas compatible avec la fonction d’interruption, le programme ne fonctionnera pas. Dans l’IDE Arduino, les interruptions sont déclenchées par un changement dans le signal d’entrée que vous surveillez, mais vous pouvez sélectionner le changement exact que vous voulez surveiller. Pour ce faire, modifiez le paramètre de attachInterrupt.

cartes Arduino broches supportant les interruptions
Arduino Uno, Nano, Mini 2, 3
Arduino Mega 2, 3, 18, 19, 20, 21
Arduino Micro, Leonardo 0, 1, 2, 3, 7
Arduino Zero toutes les broches numériques sauf 4
Arduino Due toutes les broches numériques

Syntaxe de l’appel de fonction: attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);

digitalPinToInterrupt(pin) – dans ce paramètre, il est nécessaire de spécifier une broche spécifique qui sera utilisée pour traiter le signal d’interruption externe.

ISR – nom de la fonction qui sera appelée pendant l’interruption

mode – type de transition (changement d’état) qui sera traité, par exemple niveau inférieur, niveau supérieur, etc. Les valeurs suivantes sont possibles :

  • RISING : lorsque le signal passe de LOW à HIGH
  • FALLING : lorsque le signal passe de HIGH à LOW
  • CHANGE : chaque fois que le signal passe de LOW à HIGH ou de HIGH à LOW
  • LOW : l’interruption est déclenchée chaque fois que le signal est LOW

Utilisation des interruptions avec des exemples

Utilisation des interruptions Arduino avec exemples
Utilisation des interruptions dans Arduino avec des exemples

Dans le premier exemple, le microcontrôleur surveille constamment l’état du bouton, et la LED s’allume lorsque le bouton est enfoncé. Mais en utilisant l’entrée numérique 2 en mode interruption, le microcontrôleur n’a pas besoin d’interroger le bouton. Si le signal numérique sur la broche activée par l’interruption change, l’Arduino arrêtera l’exécution du code du programme principal sans que le bouton soit interrogé en permanence.

Programme pour allumer une LED sans interruption

#define LED 10
#define BUTTON 2

byte ledState = LOW;

void setup() {
   pinMode(LED, OUTPUT);
   pinMode(BUTTON, INPUT);
}

void loop() {
   if (digitalRead(BUTTON) == HIGH) {
      ledState = !ledState;
   }

   digitalWrite(LED, ledState);
}

Explication du code Arduino pour allumer une LED sans interruption:

  1. une pression sur le bouton modifie l’état de la LED.

L’exemple suivant modifie la façon de contrôler le bouton-poussoirs – une fonction d’interruption est attachée à l’entrée numérique 2 de la carte Arduino. Lorsque le signal du bouton augmente, c’est-à-dire passe de LOW à HIGH, le code du programme principal dans void loop() est arrêté et void blinkLed() est appelé. Le principal avantage de ce cas est que nous n’avons plus besoin d’interroger le bouton dans le programme.

Programme utilisant des interruptions matérielles

#define LED 10
#define BUTTON 2

volatile byte ledState = LOW;

void setup() {
   pinMode(LED, OUTPUT);
   pinMode(BUTTON, INPUT);

   attachInterrupt(digitalPinToInterrupt(BUTTON), blinkLed, RISING);
}

void loop() {
   // il n'y a pas de commande
}

void blinkLed() {
   ledState = !ledState;
   digitalWrite(LED, ledState);
}

Explication du code utilisant des interruptions matérielles Arduino:

  1. noter qu’il n’y a pas de commande dans la boucle principale.

Comment utiliser correctement les interruptions?

Rendre la fonction d’interruption aussi rapide que possible

La fonction d’interruption doit être aussi rapide que possible, car elle interrompt l’exécution du code principal de votre programme. Si vous devez effectuer des calculs lourds ou de longues actions lorsqu’une interruption externe est déclenchée, vous devez les laisser dans void loop(). Et à l’intérieur des fonctions d’interruption, vous ne devez modifier que les variables d’état dont dépendent les opérations requises.

Ne pas utiliser de fonctions temporelles dans les interruptions

La commande delay() dans une fonction d’interruption ne fonctionne pas. Si vous utilisez le compteur de temps sur millis(), lorsque vous quitterez la fonction d’interruption, vous obtiendrez la dernière valeur enregistrée, car millis() n’est pas incrémenté dans la fonction d’interruption. L’utilisation de millis() sert peut-être à empêcher le bouton de trembler, mais il est préférable de l’utiliser dans la boucle principale void loop().

Ne pas utiliser le moniteur de port dans les interruptions

Lorsque vous êtes à l’intérieur d’une interruption, les données envoyées ou reçues par les commandes Serial peuvent être perdues. Vous pouvez utiliser Serial.print() à l’intérieur d’une fonction d’interruption pour déboguer le programme et vous assurer que l’interruption est déclenchée, mais vous risquez de rencontrer des problèmes. Il est préférable de définir un drapeau à l’intérieur de l’interruption et d’interroger ce drapeau à l’intérieur de void loop().

Utiliser volatile pour déclarer les variables

Les variables utilisées dans les fonctions ISR et dans les fonctions normales doivent être déclarées en utilisant volatile. Cela indique au compilateur que les variables de ce type peuvent changer à tout moment et que le microcontrôleur doit recharger la variable chaque fois que vous y accédez, plutôt que de s’appuyer sur une copie de celle-ci. Dans le cas contraire, les algorithmes d’optimisation peuvent supprimer entièrement la variable de l’exécutable.

Conclusion. L’utilisation de la fonction attachInterrupt d’Arduino est très utile lorsque vous devez vous assurer que le microcontrôleur ne manquera aucun changement dans le signal que vous surveillez. Cependant, lorsque vous utilisez des interruptions de bouton-poussoir dans Arduino, vous devez faire attention à ne pas les utiliser trop souvent. Parfois, une simple interrogation du capteur peut être une meilleure option.





2 Replies to “Utilisation des interruptions externes et matérielles Arduino”

  1. Correction ->>> if (digitalRead(BUTTON) == HIGH)

    Normalement ici vous faites un test d’égalité pour savoir si le bouton a été appuyé pour ensuite inverser l’état de la LED, mais vous avez dû garder la syntaxe d’un digitalWrite.
    Je ne suis pas sûr que la partie ou vous expliquez comment allumer la LED sans les interruptions soit utile…
    —
    Sinon excellent tuto, bravo ! Quelques petites corrections à faire mais rien de bien méchant.
    Passez une très bonne journée !
    Cordialement
    Rémi

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. Découvrez comment les données de vos commentaires sont traitées.