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
- Arduino Uno (ou une carte compatible)
- Bouton-poussoir
- Résistance 10K-OHM (pour la configuration de la mise à la baisse)
- LED and 220-ohm resistor (optional)
- Fils de planche à pain et de cavalier
- 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
- Interruptions externes: Déclenché par des événements sur des broches spécifiques (par exemple, broche 2 ou 3 sur Arduino Uno).
- Interruptions de changement de broche: Déclenché par un changement sur toute broche numérique.
- 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
, ouLOW
).
-
-
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
- Gardez les ISR courts: Évitez les retards ou les calculs complexes dans les ISR pour assurer une réponse rapide.
- É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.
-
Utiliser
volatile
pour les variables partagées: Marque des variables partagées entre les ISR et le programme principal commevolatile
pour éviter les problèmes d'optimisation du compilateur. - 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.
-
Désactiver les interruptions pendant les sections critiques: Utiliser
noInterrupts()
etinterrupts()
pour protéger les sections de code critiques.
Applications des interruptions
- Gestion des pressions sur le bouton sans interrogation
- Lire des encodeurs rotatifs
- Timing critical events (e.g., precise motor control)
- Planifier des tâches périodiques
- 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!