Pulsante a pressione (push button)

Il pulsante a pressione (in inglese push button) è un componente molto semplice, e lo utilizzeremo molto nei nostri progetti con Arduino.

I pulsanti a pressione normalmente sono dei contatti aperti, ovvero non possono essere attraversati dalla corrente. Grazie alla pressione che facciamo sul pulsante, meccanicamente si crea un passaggio per la corrente.

Nei pulsanti a pressione questo passaggio scompare appena smettiamo di premere, mentre negli interruttori (in inglese switch) la presenza del canale dipende dalla posizione della levetta.

Normalmente non abbiamo bisogno di un modulo apposito per utilizzarli, ma sicuramente può risultare comodo. Il modulo che vedremo è quello del kit Elegoo.

Struttura Modulo

Specifiche Tecniche

Il modulo non ha particolari specifiche. La tensione di alimentazione indicata per il push button non è ovviamente la massima possibile, ma quella indicata per poterlo utilizzare con Arduino.

Si consiglia comunque di non utilizzare mai più di 24V nei vostri progetti.

Schema Collegamento

L’aspetto interessante dei push buttons è l’essere circuiti aperti quando non premuti.

Schema di collegamento interno.
Per individuare i collegamenti interni, usare il tester.

Questo fatto può ingannare i meno esperti: i pin di Arduino, se non collegati ad una tensione fissa, sono esposti ai campi elettromagnetici che li circondano, e quindi cambiano continuamente e casualmente valore.

Come possiamo leggere nella documentazione ufficiale qui, il valore HIGH del pin corrisponde a valori di tensione maggiori di 3.0V (se Arduino è alimentato a 3.3V invece è 2.0V), mentre per valori inferiori è LOW.

Può sembrare sorprendente, ma i campi elettromagnetici di cui normalmente siamo circondati rendono veramente facile far scattare la soglia del pin, se questo è scollegato.

Dobbiamo quindi tenere sempre collegato il pin, utilizzando una resistenza di pull-up o pull-down da 10kΩ.

Nel nostro modulo, è già presente una resistenza di pull-up.

Altrimenti è anche possibile usare quelle interne di Arduino, il cui valore è circa 20kΩ, che però potrebbe non essere sufficientemente basso in presenza di disturbi, e non funziona sul pin 13, come accennato qui.

Ci limitiamo a collegare come segue:

Schema collegamento

Altrimenti avremmo fatto come segue:

Configurazione con pull-up esterno.
Invertire i collegamenti di 5V e GND per avere pull-down.
I pin in verticale sono già collegati insieme all’interno del pulsante.

Oppure semplicemente:

Configurazione con pull-up interno

Codice

Il codice che andremo ad utilizzare è molto semplice, ma dipende dalla configurazione di collegamento scelta.

Riportiamo qui i codici per tutte le configurazioni dei push buttons con Arduino:

#define BUTTON_PIN 2

void setup() {
  Serial.begin(9600); //Inizialiazzo la seriale per comunicare
  pinMode(BUTTON_PIN, INPUT); //Imposto il pin come ingresso
}

bool wasPressed = 0; //Variabile per rilevare il fronte

void loop() {
  /*
   * Quando vogliamo rilevare la pressione del pulsante,
   * ma non vogliamo eseguire il codice continuamente, 
   * dobbiamo usare una variabile per isolare il fronte
   * di discesa del segnale
   */
   if (digitalRead(BUTTON_PIN) == LOW && !wasPressed){
      //Eseguito solo alla prima pressione
      Serial.println("Rilevata pressione pulsante!");
      wasPressed = 1; //Mi segno che ho rilevato la pressione
   }else if (digitalRead(BUTTON_PIN) == HIGH && wasPressed){ //Quando rilascio il pulsante
      Serial.println("Rilevato rilascio pulsante!");
      wasPressed = 0; //Mi preparo per la prossima pressione
   }
   /*
    * Se ci interessa invece eseguire il codice continuamente
    * mentre il pulsante è premuto, facciamo come segue
    */
    if (digitalRead(BUTTON_PIN) == LOW){
      //Eseguito continuamente mentre il pulsante è premuto
      Serial.println("Pulsante premuto!");
    }
  
   //Ritardo opzionale
   delay(100);
}
#define BUTTON_PIN 2

void setup() {
  Serial.begin(9600); //Inizialiazzo la seriale per comunicare
  pinMode(BUTTON_PIN, INPUT); //Imposto il pin come ingresso
}

bool wasPressed = 0; //Variabile per rilevare il fronte

void loop() {
  /*
   * Quando vogliamo rilevare la pressione del pulsante,
   * ma non vogliamo eseguire il codice continuamente, 
   * dobbiamo usare una variabile per isolare il fronte
   * di discesa del segnale
   */
   if (digitalRead(BUTTON_PIN) == HIGH && !wasPressed){
      //Eseguito solo alla prima pressione
      Serial.println("Rilevata pressione pulsante!");
      wasPressed = 1; //Mi segno che ho rilevato la pressione
   }else if (digitalRead(BUTTON_PIN) == LOW && wasPressed){ //Quando rilascio il pulsante
      Serial.println("Rilevato rilascio pulsante!");
      wasPressed = 0; //Mi preparo per la prossima pressione
   }
   /*
    * Se ci interessa invece eseguire il codice continuamente
    * mentre il pulsante è premuto, facciamo come segue
    */
    if (digitalRead(BUTTON_PIN) == HIGH){
      //Eseguito continuamente mentre il pulsante è premuto
      Serial.println("Pulsante premuto!");
    }
  
   //Ritardo opzionale
   delay(100);
}
#define BUTTON_PIN 2

void setup() {
  Serial.begin(9600); //Inizialiazzo la seriale per comunicare
  pinMode(BUTTON_PIN, INPUT_PULLUP); //Imposto il pin come ingresso con pull-up interno
}

bool wasPressed = 0; //Variabile per rilevare il fronte

void loop() {
  /*
   * Quando vogliamo rilevare la pressione del pulsante,
   * ma non vogliamo eseguire il codice continuamente, 
   * dobbiamo usare una variabile per isolare il fronte
   * di discesa del segnale
   */
   if (digitalRead(BUTTON_PIN) == LOW && !wasPressed){
      //Eseguito solo alla prima pressione
      Serial.println("Rilevata pressione pulsante!");
      wasPressed = 1; //Mi segno che ho rilevato la pressione
   }else if (digitalRead(BUTTON_PIN) == HIGH && wasPressed){ //Quando rilascio il pulsante
      Serial.println("Rilevato rilascio pulsante!");
      wasPressed = 0; //Mi preparo per la prossima pressione
   }
   /*
    * Se ci interessa invece eseguire il codice continuamente
    * mentre il pulsante è premuto, facciamo come segue
    */
    if (digitalRead(BUTTON_PIN) == LOW){
      //Eseguito continuamente mentre il pulsante è premuto
      Serial.println("Pulsante premuto!");
    }
  
   //Ritardo opzionale
   delay(100);
}