Ago 152012
 

Nelle precedenti puntate abbiamo parlato degli ingressi ed uscite digitali di Arduino, più in particolare abbiamo visto come collegare un pulsante in ingresso ed un relè in uscita. Oggi, per prima cosa, vediamo come collegare un LED alle uscite di Arduino. Sinora abbiamo usato il LED interno per motivi di comodità visto che è utilizzabile senza alcun hardware aggiuntivo. Ma facciamo un piccolo passo indietro e chiediamoci: cos’è un LED? La parola LED deriva dall’inglese, Light Emission Diode, ossia diodo ad emissione di luce. A questo punto potreste chiedervi cos’è un diodo. Potreste cercare su Google o leggervi il libro di elettronica che ho pubblicato sul blog, ma per semplificare al massimo pensiamo ad una specie di valvola di non ritorno che fà passare la corrente da una parte ma non dalla parte opposta. Il LED si comporta nello stesso modo e se la corrente passa dal lato corretto “si accende” e produce luce, il cui colore dipende dal materiale con cui è costruito il LED che andiamo ad usare. In realtà molto probabilmente già sapete di cosa parliamo, ma nel caso non lo aveste ancora capito, sono quelle piccole lucette che trovate sul televisore quando è in standby, sugli alimentatori, sulla playstation e gran parte dei prodotti elettronici in commercio. Nei circuiti i LED vengono usati normalmente per “indicare” qualcosa, che può essere la presenza di alimentazione come un codice d’errore, anche se sempre più, stanno prendendo piede i LED da “illuminazione” che però usano correnti ben diverse per il loro funzionamento e che possiamo considerare un capitolo a se stante anche se molto affine a quanto andiamo a valutare oggi.
La prima cosa che abbiamo imparato è che il LED è un diodo e come tale ha un “verso” in cui fà passare la corrente e questo verso se rispettato ne permette l’accensione. Il LED ha perciò un catodo negativo ed un anodo positivo che andranno collegati rispettando la polarità; diventa perciò importante riconoscere anodo e catodo. Se il LED è nuovo presenta due “gambette” che sono una corta (polo negativo) ed una lunga (polo positivo), facile da ricordare (lunga +, corta -). Se invece il LED non è nuovo, i due terminali potrebbero essere stati tagliati ed essere della stessa lunghezza. In questo caso dobbiamo guardare con attenzione l’interno del LED: vediamo che anodo e catodo hanno diverse forme: il + ha una forma appuntita, un qualcosa in + che si insinua in un “buco” (-) del catodo. Inoltre alla base il LED è smussato sul lato negativo. Ma forse la figura qui a sotto è maggiormente esplicativa dei miei tentativi di creare in voi uno schema mnemonico.

I led di cui andremo ora ad occuparci hanno dimensioni fra i 2 ed 8mm, i più comuni hanno la forma a “cupola” della figura qui sopra e si saldano attraverso le loro gambe, ma ve ne sono anche altre forme e tipologia di montaggio, ad esempio quello integrato su Arduino è un SMD (montaggio in superficie, perciò senza le gambette) ed è rettangolare, piatto. La prima cosa fondmentale da sepere sui LED è che essi non limitano la corrente.

D’altra parte un LED come ogni componente ha un suo range di funzionamento oltre il quale si brucia inesorabilmente, per cui la prima cosa da sapere è che bisogna sempre usare una resistenza in serie per limitare la corrente che lo attraversa. L’altra cosa da sapere è che come per ogni componente, anche i LED determinano una caduta di tensione che dipende dal materiale con cui sono costruiti. Inoltre materiali diversi determinano tinte cromatiche differenti, ne deriva che colori diversi hanno cadute di tensioni differenti. Purtroppo le cadute di tensione sono solo “parzialmente standard”, infatti noterete differenze in base al produttore.

Colore Caduta di tensione
  Wikipedia Pg Arduino
Infrarosso <1.63  
Rosso  1.63 – 2.03 1.8
Arancione  2.03 – 2.10  
Giallo  2.10 – 2.18 1.9
Verde  1.9 – 4 2.0
Blu  2.48 – 3.7 3.0
Violetto  2.76 – 4  
Porpora  2.48 – 3.7  
Ultavioletto  3.1 – 4.4  
Rosa  3.3  
Bianco  3.5 3.0

Vi allego qui sopra una tabellina che riporta i valori così come sono scritti su Wikipedia e su un articolo del Playgroung Arduino, questo solo per farvi notare quale sia la variabilità. Ultima cosa è l’assorbimento di corrente del LED che mediamente oscilla fra i 15 ed i 20mA. Attenzione che parliamo sempre di led a bassa potenza e non di quelli più recenti ad alta potenza ed utilizzabili anche per illuminazione di ambienti.

Ora facciamo il primo esempio pratico. Prendiamo un pin digitale di Arduino qualunque, ad esempio il 4, e ci colleghiamo un led rosso. Assumiamo che il LED rosso determini una caduta di potenziale di 1.8V e possa assorbire un massimo di 20mA. Come facciamo a dimensionare la resistenza? Il calcolo è molto semplice. Sappiamo che da Arduino abbiamo le uscite a 5V e che la caduta del LED è 1.8 per cui otteniamo 5-1.8=3.2V. Essendo (legge di Ohm) V=R+I, ossia R=V/I, otteniamo R=3.2/20*1000=160. Il *1000 è legato al fatto che nella formula abbiamo messo mA anzichè A. Possiamo quindi usare una resistenza standard da 160Ω, ma anche valori superiori andranno bene anche se ridurranno la luminosità del LED fino al completo spegnimento. L’importante è non usare valori di resistenza più bassi. Qui sotto lo schema elettrico riassuntivo (nota che nello schema è inserita una R di 270Ω anzichè 160).

Tutte le cose fondamentali per il collegamento di un led le abbiamo dette e chi necessitava solamente di queste semplici delucidazioni spero sia rimasto soddisfatto. Ma l’articolo continua perchè anzichè usare un solo LED potremmo aver necessità di metterne in serie, in parallelo o variarne la luminosità.

Per prima cosa vediamo la disposizione in serie . Ci troviamo nella situazione in cui anzichè avere un solo led ne abbiamo 2 o più in “riga”, uno dietro l’altro. Quanti possiamo metterne? La prima domanda è semplice. Se il nostro potenziale è di 5V ed il singolo LED determina una caduta di tensione di 1.8V, abbiamo 5/1.8=2.7, quindi in realtà possiamo alimentare solamente 2 led in serie in quanto con il terzo il potenziale andrebbe al di sotto dello zero. Naturalmente se invece di usare le uscite di Arduino avessimo ad esempio una linea di alimentazione esterna a 12V, potremmo mettere 12/1.8=6.67, ossia 6 LED in serie. Il calcolo della resistenza è del tutto uguale a prima solo che la caduta di tensione complessiva di 2LED è di 1.8*2=3.6V. Quindi 5-3.6=1.4 e 1.4/20*1000=70Ω, e la resistenza più vicina (in eccesso) è quella da 82Ω.

I LED in parallelo li possiamo trattare in due modi. Il primo metodo è usare una resistenza per ogni LED ed in questo caso il valore è del tutto identico a quello del LED singolo (160Ω). Alternativamente le varie resistenze possono essere accorpate in una unica ma in questo caso il valore cambia, dobbiamo infatti usare la regola delle resistenze in parallelo per cui con due LED la resistenza avrà un valore della metà (1/Rt=1/R1+1/R2), ossia di 80Ω.  Qui sotto lo schema riassuntivo con le tre possibilità, si noti che nei campi delle resistenze ho inserito i valori calcolati e non quelli delle resistenze standard commerciali.

Ma vale la pena fare alcune ulteriori considerazioni. Ad esempio è logico capire che lo schema parallelo con due resistenze permette, nel caso remoto si bruci una resistenza, di far accendere comunque l’altro LED. Gli svantaggi sono ovviamente legati all’utilizzo di maggior quantità di materiale e quindi incremento di costi, saldature ed ingombro……ma non solo….

I consumi.

Tano per cominciare una parola sui “calcolatori online”. Ne troverete numerosi e se li confrontate vedrete che i risultati fra loro sono discordanti e sono davvero pochi quelli che effettuano il calcolo correttamente.

Quando progettiamo un circuito dobbiamo stare attenti anche a quanto consuma il nostro circuito e quanti watt dissipano i vari componenti. Facciamo un rapido calcolo per tutte le possibilità. Nel caso dei led in serie abbiamo una resistenza calcolata di 70Ω, il che necessiterà di una resistenza commerciale da 82Ω. Nel nostro circuito i 2 LED determinano una caduta di tensione di 3.6V con un “residuo” di 1.4 “assorbito” dalla resistenza. Con la resistenza di 82Ω otteniamo una corrente di 17.07mA contro i 20mA teorici che volevamo far passare attraverso i nostri LED. Lo stesso calcolo lo otteniamo anche in questo modo: essendo l’alimentazione costante, R*I è altrettanto costante per cui 20*70=1400. Variando la resistenza abbiamo 1400/82 che fà sempre 17.07mA. Se moltiplichiamo la corrente di 17.07mA per la tensione di 1.4V otteniamo un consumo di 23.9mW da parte della nostra resistenza (P=V*I). Allo stesso modo moltiplicando i 17.07mA per la caduta di tensione dei LED (1.8V) otteniamo il consumo di ogni singolo LED che sarà di 30.73mW.  Il totale è di 61.46 per l 2 LED più i 23.9 della resistenza per complessivi 85.37mW. Se calcoliamo l’efficienza come il rapporto della potenza impiegata per illuminare i LED sul totale, otteniamo un valore del 72%. Ques’ultimo valore non cambia modificando il valore di resistenza. Invece aumentando il valore della resistenza si riduce il consumo del circuito.

Nota: i calcoli sono basati sul presupposto che i diodi abbiano una risposta lineaare, cosa che non avviene nella realtà, per questo motivo la corrente reale sarà di 17.7mA anzichè 17.07. Nei nostri articoli ci limiteremo ai calcoli più semplici che risultano ampiamente adeguati per la costruzione dei circuiti proposti senza addentrarci in complesse formule che non andrebbero a modificare nulla di quello che stiamo dicendo.

Nel secondo caso, quello con i LED in parallelo, ognuno con la sua resistenza, abbiamo calcolato 160Ω che andranno sostituiti da una resistenza commerciale da 180Ω. Perciò in ognuno dei due rami abbiamo una “tensione residua” di 3.2V che con una R=180Ω ci da una corrente di 17.78mA per ognuna delle due resistenze corrispondente a 56.89mW (x2). I due LED invece consumeranno 1.8*17.8=32mW per un totale complessivo di 178mW, ben superiore alla soluzione precedente. Inoltre è da notarsi che con i “rami ” in parallelo scorreranno nel circuito un totale di 17.78+17.78mA, ossia 35.5mA che si avvicina drammaticamente alla massima soglia erogabile da Arduino. Da notarsi infine che l’efficienza del circuito si riduce al 36%.

Vediamo ora il terzo caso, quello parallelo con la resistenza in comune. Anche in questo caso la resistenza commerciale è la stessa da 82Ω del primo caso. Ma la caduta di tensione con i LED in parallelo è di soli 1.8V per cui residuano 3.2V. Ne ricaviamo 39.02mA reali (contro i 40 teorici legati ai 2 LED paralleli) ed un consumo di 124.9mW. Ovviamente se attraverso il resistore scorrono 39.02mA, a valle avremmo 19.51mA su ognuno dei LED, valore prossimo ai 20mA che volevamo utilizzare. Il consumo complessivo dei due LED sarà di 1.8*39.02=70.24mA con un totale del circuito di 195.1mW con un assorbimento prossimo al massimo erogabile da Arduino. L’efficienza è del 36%. L’unica grossa differenza rispetto al caso precedente stà nel fatto che una singola resistenza deve assorbire un carico maggiore per cui occorre prestare attenzione che oltre al valore in Ohm sia in grado di sopportare il carico a cui è sottoposta.

Con pochi calcoli abbiamo dimostrato come circuiti funzionalmente identici hanno consumi notevolmente diversi, inoltre abbiamo visto come l’utilizzo dei 2 LED in parallelo comporta un’erogazione di corrente doppia da parte dell’uscita di Arduino portandola a valori prossimi al massimo erogabile (cosa da evitarsi!). Ques’ultima considerazione ci fà capire che per utilizzare un numero maggiore di LED dobbiamo utilizzare stratagemmi diversi perchè con il LED preso nel nostro esempio possiamo illuminare un massimo di soli due LED, sia che essi siano in serie o in parallelo.

Luminosità

Prima abbiamo accennato al fatto che aumentando la resistenza si riduce la luminosità del LED. Ma normalmente la resistenza è fisicamente saldata al circuito per cui se volessimo far variare la luminosità direttamente ad Arduino come facciamo? PWM: Questa è la risposta.

PWM (Pulse-width modulation)

Nell’immagine qui a lato, prelevata pari pari dal sito ufficiale di Arduino, vediamo un diagramma chiarificatore. Il concetto è in realtà semplice, anzichè utilizzare l’uscita 5V continua di Arduino, si usano degli impulsi a 5V più o meno ravvicinati andando perciò a “simulare” una tensione che va da 0 a 5V.  Come vedete la “linea temporale” è suddivisa in barrette verdi che prendono il nome di periodo. In Arduino la frequenza è di circa 500Hz per cui ogni periodo dura circa 2 millisecondi. All’interno del periodo abbiamo un impulso a 5V che ha una durata temporale variabile (larghezza dell’impulso – pulse width), ed una parte in cui l’impulso si azzera. Ultima cosa è il duty cycle ossia la percentuale di tempo in cui il segnale è “ON”. Un duty cycle del 100% indica una corrente continua a 5V, un duty cycle allo 0% indica una corrente fissa a 0V ed un duty cycle al 50% indica che per metà del periodo abbiamo una tensione a 5V e per l’altra metà a 0V. Se osservate la vostra scheda Arduino ed osservate le uscite digitali, vedrete che le 3,5,6,9,10,11 sono contrassegnate dal simbolino ˜ proprio ad indicare che quell’uscita è abilitata all’uso della tecnica PWM. Arduino permete di scegliere il duty cycle con un valore compreso fra 0 e 255 dove il 255 corrisponde al 100% e 127 corrisponde al 50%, potendo perciò avere una precisione di circa lo 0.5%. L’utilizzo è molto semplice, basta uitilizzare la funzione analogWrite() esattamente come abbiamo visto fare per la digitalWrite() nelle precedenti puntate. Ora vediamo di preparare un esempio pratico.

In casa non ho led rossi per cui sono costretto ad usarne uno verde. Diciamo, e nel mio caso è la verità, che non abbiamo idea di quali siano i parametri di funzionamento del LED che abbiamo sul nostro tavolo. Guardando in rete molti dicono che la caduta di tensione è 2V, alcuni indicano 2.4V. La cosa migliore è usare i parametri più sicuri per cui proviamo ad usare 2.4V con 15mA e nel caso siano parametri troppo restrittivi, l’effetto sarà quello di avere una ridotta luminosità del LED (a meno che non si accenda proprio). Al contrario se i parametri non fossero abbastanza restrittivi come ad esempio per LED a 10mA, vedremo che in tempi variabili il LED farà “puff”. Quindi, dicevamo, 5-2.4=2.6V/15mA=174Ω con una resistenza commerciale di 180Ω ed una corrente effettiva di 14.4mA. Colleghiamo la resistenza ad una delle uscite PWM di Arduino, ad esempio la 9, in serie mettiamo il polo positivo del LED ed il negativo lo mettiamo a massa. Il caso vuole che mi manchi proprio la resistenza da 180Ω, per cui nell’esempio ho usato un potenziometro che è settato a 190Ω. Ora ci manca solo lo sketch da passare ad Arduino. Ho pensato ad un codice molto semplice che modifica nel tempo il duty cycle portandolo dal 100% a 0%  e viceversa con modifiche ogni 10 ms.

int ledPin = 9;    // LED connesso al pin digitale 9

void setup()  { } 

void loop()  
{ 
  for(int Val = 0 ; Val <= 255; Val +=1) // Vado da 0 a 255
  { 
    analogWrite(ledPin, Val);  // imposto il valore sull'uscita digitale       
    delay(10); // aspetto 10ms                           
  } 

  for(int Val = 255 ; Val >= 0; Val -=1) // ora scendo da 255 a 0
  { 
    analogWrite(ledPin, Val);         
    delay(10);                            
  } 
}

Anche se lo schema, la realizzazione ed il software sono di estrema semplicità, vi lascio con un breve video che mostra la sketch all’opera.

Nota conlcusiva:

ATTENZIONE: cercando in rete troverete un’infinità di articoli, video etc ove si dice che potete collegare un LED esterno al pin digitale numero 13 di Arduino perchè c’è una resistenza collegata in serie. Non è vero! La resistenza c’è ma è in parallelo e serve a proteggere il LED interno, perciò se collegate direttamente il LED esterno a quel pin non avete alcuna resistenza di protezione per cui grazie alla robustezza dei LED e di Arduino, il circuito può funzionare per un pò, specie se il LED non è costantemente acceso, ma….NON FATELO perchè è solo questione di tempo e prima o poi qualcosa si brucia. Ricordate la regola: la resistenza deve esserci sempre, magari di un solo ohm, ma deve esserci.