Mag 192012
 

Fig1: collegamento diretto: NON fatelo!

In questa puntata vediamo come interfacciarci con Arduino attraverso l’uso di un pulsante. Vedrete che tale tipo di collegamento è molto semplice, ma necessita di piccole accortezze. Se ricordate nella prima puntata avevamo detto che la scheda Arduino UNO può essere alimentata da 6 a 20V anche se consigliati fra 7 e 12. Ma i pin (i buchetti di ingresso) operano a 5V indipendentemente dai valori di alimentazione e possono “far scorrere” un massimo di 40mA. Per tale motivo non potete ad esempio usare una batteria a 9V per fornire un segnale di ingresso. Ora l’intuito potrebbe farci pensare che per realizzare un pulsante possa bastare collegare una fonte a 5V ad un pulsante che a sua volta verrà collegato ad uno degli ingressi, come in figura 1.

Figura 2: Utilizzo di un deviatore al posto del pulsante

Vi ho allegato l’immagine qui vicino, ma come scritto sopra “NON FATELO!”. Se ho scritto così è perchè faremmo un grosso guaio ad Arduino nel momento in cui andiamo a premere il pulsante, ma perchè? Finchè non premiamo il pulsante non succede nulla per cui l’ingresso dovrebbe leggere uno 0, ossia un “ingresso non attivato – LOW”, anche se più avanti faremo alcune importanti precisazioni. Ma quando premiamo il pulsante cosa succede? In teoria i 5V “raggiungeranno” il nostro ingresso che diventerà un 1, ossia “ingresso attivato – HIGH” ossia esattamente ciò che volevamo fare. Questo è verissimo ma c’è un piccolo particolare che abbiamo trascurato, infatti non abbiamo fatto nulla per limitare la corrente ad un massimo di 40mA, motivo per cui il pin di ingresso potrà andare ad assorbire molta più corrente andando a friggersi in modo definitivo. Per limitare la corrente dobbiamo usare per forza una resistenza, diciamo di almeno 250 Ohm in modo che possano passare un massimo di 20mA (ricordiamo che è buona norma non superare la metà del massimo consentito). Nota che non esistendo resistenze da 250Ω i valori commerciali più prossimi sono 270Ω o 330Ω (usato nell’esempio). La documentazione ufficiale suggerisce un valore di 470Ω che mantiene la corrente a circa la metà del massimo da noi voluto, circa un quarto della massima corrente assorbibile dal pin di Arduino. Se non lo aveste capito, il valore di 250Ω deriva dalla semplice legge di Ohm, infatti se ho V=5 e I=20mA (la soglia da noi decisa), R=V/I ossia 5/0.02 (la corrente è espressa in Ampere e 20mA corrispondono a 0.02A).  Il risultato è appunto 250. Allo stesso modo possiamo calcolare che con la resistenza di 470Ω suggerita dalla documentazione ufficiale, passa una corrente di poco meno di 11mA. Una cosa importante da notare è che questo tipo di approccio non dipende da Arduino ma è applicato a qualsiasi circuito integrato (IC)  (microprocessore), vi basta infatti guardare lo schema elettrico o seguire le piste sulla scheda per capire che in buona parte le uscite si interfacciano direttamente con l’ATMega, ossia il “cervello” del nostro Arduino.

Ingresso indeterminato

Purtoppo la lezione non è ancora finita. Quando il pulsante non è premuto non c’è nulla che “dica” al circuito di restare a livello LOW, infatti interferenze elettromagnetiche, correnti statiche o quant’altro potrebbero far alzare il livello della tensione sino ad arrivare ad un livello HIGH. Infatti un microprocessore interpreta normalmente un livello di tensione sotto una certa soglia come LOW (zero) e sopra un’altra soglia come HIGH (uno). La presenza di tensioni non previste o di valori che sono intermedi fra le due soglie vanno evitati ed è per questo che quando un pin non è collegato a nulla si parla di pin flottante e di “valore indeterminato”. Per portare a zero il pin non si fà altro che collegarlo a massa. Se per un momento sostituiamo il pulsante con un deviatore, il risultato potrebbe essere quello della prossima figura (fig.2). Vediamo che il pin è protetto dalla resistenza ed in base alla posizione del deviatore (switch) questo è collegato o a massa o ai 5V. Si noti anche che se per errore nel nostro software impostiamo l’uscita come output (uscita) anzichè input (entrata) e poniamo il valore ad HIGH, ossia passaggio di una corrente, la resistenza impedirà l’eccessivo assorbimento di corrente fra l’uscita di Arduino e la massa qualora lo switch sia deviato in questa posizione. Durante la prova di questi circuiti ho provato semplicemente a lasciare collegato al pin la sola resistenza senza nessun altro collegamento. Arduino ha letto un valore HIGH anche senza il collegamento a 5V.

Resistenze pull up e pull down

Fig.3: Pull Down

 

Fig.4: Pull Up

Ma noi originariamente volevamo utilizzare un pulsante per cui dobbiamo escogitare un sistema differente. A questo punto introduciamo una nuova resistenza che prenderà il nome, in base al tipo di collegamento, di resistenza di pull-up o di pull-down. Nella prossima figura (fig.3) vediamo una resistenzaa di tipo pull-down. Come vediamo dallo schema c’è ancora l’originaria resistenza a proteggere il pin a cui ne abbiamo associata una seconda che scarica a massa. Quando il pulsante non è premuto le due reistenze sono messe in serie ed il pin leggerà zero, ossia il valore di massa. Le resistenze faranno si che eventuali interferenze vengano limitate impedendo la lettura di valori indeterminati. Quando invece andiamo a premere il pulsante la corrente seguirà la via a minor resistenza che è quella verso il pin, impedendo perciò di creare un cortocircuito fra 5V e massa. Se invertiamo la posizione del pulsante con la resistenza da 10k, otteniamo una resistenza di pull-up. In questo caso a pulsante non premuto c’è costantemente corrente che passa attraverso le due resistenze e giunge al pin, per questo si chiama pull UP, infatti UP significa alto, come il segnale (5V). Quando invece andiamo a premere il pulsante la corrente seguirà la via a minor resistenza per cui passerà dalla resistenza di 10k al pulsante, alla massa. E’ indispensabile usare una resistenza da 10K? No. Benchè per questo genere di applicazione sia un valore sostanzialmente standardizzato, nulla vieta di usarne di diverse, comunque, con il nostro amato Arduino, consiglio di restare fra 5kΩ e 10kΩ, anche se in rete possiamo trovare valori variabili da 2KΩ a 100KΩ.

Resistenza pullup interna

A dirla tutta Arduino ci permette di semplificare le cose eliminando tutte le resistenze. Ma come? Se configurate il pin scelto che nel nostro caso era l’8, dopo aver configurato il pin come INPUT con pinMode(8, INPUT); possiamo usare digitalWrite(8, HIGH); per attivare la resistenza di pullup interna di Arduino di 20kΩ (la documentazione ufficiale riporta 20-50kΩ senza specificare meglio). Ciò può semplificare la struttura del nostro circuito, MA, se fate un errore nella programmazione, il pin non sarà protetto dalla resistenza per cui un errore di programmazione può portare a dei guasti, cosa che sicuramente non desideriamo. Nella figura 5 vediamo lo schema a confronto della resistenza di pull up e pull down, che forse fà comprendere meglio la differenza di collegamento (l’ho trovato in rete per cui al posto della resistenza da 330Ω ne trovate una da 220). Vi faccio notare che nello schema “pullup” la resistenza sul pin di Arduino potrebbe essere elimintata in quanto sulla linea 5V c’è già la resistenza da 10kΩ a proteggere il pin da un eccesso di corrente. MA se per errore con un filo 5V tocchiamo la linea che và a massa, magari perchè durante le nostre prove banalmente la sfioriamo spostando un cavo, il pin non sarà protetto e potrà bruciarsi. Trovo perciò utile imparare a mettere sempre questa resistenza, quantomeno sui prototipi che sono a maggior rischio cortocircuiti. Lo dico semplicemente perchè in molti schemi che trovate in rete non viene utilizzata.

Figura 5: schema di resistenza pull up e pull down.

Il software

Ora concentriamoci sul software. Nei precedenti articoli ci siamo limitati ad utilizzare gli esempi inclusi nell’SDK di Arduino. Questa volta faremo un passetto in più per cui prepariamoci a scrivere il nostro primo software di gestione del nostro amato Arduino. Il circuito utilizzato sarà quello della figura 3 con la resistenza configurata come pulldown. L’output sarà rappresentato dal led interno dell’uscita 13. Se ricordate un programma Arduino presenta una pima funzione setup() in cui andremo ad inizializzare i pin di Arduino, in particolare nel nostro caso inizializzeremo il pin 13 come OUTPUT per usare il led interno, ed il pin 8 come INPUT per leggere lo stato del pulsante.

Per fare ciò scriviamo:

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(8 , INPUT);
}

Per migliorate la leggibilità e permettere una più semplice modifica del software in futuro, è buona norma assegnare il numero di pin a variabili più facilmente gestibili. In questo modo se decidiamo di spostare gli ingressi o le uscite è sufficiente modificare l’assegnazione della variabile anzichè modificare tutti i riferimenti in tutto il listato.

Nel setup ci preoccupiamo di impostare  lo stato del led ed usare un comando digitalWrite per accertarci di portare lo stato del led ad un valore LOW.

int ledpin=13; // assegno 13 alla variabile intera ledpin
int buttonpin=8; // assegno 8 alla variabile intera buttonpin
int ledstatus=0;

void setup()
{
 pinMode(ledpin, OUTPUT);
 pinMode(buttonpin , INPUT);
 digitalWrite(ledpin, ledstatus);
}

Ora dobbiamo creare un loop che va a testare continuamente l’ingresso del pulsante per vautare se è stato premuto o meno ed in base a ciò decide se accendere o meno il led.

void loop()
{
  ledstatus = digitalRead(buttonpin);   // lettura dell'ingresso
  if (ledstatus == HIGH) {               // controlla se il pulsante è premuto
    digitalWrite(ledpin, HIGH);   // accedn il LED
  }
  else if (ledstatus == LOW) {              // controlla se il pulsante viene rilasciato
    digitalWrite(ledpin, LOW);    // spegne il LED
  }
}

Il codice è estremamente semplice. Viene utilizzata la funzione digitalRead per leggere lo stato del pin a cui abbiamo collegato il pulsante. Se questo è premuto determina l’accensione del led con la digitalWrite(ledpin,HIGH), altrimenti (else) ne effettua lo spegnimento.

Ecco il consueto video in cui vi faccio vedere il circuito funzionante. Noterete che al posto del micropulsantino ho usato un interruttore di maggiori dimensioni per il semplice motivo che non avevo nessun pulsante a portata di mano.

Arduino collegato ad un interruttore in ingresso ed un relè in uscita. Premendo l’interruttore viene attivato il relè e viceversa.

Per finire vi propongo un esercizio. Ricordate la lezione sul relè? Se unite la lezione di oggi e quella sul relè, senza alcuna modifica otterrete un circuito in cui alla pressione del pulsante si accende il led e si attiva il relè collegato. Guarda caso non ci sono sovrapposizioni fra i due schemi per quanto riguarda i pin di Arduino per cui è sufficiente collegare il tutto ed usare il software qui sopra per ottenere il risultato desiderato. Eccovi una foto. Se guardate con attenzione vedrete che non ho fatto altro che collegare la massa del vecchio circuito a quella del nuovo ed ho messo il filo verde sull’uscita 13 di Arduino. Qualcuno sicuramente avrà pensato che fare tutto questo lavoro per fare in modo che alla pressione di un pulsante si accenda un relè non ha alcun senso, bastava collegare direttamente il pulsante al relè ed ottenevamo la stessa identica cosa. O no? In realtà questa è la base di tutta una serie di possibili circuiti. Pensate ad esempio di modificare il software di Arduino per spegnere il relè dopo un certo tempo dall’accensione. In questo caso otteniamo un’uscita temporizzata. O ancora. Pensate di sostituire il pulsante con un sensore infrarossi e collegare il relè ad una sirena. Avrete creato un rudimentale antifurto. Spero che l’articolo odierno vi sia piaciuto e vi sia chiaro, in caso contrario lasciate pure i vostri commenti.

  5 Responses to “Arduino: colleghiamo un pulsante esterno.”

  1.  

    Bellissimo post, davvero! Però per piacere, HIGH, non “HIGHT” 😉 Grazie ancora dell’articolo! 🙂

    •  

      ooopps….non ho neanche la scusa del correttore ortografico, ho proprio sbagliato. Almeno ne ho sbagliati solo la metà :-). Ora correggo quelli sbagliati. Grazie per la segnalazione, mi toccherà mettere il cappello da asino, me lo merito proprio 🙂

  2.  

    Alcune osservazioni:
    1) “ingresso attivato – HIGH” e “ingresso non attivato – LOW” sono espressioni improprie.
    non sta scritto da nessuna parte che attivo = high e non attivo = low io posso creare benissimo un circuito che si attiva quando un segnale è low!
    Per non creare ambiguità o incomprensioni, mi limiterei ad usare i termini HIGH e LOW.
    2) “i buchetti di ingresso) operano a 5V indipendentemente dai valori di alimentazione e possono “far scorrere” un massimo di 40mA” questo è vero per i pin usati come uscita, cioè se sono loro ad erogare la corrente per circuiti utilizzatori, come ad es. per accendere un LED.
    Se invece il pin è impostato come ingresso, questo va in alta impedenza. Di fatto il micro legge la tensione ai capi di un condensatore, quindi circola la sola corrente di carica di questo condensatore. La resistenza indicata, quindi, non serve.
    Il problema di connessione dei pulsanti è un’altro, bisogna proteggersi dal debounce, cioè dalle oscillazioni che si generano quando si collega meccanicamente un circuito. Semplificando solo per far capire di cosa si parla, le scintille che si vedono sulle prese elettriche quando si connettono. Più la presa è di qualità scarsa e più sono evidenti. Se l’ingresso viene letto molte volte in rapida successione potrei leggere più pressioni del pulsante appunto a causa di questo fenomeno.

    Se il buongiorno si vede dal mattino…

    •  

      1) ““ingresso attivato – HIGH” e “ingresso non attivato – LOW” sono espressioni improprie.”: in questo esempio non lo sono ed essendo un articolo per principianti alle prime armi non trovo il motivo di scrivere diversamente.
      2) “mi limiterei ad usare i termini HIGH e LOW.”: quando scriverai il tuo articolo farai quello che vuoi ma qui quello che scrive sono io, prendo volentieri suggerimenti, ma non mi interessano i sapientoni che commentano giusto per far vedere che sanno qualcosa.
      3) Il debounce è spiegato in altra sede, non era il target di questo articolo.
      4) Se per errore nello sketch imposti il pin in uscita anzichè in entrata, non hai nessuna alta impedenza per cui nello schema in pullup quando premi il pulsante connetti direttamente l’uscita a massa. Detto questo il tuo commento è fuori luogo perchè un principiante seguendo il tuo consiglio, per una semplice svista potrebbe bruciare il suo, magari unico, Arduino.
      5) “Se il buongiorno si vede dal mattino…”: sai nessuno ti obbliga a leggere e tantomeno a commentare. Se non gradisci il contenuto del blog puoi semplicemente ignorarne l’esistenza, stiamo bene anche senza i tuoi inutili commenti.

  3.  

    Bella risposta al sapientone di turno. Chiaro che “manca qualcosa”, ma chi è alle prime armi non riesce a capire tutto e subito. E’ come usare dosaggi elevati di farmaco (spiegazioni) che poi ammazzano il paziente (l’attenzione e comprensione).
    Apprezzo iltuo linguafggio scorrevole ed efficace.
    Se leggerai questo post, mi passi il link della lezione che menzioni in questo articolo:

    “Per finire vi propongo un esercizio. Ricordate la lezione sul relè? Se unite la lezione di oggi e quella sul relè, senza alcuna modifica otterrete un circuito in cui alla pressione del pulsante si accende il led e si attiva il relè collegato. Guarda caso non ci sono sovrapposizioni fra i due schemi per quanto riguarda i pin di Arduino per cui è sufficiente collegare il tutto ed usare il software qui sopra per ottenere il risultato desiderato.”.