venerdì 2 febbraio 2018

Pulsanti e Resistenze di Pull Up-Down con Arduino







In questo post tratto un tema base per chi si avvicina ad Arduino ed in particolare come leggere correttamente lo stato di un pulsante ed accendere un led di conseguenza.

Il tema puo' sembrare banale ma ho visto sul gruppo Facebook che moltissime persone che si avvicinano ad Arduino non hanno ben chiaro il concetto di Resistenza di Pull-Up e di Pull-Down.

In questo post spiego questo concetto e lo applico ad un pulsante. 

Questo e' un concetto base che poi e' utilizzato in altri scenari nell'uso di Arduino e nella realizzazione di progetti.


Alta Impedenza

Quando in uno sketch impostiamo (tipicamente nel setup) un digital pin a input




Il pin in questione viene portato in uno stato di Alta Impedenza,  come se in serie al pin ci sia una resistenza da 100 MOhM. In tale stato il pin in ingresso richiede una piccolissima corrente per cambiare stato logico.

In altre parole il pin in alta impedenza si comporta come una "semplicissima "antenna" e puo' captare qualsiasi tipo di rumore o perturbazione e di conseguenza cambiare stato logico in maniera casuale e non controllabile.




Per esempio nel codice qui sopra in cui accendiamo un led in base allo stato di un pulsante, non riusciremo a raggiungere l'effetto desiderato in quanto il led si accenderà' anche senza una pressione del pulsante.


Pull-Up e Pull-Down

Il problema sopra evidenziato si risolve collegando opportunamente una resistenza al pin in question.







Piu' nello specifico ci sono due configurazioni possibili:

  • Pull-Up: si inserisce un'opportuna resistenza (10-100K Ohm) tra il piedino e l'alimentazione (VCC)
  • Pull-Down:si inserisce un'opportuna resistenza (10-100K Ohm) tra il piedino e la massa (GND)


Vediamo piu' in dettaglio il funzionamento (la linea blu rappresenta il flusso di corrente).





Pull-Up


In questo caso si vede che con il pulsante OFF (non premuto) il pin assume stato logico stabile 1 (HIGH).
Contrariamente al caso in cui la resistenza non e' presente lo stato logico 1 permane all'ingresso del pin di arduino in modo stabile e permanente.





In questo caso si vede che alla pressione del pulsante la corrente fluisce verso massa portando il pin allo stato logico 0 (LOW).

Pull-Down





In questo caso si vede che con il pulsante OFF (non premuto) il pin assume stato logico stabile 0 (LOW).
Contrariamente al caso in cui la resistenza non e' presente lo stato logico 0 permane all'ingresso del pin di arduino in modo stabile e permanente.






In questo caso si vede che alla pressione del pulsante la corrente fluisce verso massa portando il pin allo stato logico 1 (HIGH).



Circuito con Pulsante e resistenza di Pull-Up

Qui il classico schema elettrico per il collegamento di un pulsante ad arduino in modo corretto (a meno del bouncing)





Qui lo schema su breadboard





Qui un semplice codice di test.





Circuito con Pulsante e resistenza di Pull-Down

Qui il classico schema elettrico per il collegamento di un pulsante ad arduino in modo corretto (a meno del bouncing)



Qui lo schema su breadboard






Qui un semplice codice di test







Circuito con Pulsante senza Resistenza

Ora che il concetto di Pull-Up e Pull-Down e' chiaro possiamo sfruttare una caratteristica del micro Atmel 328 (quello di arduino).
In particolare questo micro controllore fornisce internamente per ogni pin di I/O digitale una resistenza di Pull-Up.

Questo e' un grande vantaggio in quanto ci permette di risparmiare una resistenza e di semplificare il nostro circuito.

Qui il classico schema elettrico per il collegamento di un pulsante ad arduino in modo corretto (a meno del bouncing) senza resistenza di Pull.









Qui un semplice codice di test



Come si vede basta durante la configurazione del pin di input usare il valore INPUT_PULLUP e la resistenza interna al micro viene abilitata.

Si fa notare che la resistenza interna e' solo di Pull-UP.
Se si vuole usare la configurazione Pull-Down e' necessario inserire la resistenza esternamente come mostrato sopra.

Spero con questo post di fare un po' di chiarezza per chi e' alle prime armi e non ha le nozioni base di elettronica ed elettrotecnica.





8 commenti:

  1. Ciao, grazie per quello che fai, condividi così utenti come me forse imparano, allora sto cercando disperatamente una cosa, ho fatto il circuito con un attiny85 che ha un pulsante che fa l'accensione e lo spegnimento di un led, con il debounce, fin qua ci sono riuscito, il problema è che deve andare in sleep quando il led è spento e quando premo il pulsante deve risvegliarsi, questa perte non so proprio come farla, mi aiuti per favore, Grazie

    RispondiElimina
  2. qui il datasheet di attiny

    http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet.pdf

    guarda il capitolo 9.3.2 (GIMSK) e 9.3.4 (PCMSK)

    abiliti gli interrupt sui pin
    GIMSK |= (1 << PCIE);

    specifici su quale pin arrivera l'interrupt
    PCMSK |= (1 << PCINT4);

    abiliti interrupt
    sei();

    RispondiElimina
  3. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  4. Ciao, con Tinkercad è possibile simulare gli schemi di funzionamento con processori composti ad esempio: arduino uno più motor shield e relay shield? grazie Carlo

    RispondiElimina
    Risposte
    1. ciao Carlo, se i componenti che menzioni sono disponibili in tinkercad è certamente possibile utilizzarli.
      A memoria non mi pare sia disponibili, però è un bel pò che non gioco con tinkercad.
      ti suggerisco di verificare, magari ora sono presenti

      Elimina
  5. Ciao, dovrei modificare uno schema che utilizza i moduli arduino uno, motor shield e relay shield dove utilizzo due sensori IR che abilitano eventi ai pin digitali 10 e 11 impostati come input. Dovrei modificare i sensori con pulsanti e dalla spiegazione pullup e pulldown, ben fatta, non so quale applicare perchè non conosco quale stato (0 /1) viene impostato su sui pin indicati quando il sensore attende interruzione. Se puoi darmi una mano. Grazie.

    RispondiElimina
    Risposte
    1. se hai il circuito montato con un tester misura lo stato del pin 10 e 11.

      in ogni caso la soluzione migliore è controllare il datasheet del tuo sensore IR (immagino dei PIR) su quale sia l'uscita. Normalmente è 0 se non c'e' rilevazione ed 1 quando rileva.

      Ma su alcuni moduli è configurabile.

      Anche in questo caso con il tester puoi fare un velocissimo controllo.

      Prova è facilissimo

      Elimina
    2. Ok. grazie del supporto. trovato

      Elimina