GLG Programs fa uso di cookie per migliorare l'esperienza di navigazione degli utenti, ma non per tracciarne un profilo. Proseguendo nella navigazione, si accetta implicitamente l'utilizzo dei cookie.
[OK]Note legaliNon mi importa
Logo GLGPrograms Logo GLGPrograms

Dispense Arduino

[Icona della Guida] Materiale tratto dal nostro corso di base Arduino, con esempi ed esercizi

Icona introduzione dispense

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.

analogia Tensione-Corrente

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
Legge di Ohm

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

Resistenze a foro passante e SMD

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:

La tolleranza indica quanto il valore effettivo della resistenza si discosta dal valore scritto sopra (valore nominale, in gergo tecnico). Ad esempio, una resistenza 330 Ohm a tolleranza 5% può avere un valore fra 313 e 346 Ohm. Le resistenze non sono perfette...
La potenza indica quanta tensione e corrente può sopportare la resistenza prima di rompersi. L'energia delle cariche elettriche "rallentate" va a scaldare la resistenza, e c'è una pratica formulina che ci dice quanta potenza finisce in calore quando una resistenza è ad una tensione V e attraversata da una corrente I, nota come Legge di Joule:
P = V·I
Questo valore non è scritto sulle resistenze, ma è determinato dalla loro dimensione. Le resistenze ad uso hobbistico sono solitamente da ¼W (0.25W).
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.
La tabella del codice colori delle resistenze

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.

È il momento di applicare la legge di Ohm vista poco fa, insieme ad alcune considerazioni.

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 Ohm
Se 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);
  }
}
5 led

Con poche righe abbiamo istruito Arduino a svolgere questo lavoretto ripetitivo.

Esercizio

Pagina scritta da GiulioGiulio

Hai una domanda? Scrivici!
Questa pagina ti è piaciuta? Condividila!
Share on Facebook Share on Google+ Share on linkedin