Utilizzo degli interrupt esterni e hardware di Arduino

Cosa sono gli interrupt esterni e hardware in Arduino? Come utilizzare gli interrupt in un programma per microcontrollori? Vediamo alcuni semplici esempi di lavoro con gli interrupt nell’ambiente IDE di Arduino, in cui è possibile utilizzare la funzione attachInterrupt(). Verranno forniti alcuni esempi di programmi per microcontrollori Arduino Uno con spiegazioni e punti importanti a cui prestare attenzione quando si utilizzano gli interrupt ISR.




Per questa attività sono necessari:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • pulsante
  • resistenza
  • breadboard
  • cavi di collegamento

Cosa sono gli interrupt hardware ed esterni Arduino?

Le interruzioni possono essere spiegate con un semplice esempio di vita. Ad esempio, se state aspettando un’e-mail molto importante, controllate la vostra casella di posta ogni 10 minuti. In questo modo si perde tempo e il lavoro diventa meno produttivo. Nel caso della programmazione Arduino, ciò equivale a eseguire costantemente il polling di un sensore digitale o analogico, con conseguente spreco di tempo e di risorse della CPU.

La tabella seguente elenca i pin del microcontrollore che possono essere utilizzati per gli interrupt. Se un pin della scheda non è compatibile con la funzione di interrupt, il programma non viene eseguito. Gli interrupt vengono attivati da una variazione del segnale di ingresso su un pin della scheda. È possibile selezionare l’esatta variazione del segnale che si desidera controllare. A questo scopo viene utilizzato il terzo parametro di attachInterrupt().

schede Arduino pin che supportano gli interrupt
Arduino Uno, Nano, Mini 2, 3
Arduino Mega 2, 3, 18, 19, 20, 21
Arduino Micro, Leonardo 0, 1, 2, 3, 7
Arduino Zero tutti i pin digitali tranne il 4
Arduino Due tutti i pin digitali

Sintassi della chiamata di funzione: attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);

digitalPinToInterrupt(pin) – in questo parametro è necessario specificare un pin specifico che verrà utilizzato per elaborare il segnale di interrupt esterno.

ISR – nome della funzione che verrà richiamata durante l’interrupt

mode – tipo di transizione (cambiamento di stato) da elaborare, ad esempio livello basso, livello alto, ecc. Sono possibili i seguenti valori:

  • RISING: quando il livello del segnale passa da LOW a HIGH
  • FALLING: quando il livello del segnale passa da HIGH a LOW
  • CHANGE: ogni volta che il segnale passa da LOW a HIGH o da HIGH a LOW
  • LOW: si attiva ogni volta che il segnale è LOW

Come interrompere un programma Arduino IDE?

Come interrompere un programma Arduino
Come interrompere un programma Arduino IDE

Nel primo esempio, il microcontrollore monitora costantemente lo stato del pulsante e il LED si accende quando il pulsante viene premuto. Ma utilizzando l’ingresso digitale 2 in modalità di interrupt, il microcontrollore non ha bisogno di interrogare il pulsante. Se il segnale digitale sul pin attivato dall’interrupt cambia, Arduino interrompe l’esecuzione del codice del programma principale senza che il pulsante venga interrogato in continuazione.

Programma per polling dei pulsanti senza interrupt




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

Spiegazione del codice per polling dei pulsanti senza interrupt Arduino:



  1. quando si preme il pulsante, il LED si accende.

L’esempio seguente modifica il modo in cui viene controllato il pulsante: una funzione di interrupt è collegata all’ingresso digitale 2 del microcontrollore Arduino. Quando il segnale digitale del pulsante aumenta, cioè passa da LOW ad HIGH, il codice del programma principale in void loop() viene interrotto e viene richiamato void blinkLed(). Il vantaggio principale è che non è più necessario eseguire costantemente il polling del pulsante nel programma.

Programma per l’interrupt di un pulsante esterno

#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() {
 
}

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

Spiegazione del codice per l’interrupt di un pulsante esterno Arduino:

  1. non ci sono comandi nel ciclo principale void loop(), ma quando si preme il pulsante viene attivata la funzione di interrupt blinkLed() e il LED si accende.

Cosa considerare quando si utilizzano gli interrupt?

Rendere la funzione di interrupt il più veloce possibile

La funzione di interrupt deve essere il più veloce possibile perché interrompe l’esecuzione del codice principale del programma. Se è necessario eseguire azioni lunghe quando si verifica un’interruzione esterna, è meglio lasciarle in void loop(). Inoltre, all’interno delle funzioni di interrupt si devono modificare solo le variabili di stato da cui dipendono le operazioni richieste.

Non utilizzare funzioni temporali negli interrupt

Il comando delay() in una funzione di interrupt non funziona. Se si utilizza il contatore di tempo su millis(), all’uscita della funzione di interrupt verrà recuperato l’ultimo valore registrato, poiché la funzione di interrupt non esegue il conto alla rovescia. L’uso di millis() può evitare il jitter del pulsante, ma è meglio usarlo nel ciclo principale void loop().

Non utilizzare il monitor della porta negli interrupt

Quando si è all’interno di un’interruzione, i dati attraverso la seriale possono andare persi. È possibile utilizzare Serial.print() all’interno di una funzione di interrupt per eseguire il debug del programma e assicurarsi che l’interrupt venga attivato, ma si potrebbero incontrare dei problemi. È preferibile richiedere informazioni all’interno di void loop().

Usare volatile per dichiarare le variabili

Le variabili utilizzate nelle funzioni ISR e nelle funzioni normali devono essere dichiarate con la variabile volatile. Questo indica al compilatore che le variabili di questo tipo possono cambiare in qualsiasi momento e che il microcontrollore deve ricaricare la variabile ogni volta che vi si accede. In caso contrario, gli algoritmi potrebbero cancellare completamente la variabile.

Conclusione. L’uso della funzione attachInterrupt nel linguaggio Arduino è molto utile quando ci si vuole assicurare che il microcontrollore non perda alcun cambiamento nel segnale controllato. Tuttavia, quando si utilizzano gli interrupt a pulsante nella programmazione di Arduino, bisogna fare attenzione a non usarli troppo spesso. A volte il semplice polling del sensore può essere un’opzione più semplice e migliore.

5/5 - (1 vote)


Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.