Gestire un bottone meccanico con Arduino

Un componente molto utile in un progetto Arduino è il bottone meccanico. Si presenta solitamente come un cubetto di metallo e plastica con un piccolo cilindro al centro sostenuto internamente da una molla (o da lamelle metalliche); presenta quattro connettori con i quali può essere incastrato nei fori di una breadboard. Quando il pulsante viene premuto, i connettori opposti si collegano elettricamente, chiudendo il circuito. Nella foto sotto vengono mostrate varie angolazioni di un bottone meccanico.

Bottone meccanico per Arduino

Lista dei componenti

Passiamo subito in rassegna tutto ciò che serve per approntare un prototipo di controllo pulsante con Arduino. Una volta assemblato il tutto passeremo a scrivere il codice necessario.

Abbiamo quini bisogno di:

  • una breadboard
  • tre cavetti jumper
  • un ponticello da doppino telefonico
  • una resistenza da 10k ohm
  • un bottone meccanico
  • una scheda Arduino
  • un cavo usb per collegare Arduino al pc

La resistenza ci servirà per filtrare eventuale elettricità statica o altro tipo di interferenze provocate dal rilascio del pulsante. Imposteremo infatti un pin digitale in input, collegandolo al tasto; se al pin dovessero arrivare fluttuazioni di tensione, il valore in ingresso non corrisponderebbe più a un valore minore o uguale alla costante LOW, rilevando false pressioni del pulsante.

Creazione del circuito per gestire un pulsante con Arduino

Come si può osservare dalla foto, il pin digitale 8 è stato collegato a un connettore del bottone. Il connettore opposto corrispondente viene collegato a massa (al pin GND) tramite la resistenza. Il connettore parallelo a quello collegato alla resistenza va direttamente all’alimentazione di 5V di Arduino, tramite il ponticello e il cavetto jumper.

Circuito di gestione bottone con Arduino

Gestire il rimbalzo di un bottone con Arduino

Oltre alle fluttuazioni di tensione che si verificherebbero se collegassimo il pulsante a massa direttamente senza fare uso di una resistenza, la pressione sul tasto può causare dei rimbalzi, che a loro volta provocano degli sbalzi di tensione, col risultato che stato del bottone risulta premuto più volte anche dopo averlo rilasciato. Per questo è opportuno salvare in variabili diverse la tensione in ingresso sul pin 8 e lo stato precedente ad ogni ciclo della funzione loop di Arduino. Prima di confrontare se il valore ricevuto dal pin corrisponde alla costante HIGH di Arduino, dovremo verificare che lo stato precedente e lo stato corrente del bottone non coincidano (nel qual caso considereremo il tasto non premuto). Inoltre è opportuno inserire un ritardo di alcuni millisecondi per attendere che il meccanismo del tasto si riposizioni ad ogni pressione.

Il codice sorgente di gestione del tasto meccanico con Arduino

Nello sketch del progetto, impostiamo il pin 8 in modalità input e inizializziamo la comunicazione seriale. Per salvare lo stato del bottone creiamo la variabile stato_precedente e la costante STATO_ATTUALE. La prima viene inizializzata con la costante LOW, ad indicare una tensione bassa associata al tasto nel suo stato normale (non premuto); la seconda riceve in input dal pin 8, tramite la funzione digitalRead, la tensione in ingresso (che sara HIGH qualora venga esercitata pressione meccanica sul tasto). Successivamente, nel test condizionale, verifichiamo che lo stato precedente sia LOW e che il tasto sia stato premuto (STATO_ATTUALE == HIGH). Se il flusso di esecuzione entra nel blocco if, dopo aver stampato sulla seriale un alert apposito, applicheremo un ritardo di 50 millisecondi. Nell’ultima riga del loop riassegniamo il valore dello stato attuale alla variabile stato_precedente, per rieseguire il confronto con il successivo stato del bottone al prossimo ciclo.

#define PIN_BOTTONE  8

void setup() {
  //inizializzazione della comunicazione seriale
  Serial.begin(9600);

  //impostazione del pin 8 in modalità input
  pinMode(PIN_BOTTONE, INPUT);
}

//stato del bottone meccanico
int stato_precedente = LOW;

void loop() {
  
  //stato del bottone impostato da monitor seriale
  const int STATO_ATTUALE = digitalRead(PIN_BOTTONE);

  //verifichiamo che lo stato precedente fosse low e che il tasto sia stato premuto
  if(STATO_ATTUALE != stato_precedente && STATO_ATTUALE == HIGH){
    //stampa sulla seriale di una notifica di pressione del tasto
    Serial.println("Tasto premuto");
    //attesa di 50 millisecondi per evitare rimbalzi meccanici
    delay(50);
  }

  //lo stato attuale del bottone diventa lo stato precedente al prossimo loop
  stato_precedente = STATO_ATTUALE;
}

Provate a commentare il delay e ad applicare al bottone pressioni più o meno prolungare per sperimentare il rimbalzo. Fate lo stesso eliminando il codice di gestione dello stato. Cosa succede sul monitor seriale?

Conclusione

Abbiamo visto come gestire un pulsante meccanico con Arduino e come risolvere le problematiche legate alle fluttuazioni di tensione e al rimbalzo dello stesso. Nel codice sorgente abbiamo fatto uso di una variabile dichiarata al di fuori del blocco del loop di Arduino; ne tratteremo più approfonditamente in un prossimo articolo, dove parleremo del riutilizzo del codice tramite la creazioni di funzioni e ne approfitteremo per vedere come funziona una libreria, come quella per gestire il debounce di un bottone. Non ci limiteremo a stampare sul monitor seriale, ma proveremo ad accendere un led con un tasto.

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.