Nell'esempio precedente abbiamo cambiato lo stato di un pin di digital input collegandolo a GND piuttosto che a 5V.
Un metodo più semplice è quello di utilizzare un pulsante per variare lo stato di un pin. Prima di questo però dobbiamo introdurre un nuovo concetto: le resistenze di pullup
Resistenze di pull up
Gli ingressi dell'arduino sono ad alta impedenza ovvero richiedono (assorbono) una corrente minima per cambiarne lo stato.
Questo
è molto vantaggioso e ci permette di gestire facilmente i dispositivi
da collegare agli ingressi, ma presenta anche un inconveniente: essendo
così sensibili gli ingressi lasciati liberi (non collegati) presentano
valori casuali causati dai rumori di fondo e non un valore LOW come potremmo erroneamente pensare.
Nello schema sopra riportato con pulsante premuto avremo un valore HIGH sul pin di ingresso, mentre con circuito aperto avremo valori in ingresso oscillanti.
Per questa ragione dobbiamo far si che il nostro pin sia sempre connesso o a 5V o a 0V.
Potremmo ovviare il problema connettendo il circuito aperto a terra:
Ma in questo caso il problema nasce quando chiudiamo il circuito che causa un bel cortocircuito con conseguente danneggiamento del nostro arduino.
Per fare questo possiamo utilizzare il seguente schema:
Nello schema abbiamo introdotto una resistenza da 10K chiamata
resistenza di pull up.
Fintatochè il pulsante non è premuto il pin rimane stato HIGH; la corrente che fluisce è bassa per via della resistenza, ma data l'alta impedenza degli ingressi è sufficiente a mantenere alto lo stato.
Quando premiamo il pulsante la corrente fluisce verso massa e la tensione prossima a 0V porta il pin in stato LOW. In questo caso non abbiamo corto circuito poichè la resistenza limita la corrente ( I = V/R=5V/10.000ohm= 5mA)
L'obiettivo raggiunto utilizzando una resistenza di pull up è quello di togliere le fluttuazioni al pin di input; Il compito della resistenza di pull up è i ridurre la corrente che attraversa il circuito.
Solitamente per i circuiti di pull up si utilizzano resistenze da 10K, ma se vogliamo possiamo utilizzare resistenze da 47K o superiori.
Utilizzando una resistenza di pull up avremmo uno stato HIGH con il circuito aperto (pulsante non premuto) e LOW con circuito chiuso (pulsante premuto). Questo può inizialmente creare un po' di confusione, ma è solo una convenzione.
Resistenza di pull up interna
E' possibile attivare una resistenza di pull up interna all'Atmega con l'istruzione
pinMode(pin, INPUT); // set pin to input
digitalWrite(pin, HIGH); // turn on pullup resistors
In questo modo viene attivata sul pin in ingresso una resistenza di pull up pari a 30K.
Rispetto alle resitenze di pullup reali quelle software hanno il limite di avere un valore fisso che in certi casi potrebbe non essere adeguato
Resistenze di pull down
In maniera analoga alle resistenze di pull up possiamo utilizzare resistenze di pull down. In questo caso il circuito aperto porterà il pin in stato LOW e il circuito chiuso in stato HIGH.
Riferimenti
http://www.seattlerobotics.org/encoder/mar97/basics.html
http://www.thebox.myzen.co.uk/Tutorial/Inputs.html
http://www.ladyada.net/learn/arduino/lesson5.html
http://arduino.cc/en/Tutorial/Button