sabato 26 dicembre 2015

Scratch e Arduino - Progetto #2: Led effetto supercar

Quando ero ragazzino era molto popolare una mitica serie TV chiamata Supercar. L'auto tra le mille funzionalita' aveva anche un bellissimo effetto di luci sul davanti (ben visibile qui )

Proviamo adesso a realizzare qualcosa di simile (anche se non esattamente uguale) con Arduino.

Nel post precedente (leggilo qui) abbiamo imparato come far lampeggiare un led con Arduino, quindi adesso che sappiamo tutto cio' di cui abbiamo bisogno proviamo a fare l'effetto supercar :)


Obiettivi del progetto

Far accendere una serie di led con Arduino in modo da creare l'effetto supercar


Lista Componenti

Vediamo di cosa abbiamo bisogno per eseguire il progetto.


Scheda Arduino
Breadboard

4x Led

4x Resistenze da 220 ohm 

Fili Maschio-Maschio




Circuito e collegamenti

Qui lo schema dei collegamenti da realizzare. Ho usato il software Fritzing per rappresentare gli schemi di collegamento.




E qui la realizzazione su breadboard del circuito








Il circuito e' semplice ed e' molto simile a quello del progetto #1.
In pratica si devono collegare i 4 led alla stessa maniera del progetto #1.

In questo caso abbiamo 4 led (l'effetto viene meglio con piu' led, ma per praticita' fermiamoci a 4).
Disponiamo in una fila orizzontale i 4 led con il pidino + (anodo) verso destra.
Colleghhiamo una resistenza da 220 ohm all'anodo di ciascun led. In questo caso per praticita' dispongo la resistnza in verticale a cavallo della scanalatura centrale della breadboard.

Collego un filo nero (puoi usare anche un altro colore non e' cosi' importante per il momento) ad ogni piedino - (catodo) di ciascun led. L'altra estremita' di ciascun filo nero la collego nella linea orizzontale piu' in basso della breadboard (come da schema).

Adesso collego un filo rosso (puoi usare anche un altro colore non e' cosi' importante per il momento) ad ogni piedino della resistenza da 200 ohm, L'altra estremita' del filo rosso la collego ad un piedino digitale di Arduino. Come da schema il primo filo rosso lo collego al pidino 2, il secondo filo al piedino 3, il terzo filo al piedino 4 e infine il quarto filo al piedino 5 di Arduino (vedi foto circuito).

Per finire collego sempre con un filo nero, la linea orizzontale piu' bassa della breadboard al pidino GND di arduino. In questo modo abbiamo collegato tutti i catodi dei led a GND.


Programma Scratch

Adesso che il circuito e' completo, passiamo alla parte software.
In sostanza dobbiamo accendere e spegnere i led in sequenza in modo da realizzare l'effetto supercar.

Creeremo il programma in due modi: il primo piu' semplice senza cicli, il secondo piu' ottimizzato per ridurre ilo numero di istruzioni in cui useremo dei cicli e delle variabili.

Codice base


Crea questo script in Scratch usando il mouse





Adesso vediamo cosa fa il programma scratch descrivendo i vari blocchetti dall'alto al basso:




Questo e' l'inizio del programma. In particolare diciamo a scratch di iniziare ad eseguire il programma quando facciamo click con il mouse sulla bandierina verde





Come nel progetto #1, diciamo a scratch di collegare il ledA al pin 2 di arduino, il ledB al pin 3, il ledC al pin 4 e infine il ledD al pin 5. Cio' coincide esattamente con i collegamenti elettrici che abbiamo effettuato prima.

Spegniamo tutti i led quando il programma inizia per evitare effetti visivi indesiderati.

Questo blocco dice a scratch di aspettare per 1 secondo prima di eseguire il comando successivo. (questo blocco e' opzionale, puoi provare a rimuoverlo e vedere cosa succede)

questo e' un che in programmazione si chiama ciclo. Piu' imparticolare questo e' un ciclo infinito. Cio' significa che tutte le istruzioni o comandi che sono contenuti al suo interno vengono ripetuti per esempre dal primo all'ultimo, e poi dinuovo dall'inizio

Questo e' il blocco principale del codice che viene ripetuto per sempre in quanto e' all'interno del ciclo per sempre. Ma vediamo in dettaglio come funziona.
Accendiamo il ledA (quello piu' a destra di tutti)
Aspettiamo 1 secondo
Adesso spegniamo il ledA (quindi il ledA rimane acceso per 1 secondo) e allo stesso tempo accendiamo il LedB
Aspettiamo 1 secondo
Adesso spegniamo il ledB (quindi il ledB rimane acceso per 1 secondo) e allo stesso tempo accendiamo il LedC
Aspettiamo per 1 secondo
Adesso spegniamo il ledC  e allo stesso tempo accendiamo il LedD
Aspettiamo per 1 secondo (a questo punto abbiamo acceso in sequenza i led da destra verso sinistra, ora dobbiamo ornare indietro)
Aspettiamo per 1 secondo
Adesso spegniamo il ledD e allo stesso tempo accendiamo il LedC (in effetti stiamo tornando indietro)
Aspettiamo per 1 secondo
Adesso spegniamo il ledC e allo stesso tempo accendiamo il LedB
Aspettiamo per 1 secondo
Adesso spegniamo il ledB e allo stesso tempo accendiamo il LedA

A questo punto la sequenza e' completa, abbiamo accesso tutti i led uno per uno da destra a sinistra e poi da sinistra a destra



Quindi una volta fatto click sulla bandierina verde il programma inizia collegando i ledA,B,C, D  ai pin 2,3,4,5 di arduino.
Poi inizia un ciclo infinito che accende il led in sequenza da destra verso sinistra e viceversa andando cosi' a creare l'effetto visivo desiderato






Complimenti!!! come detto all'inizio avete realizzato l'effetto supercar!! :)


Codice con variabile


Nel codice precedente abbiamo fatto in modo che ogni led rimanga acceso per 1 secondo.
Se volessimo ora rendere l'effetto piu' veloce o lento dovremmo cambiare il valore 1 in tutti i blocchi Attendi 1 secondo. Ce ne sono 7 e sarebbe tedioso.

Allora introduciamo nel programma una variabile e chiamiamola ritardo






Crea questo script in Scratch usando il mouse





Come si vede lo script e' molto simile a quello precedente. Ci sono solo due differenze




Il blocco porta ritardo a 0.2 assegna un valore alla variabile ritardo. Nel nostro caso siccome vogliamo che l'effetto supercar sia piu' veloce assegniamo un valore minore di 1 (0.2)



Il blocco Attendi 1 secondo viene modificato come in figura di fatto mantenendo il led acceso per un periodo pari al valore contenuto nella variabile ritardo



Quindi in questo modo rendendo variabile il tempo di accensione del led possiamo variare facilmente la velocita' dell'effetto supercar!!





Codice con cicli


Crea questo script in Scratch usando il mouse





Adesso vediamo cosa fa il programma scratch descrivendo i vari blocchetti dall'alto al basso:




Inizializziamo una nuova variabile chiamata pin al valore 2. Avrei potuto usare direttamente porta in a 2 ma per qualche oscuro motivo non funziona. Provando ho visto che inizializzandolo a 0 e poi cambiando il valore a 2 funziona correttamente.

Come nel programma precedente all'inizio del programma spegniamo tutti i led per evitare effetti indesiderati. Questa volta creiamo un ciclo che viene ripetuto 4 volte (1 volta per ogni led). All'inizio del ciclo la variabile pin vale 2. La prima istruzione dento il ciclo imposta il pin pin a spento. Siccome la variabile pin vale 2 questo comando effettivamente imposta il pin 2 a spento. La seconda istruzione del ciclo incrementa il valore della variabile pin di 1. Quindi ora pin vale 3. Adesso la prima iterazione del ciclo si e' conclusa ed il ciclo inizia da capo. Quindi ora il pin 3 viene spento. La viaribile pin viene adesso portata a 4 ed il ciclo ricomincia spegnendo il pin 4. Cosi' via per 4 volte di fatto spegnendo il pin 2,3,4 e 5

Come nel programma precedente dobbiamo accendere i led da destra a sinistra e poi da sinistra a destra, Iniziamo con un primo ciclo che accende i led da destra a sinistra.All'inizio del ciclo la variabile pin ha valore 2 (primo led a destra). Ripetiamo il ciclo per 4 volte, una volta per ogni led. Nella prima iterazione del ciclo accendiamo il led 2 (pin=2) e spegniamo il led 1( pin = pin -1 ; pin = 2-1=1). In realta' al pin 1 non abbiamo collegato nulla quindi non succede nulla. A questo punto ci spostiamo a sinistra di un led incrementando la variabile pin di 1 e potandola a 3. Adesso attendiamo un periodo pari al valore della variabile ritardo. Adesso il ciclo ricomincia dall'inizio. Adesso accendiamo il led 3(pin=3) e spegniamo il led 2(pin = pin - 1; pin = 3-1 = 2). Incrementiamo il valore di pin di 1 (4) e attendiamo il tempo prestabilito. Poi il ciclo ricomincia accendendo il led 4 e spegnendo il led 3 (4-1). Cosi' via per 4 volte di fatto accendendo e spegnendo tutti i led da destra a sinistra nella sequenza corretta. 

Al termine del ciclo precedente la variabile pin ha valore pare a 6. Quindi prima di iniziare il ciclo di ritorno (quello che accende i led da sinistra a destra) impostiamo la variabile pin a 5. Nella prima iterazione del ciclo spegniamo il led 5 (pin =5) e accendiamo il led 4 (pin = pin -1; pin=5-1 = 4). Adesso il valore della variabile pin viene decrementato di 1 diventando uguale a 4. Adesso attendiamo il riratdo prestabilito. La prima iterazione del ciclo si e' conclusa e comincia dall'inizio. Adesso spegniamo il led 4 (pin = 4) e accendiamo il led 3 (pin = 4-1 = 3). Decrementiamo dinuovo pin a 3. Quando il ciclo ricomincia spegniamo il led 3 e accendiamo il led 2. Il ciclo si ripete per 4 volte accendendo e spegnendo i led da sinistra a destra nella giusta sequenza.

Questo e' il ciclo principale che viene eseguito per sempre. Quando il ciclo che accende i led da destra a sinistra finisce inizia il ciclo che accende i led da sinistra a destra. A questo punto il ciclo principale ricomincia facendo accendere dinuovo i led da destra a sinistra. 



Complimenti!!!! Hai implementato l'effetto super car usando quano appreso nel post #1 ed inoltre hai imparato cosa sono e come si usano le variabili e i cicli. Inoltre hai anche imparato come si incrementa e decrementa una variabile.