Arduino e i 6 PIN Digitali Segreti

Obiettivo: Scoprire ed utilizzare i 6 pin digitali segreti di Arduino nel proprio progetto.

Arduino Porte (Input, Output, Digitali, Analogici)

Teoria:

Uno dei problemi più comunemente incontrati dagli sviluppatori è quello di finire i pin digitali necessari per collegare Arduino ad eventuali periferiche (sensori/attuatori). I pin digitali sono 14 e potrebbero bastare pochi elementi per terminarli (e.g., display, led, pulsanti, keypad). E’ importante inoltre considerare che i pin 0 ed 1 sono utilizzati per la comunicazione seriale pertanto ne è sconsigliato l’utilizzo.
Pertanto, le soluzioni alla carenza di pin digitali in un progetto che richieda più 14 pin sono:

  • Utilizzare una scheda più efficace come Arduino Mega
  • Utilizzare dei componenti elettronici aggiuntivi tipo buffer o registri
  • Utilizzare i 6 Pin Digitali Segreti (SOLUZIONE PROPOSTA)

Nello specifico è possibile utilizzare i 6 pin di input analogici (quelli che si trovano in basso a destra nella scheda) come pin di input/output digitali. Pertanto i PIN di input/output sono in tutto 20 e non 14 come sempre pensato.
Utilizzare i pin di input analogici come pin di input/output digitale è particolarmente semplice basta semplicemente indicare nell’istruzione pinmode il numero corretto definito nella seguente tabella:

Input Analogico Input/Output Digitale
A0 14
A1 15
A2 16
A3 17
A4 18
A5 19

Collegamento Circuitale:

Collegamento Circuitale

Codice: Viene in seguito riportato il codice necessario per accendere spegnere un led utilizzando il pin segreto 14.








Crepuscolare [Avanzato] (Smart Lamp)

Obiettivo: Accensione automatica di quattro LED al diminuire dell’intensità di luce rilevata.



Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • 4 Led
  • 1 Foto-resistenza
  • 4 Resistenze (100Ohm) per Led
  • 1 Resistenza (2.2kOhm) per Foto-resistenza

TeoriaLa foto resistenza è un componente elettronico la cui resistenza è inversamente proporzionale alla quantità di intensità luminosa che lo colpisce. Questo significa che la corrente (inversamente proporzionale alla resistenza) aumenta all’aumentare dell’intensità luminosa.
A seguire, viene riportato la caratteristica Ohm/Lux di una fotoresistenza tipicamente impiegata in applicazioni realizzate mediante Arduino.

Datasheet Fotoresistenza

Nel caso specifico, è importante ricordare che Arduino non può rilevare né variazioni di resistenza né variazioni di corrente. Il microcontrollore può infatti analizzare solamente valori di tensione. Per questo motivo, l’utilizzo di una resistenza è indispensabile al fine di collegare correttamente la fotoresistenza ad Arduino. Nel dettaglio, il circuito previsto per trasformare la variazione di resistenza in una variazione di tensione è il partitore di tensione.

Partitore di Tensione e Fotoresistenza

Nel circuito presentato, la variazione di luminosità produce una variazione del valore della fotoresistenza. Di conseguenza anche il valore della corrente risulta funzione dell’intensità luminosa e di conseguenza anche il valore di tensione in ingresso ad Arduino. Nel dettaglio:

  • Un incremento della luminosità porta ad un decremento della tensione.
  • Un decremento della luminosità porta ad un incremento della tensione.
    • se il pulsante viene premuto la tensione in ingresso ad Arduino è pari a 0.
    • se il pulsante non viene premuto la tensione in ingresso ad Arduino è pari a Vcc (5V)
  • Resistenza di Pull Down:
    • se il pulsante viene premuto la tensione in ingresso ad Arduino è pari a Vcc (5V).
    • se il pulsante non viene premuto la tensione in ingresso ad Arduino è pari a 0.

Attraverso l’utilizzo del comando analogRead è possibile leggere la tensione su uno specifico pin analogico (A0-A5) di Arduino. La funzione analogRead restituisce un valore compreso tra 0 e 1023 a seconda della tensione letta dal microcontrollore.
A titolo di esempio, se il valore di tensione letto utilizzando la funzione analogRead sul pin A0 di Arduino risulta pari a 613. Il valore di tensione può essere facilmente calcolato:

valoreTensioneAnalogico = 613/1023*5 = 3V

dove:

  • Il valore analogico di tensione letto utilizzando l’istruzione analogRead è pari a 613
  • Il valore di tensione massimo che può essere letto dalla funzione analogRead è pari a 1023
  • La tensione massima in uscita ad Arduino è pari a 5V

Tale valore può essere facilmente utilizzato per controllare uno o più led mediante l’istruzione condizionale IF.

Collegamento Circuitale:

Collegamento Circuitale

Codice:

A seguire viene riportata la schematizzazione mediante flowchart dell’algoritmo utilizzato per realizzare il programma.

Flowchart

Codice:


[crayon-673f64c373228622606086/]

P




Crepuscolare (Smart Lamp)

Obiettivo: Accensione automatica di un LED al diminuire dell’intensità di luce rilevata.



Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • 1 Led
  • 1 Foto-resistenza
  • 1 Resistenza (2.2kOhm)

TeoriaLa foto resistenza è un componente elettronico la cui resistenza è inversamente proporzionale alla quantità di intensità luminosa che lo colpisce. Questo significa che la corrente (inversamente proporzionale alla resistenza) aumenta all’aumentare dell’intensità luminosa.
A seguire, viene riportato la caratteristica Ohm/Lux di una fotoresistenza tipicamente impiegata in applicazioni realizzate mediante Arduino.

Datasheet Fotoresistenza

Nel caso specifico, è importante ricordare che Arduino non può rilevare né variazioni di resistenza né variazioni di corrente. Il microcontrollore può infatti analizzare solamente valori di tensione. Per questo motivo, l’utilizzo di una resistenza è indispensabile al fine di collegare correttamente la fotoresistenza ad Arduino. Nel dettaglio, il circuito previsto per trasformare la variazione di resistenza in una variazione di tensione è il partitore di tensione.

Partitore di Tensione e Fotoresistenza

Nel circuito presentato, la variazione di luminosità produce una variazione del valore della fotoresistenza. Di conseguenza anche il valore della corrente risulta funzione dell’intensità luminosa e di conseguenza anche il valore di tensione in ingresso ad Arduino. Nel dettaglio:

  • Un incremento della luminosità porta ad un decremento della tensione.
  • Un decremento della luminosità porta ad un incremento della tensione.

Attraverso l’utilizzo del comando analogRead è possibile leggere la tensione su uno specifico pin analogico (A0-A5) di Arduino. La funzione analogRead restituisce un valore compreso tra 0 e 1023 a seconda della tensione letta dal microcontrollore.
A titolo di esempio, se il valore di tensione letto utilizzando la funzione analogRead sul pin A0 di Arduino risulta pari a 613. Il valore di tensione può essere facilmente calcolato:

valoreTensioneAnalogico = 613/1023*5 = 3V

dove:

  • Il valore analogico di tensione letto utilizzando l’istruzione analogRead è pari a 613
  • Il valore di tensione massimo che può essere letto dalla funzione analogRead è pari a 1023
  • La tensione massima in uscita ad Arduino è pari a 5V

Tale valore può essere facilmente utilizzato per controllare un led mediante l’istruzione condizionale IF.

Collegamento Circuitale:

Collegamento Circuitale

Codice:

A seguire viene riportata la schematizzazione mediante flowchart dell’algoritmo utilizzato per realizzare il programma.

Flowchart


[crayon-673f64c3752d8503522211/]

Personalizzazioni:

E’ possibile modificare il circuito aggiungendo altri led. E’ inoltre possibile modificare il codice al fine di realizzare una lampada che accenda un numero differente di led in funzione della luminosità.




Controllo di un LED mediante un Potenziometro

Obiettivo: Controllare un LED utilizzando un potenziometro



Pre-Requisiti


Fading led


Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • 1 Led
  • 1 Resistenza (100 Ohm)
  • 1 Trimmer (4.7KOhm o similari)

TeoriaIn questo articolo si propone l’utilizzo di un potenziometro per regolare in modo manuale la luminosità di un LED. E’ importante considerare che (come riportato nei pre-requisiti) l’impiego della funzione digitalWrite non permette di modulare l’intensità luminosa del LED. Difatti, attraverso l’utilizzo di questa istruzione digitale, il LED può trovarsi solamente in due stati logici LOW (spento) o HIGH (acceso).
Per raggiungere lo scopo prefissato è pertanto necessario l’utilizzo di una differente funzione denominata: analogWrite. Questa funzione permette infatti di modulare l’intensità luminosa del LED fornendo 256 differenti livelli di luminosità. L’istruzione analogWrite permette infatti di emulare un finto segnale analogico attraverso l’impiego della tecnica PWM (Pulse Width Modulation). Solamente sei PIN (quelli contrassegnati dal simbolo tilde ~) possono essere utilizzati per fornire un segnale “analogico”.

Tuttavia è importante considerare che se l’istruzione analogwrite permette di gestire la luminosità del LED, questa funzione non permette di controllare la posizione del potenziometro essendo il potenziometro un dispositivo di input (dato da leggere). Pertanto per la gestione del potenziometro sarà effettuata utilizzando una differente funzione denominata analogRead. Questa funzione permette infatti di leggere un livello di tensione compreso tra 0 e 5 Volt e mapparlo in un intervallo discreto composto da 1024 livelli (0-1023).

Collegamento Circuitale:

Collegamento Circuitale

Codice:






Pulsante come Interruttore

Obiettivo: Utilizzo di un pulsante come interruttore per l’accensione di un led (stato ON/OFF)



Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • 1 Led
  • 1 Pulsante
  • 1 Resistenza (100 Ohm)
  • 1 Resistenza (1kOhm)

Pre-Requisiti


LED e Pulsante


TeoriaDa un punto di vista pratico mantenere una luce accesa tenendo premuto il pulsante (vedi lezione pre-requisiti) non è proprio il massimo della vita. Se da un punto di vista elettronico il componente tipicamente utilizzato per gestire lo stato ON/OFF di una lampada è l’interruttore, attraverso una corretta gestione del software di controllo è possibile “trasformare un pulsante in interruttore”. Per questo motivo, agendo direttamente sul software e lasciando invariato l’hardware proposto nell’esperienza LED e Pulsante, è possibile trasformare il sistema in questione in un controllo ON/OFF dove il pulsante è utilizzato come interruttore.

Datasheet Pulsante

Anche se in questa esperienza il pulsante viene utilizzato come interruttore è importante ribadire che l’impiego di resistenze di Pull-up o Pull-down sono necessarie per un corretto funzionamento del circuito.Maggiori informazioni sulle resistenze di Pull-up o Pull-down possono essere trovate qui.

Collegamento Circuitale:

Collegamento Circuitale

CodiceIl codice utilizzato per trasformare il pulsante in interruttore si basa sull’impiego di due differenti variabili globali (create fuori dalle funzioni loop e setup, pertanto visibili in tutto il codice). Queste variabili sono:

  • valButtonOld: Memorizza la lettura precedente effettuata sul pulsante. Attraverso questa variabile è possibile evitare letture multiple. E’ importante considerare che essendo il clock di Arduino più elevato del tempo di reazione umano, premendo il pulsante anche per un istante brevissimo il controllore eseguirà più letture con stato del pulsante HIGH eseguendo in seguito il codice corrispondente. Per questo motivo si preferisce leggere lo stato di transizione da basso ad alto piuttosto che lo stato alto di un pulsante.
Esempio di lettura multipla
  • ledState: Memorizza lo stato del led (se acceso o spento). Premuto il pulsante, nel caso in cui il led sia acceso questo viene spento viceversa nel caso in cui il led sia spento questo viene acceso. Per questo motivo è indispensabile utilizzare una variabile per controllare lo stato del pulsante.



Personalizzazioni:

L’impiego della variabile valButtonOld, utilizzata per evitare letture multiple, può essere evitato aggiungendo un delay dopo la lettura del pulsante. Si provi ad implementare il circuito ed il relativo codice.




LED e Pulsante

Obiettivo: Accensione di un LED mediante un pulsante.



Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • 1 Led
  • 1 Pulsante
  • 1 Resistenza (100 Ohm)
  • 1 Resistenza (1kOhm)

TeoriaIl pulsante è un dispositivo elettronico a due stati (ON, OFF) con una sola posizione monostabile. Nel caso specifico i pulsanti permettono di aprire o chiudere un circuito e pertanto collegare a GND (0V) o a VCC (5V) una specifica uscita. A seguire, viene riportato lo schema circuitale di un pulsante tipicamente impiegato in applicazioni realizzate mediante Arduino.

Datasheet Pulsante

L’utilizzo di una resistenza è indispensabile al fine di collegare correttamente il pulsante ad Arduino evitando cortocircuiti. A seconda del collegamento realizzato, la resistenza prende il nome di:

  • Resistenza di Pull Up: la resistenza viene collegata direttamente all’alimentazione.
  • Resistenza di Pull Down: la resistenza viene collegata a massa.
Resistenze di Pull Up e di Pull Down

Il comportamento del circuito e la tensione letta dal microcontrollore dipende dalla tipologia di collegamento circuitale utilizzato. In particolare:

  • Resistenza di Pull Up:
    • se il pulsante viene premuto la tensione in ingresso ad Arduino è pari a 0.
    • se il pulsante non viene premuto la tensione in ingresso ad Arduino è pari a Vcc (5V)
  • Resistenza di Pull Down:
    • se il pulsante viene premuto la tensione in ingresso ad Arduino è pari a Vcc (5V).
    • se il pulsante non viene premuto la tensione in ingresso ad Arduino è pari a 0.

Attraverso l’utilizzo del comando digitalRead è possibile leggere la tensione su uno specifico pin digitale (0-13) di Arduino. La funzione digitalRead restituisce un valore (i.e., LOW o HIGH) a seconda della tensione letta dal microcontrollore. Tale valore può essere facilmente utilizzato per controllare un led mediante l’istruzione condizionale IF.

A seguire viene riportato lo schema elettrico ed il codice utilizzato per l’accensione di un pulsante sfruttando una resistenza di Pull Down.

Collegamento Circuitale:

Collegamento Circuitale

Codice:

A seguire viene riportata la schematizzazione mediante flowchart dell’algoritmo utilizzato per realizzare il programma.

Flowchart



Personalizzazioni:

E’ possibile modificare il circuito aggiungendo pulsanti e led. E’ inoltre possibile modificare il codice al fine di realizzare una lampada che rimanga acceso fino a quando il pulsante non venga premuto una seconda volta (Attenzione possibili problematiche di rimbalzo).




Il LED RGB

Obiettivo: Accensione di un LED RGB (Red Green Blue) .



Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • 1 Led RGB
  • 3 Resistenza (100 Ohm)

TeoriaGli RGB rappresentano una particolare sottocategoria di LED capaci di riprodurre differenti colori attraverso la combinazione dei colori fondamentali Rosso Verde e Blu. Nel dettaglio, questi dispositivi sono costituiti da tre differenti led azionati in funzione del colore da riprodurre.

I LED RGB sono dotati di 4 differenti morsetti e sono così classificati:

  • RGB ad Anodo Comune: il pin più lungo del LED deve essere collegato a massa (GND) mentre gli altri 3 differenti PIN sono utilizzati per comandare i 3 LED (rosso, verde, blue). Nel caso in questione i singoli LED sono accesi attraverso l’istruzione Arduino digitalWrite(pinLed, HIGH);
  • RGB a Catodo Comune: il pin più lungo del LED deve essere collegato a VCC (5V) mentre gli altri 3 differenti PIN sono utilizzati per comandare i 3 LED (rosso, verde, blue). Nel caso in questione i singoli LED sono accesi attraverso l’istruzione Arduino digitalWrite(pinLed, LOW);
LED RGB (Anodo e Catodo comune)

Collegamento Circuitale:

Viene in seguito riportato lo schema elettrico utilizzato per comandare il LED RGB. Nel dettaglio il LED impiegato è della modalità catodo comune.

Collegamento Circuitale

Codice:

Considerando l’impiego di un LED a catodo comune i singoli LED (R, G, B) possono essere accesi mediante l’istruzione digitalWrite(pinLed,HIGH);



Personalizzazioni:

E’ possibile modificare il circuito aggiungendo pulsanti




Buzzer Passivo

Obiettivo: Realizzazione di un semplice segnalatore acustico (basato su un buzzer passivo).



Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • 1 Buzzer passivo

TeoriaIl Buzzer (cicalino) è uno dispositivo elettronico che permette di emettere un suono (bzzz) se correttamente alimentato.
I buzzer si suddividono in:

  • Buzzer Attivi: alimentati con una tensione opportuna riproducono un tono ad una frequenza pre-impostata.
  • Buzzer Passivi: non emettono alcun suono pre-impostato, ma necessitano di una forma d’onda specifica per fare vibrare la membrana interna. Possono produrre toni differenti in funzione del segnale di alimentazione utilizzato.

L’utilizzo di un buzzer passivo permette di creare delle melodie personalizzate o differentemente riprodurre piccole canzoni famose. Questo perché il buzzer passivo, a differenza del buzzer attivo, può generare differenti tonalità (note).
Le differenti note sono generate utilizzando la funzione tone (nativa nella libreria Arduino). Nello specifico viene riportata in seguito la sintassi di tale funzione.

tone(pin, frequenza)

tone(pin, frequenza, durata)

Per interrompere un tono è possibile utilizzare la funzione noTone()

Collegamento Circuitale:

Collegamento Circuitale

Codice:


[crayon-673f64c3760be635141440/]

PersonalizzazioniE’ possibile modificare il comportamento del circuito in questione intervenendo sul valore delle frequenze caratteristiche dei toni e sulle pause introdotte attraverso la funzione delay.




Buzzer Attivo

Obiettivo: Realizzazione di un semplice segnalatore acustico (basato su un buzzer attivo).

Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • 1 Buzzer Attivo

TeoriaIl Buzzer (cicalino) è uno dispositivo elettronico che permette di emettere un suono (bzzz) se correttamente alimentato.
I buzzer si suddividono in:

  • Buzzer Attivi: alimentati con una tensione opportuna riproducono un tono ad una frequenza pre-impostata.
  • Buzzer Passivi: non emettono alcun suono pre-impostato, ma necessitano di una forma d’onda specifica per fare vibrare la membrana interna. Possono produrre toni differenti in funzione del segnale di alimentazione utilizzato.

Collegamento Circuitale:

Collegamento Circuitale

Codice:


[crayon-673f64c378ab3029708538/]

PersonalizzazioniE’ possibile modificare il comportamento del circuito in questione intervenendo sul valore della variabile buzzerTime. Modificando il suo valore infatti cambia la pausa generata tra un tono del buzzer ed il successivo.




Fading led

Obiettivo: Realizzazione di un LED con dissolvenza (fading).

Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • 1 Led
  • 1 Resistenza (100 Ohm)

TeoriaL’utilizzo dell’istruzione digitalWrite non permette di modulare/regolare la luminosità di un LED. Attraverso l’utilizzo di questa istruzione digitale infatti il LED può trovarsi solamente in due stati logici LOW (spento) o HIGH (acceso).
Per raggiungere lo scopo prefissato è pertanto necessario l’utilizzo di una differente funzione denominata: analogWrite. Questa funzione permette infatti di modulare l’intensità luminosa del LED fornendo 256 differenti livelli di luminosità.
L’istruzione analogWrite permette infatti di emulare un finto segnale analogico attraverso l’impiego della tecnica PWM (Pulse Width Modulation). Solamente sei PIN (quelli contrassegnati dal simbolo tilde ~) possono essere utilizzati per fornire un segnale “analogico”.
A titolo di esempio, volendo alimentare un dispositivo con una tensione analogica pari a 3V il valore da utilizzare come parametro della funzione analogWrite può essere così calcolato:

valore = 3/5*255 = 153

dove:

  • Il valore analogico che si vuole produrre è pari a 3V
  • La tensione massima in uscita ad Arduino è pari a 5V
  • Il valore massimo utilizzabile dalla funzione analogWrite è pari a 255

Collegamento Circuitale:

Collegamento Circuitale

Codice:


[crayon-673f64c37bbab359499562/]