Tutoriel d'interruption d'Arduino

Arduino Interrupts Tutorial

Les interruptions sont une caractéristique puissante des microcontrôleurs qui vous permettent de gérer les événements de manière asynchrone. Contrairement au sondage, qui vérifie en continu les événements, les interruptions réagissent immédiatement lorsqu'un événement spécifique se produit, comme une appuye sur un bouton ou un débordement de minuterie. Ce tutoriel vous guidera à travers la compréhension et l'utilisation d'interruptions avec Arduino.


Ce dont vous aurez besoin

  1. Arduino Uno (ou une carte compatible)
  2. Bouton-poussoir
  3. Résistance 10K-OHM (pour la configuration de la mise à la baisse)
  4. LED and 220-ohm resistor (optional)
  5. Fils de planche à pain et de cavalier
  6. Arduino IDE installed on your computer

Step 1: What Are Interrupts?

An interrupt temporarily halts the main program’s execution to handle a specific event. Once the event is processed, the program resumes where it left off. Interrupts are managed using special functions called Interrupt Service Routines (ISRs).

Types d'interruptions à Arduino

  1. Interruptions externes: Déclenché par des événements sur des broches spécifiques (par exemple, broche 2 ou 3 sur Arduino Uno).
  2. Interruptions de changement de broche: Déclenché par un changement sur toute broche numérique.
  3. Interruptions de la minuterie: Déclenché par des débordements de minuterie ou comparer les matchs.

Étape 2: Utilisation d'interruptions externes

L'Arduino Uno prend en charge les interruptions externes sur les broches 2 et 3. Vous pouvez configurer ces interruptions pour déclencher:

  • SOULÈVEMENT: Le signal passe de bas à haut.
  • CHUTE: Le signal passe de haut à bas.
  • CHANGEMENT: Les changements de signal indiquent (faible à élevé ou élevé à bas).
  • FAIBLE: Le signal reste faible.

Exemple de code: détection d'un bouton Appuyer

Cet exemple bascule une LED lorsqu'un bouton connecté à la broche 2 est enfoncé.

#define buttonPin 2 // Interrupt pin
#define ledPin 13   // Built-in LED

volatile bool ledState = false; // Shared variable between ISR and main code

void handleInterrupt() {
  ledState = !ledState; // Toggle LED state
  digitalWrite(ledPin, ledState);
}

void setup() {
  pinMode(buttonPin, INPUT_PULLUP); // Enable internal pull-up resistor
  pinMode(ledPin, OUTPUT);

  attachInterrupt(digitalPinToInterrupt(buttonPin), handleInterrupt, FALLING); // Trigger on button press
}

void loop() {
  // Main loop does nothing; interrupt handles the LED
}

Explication

  • attachInterrupt(digitalPinToInterrupt(pin), ISR, mode): Configure l'interruption.
    • pin: La broche d'interruption (par exemple, broche 2 ou 3 sur Arduino Uno).
    • ISR: La routine de service d'interruption à exécuter.
    • mode: La condition de déclenchement (RISING, FALLING, CHANGE, ou LOW).
  • digitalPinToInterrupt(pin): Convertit un numéro de broche en son numéro d'interruption.

Étape 3: Utilisation des interruptions de changement de broche

Les interruptions de modification des broches vous permettent de détecter les modifications sur toute broche numérique. Cela nécessite des bibliothèques supplémentaires, comme Activer l'interrupteur.

Exemple de code: interruption de changement de broche

#include <EnableInterrupt.h>
#define pin 4 // Pin to monitor

void handlePinChange() {
  Serial.println("Pin state changed!");
}

void setup() {
  Serial.begin(9600);
  enableInterrupt(pin, handlePinChange, CHANGE); // Trigger on any state change
}

void loop() {
  // Main loop does nothing; interrupt handles the event
}

Installation de la bibliothèque

Pour utiliser les interruptions de changement de broche, installez le Activer l'interrupteur Bibliothèque via le gestionnaire de bibliothèque Arduino.


Étape 4: Interruptions de la minuterie

Les interruptions de minuterie sont utiles pour planifier des tâches à des intervalles précis. Reportez-vous au Tutoriel de la minuterie Arduino Pour plus de détails sur la configuration des interruptions de minuterie.

Exemple: clignoter une LED avec interruption Timer1

#define ledPin 13

void setup() {
  pinMode(ledPin, OUTPUT);

  // Configure Timer1
  noInterrupts(); // Disable interrupts during setup
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;

  OCR1A = 15624; // Compare match value for 1Hz (1-second interval)
  TCCR1B |= (1 << WGM12); // CTC mode
  TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 prescaler
  TIMSK1 |= (1 << OCIE1A); // Enable Timer1 compare interrupt

  interrupts(); // Enable interrupts
}

ISR(TIMER1_COMPA_vect) {
  digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle LED
}

void loop() {
  // Main loop does nothing; Timer1 handles the LED
}

Étape 5: meilleures pratiques pour utiliser les interruptions

  1. Gardez les ISR courts: Évitez les retards ou les calculs complexes dans les ISR pour assurer une réponse rapide.
  2. Évitez la communication série dans les ISR: Les fonctions série peuvent ne pas fonctionner de manière fiable à l'intérieur d'un ISR.
  3. Utiliser volatile pour les variables partagées: Marque des variables partagées entre les ISR et le programme principal comme volatile pour éviter les problèmes d'optimisation du compilateur.
  4. Déboucher les entrées: Gérer la logique de débouchement dans les logiciels ou le matériel pour les signaux bruyants comme les appuyés sur les bouton.
  5. Désactiver les interruptions pendant les sections critiques: Utiliser noInterrupts() et interrupts() pour protéger les sections de code critiques.

Applications des interruptions

  1. Gestion des pressions sur le bouton sans interrogation
  2. Lire des encodeurs rotatifs
  3. Timing critical events (e.g., precise motor control)
  4. Planifier des tâches périodiques
  5. Réagir aux signaux externes (par exemple, capteurs, événements de communication)

Dépannage

  • Interruption pas déclenchant: Assurez-vous que la broche et le mode corrects sont configurés.
  • Comportement instable: Déboucher des signaux bruyants et éviter de longs ISR.
  • Confort avec les bibliothèques: Certaines bibliothèques utilisent des interruptions en interne (par exemple, Servo, PWM). Assurez-vous aucun conflit avec votre code.

Conclusion

Les interruptions permettent une gestion réactive et efficace des événements dans les projets Arduino. En apprenant à utiliser des interruptions externes, de changement de broche et de minuterie, vous pouvez créer des applications robustes et précises. Expérimentez avec différents types d'interruptions pour améliorer vos projets et optimiser les performances!

Laissez un commentaire

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.