Bottoni con antirimbalzo

I bottoni delle nostre esperienze con Arduino sono molto semplici ed economici. Questa loro natura li rende particolarmente suscettibili a falsi contatti che possono generare anomalie nei circuiti che pilotano. Per questo esistono bottoni più complessi in cui è già previsto un circuito di controllo detto antirimbalzo. Qui noi ne realizziamo uno integrando un software di controllo opportuno invece che un sistema hardware più costoso. Gli alunni più scettici potranno dire in base a qualche prova empirica: “ma no, guarda, funziona lo stesso anche senza”. Si, vero, potrebbe essere che alcuni bottoni o perché nuovi o perché riescano particolarmente buoni non occorra aggiungere altro. Ma in alcuni contesti come bottoni usati/usurati, macchinari che producono a contatto con i bottoni vibrazioni inopportune, fonti di calore o altre anomalie, la necessità magari di alcune certificazioni di sicurezza, rendono molto importante padroneggiare questa tecnica.

Cosa ci occorre

Per questa esperienza vogliamo realizzare un circuito con due bottoni che accendono e spengono un buzzer. Fate attenzione se il buzzer sia o no attivo perché cambia il codice che dobbiamo andare a realizzare. In alternativa al buzzer si può pensare ad un analogo attuatore quale un semplice led o un coppia di led di due colori verde/rosso ad esempio per indicare lo stato dei bottoni. Le resistenze applicate ai bottoni di solito sono molto alte, anche 10 K ohm.

La logica

Primo elemento che vediamo sempre nei nostri esercizi è la dichiarazione dei pin. Ci siamo abituati dalle prime esperienze magari a comprendere i due stati INPUT e OUTPUT ma ce n’è un terzo INPUT_PULLUP che intuitivamente si comporta come input ma aggiunge una resistenza standard interna del pin che agisce in modo un po’ controintuitivo: se il segnale è HIGH il circuito del bottone non è premuto e passa la corrente, viceversa premendo il bottone il circuito si apre e lo stato diventa LOW. Un po’ al contrario, in pratica.

Veniamo agli stati. Ci sono solo due situazioni accettabili: uno dei due bottoni è acceso e l’altro spento. Altri stati sono anomalie e non vanno considerati o se lo si desidera, vanno esplicitamente trovati modi di fornire un feedback di errore (seriale, led ecc).

Altre idee

I bottoni ci permettono di creare una infinità di applicazioni. Già semplicemente sostituendo l’attuatore possiamo fare esperienze diverse con led o servomotori. I bottoni possono essere semplicemente essere utilizzati per abilitare o meno un circuito più complesso accendendo e spegnendo una funzionalità.

I buzzer attivi sono molto interessanti per i più piccoli che possono esercitarsi a cambiare frequenza e realizzare musichette. Molte sono già in rete scritte da appassionati. Una sfida per i più piccoli potrebbe essere quella di realizzare una tastiera ad una ottava con otto bottoni, ognuno che emette una nota.

Listato completo


int BUZZER = 13;
int PULSANTESTART = 11;
int PULSANTESTOP = 10;
int start = 1;
int stop = 1;
int stato_start = 0;
int stato_stop = 0;

void setup()
{
  pinMode(PULSANTESTART, INPUT_PULLUP);
  pinMode(PULSANTESTOP, INPUT_PULLUP);  
  pinMode(BUZZER, OUTPUT);
  start = 0;
  stop = 0;
}

void controllaStato()
{
  if (start == HIGH && stop == LOW)
  {
  	stato_start = 0;
        stato_stop = 1;
  }  
  
  if (start == LOW && stop == HIGH)
  {
  	stato_start = 1;
        stato_stop = 0;  
  }  
}  

// se il buzzer è passivo
//void sistemaSpento(){digitalWrite(BUZZER, LOW); }
//void sistemaAcceso(){digitalWrite(BUZZER, HIGH ); }

// se il buzzer è attivo
void sistemaAcceso(){tone(BUZZER, 700);}
void sistemaSpento(){noTone(BUZZER); }

void loop()
{
  // legge il valore dell'input e lo conserva 
  start = digitalRead(PULSANTESTART);  
  stop = digitalRead(PULSANTESTOP);  
  controllaStato();
  if (stato_start == 0 && stato_stop == 1)
    sistemaSpento();
  
  if (stato_start == 1 && stato_stop == 0)
    sistemaAcceso();
     

}

Il file di progetto Fritzing

Ultima modifica 18 Gennaio 2024