Arduino – Funzione antirimbalzo (debouncing)

In un mondo ideale un pulsante può essere visto come un contatto che, nel caso sia di tipo N.O. (Normally Opened) risulta aperto quando è a riposo e chiuso quando è premuto. Inoltre all’istante della pressione/rilascio è privo di qualunque fenomeno transitorio.
Nel mondo reale però purtroppo non è così. Essendo un qualunque pulsante costituito da lamelle che si toccano o no a seconda che questo sia premuto o rilasciato, al momento della pressione/rilascio queste non si stabilizzano subito nella posizione voluta ma si ha un fenomeno transitorio di tipo oscillatorio chiamato microrimbalzo.

Finché intendiamo utilizzare un pulsante per controllare l’accensione monostabile di un led (cioè quando è premuto è acceso, altrimenti è spento) allora questo fenomeno non è un problema. Sarebbe tuttavia inutile sprecare un Arduino per questo scopo. Il fenomeno del microrimbalzo non è trascurabile se vogliamo controllare l’accensione bistabile del led, in cui ad una pressione del pulsante si accende e ad una successiva si spegne. Allo scopo si può impiegare il seguente circuito.

Come si nota dallo schema, l’ingresso di Arduino a cui è collegato il pulsante sarà a livello alto quando questo è a riposo, mentre a livello basso quando premuto. E’ stata scelta questa logica in quanto Arduino include delle resistenze di pull-up attivabili via programma per i vari ingressi mediante l’istruzione pinMode(pin, INPUT_PULLUP) da richiamare nel void setup(). Si può quindi evitare di dover collegarne di esterne. Il seguente listato dà un’idea sul funzionamento.

Cosa succederà in questo caso? Premendo il pulsante una volta il led dovrebbe accendersi, premendolo una seconda volta dovrebbe invece spegnersi, ma in pratica non è così e ciò è visibile nel video seguente. Premendo il pulsante una volta infatti, essendoci un segnale che oscilla temporaneamente, lo stato dell’ingresso continua a cambiare diverse volte, quindi il led non si sa se rimarrà poi acceso o spento.

44,716 total views, 2 views today