Dispense Arduino
Materiale tratto dal nostro corso di base Arduino, con esempi ed esercizi

Elettronica di base e uso dei LED
Apriamo la prima lezione introducendo il linguaggio di programmazione
di Arduino, e le prime funzioni per configurare un'uscita e far
accendere un LED.
A seguire alcuni cenni di elettronica, qualche richiamo di cose
che magari hai già studiato a scuola, ricapitolate in modo
essenziale.
Accendere un LED

Sul pin 13 di Arduino è presente un LED saldato, su cui si possono fare dei primi esperimenti senza dover collegare nessun filo. Proviamo a caricare, quindi, il nostro primo listato:
const byte LED = 13; void setup() { pinMode(LED, OUTPUT); } void loop() { digitalWrite(LED, HIGH); delay(1000); digitalWrite(LED, LOW); delay(1000); }
Elettronica di base
Il microcontrollore della scheda Arduino funziona ad una tensione di 5v, ed ha la capacità di erogare una corrente di circa 0.040A (40mA). Volt e Ampere, ovvero Tensione e Corrente sono i due parametri fondamentali dell'elettronica.

In termini estremamente semplificati, la tensione ci indica
quanto una carica elettrica è disposta a muoversi da un certo
punto ad un altro.
La tensione, appunto, non è assoluta, ma si misura sempre fra due punti, così
come un'altezza o una lunghezza. Con una semplice analogia, si può
comparare la tensione ad un dislivello: una biglia lasciata cadere
da un metro arriverà a terra con velocità minore che se lasciata
cadere giù dal tetto di una casa alta qualche centinaia di metri.
Quando si farà riferimento ad una tensione in un punto sarà (quasi) sempre
intesa come la differenza di tensione fra quel punto e la massa, o terra,
indicata su Arduino con la sigla GND
(ground, terra in inglese).
Vedremo a breve un'eccezione.
La corrente è invece la velocità delle cariche (della biglia secondo
la precedente analogia), e si misura in Ampere. Siccome l'Ampere è
molto grande per le nostre applicazioni faremo ricorso al sottomultiplo
milliAmpere [ 1 mA = 0.001 A ]
.
Una relazione fondamentale che lega Tensione e Corrente è la legge di Ohm, e mostra che alcuni materiali hanno la capacità di rallentare la corrente.
V = I·R

R esprime la resistenza del materiale, più è "resistente" e meno la corrente è disposta ad attraversarlo. I è la corrente che attraversa il materiale, e V è la differenza di tensione misurata ai suoi capi, che per non confondere con la tensione rispetto alla massa chiameremo caduta di tensione. Esistono particolari componenti elettrici detti resistenze che hanno un valore ben prefissato, e si usano appunto per limitare correnti e tensioni nei circuiti.
Nota: questa relazione non vale per qualsiasi oggetto abbia a che fare con l'elettronica, ma con buona approssimazione vale per tutti i componenti che useremo.
Resistenze


Comprata una resistenza, bisogna saper leggere qual è il suo valore. Su quelle in formato a foro passante, o "da hobbista", il valore è espresso con una serie di striscie colorate sul corpo, da decifrare seguendo l'apposito codice colori. Le resistenze più comuni per piccoli progetti sono a 4 bande e tolleranza 5%, il che significa che la striscia oro sarà sempre presente, informazione che aiuta nel decifrare il codice.
Giusto due parole su un paio di parametri relativi alle resistenze:
P = V·I
Un asciugacapelli al suo interno non ha altro che una resistenza ed una ventola che ne diffonde il calore. Usando le leggi di Joule e Ohm prova a ricavarti quanto è grande la resistenza, sapendo che
P = 1000W
e V = 220V
.

LED
Un LED (Light Emitting Diode) è un componente che emette luce se
attraversato da corrente, il che lo rende un ottimo concorrente
delle comuni lampadine.
Ha però dei vincoli molto precisi:
richiede una caduta di tensione ai suoi
capi ben precisa per poter funzionare correttamente. Se di tenta di forzargli
una tensione più alta si va a "stressare" il materiale interno, danneggiandolo.
La caduta di tensione varia con il colore del LED, ma tipicamente si
aggira intorno a 1.5 ~ 3 V.
Abbiamo anche un vincolo sulla corrente per accendere il LED,
che deve mantenersi al di sotto dei 30mA, sempre per avere un corretto
funzionamento.
Infine, i LED hanno un verso di posizionamento ben preciso:
il pin di catodo deve necessariamente trovarsi ad un
potenziale inferiore dell'anodo. Il catodo è spesso
contrassegnato da una tacca sul corpo del led, ed il
pin è più corto dell'anodo (se non è stato tagliato).
Colore | Tensione |
---|---|
Rosso | 1.8 V |
Giallo | 1.9 V |
Verde | 2.0 V |
Blu | 3.0 V |
Bianco | 3.0 V |

Al lavoro!
Adesso siamo pronti ad accendere un qualsiasi LED, oltre a quello
presaldato su Arduino!
Alterare lo stato di un pin digitale non significa altro che
cambiare lo stato di tensione su di esso fra 0V e 5V, quindi alimentare
il led direttamente da un pin non è una strada praticabile.

Se il pin 13 è LOW, quindi a 0v, non si pongono problemi,
perché i punti A e C sono allo stesso potenziale ("alla stessa altezza),
e la corrente non scorre.
Supponiamo di portare il pin ad HIGH
: la tensione in A, ovvero
la tensione fra A e C (VAC), è 5v. VBC (sul led rosso) deve
essere 1.7V, quindi la caduta sulla resistenza dovrà necessariamente
essere VAB = 5v - 1.7V = 3.3V
Bene, conosciamo la V caduta di tensione sulla resistenza, e poniamo che nel LED debbano scorrere 10mA. La stessa corrente deve scorrere anche nella resistenza, perché si trova esattamente sullo stesso filo del led e non ci sono altri percorsi, quindi è nota anche la corrente I che attraversa la resistenza.
V = I · R → R = V / I = 3.3/0.01 = 330 OhmSe il valore di resistenza da 330 Ohm non fosse reperibile, in questo caso possiamo utilizzarne una più grande o piccola, per esempio 220Ohm (Rosso-Rosso-Marrone-Oro) o 470Ohm (Giallo-Viola-Marrone-Oro). Per esercizio prova a calcolare qual è la corrente I usando questi due valori, e quale sarebbe se per sbaglio si usasse una
R = 1kOhm = 1000 Ohm
.
Artifici di programmazione
Capìta l'elettronica, vediamo adesso come utilizzare alcuni costrutti e trucchetti del linguaggio C per snellire il codice.
Una prima cosa interessante è ridurre il listato del Blink ad
una sola riga nel loop()
. Quando si imposta
lo stato di un pin è possibile andare a rileggerlo successivamente,
in modo da determinare se il pin era stato posto a LOW oppure a HIGH,
utilizzando la funzione digitalRead(pin)
.
Letto il valore precedente basta invertirlo con l'operatore !
,
e darlo in pasto a digitalWrite
.
const byte LED = 13; void setup() { pinMode(LED, OUTPUT); } void loop() { digitalWrite(LED, !digitalRead(LED)); delay(1000); }
Un secondo esempio che vediamo è un circuito con 5 LED da gestire: li vogliamo far illuminare uno per volta, dal primo all'ultimo. Questa operazione può essere benissimo fatta istruzione per istruzione, ma si capisce bene che ne verrebbe fuori un listato kilometrico. Possiamo invece far ricorso a dei cicli, che ci consentono di ripetere operazioni simili più volte ed in modo intelligente:
const byte NUMERODiLed = 5; // Creo un array, ovvero un gruppo di variabili indicizzate const byte LED[NUMERODiLed] = {13, 12, 11, 10, 9}; void setup() { // Ripete il blocco successivo NUMERODiLed volte for(byte count = 0; count < NUMERODiLed; count++) { // Tutti i LED in output, ogni volta richiamo // l'elemento count all'interno dell'array pinMode(LED[count], OUTPUT); // Tutti i LED spenti digitalWrite(LED[count], LOW); } } void loop() { // Ripete il blocco successivo NUMERODiLed volte for (byte count = 0; count < NUMERODiLed; count++) { // Accendo il led numero count... digitalWrite(LED[count], HIGH); delay(500); // ... e lo spengo dopo mezzo secondo digitalWrite(LED[count], LOW); } }

Con poche righe abbiamo istruito Arduino a svolgere questo lavoretto ripetitivo.
Esercizio
- Luci di SuperCar: accendi 5 led da sinistra a destra e poi da destra a sinistra;
