I pin digitali di Arduino possono essere configurati per essere usati sia come ingressi che come uscite. Anche i pin analogici posso essere configurati ed usati per svolgere funzioni digitali.

I pin si configurano usando il comando pinMode() .
La sua sintassi è:

pinMode(pin, mode)

dove pin è un valore di tipo int che indica quale pin stiamo configurando, e mode può assumere due valori INPUT ed OUTPUT.

INPUT

Quando configuriamo un pin come INPUT lo settiamo in condizione di alta impedenza, in pratica è come se in serie al pin ci fosse una resistenza di circa 100MOhm. Questa resistenza serve a non “caricare” il circuito da cui andiamo a leggere il dato limitando l’assorbimento di corrente.

Se da un lato questa resistenza ci fa comodo perchè ci dà una alta sensibilità, dall’altro può crearci problemi proprio per lo stesso motivo: se lasciamo il pin scollegato, o magari collegato ad un filo che non giunge da nessuna parte, rischiamo di subire l’influenza di un qualche accoppiamento capacitivo (o qualche altro genere di distrurbo) che ci fa leggere un valore inesatto. Un esempio può essere l’uso di un encoder dove i contatti sono liberi finchè non ruotiamo l’encoder, e poi tornano scollegati.

Per ovviare a questo problema possiamo usare una resistenza di pull-up “nativa” dell’arduino. Essa si attiva usando il comando digitalWrite(pin, HIGH) su un pin precedentemente configurato come input. In questo modo si attiva una resistenza da 20 KOhm interna all’Arduino tra l’alimentazione ed il pin.

Nota: Questa resistenza genera una piccola corrente che potrebbe far accendere lievemente un LED collegato a quel pin.

Nota2: Sulla maggior parte delle board al pin 13 è collegato anche un led con una resistenza, questa potrebbe far variare la lettura quando si attiva la resistenza di pull-up su questo pin.

Per capire bene la funzione della resistenza di pull-up interna vediamo queste due configurazioni praticamente equivalenti.

Abbiamo usato lo sketch di esempio per leggere il pulsante.

Con Pull-Up esterna:

xxx pull-up_ext xxx Modifichiamo così il pin del pulsante

const int buttonPin = 14;

per usare l’ingresso analogico

Con Pull-Up interna
xxx pull_up_int xxx Alla fine del void Setup() inseriamo questa riga

digitalWrite(buttonPin, HIGH);

per attivare la resistenza di pull up interna

Potete scaricare gli sketch e gli schemi in Fritzing qui.

Nel primo abbiamo usato la classica configurazione con la resistenza di pull-up esterna; come uscita usiamo il pin 13, così da fruttare il led integrato in Arduino; per la misura dell’ingresso digitale abbiamo usato un pin analogico: per attivarli come ingressi/uscite digitali si usa la normale sintassi pinMode() ricordandosi che essi sono numerati da 14 a 19 (A0 diventa 14, A1 diventa 15 ecc…).

Nel secondo abbiamo attivato la resistenza di pull-up interna ed abbiamo tolto quella esterna, il risultato è uguale!!!

OUTPUT

La configurazione da pin di OUTPUT è l’esatto contrario dell’INPUT: il pin viene posto in bassa impedenza, ed è in grado di generare (o assorbire) fino a 40 mA di corrente. Dobbiamo stare attenti a non superare questo limiti, perchè ciò comporterebbe la bruciatura del transistor d’uscita rendendo il pin (e a volte anche l’ATMega) inutilizzabile.