Tutorial: Giochi di luce con Arduino

Continuo il filone feste di Natale con questo primo semplice gioco di luci per il tuo albero di natale o presepe. Nei prossimi articoli troverai degli esempi differenti di giochi natalizi e chissà che non possa realizzare dei giochi di luce radiocomandati 🙂

Albero di Natale

Ti mostro un semplice sketch lasciando a te la possibilità di definire sia che tipo di luci utilizzare, magari riciclando delle vecchie serie di luci oramai in disuso perchè statiche, o realizando delle serie con i led.

Ricorda che le uscite Arduino non erogano correnti elevate e per questo dovrai studiare una alimentazione esterna, potrebbe essere fatta con dei triac, se vuoi realizzare una centralina luci a 220v, o con dei transistor se desideri colegare direttamente le serie in bassa tensione.

Passiamo allo sketch:

/**
 * Giochi di luce con Arduino
 * Version 0.1 Dec, 2011
 * Copyright 2011 Alfieri Mauro
 * info at mauroalfieri dot it
 *
 * This example code is in the public domain.
 */
 
 #include <SoftPWM.h>
 
 int minpin = 2;
 int maxpin = 13;
 int fadeUp = 1000;
 int fasdeDown = 1000;
 
 void setup() {
   SoftPWMBegin();
   for ( int i=minpin; i<=maxpin; i++)
   {
     SoftPWMSet(i, HIGH);
   }
   for ( int i=minpin; i<=maxpin; i++)
   {
     SoftPWMSet(i, LOW);
     SoftPWMSetFadeTime(i, fadeUp, fasdeDown);
   }
 }
 
 void loop() {
   
  game_one();
 
 }
 
 void game_one() {
   for ( int l=minpin; l<=maxpin; l++)
   {
     SoftPWMSetPercent(l, 100);
     if (l >= (minpin+1)) { SoftPWMSetPercent((l-1), 0); }
     if (l == minpin)     { SoftPWMSetPercent((maxpin), 0); }
     delay(fadeUp);
   }
 }

Per consentirti il massimo della flessibilità ho previsto di utilizzare tutte le uscite digitali di Arduino, lasciandoti la possibilità di ridurle in numero se ti occorressero meno serie di luci.

Inoltre ho previsto di utilizzare tutte le uscite digitali in modalità PWM in questo modo potrai usare effetti di dissolvenza su tutte le luci; usa solo l’accortezza di verificare che le tue serie possano essere pilotate in dssolvenza pena la loro rottura prima della fine delle feste, e l’effetto sarebbe sgradevole. Ricorda inoltre di fare molta attenzione alle alte tensioni (220v) se decidi di realizzare una centralina luci a 200v.

Iniziamo a vedere come si comporta lo sketch.

linea 10: includi la libreria SoftPWM, che ti permette di utilizzare tutte le uscite digitali con segnali PWM;

linee 12-15: definisci le variabili di tipo integer necessarie al funzionamento del tuo gioco di luce, in particolare minpin e maxpin definiscono il primo e l’ultimo pin di Arduino che utilizzerai, sono impostati rispettivamente a 2 e 13 in questo modo escludi i primi 2 pin ( 0 e 1 ) solitamente Tx ed Rx destinati alle comunicazioni seriali; le variabili fadeUp e fadeDown definiscono i tempi di dissolvenza in accensione e spegnimento;

linea 17: definisci la funzione di setup() il cui scopo ti è chiaro;

linea 18: inizializza la libreria SoftPWM, indicando allo sketch che intendi utilizzarla per questo programma;

linee 19-22: esegui un primo ciclo di startUp, ossia un ciclo in cui tutte le linee si accendono, serve a verificare che tutto funzioni e non ci siano serie di lampadine bruciate; è molto utile anche per sapere quando il circuito riceve per la prima volta tensione. Alla linea 21 utilizza la funzione SoftPWMSet( pin, valore) per eseguire il check, ad ogni ciclo for il valore di i si incrementa di uno a partire dal minpin fino a raggiungere il maxpin, per ogni pin imposta il valore del pin a HIGH ossia accende la serie collegata;

linee 23-27: esegui la stessa operazione delle righe 19-22 ma impostando il valore di ciascun pin a LOW ossia spegnendo la serie; inoltre utilizzando la funzione SoftPWMSetFadeTime( pin, fadeUp, fadeDown) imposti i tempi con cui la libreria softPWM deve accendere e spegnere ciascuna linea di lampadine, i loro valori sono definiti alle linee 14 e 15; ATTENZIONE: per ottenere un effetto fluido e veritiero puoi variare a piacere questi due valori ma sconsiglio di impostare il fadeUp di valore inferiore al fadeDown otterresti che la fase di spegnimento dura più tempo di quella di accensione, rendendo non equilibrato l’effetto;

linee 30-34: in questo sketch la funzione loop() si limita a lanciare il primo gioco di luci, ho voluto darle solo questa funzione perchè così potremo aggiunger nuovi giochi di luce a questo stesso sketch;

linea 36: definisci una nuova funzione game_one() che esegue il primo gioco di luci e che viene invocata dalla loop() ad ogni eseguzione del ciclo di Arduino;

linea 37: inizia un cisclo dal valore del pin minimo (minpin) al valore del pin massimo (maxpin) in cui eseguirai delle operazioni per ciascun pin;

linea 39: utiliza la funzione SoftPWMSetPercent( pin, percentuale) in cui imposti per ciascun pin, primo valore, la percentuale a cui vuoi che arrivi il segnale pwm, in pratica impostandolo a 100 indichi alla SoftPWM di incrementare il valore del pin impostato da 0% a 100% nel tempo indicato dal fadeUp (vedi linea 26) la libreria provvederà a inviare valori corrispettivi da 0 a 255 all’uscita corrispondente, nel tempo impostato;

linea 40: controlla che il valore di l sia superiore alla somma (minpin+1) questo comporta che lo sketch esegue le istruzioni tra parentesi solo quando l assume valore 3 (2 + 1) questo trucco ti permette di spegnere la serie precedentemente accesa, in pratica con l=2 (l=minpin) accendi la serie di luci connessa al pin 2; con l>=3 accendi la serie di luci connessa ai pin da 3 in poi e spegni la precedente, per fare questo utilizzi la stessa funzione SoftPWMSetPercent impostando a 0 la percentuale del pin precedente (l-1);

linea 41: è molto simile alla linea precedente ma ti permette di spegnere l’ultima serie accesa quando l=minpin, entra in gioco da subito ma il suo effetto lo vedi solo al secondo loop di Arduino in quanto al primo loop hai acceso in sequenza le serie collegate ai pin 2,3,4,5,6,7,8,9,10,11,12,13 spegnendo ogni volta la precedente, ma ti sarà rimasta accesa l’ultima linea (13 o maxpin) per cui dal loop successivo provvederai a spegnere propio quella mentre la prima (2 o minpin) si accende, l’effetto è di rotazione continua;

linea 42: attendi il tempo necessario alla realizzazione di quello che hai impostato in Arduino, ossia attendi che il pin in accensione sia giunto al livello massimo e che l’eventuale spegnimento sia concluso, per farlo giochi solo sui tempi, sapendo che fadeUp è il tempo in cui la SoftPWM incrementa il valore in accensione e che fadeDown è il tempo di decremento impostando il delay, tempo di attesa, come fadeUp l’effetto sarà di serie contigue che alternano accensione e spegnimento. ATTENZIONE: per questo motivo ti sconsiglio di impostare un fadeDown superiore al fadeUp, rovinerebbe l’effetto;

Buon divertimento

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/tutorial-giochi-di-luce-con-arduino.html

37 comments

7 pings

Skip to comment form

    • Macca96 on 26 ottobre 2013 at 21:23
    • Reply

    ciao Mauro

    come gli altri tutorial, anche questo è utile e fantastico

    ma ho un problema.
    quando copio lo sketch per fare una prova il programma mi da:” errore di compilazione”
    la libreria lo scaricata e inclusa e non capisco il problema

    spero tu possa aiutarmi

    grazie

    macca96

    1. Ciao Macca,
      al solito se non mi scrivi l’errore che ti da io non posso sapere che problema ti da.

      Mauro

    • Macca96 on 27 ottobre 2013 at 13:57
    • Reply

    il problema è quello non viene scritto niente e sopra mi dice nella parte arancione “errore durante la compilazione”

    1. Ciao Macca,
      ti evidenzia qualche linea del codice?
      in arancione, nell’area nera in basso, che messaggio riporta?

      Mauro

    • Macca96 on 28 ottobre 2013 at 15:11
    • Reply

    no niente errori , è quello che non capisco
    messaggio “errore durante la compilazione”
    sotto nel nero tutto vuoto

    1. Ciao Macca,
      se non ti da altro errore e non ti evidenzia un punto dello sketch potrebbe essere un errore dell’IDE installato in modo non corretto, il problema in questo caso non è lo sketch ma l’installazione sul Computer.

      Se prendi uno sketch base tipo il blink lo compila? E successivamente riprovando con questo sketch il risultato cambia?

      Mauro

    • Macca96 on 29 ottobre 2013 at 21:12
    • Reply

    si solo con quello sketch non funzionava
    oggi ho acceso il computer è lo ha compilato correttamente e non ho fatto niente

    se so fa ancora ti ricontatto

    grazie mille

    macca

    1. Ciao Macca,
      l’errore non dipendeva dallo sketch ma da tuo IDE che rileva delle difficoltà di comunicazione con Arduino.

      Se ti ricapita cerca di capire cosa é cambiato nei tuoi collegamenti.

      Mauro

    • Macca96 on 2 novembre 2013 at 13:12
    • Reply

    grazie infatti faceva fatica a entrare nell’ide di arduino

    se volessi controllare lampade a 220v (ho in casa quelle psicadeliche) con arduino
    come posso fare??
    il problema è la parte di cablaggio sulle lampade
    non so cosa usare se triac o mosfet non ci ho capito niente
    hai per caso uno schema ??
    il progetto è per una festa devo controllare le luci con i tuoi giochi

    ancora grazie mille

    1. Ciao Macca,
      a volte basta solo provare senza arrendersi alla prima difficoltà 🙂
      Schemi di controllo lampade a incandescenza ( immagino tu ti riferisca a quelle ) ne trovi su internet molti a disposizione, in alternativa esistono delle shield se non ricordo male.

      Mauro

    • Daide on 16 gennaio 2014 at 17:58
    • Reply

    Ciao e grazie per i tuoi tutorial! Sono alle prime armi con arduino e ho bisogno di una mano.

    Io ho una scheda arduino mega 2560 che se non sbaglio ha già i pin da 2 a 13 in pwm. Quindi non dovrei utilizzare la libreria, giusto?

    In ogni caso ho scaricato la libreria e l’ho messa nella stessa cartella dove ho salvato lo sketch. Poi setto i pin (che in arduino mega non supportano pwm):

    int minpin = 25;
    int maxpin = 35;

    ma quando passo il codice alla scheda mi da questi errori:

    led.ino: In function ‘void setup()’:
    led:18: error: ‘SoftPWMBegin’ was not declared in this scope
    led:21: error: ‘SoftPWMSet’ was not declared in this scope
    led:25: error: ‘SoftPWMSet’ was not declared in this scope
    led:26: error: ‘SoftPWMSetFadeTime’ was not declared in this scope
    led.ino: In function ‘void game_one()’:
    led:39: error: ‘SoftPWMSetPercent’ was not declared in this scope

    Puoi darmi una mano? Grazie!

    1. Ciao Daide,
      i pin da 2 a 13 nella Mega sono identici a quelli dell’arduino uno per rendere compatibili le shield.
      La Mega ha 15 pin PWM ma sono in altre posizioni quelli differenti dal 3,5,6,9,10 e 11

      L’errore che ricevi è causato dal fatto che la libreria la devi installare nel path delle librerie arduino.

      Mauro

    • Matteo on 5 dicembre 2014 at 09:32
    • Reply

    Ciao Mauro!

    Ho trovato questa guida cercando un po’ su internet da estremo novello di Arduino 🙂
    Come primo esperimento mi sarebbe piaciuto buttarmi su un esperimento del genere, ovvero settare sul mio albero di natale i giochi di luce che voglio io.
    Lo sketch che hai fatto mi è abbastanza chiaro(per lo meno come primo gioco di luci, poi altri eventuali dovrei approfondirli), ma mi chiedevo cosa può servire come componenti?

    Ti ringrazio e se mi scrivessi via mail se ti va potremmo approfondire meglio il discorso.

    Grazie,
    Matteo

    1. Ciao Matteo,
      che intendi per componenti? cosa ci vorresti collegare?
      Ti sconsiglio di mettere in chiaro la tu casella email in quanto ti troveresti subissato di spam a causa della visibilità del blog sul web.
      L’ho rimossa prima di autorizzarti il commento.
      Io la tua email la vedo cmq dal campo in alto che hai compilato.

      Quale discorso vorresti approfondire che non sia possibile condividere con gli appassionati che leggono il blog?

    • enrico on 5 febbraio 2015 at 08:35
    • Reply

    Ciao Mauro
    sto provando lo sketch giochi di luce con Arduino,quando al passo 10 della compilazione inserisco
    PWM scaricato,lo sketch mi da errore di compilazione,potresti pubblicare lo scketch con il PWM gia inserito.
    grazie

    1. Ciao enrico,
      devi includere la libreria SoftPWM come indicato alla linea 10

    • enrico on 5 febbraio 2015 at 16:01
    • Reply

    Ciao Mauro
    scusa di nuovo ,come gia’ ti avevo detto ma sono uno alle prime armi nonostante la mia eta’da pensionato
    ma uno sketch con inclusa la libreria SoftPWM non puoi pubblicarla?
    grazie

    1. Ciao Enrico,
      putroppo no, le liberie si includono così come leggi nello sketch, non è possibile usarle in altro modo nello sketch.
      Cmq non è complesso, cerca in internet la liberria, segui uno dei miei tutorial su come si installa la libreria o uno dei tutorial sul sito arcuino originale e il gioco è fatto.

    • ENRICO on 14 febbraio 2015 at 16:00
    • Reply

    Ciao Mauro
    sono ancora alle prese con SoftPWM.h,l’ho trovato,l’ho inserito
    ma alla verifica compilazione mi si evidenzia SoftPWMBegin(); con la scritta softPWMBEGIN was non declared in this scope,e mi sembra di aver fatto tutto giusto.
    grazie
    ciao
    enrico

    1. Ciao Enrico,
      hai riavviato l’IDE dopo aver caricato la libreria.

    • Polyphemo on 17 ottobre 2015 at 19:26
    • Reply

    Ciao Mauro
    Complimenti per i tutorial sono fatti molto bene e sono descritti anche meglio.
    Ti scrivo perche (scusa per gli accenti ma ho una tastiera canadese senza accenti) mi sto cimentando con i giochi di luce e tutto funziona perfettamente, ma vorrei creare un gioco di luce dove i led lampeggiano in random mode, ma non sono riuscito a trovare niente in merito, ho solo trovato solo questo sito http://www.nerdz.eu/evolution.228 dove lo scetch fa lampeggiare un solo led ma il random e sulla quantita di lampeggio del led.
    spero che potrai aiutarmi.
    Grazie Polyphemo.

    1. Ciao Ployphemo,
      che tipo di casualità vuoi che abbiano questi led?
      Stabilita quella puoi scrivere uno sketch, partendo dal mio esempio, che esegua ciò che desideri.

    • Angelo on 2 novembre 2015 at 09:33
    • Reply

    Ciao Mauro,
    più leggo le pagine di questo blog più mi appassiono con arduino. Ho appena iniziato ad utilizzarlo e grazie alle tue guide sono riuscito a fare delle cose interessanti.
    Ti volevo chiedere se esiste un modo per aumentare la velocità di un effetto senza l’ausilio di potenziometri. Qui di seguito ti metto un link della cosa che vorrei realizzare con arduino per un modello che sto realizzando. Mi puoi dare una mano a capire come fare?
    Grazie per l’attenzione.
    Angelo
    https://youtu.be/oIYHLvkKPfk

    1. Ciao Angelo,
      come già avrai letto in questo tutorial basta usare i tempi del micro controllore arduino per gestire la velocità in cui si alternano le velocità di accensione e spegnimento dei led.

    • Cristian on 6 gennaio 2016 at 19:38
    • Reply

    Ciao Mauro,
    Lo so che è passato natale ma mi puoi dire come fare uno show di luci di natale da 220v attraverso arduino.
    Si può fare?se si mi puoi spiegare come si fa?

    1. Ciao Cristian,
      si può fare ed esistono molti modi di farlo.
      Con una richiesta generica come la tua non saprei dirti che strada prendere, posso solo consigliarti di leggere i miei articoli sui giochi di luce, come questo, e studiare su un buon manuale di elettronica come adattare il segnale da 5v a 220v mediante shield ecc..

    • cristian on 7 gennaio 2016 at 16:07
    • Reply

    ciao mauro sono sempre Cristian,
    mi puoi cosigliare qualcosa?sai uno di questi modi che si possono utilizzare?
    Perchè ho sempre desiderato di fare uno spettacolo di luci di natale a ritmo di musica.
    Perpiacere se puoi rispondimi il prima possibile.

    • cristian on 9 gennaio 2016 at 14:52
    • Reply

    ciao mauro sono sempre cristian,
    attraverso i relè posso fare uno spettacolo di luci di natale a ritmo di musica??

    1. Ciao Cristian,
      dipende dallo spettacolo, il relay è solo on/off e non può gestire i passaggi graduali di illuminazione.

        • Cristian on 10 gennaio 2016 at 21:18
        • Reply

        Uno spettacolo a ritmo di musica ad esempio con la canzone let it go frozen si può fare con i relè??

        1. Ciao Christian,
          mi chiedi cose che non so.

            • Cristian on 12 gennaio 2016 at 16:11

            mi potresti consigliare un buon manuale di elettronica (per i primi passi di arduino).

          1. Ciao Cristian,
            libri non posso dirti di averne letti molti, sopratutto primi passi; i miei li ho mossi su internet cercando info nel web in quanto i libri sono usciti successivamente.
            Il libro ufficiale incluso nel kit arduino potrebbe essere un buon prodotto.

    • Michele on 1 febbraio 2016 at 21:13
    • Reply

    Ciao Mauro!
    Sono alle prime armi e sto facendo pratica con i led anche rgb, mi chiedevo come si poteva accendere un led RGB (una determinata combinazione di colori) lentamente (fade), rimanere di quel colore e poi con una pressione del pulsante cambiare colore sempre lentamente e rimanere così a meno che non premi di nuovo il pulsante.
    Ho cercato dappertutto ma non trovo esempi del genere….

    Grazie

    Michele

    1. Ciao Michele,
      dubito che troverai esattamente quello che desideri perché non è una esigenza comune.
      Puoi leggere tutti i miei articoli sul controllo di led, anche RGB, e sui pulsanti e comprendere come miscelare e riscrivere il codice per ottenere quello che ti occorre.

    • Vito on 12 novembre 2017 at 20:30
    • Reply

    Vorrei sapere dove posso trovare negli esempi riportati un progetto dove utilizzare l alimentazione esterna con i triac o transistor

    1. Ciao Vito,
      ce ne sono tanti nel blog, prova con il lampadario a fibre ottiche, è una serie di articoli in cui uso il TIP122 per accendere dei led con dissolvenza.

  1. […] Mauro Alfieri Tweet Continua la serie dei miei articoli sui giochi di luce per il tuo albero o per le decorazioni Natalizie. In questo articolo realizzerai un secondo gioco […]

  2. […] settimana fa hai potuto leggere il primo articolo relativo a giochi di luce con Arduino, oggi arricchisci le tue decorazioni con un nuovo gioco, quello mostrato nel video […]

  3. […] giochi di luce con Arduino […]

  4. […] Avrai già notato come funziona, il principio è molto semplice: se il valore della variabile game è 9 ( linea 01 ) esegue le linee successive del listato; per ciascun gioco dal primo all’ottavo Arduino esegue prima il settaggio dei pin secondo la modalità prevista dal gioco da eseguire. Ad esempio se il gioco da eseguire è il primo game_one() devi resettare i pin dal minpin al maxpin impostando come tempi di fadeUp e  fadeDown quelli definiti nelle variabili corrispondenti, se il gioco da eseguire è ad esempio il quarto game_four() allora il settagio dei pin dal minpin al maxpin è 0 come tempo di fade sia per la fase ascendente ( fadeUp ) sia discendente ( fadeDown ); In questo modo Arduino esegue tutti i giochi in sequenza e poi rilascia il controllo alla funzione loop() che provvede a rieseguire l’intero gioco ripartendo dal primo. Avrai notato che alcuni giochi di luce hanno una durata inferiore rispetto ad altri, prova a pensare come rendere quei giochi di inferiore durata più simili a quelli di durata maggiore, con delle semplici righe di codice e proponile a tutti i lettori di questa serie di articoli come commento a questo articolo. Riepilogo di seguito ciascuno dei giochi di luce così come li vedrai eseguiti selezionando il nono gioco di luce: Primo Gioco […]

  5. […] Mauro Alfieri Tweet Finita la serie di articoli sui Giochi di luce con Arduinoecco un articolo sui motori passo-passo. E’ molto tempo che non mi occupavo di […]

  6. […] personalemente, e lo sto utilizzando per i tutorial che hai visto nell’ultimo periodo: Giochi di luce, Motori stepper, […]

  7. […] questa shield in modo più utile, un primo suggerimento è prendere tutta la serie di articoli sui giochi di luce di Natale ed adattarla per essere utilizzata con la shield I/O otterrai dei fantastici giochi di luce per il […]

Lascia un commento

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.