Arduino interrompe il tutorial

Arduino Interrupts Tutorial

Gli interrupt sono una potente caratteristica dei microcontrollori che consentono di gestire gli eventi in modo asincrono. A differenza del polling, che controlla continuamente gli eventi, gli interrupt rispondono immediatamente quando si verifica un evento specifico, come una pressione del pulsante o un overflow del timer. Questo tutorial ti guiderà attraverso la comprensione e l'uso di interruzioni con Arduino.


Cosa avrai bisogno

  1. Arduino Uno (o una scheda compatibile)
  2. Pulsante
  3. Resistenza 10K-OHM (per configurazione a discesa)
  4. Resistenza a LED e 220 ohm (opzionale)
  5. Breadboard e fili jumper
  6. Arduino IDE installato sul tuo computer

Passaggio 1: cosa sono interrupt?

Un interrupt interrompe temporaneamente l'esecuzione del programma principale per gestire un evento specifico. Una volta che l'evento è stato elaborato, il programma riprende da dove era stato interrotto. Gli interrupt sono gestiti utilizzando funzioni speciali chiamate Interrupt Service Routines (ISRS).

Tipi di interruzioni in Arduino

  1. Interrupt esterni: Innescato da eventi su pin specifici (ad es. Pin 2 o 3 su Arduino Uno).
  2. Il cambio di pin interrupt: Attivato da una modifica su qualsiasi pin digitale.
  3. Timer Interrupts: Attivato da overflow timer o confronta le corrispondenze.

Passaggio 2: usando interrupt esterni

Arduino UNO supporta interruzioni esterne sui pin 2 e 3. È possibile configurare questi interrupt su cui attivare:

  • IN AUMENTO: Il segnale va dal basso a alto.
  • CADENTE: Il segnale passa da alto a basso.
  • MODIFICA: Cambiamenti del segnale Stato (da basso a alto o alto a basso).
  • BASSO: Il segnale rimane basso.

Codice di esempio: rilevare un pulsante Premere

Questo esempio attiva un LED quando viene premuto un pulsante collegato al pin 2.

#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
}

Spiegazione

  • attachInterrupt(digitalPinToInterrupt(pin), ISR, mode): Configura l'interrupt.
    • pin: Il perno di interrupt (ad es. Pin 2 o 3 su Arduino Uno).
    • ISR: La routine di servizio di interruzione da eseguire.
    • mode: La condizione di innesco (RISING, FALLING, CHANGE, O LOW).
  • digitalPinToInterrupt(pin): Converte un numero PIN al suo numero di interrupt.

Passaggio 3: utilizzando interrupt per il cambio del pin

Gli interrupt per il cambiamento del pin consentono di rilevare le modifiche su qualsiasi pin digitale. Ciò richiede librerie aggiuntive, come ad esempio EncableInterrupt.

Codice di esempio: interrupt per modifica del pin

#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
}

Installazione della libreria

Per utilizzare l'interruzione del cambio del pin, installare il EncableInterrupt Biblioteca tramite il gestore della biblioteca Arduino.


Passaggio 4: il timer interrompe

Gli interrupt del timer sono utili per la pianificazione di attività a intervalli precisi. Fare riferimento a Arduino Timer Tutorial Per i dettagli sulla configurazione degli interrupt del timer.

Esempio: lampeggiare un LED con interrupt 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
}

Passaggio 5: best practice per l'utilizzo degli interrupt

  1. Mantieni gli ISR ​​a corto: Evitare ritardi o calcoli complessi negli ISR ​​per garantire una risposta rapida.
  2. Evita la comunicazione seriale negli ISR: Le funzioni seriali potrebbero non funzionare in modo affidabile all'interno di un ISR.
  3. Utilizzo volatile Per variabili condivise: Mark variabili condivise tra ISRS e il programma principale come volatile per prevenire i problemi di ottimizzazione del compilatore.
  4. Input di debounce: Gestisci la logica di debounce in software o hardware per segnali rumorosi come pressioni sul pulsante.
  5. Disabilita interruzioni durante le sezioni critiche: Utilizzo noInterrupts() E interrupts() per proteggere le sezioni del codice critico.

Applicazioni di interruzioni

  1. Il pulsante di gestione preme senza polling
  2. Leggere gli encoder rotanti
  3. Eventi critici di temporizzazione (ad es. Controllo motorio preciso)
  4. Pianificazione di compiti periodici
  5. Reagendo a segnali esterni (ad es. Sensori, eventi di comunicazione)

Risoluzione dei problemi

  • Interrompere non innescare: Assicurarsi che il pin e la modalità corretti siano configurati.
  • Comportamento instabile: Debare segnali rumorosi ed evitare lunghi ISR.
  • Conflitti con le biblioteche: Alcune biblioteche usano interrupt internamente (ad es. Servo, PWM). Assicurati che nessun conflitto con il tuo codice.

Conclusione

Gli interrupt consentono una gestione reattiva ed efficiente degli eventi nei progetti di Arduino. Imparando a utilizzare interruzioni esterne, PIN e Timer, è possibile creare applicazioni robuste e precise. Sperimenta diversi tipi di interrupt per migliorare i tuoi progetti e ottimizzare le prestazioni!

Lascia un commento

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.