L’Albero di Natale (Gioco Luci + Melodia)

Obiettivo: Riprodurre la melodia “Merry Christmas” e creare un gioco luci Natalizio utilizzando la piattaforma Arduino (senza utilizzare la funzione delay).



Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • 1 Buzzer
  • 6 Resistenze (100 Ohm)
  • 6 Led (Possibilmente rossi)

Pre-requisiti:


Arduino Jingle Bells



Blinking Led Senza Delay: MILLIS()


TeoriaNelle lezioni precedenti è stato illustrato come ogni melodia musicale è composta da note e pause. Se le singole note possono essere facilmente generate grazie all’utilizzo di un buzzer passivo e della funzione tone() le pause possono essere riprodotte utilizzando la funzione delay().
Tuttavia è importante considerare che sebbene la funzione delay risulti molto pratica e permetta una facile realizzazione di giochi luci o riproduzione di melodie, questa produce un blocco del controllore il quale può impedire il corretto funzionamento di altre operazioni.
Nel caso specifico, se utilizzassimo la funzione delay sia per gestire il gioco luci sia per riprodurre la melodia, la funzione delay utilizzata in entrambi i task andrebbe a danneggiare la corretta esecuzione di una delle due attività. Ad esempio, si avrebbero delle pause troppo lunghe nella melodia rendendola incomprensibile.

Per risolvere questo problema si è deciso di utilizzare la funzione millis sia per realizzare il gioco luci sia per implementare la melodia.

La funzione millis restituisce il numero di millisecondi che sono passati da quando la board Arduino ha eseguito il programam corrente. Questo numero si riazzera dopo circa 50 giorni.

Collegamento Circuitale:

Circuito Elettrico

Codice:






Arduino Jingle Bells

Obiettivo: Riprodurre la melodia “Jingle Bells” utilizzando la piattaforma Arduino.



Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • 1 Buzzer

Pre-requisiti:

TeoriaOgni melodia musicale è composta da note e pause. Se le pause possono essere riprodotte utilizzando la funzione delay() di Arduino (già vista negli esempi precedenti), le singole note possono essere facilmente generate grazie all’utilizzo di un buzzer passivo e della funzione tone(). Nel dettaglio, l’impiego della funzione tone permette di selezionare la frequenza riprodotta dal buzzer e la relativa durata della nota.
Nel caso in questione, l’intera melodia (comprensiva di note, durata delle note e pause, viene salvata in due differenti array (vettori) e riprodotta sequenzialmente come un vero spartito musicale.

Collegamento Circuitale:

Collegamento Circuitale

Codice:






Arduino Merry Christmas

Obiettivo: Riprodurre la melodia Merry Christmas utilizzando la piattaforma Arduino.



Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • 1 Buzzer

Pre-requisiti:

TeoriaOgni melodia musicale è composta da note e pause. Se le pause possono essere riprodotte utilizzando la funzione delay() di Arduino (già vista negli esempi precedenti), le singole note possono essere facilmente generate grazie all’utilizzo di un buzzer passivo e della funzione tone(). Nel dettaglio, l’impiego della funzione tone permette di selezionare la frequenza riprodotta dal buzzer e la relativa durata della nota.
Nel caso in questione, l’intera melodia (comprensiva di note, durata delle note e pause, viene salvata in due differenti array (vettori) e riprodotta sequenzialmente come un vero spartito musicale.

Collegamento Circuitale:

Collegamento Circuitale

Codice:






Realizzare una Pila con una Patata

Obiettivo: Realizzare una Pila con una Patata ed accendere un LED.



Componenti elettronici:

  • 1 Patata
  • 1 moneta da 5 centesimi (rame)
  • 1 chiodo (zinco)
  • Cavi
  • 1 Led (opzionale – utilizzato per verificare il funzionamento della pila)
  • 1 Multimetro (opzionale – utilizzato per verificare il funzionamento della pila)

TeoriaDal punto di vista teorico, una pila è costituita da una soluzione elettrolitica nella quale sono immersi due differenti metalli (come ad esempio rame e zinco).
E’ importante considerare che ogni agrume possiede al proprio interno succhi che possono fungere da soluzioni elettrolitiche in quanto ricchi di ioni.
Per questo motivo, elementi come limoni, arance e patate possono essere facilmente trasformati in pile.

Procedimento:  Viene in seguito riportato un procedimento step by step per realizzare la pila utilizzando una patata

  • Prima di iniziare, fare pressione con i palmi delle mani sulla patata appoggiata sul tavolo in modo schiacciarla e rompere i legami interni che producono il succo (questo permette di generare più energia).
  • Introdurre alle due estremità della patata la moneta da 5 centesimi (è possibile anche utilizzare un chiodo di rame) ed il chiodo di zinco.
  • Evitare che all’interno della patata i due elementi conduttori si tocchino tra di loro.
  • Utilizzare il multimetro per determinare il livello di differenza di potenziale (tensione) prodotto.

Collegamento Circuitale:

Collegamento Circuitale


PersonalizzazioniE’ possibile collegare più patate in serie al fine di incrementare il livello di tensione.





Come Utilizzare il Monitor Seriale per Determinare se un Pulsante Funziona

Obiettivo: Utilizzare il monitor seriale di Arduino per avviare una comunicazione dati Arduino-PC e comprendere se un pulsante funziona oppure no.

Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • Pulsante
  • Resistenza (1kOhm)

Prerequisiti


LED e Pulsante


TeoriaNon essendo disponibile un debugger per il controllore Arduino, l’utilizzo del monitor seriale rappresenta l’unica valida alternativa per comprendere i malfunzionamenti del codice scritto.
Il monitor seriale è uno strumento integrato nell’IDE di Arduino e nella piattaforma Tinkercad per visualizzare i dati ricevuti mediante comunicazione seriale.
La comunicazione seriale è una modalità di comunicazione tra dispositivi digitali nella quale i bit sono trasferiti lungo un canale di comunicazione uno di seguito all’altro. Nel caso specifico, la comunicazione avviene tra il Computer ed Arduino.
Le istruzioni per inviare messaggi da Arduino al Personal Computer sono due: Serial.begin e Serial.println

L’Inizializzazione della comunicazione avviene mediante l’istruzione:

Serial.begin(9600);

Questa istruzione deve essere inserita all’interno del corpo del setup e permette di impostare la comunicazione seriale definendo la velocità della comunicazione in bits per second (baud). 

La comunicazione vera e propria avviene invece mediante l’istruzione:

Serial.println(“Il valore del pulsante risulta:”);

Serial.println(valButton);

Nel primo caso viene stampato nel monitor seriale il testo: “Il valore del pulsante risulta:”. Mentre nel secondo caso viene stampato il valore della variabile valButton.
L’impiego delle println permette di capire il valore delle variabili e determinare il corretto funzionamento del circuito.
E’ possibile visualizzare i dati inviati da Arduino al PC cliccando sullo specifico tasto:

Pulsante per aprire il monitor seriale

Collegamento Circuitale:

Collegamento Circuitale

Codice: A seguire viene riportato il codice utilizzato per determinare se un pulsante è stato premuto oppure no. Questo permette di comprendere se un pulsante è stato montato in modo corretto. Nello specifico il codice utilizza la variabile di stato “valButton” per determinare lo stato del pulsante (premuto/non premuto).
Attraverso l’istruzione Serial.println(valButton) è possibile stampare sul monitor il valore della variabile.






Quanto Tempo Hai Premuto il Pulsante?

Obiettivo: Determinare per quanto tempo un pulsante è stato premuto.

Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • Pulsante
  • Resistenza (1kOhm)

Prerequisiti


Blinking Led Senza Delay: MILLIS()



Pulsante come Interruttore


TeoriaPoter misurare il tempo di pressione di un tasto può risultare utile in molte applicazioni. Infatti, questa informazione permette di discriminare le differenti modalità di iterazione con il pulsante come il click (tasto premuto) ed il long click (tasto premuto a lungo). Potere discriminare questi comportamenti permette di abilitare il pulsante a differenti funzioni. Ad esempio il single click potrebbe essere utilizzato per accendere un led mentre il long click potrebbe essere utile per farlo lampeggiare.
Dal punto di vista hardware il circuito necessario per realizzare questa applicazione è molto semplice ed è costituito dal singolo pulsante collegato a vcc e al ground mediante resistenza di pull-down.
Elemento centrale di questa esercitazione è la scrittura di un codice corretto che permetta di misurare esattamente lo scorrere quel tempo. Questo codice si basa sull’impiego di due elementi fondamentali:

  • La funzione millis: questa funzione restituisce il numero di millisecondi che sono passati da quando la board Arduino ha eseguito il programma corrente. Questo numero si riazzera dopo circa 50 giorni. L’impiego di questa funzione è fondamentale per misurare il tempo di pressione del pulsante. Nel dettaglio, questa operazione può essere svolta semplicemente eseguendo la differenza tra le misure temporali prese quando il pulsante è premuto e quando il pulsante è rilasciato.
  • La variabile di stato: questa variabile (di natura globale) permette di determinare quando un pulsante è premuto e quando il pulsante è rilasciato. Nello specifico grazie a questa variabile è possibile determinare un passaggio dallo stato logico basso a quello alto e viceversa.

Collegamento Circuitale:

Collegamento Circuitale

Codice: A seguire viene riportato il codice utilizzato per determinare il tempo di pressione di un pulsante. Nello specifico il codice utilizza la variabile di stato “valButtonOld” per memorizzare lo stato del pulsante relativo al ciclo passato.
Quando i valori di “valButton” evalButtonOld” differiscono, allora c’è stato un passaggio di stato.

ValButtonOld ValButton Evento
LOW HIGH Il pulsante è stato premuto
HIGH LOW Il pulsante è stato rilasciato

Nel caso specifico del passaggio di stato viene effettuata una misura del tempo trascorso mediante la funzione millis(). Per determinare il tempo trascorso basta semplicemente effettuare una differenza tra le due misure realizzate.



PersonalizzazioniE’ possibile modificare l’hardware introducendo due led. Quando il pulsante viene premuto per meno di un secondo deve accendersi il primo led, quando invece il pulsante viene premuto per più di un secondo deve accendersi il secondo.




Mappa Concettuale di Arduino

Obiettivo: Viene presentata una mappa concettuale di Arduino utile per studenti, DSA, BES, e curiosi vari.

E’ possibile scaricare la mappa in formato PDF qui.




Campanella Scolastica Azionata Mediante Relè e Pulsante

Obiettivo: Comando di una campanella scolastica mediante un relè ed un pulsante.



Componenti elettronici:

  • Arduino
  • Campana Scolastica (4.5V e 150mA)
  • Relè
  • Pulsante
  • Resistenza per pulsante (1kOhm)

TeoriaUno dei problemi principali di Arduino è legato alla impossibilità apparente di comandare dispositivi che richiedono tensione e/o correnti elevate. Infatti, è importante considerare che Arduino, attraverso le sue istruzioni di digitalWrite può generare su uno specifico pin in uscita una tensione massima di 5 Volt con una corrente pari a 70 milliAmpere.
Nel caso specifico della campana scolastica, la corrente richiesta per il corretto funzionamento del dispositivo è pari a 125mA. Pertanto la possibilità di azionare mediante Arduino la campanella è vincolata dall’utilizzo di un componente elettromeccanico aggiuntivo denominato relè (in inglese relay). Il relè infatti può essere utilizzato come un interruttore (ad alta tensione) comandato elettronicamente (mediante digitalWrite).
Da un punto di vista fisico, il relè è costituto da un elettromagnete (costituito da una bobina di filo conduttore elettrico, tipicamente rame, avvolto intorno ad un nucleo di materiale ferromagnetico). Al passaggio di corrente elettrica nella bobina, l’elettromagnete modificherà la posizione di un contatto mobile aprendo o chiudendo il circuito ad esso collegato. Il contatto aperto quando la bobina non è alimentata prende il nome di normalmente aperto (NO); mentre, l’altro contatto, quello chiuso prende il nome di normalmente chiuso (NC).

Esempio di funzionamento di un relèa

Da un punto di vista elettronico, utilizzare un relè per comandare la Campanella scolastica mediante Arduino è una procedura particolarmente semplice. Il primo passo è quello di collegare, mediante il contatto normalmente aperto del relè, la campanella ad una sorgente di alimentazione esterna (come ad esempio il pin a 5Volt di Arduino il quale permette di erogare una corrente massima di circa 500mA). In seguito la bobina del relè viene collegata al pin digitale di Arduino impiegato per il controllo della campanella. Questo ci permette di modificare la posizione del contatto mobile del relè attraverso l’istruzione di digitalWrite con la quale la bobina può essere o non essere eccitata. In questo modo è possibile comandare la campana mediante una semplice istruzione.

Datasheet del Relè LU-5-R presente in Tinkecad

Nel caso specifico, l’impiego di un pulsante permette di controllare l’attivazione della bobina e quindi il controllo della campanella.
A seguire viene riportato lo schema elettrico ed il codice utilizzato per il comando della lampada mediante relè.

Collegamento Circuitale:

Codice:

A seguire viene riportato il codice utilizzato:



Personalizzazioni:

E’ possibile introdurre un RTC per programmare l’orario della campanella.




PowerShield 6+6 T800

Obiettivo: Utilizzare la scheda PowerShield 6+6 T800 per controllare dei carichi in corrente continua con Arduino. Caso applicativo: controllo di velocità di una ventola mediante PWM.



Componenti elettronici:

  • Arduino UNO
  • PowerShield 6+6 T800
  • 1 Ventola da PC
  • 1 Alimentatore da Banco (corrente continua)
  • 1 Trimmer per controllare la velocità della ventola

Pre-requisiti:


Controllo di un LED mediante un Potenziometro


TeoriaObiettivo di questa dimostrazione è controllare una ventola per PC utilizzando la PowerShield 6+6 T800. E’ importante considerare che esistono due differenti tipologie di ventole le quali si differenziano nel numero di cavi utilizzati per alimentarle (vedi la seguente figura). Nel caso specifico è stato utilizzata una ventola a 3 cavi:

  • Cavo Nero: GND
  • Cavo Rosso: Alimentazione
  • Cavo Giallo: RPM per il controllo della velocità

Poiché la tensione di alimentazione è pari a 12 volt non è possibile utilizzare esclusivamente la scheda Arduino per pilotare la ventola ma è necessaria una fonte di alimentazione esterna ed un dispositivo di controllo (e.g., Relè, Transistor). Nel caso specifico è stato utilizzato la PowerShield 6+6 T800.

PowerShield 6+6 T800Sviluppata da Vytautas Janušonis e Valdas Mikėnas, questa scheda è stata progettata ed ideata per Arduino (UNO, MEGA, NANO) con l’obiettivo di aiutare l’utilizzatore nella gestione dei carichi che richiedono particolari valori di tensione (input voltage range 6.5 – 32Volt) e corrente (fino a 25 Ampere). Grazie alla tecnologia Mosfet la scheda supporta la gestione di elevate frequenze in uscita e garantisce il supporto PWM fornito da Arduino. In seguito sono riportate le principali specifiche tecniche della scheda:

  • Tensione in ingresso fino a 32V con un supporto massimo di corrente pari a 25A.
  • Le uscite possono controllare differenti tensioni
  • PWM fino a 100kHz
  • Fino a 7A per canale
  • Autoalimentazione della scheda controllore Arduino.
  • Circuito Integrato di MultiProtezione

Sono riportate in seguito le immagini relative alla scheda T800 e alla sua configurazione dei PIN

PowerShield 6+6 T800:
PowerShield 6+6 T800 Pin Configuration

Nella board sono presenti due switch:

  • Switch1: Permette di scegliere le uscite. Quando lo switch1 è in posizione OFF i morsetti sono pilotati i pin 2, 4, 7, 8, 12e 13. Quando invece lo switch2 è in posizione ON, sono portati sui morsetti di uscita i PIN PWM 3, 5, 6, 9, 10, 11.
  • Switch2: Permette di ottenere il feedback sugli ingressi analogici di quello che sta accadendo in uscita. Nello specifico, quando lo switch2 è in posizione ON e lo switch1 è in posizione OFF sul pin A2 viene riporta la misura della corrente che sta passando nel morsetto di uscita, sul pin A1 è riportato un warning (ON/OFF), ed infine sul pin A0 si indica se l’uscita è in protezione. Differentemente quando lo switch1 è in posizione ON queste informazioni sono riportate rispettivamente sui pin A3, A4, e A5. Tutti questi feedback possono essere visualizzati utilizzando il monitor Seriale.

Nel caso specifico del controllo di velocità di una ventola da PC lo Switch1 è impostato su ON (per abilitare i PIN PWM) mentre lo Switch2 è impostato su OFF.

Collegamento Circuitale:

Collegamento Circuitale



Considerazioni: La PowerShield 6+6 T800 è una ottima scheda che permette di ampliare le possibilità di Arduino trasformandolo in un dispositivo efficace anche dal punto di vista della gestione di carichi che richiedono l’utilizzo di correnti elevate. In molte applicazioni infatti il limite di utilizzo del controllore Arduino è proprio legato all’impossibilità di gestire carichi che richiedono tensioni maggiori di 5volt e/o correnti superiori ad un Ampere.




Utilizzare la EEPROM e salvare dati in modo permanente

Obiettivo: Salvare dati in modo permanente nella memoria EEPROM di Arduino.

Componenti Elettronici:

  • Arduino UNO

Teoria: Arduino UNO è una piattaforma HW dotata di Microcontrollore ATMega328P, questo dispositivo è dotato di tre differenti tipologie di memoria interna

  • FLASH 32 KB (Memoria allo stato solido): Memoria non volatile nella quale viene memorizzato il programma (include anche il bootloader (0,5 KB). 
  • SRAM 2 KB (Static RAM): Memoria volatile utilizzata per memorizzare le variabili e le costanti del software.etc)
  • EEPROM 1KB (Electrically Erasable Programmable ROM): Memoria non volatile utilizzate per salvare le differenti configurazioni del programma.
Schema Elettrico Arduino

E’ possibile utilizzare la EEPROM di Arduino al fine di memorizzare delle informazioni in modo permanente e che non vengano cancellate in mancanza di alimentazione. La Memoria EEPROM di Arduino UNO è pari a 1Kb = 1024 spazi o celle in cui si possono memorizzare i dati (numeri compresi tra 0 e 255).
E’ importante considerare che, se si prova a memorizzare un numero negativo oppure un numero maggiore di 255, i valori memorizzati risultano errati.
Per potere utilizzare la memoria EEPROM interna è necessario includere la specifica liberia “EEPROM.h”. Non sono necessari componenti hardware ulteriori.

Le principali funzioni utilizzate per gestire la memoria EEPROM sono:

  • EEPROM Clear: Cancella i Byte nella EEPROM.
  • EEPROM Read: Legge il valore memorizzato nella EEPROM.
  • EEPROM Write: Memorizza il valore nella EEPROM

Codice: Esempio di una scrittura su EEPROM

Per potere scrivere dati nella EEPROM è necessario includere la libreria “EEPROM.h”, nel dettaglio la funzione utilizzata è:

EEPROM.write(address, value)

dove address è il parametro che indica l’area di memoria dove scrivere il dato (da 0 a 1023), e value è il valore da scrivere in EEPROM (da 0 e 255).




Codice: Esempio di una lettura su EEPROM


Per potere leggere dati nella EEPROM è necessario includere la libreria “EEPROM.h”, nel dettaglio la funzione utilizzata è:

value = EEPROM.read(address)

dove address è il parametro che indica l’area di memoria dove leggere il dato (da 0 a 1023), e value è il valore del dato letto dalla EEPROM (da 0 e 255).