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 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
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.
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
RispondiEliminaqui il datasheet di attiny
RispondiEliminahttp://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();
Questo commento è stato eliminato dall'autore.
RispondiEliminaCiao, con Tinkercad è possibile simulare gli schemi di funzionamento con processori composti ad esempio: arduino uno più motor shield e relay shield? grazie Carlo
RispondiEliminaciao Carlo, se i componenti che menzioni sono disponibili in tinkercad è certamente possibile utilizzarli.
EliminaA memoria non mi pare sia disponibili, però è un bel pò che non gioco con tinkercad.
ti suggerisco di verificare, magari ora sono presenti
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.
RispondiEliminase hai il circuito montato con un tester misura lo stato del pin 10 e 11.
Eliminain 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
Ok. grazie del supporto. trovato
Elimina