Gioco luci con Arduino



Su ispirazione di un mio amico, ho sviluppato un circuito per accendere una matrice di LEDs. Possibile che il parroco abbia richiesto di riparare un candeliere votivo, già disposto con delle lucine a incandescenza. Abbiamo realizzato di mettere dei LED bianchi a piccola potenza. Un tasto o sensore del passaggio delle monete accende un LED alla volta.

 

Descrizione

Il progetto qui presentato è senza pretese di essere totalmente funzionante, è solo a scopo didattico. Infatti ci potrebbero essere qualche problema da risolvere nella costruzione finale del progetto.


La prova al banco dimostra la fattibilità. Poi infine nella messa in opera ci dovranno essere delle precauzioni che la lunghezza delle connessioni non sia eccessiva, oppure che l’ alimentazione sia filtrata da eventuali disturbi.

Lo sviluppo comprende un Arduino UNO V3, una matrice di LED da 6 righe per 4 colonne. Questi LED sono pilotati direttamente dall’Arduino in multiplexing.


Il programma all’ atto di attivazione di un pulsante o rilevamento di passaggio di una moneta, inizia a far lampeggiare il LED successivo alla sequenza.
Quando non ce n’è nessuno attivo, chiaro che parte dal primo.

Nel video, che si può vedere all’indirizzo sotto descritto, è stato usato un semplice filo a mo’ di pulsante.

La disposizione della matrice dei LEDs, parte da un quadrato che rispecchia in un certo modo gli assi cartesiani. Quindi la sequenza di accensione parte dal basso a sinistra e segue con l’ aumento della Y, fino al massimo del numero di una colonna. Di seguito, si passa alla colonna successiva. Vedasi tabella di seguito, che mostra quale sia la sequenza di accensione. Partendo dal numero uno.

Orientamento dei LEDs

6

12

18

24

5

11

17

23

4

10

16

22

3

9

15

21

2

8

14

20

1

7

13

19

Circuito Stampato

Per semplificare lo sviluppo, ho organizzato uno stampato a singola faccia, che prevede il collegamento di ogni anodo e catodo. La scheda prevede già una espansione di matrice da 6×6. La figura di sotto rappresenta la disposizione della scheda. Ho lasciato dello spazio tra anodi e catodi di ogni LED, per far passare più piste. Purtroppo ci sono alcuni ponticelli da passare, visto che lo sbroglio non è stato possibile ridurli.


Si dovrebbe annotare che i catodi sono rivolti verso le resistenze che vanno all’ Arduino, mentre gli anodi sono collegati ai collettori dei transistor. Quindi vediamo lo schema elettrico.

Schema elettrico

Notare che l’ Arduino potrà esser collocato su connettori. Consiglio questo modo, per poter estrarlo in caso di riprogrammazione.

In tutti i casi si può vedere i dettagli scaricando il pacchetto che contiene anche gli sketch[*] da caricare sull’ Arduino.

[*] Uno sketch ha il periodo che i LEDs rimangono accesi unico e si avvia al raggiungimento del numero massimo dei LEDs. Questo si chiama matrix_single_time.ino.
Il secondo, matrix_multiple_time.ino, funziona che ogni LED ha un suo periodo autonomo e termina con la durata assegnata (TIMEOUT). Inoltre, nel caso che tutte le luci saranno accese, verrà azzerata la durata di quel LED che avrà il periodo più lungo.
Una nota che matrix_multiple_time.ino, inizia il conteggio dalla posizione 24 all’ indietro.
Esiste anche una versione che utilizza un MAX7219 con la sua libreria, che può gestire fino a 64 lucine. Ma non è presente nel pacchetto.

Funzionamento del programma

Il programma permette alcune personalizzazioni, che sono elencate nelle sue prime linee. A prescindere da quello a cui è attualmente designato si potrebbe prendere l’ Arduino e implementare una matrice 8 righe per 6 colonne, con solo due linee di correzione. Vediamo in dettaglio.

La linea 5 #define DEBUG definisce se compilare con la seriale collegata per il debugging (Una volta provato il circuito, meglio commentare la linea). Di seguito, nello sketch, alle linee 23 e 24 si può definire quali piedini assegnare da usare con la seriale. Ci vuole una interfaccia USB-RS232 TTL come da figura. Quindi si potrà collegare ai piedini ancora disponibili a secondo di come si vorrà assegnarli.

La linea 12 #define INBTN A0, ci permette di assegnare l’ ingresso che si vuole usare per attivare il conteggio. Almeno per questo progetto si prevede nel circuito stampato un blocchetto con fissaggio a vite, per collegare il pulsante. Ma per utilizzo diverso rimane la possibilità di assegnare a nuova posizione. Eccetto quelli che sull’ Arduino sono numerati da 0 a 13, che sono quelle che si usano per pilotare la matrice di LEDs.

La linea 13 #define TMPRESS 20, serve per definire il periodo che l’ ingresso deve rimanere basso per essere convalidato. Potrebbe essere necessario l’ aggiustaggio per definirne la sensibilità. Il valore è espresso in 2,5 millisecondi. Che corrisponde al periodo di aggiornamento dei LEDs.

La linea 14 #define TIMEOUT 7200, stabilisce quanto a lungo rimangono tutti i LEDs accesi, una volta che s’è raggiunto il numero massimo di accensioni. La misura è in secondi, per tanto s’è considerato un periodo di due ore. Nella funzione countdown il ritardo è di 998 millisecondi, che potrebbe essere necessario un aggiustamento per avere il periodo corretto.

Le linee 15 e 16 definiscono quante colonne NUMCOLS e quante righe NUMROWS che per il progetto sono 4 e 6 rispettivamente.

Alle seguenti 3 linee si calcola le impostazioni del programma, a seconda dei valori definiti per le righe e le colonne, di cui sopra. (Non sono da modificare anche in un uso diverso del programma).

Alla linea 20 #define NUMBLINKS 8, si può variare quante volte lampeggiare prima di far rimanere il LED acceso fisso. Fare attenzione che può essere solo un numero pari, pena che finisce il conteggio con il relativo LED spento.

La linea 21 #define COMMON_ANODE, ci permette d’ impostare se usare livelli bassi o alti per le uscite delle righe. Per un qual caso si volesse interporre dei buffer a transistor oppure circuiti integrati come ULN2804, questo vi permette di variare la compilazione e invertire le uscite.
Se si volesse le uscite attive alte, basta commentare la linea,
mettendo //.

Lo stesso si applica anche per la linea 22 #define COL_ACTIVE_LOW, ci permette di invertire la logica delle uscite per le colonne. Io ho impostato da pilotare dei 2N2907A, quindi mi servivano attive basse.

La linea 25 #define TIMELAPSE 2500, è quella che stabilisce la frequenza di aggiornamento della matrice e la scansione delle colonne. Il periodo è in microsecondi. In effetti qui si richiama la funzione refresh ogni 2,5 millisecondi. Si potrebbe aggiustare, aumentando il valore, per ridurre leggermente la brillantezza dei LEDs, ma si rischia d’ incorrere in un fastidioso sfarfallio. Ho provato con 5 millisecondi e non presenta sfarfallio. Riducendo ulteriormente potrebbe compromettere lo svolgimento degli altri compiti dell’ Arduino.

Per il resto, si può anche adattare il programma per pilotare un display numerico a 7 segmenti, con un massimo di 6 cifre. Oppure una matrice di 8×6 colonne. Per questo il programma è un impegno didattico, per apprendere alcuni trucchi di programmazione. Un particolare da notare è stato quello di usare una routine di interrupt per poter avere l’ aggiornamento dei LEDs brillanti.
Come quando prendevo le riviste di elettronica, quasi mai copiavo il progetto intero, ero interessato a prendere spunti per le mie idee.

Prove visive

Non poteva mancare anche la prova del fuoco.

Con l’ intento che possa servire alla comunità, divertitevi.

VOTO
11 commenti
  1. Ed Tel
    Ed Tel dice:

    Hello,
    I successfully managed to get the matrix_single circuit to work. I am having difficulty to get the MAX7219 to work. I have pin 2 as input and DATAIN pin 5, CLK pin 3 ,LOAD pin 4, GND and 5V. Am I missing anything ?
    I also have question for you , can the same concept be applied to using fastLED.h and WS2812B ?
    Thanks

    Approvazioni
    • Picmicro675
      Picmicro675 dice:

      The last sketch should work for the MAX 7219. I repeated the compilation and it compiles just fine. I have tested the sketch only with the simulator.
      For WS2812B it think is rather a different story, but the style to have that effect remain same. You should maintain the arrays to memorize each LED life. I wrote even for that some source for a PIC12F1822/40, in proton basic, but it follows a different style.

      Approvazioni
      • Ed Tel
        Ed Tel dice:

        Hi, Thanks for your prompt reply. I am still struggling to get the MAX7219 to work. i am using the MAX7219 Dot Matrix Module Microcontroller LED Module Display Module as a test. Any suggestions ?

        Approvazioni
        • Picmicro675
          Picmicro675 dice:

          You should provide some details about your assembly in order to comment and verify that you didn’t fall into an oversight.
          Using Arduino you may use the specific library as the sketch propose and connect the pins as written in that sketch. No idea if that will run smoothly I currently don’t have the hardware nor time to prove my sketch.
          I suggest you open a new discussion about your making.

          Approvazioni
  2. Ed Tel
    Ed Tel dice:

    Excellent and Interesting project using PORTD and PORTB , will attempt on Arduino UNO. do you have schematic to support about 64 LEDs. Keep up good work.

    Approvazioni
    • Picmicro675
      Picmicro675 dice:

      I’m glad that you’re interested on my project. So for the 8×8 schematics it was just a bit of copy-and-paste to add two more columns. I didn’t get into the sketch and PCB layout. So you should try a bit from yourself. In case you are in a bunch of difficulties I’ll get something developed for you. Currently to revise that project into a 8×8 layout I got some development with the MAX7219. That should be already included since the publication.
      The 8×8 you may find it here to download.

      Approvazioni
      • Ed Tel
        Ed Tel dice:

        Many thanks for your reply much appreciated. I will first attempt with 24 LEDS the progress to 64. I was not able to get to the download link provided for the 8 x 8 layout.
        To use the 8 x 8 which additional Pins on Arduino are available. Also I would like to add 2 x 8 LCD Dispaly, any ideas?

        Approvazioni
        • Picmicro675
          Picmicro675 dice:

          Sorry about the incorrect link, I got something messy along the way. Now is corrected. You will find the schematics.
          Anyway you may solve the case and use the entire PORTD to address more columns. But as I stated you might opt and use a CD4028 to convert the addressing by using only 3 bits.
          Here the MAX7219 sketch, the latest version.

          Sorry about the comments in Italian.

          Approvazioni
          • Ed Tel
            Ed Tel dice:

            Thank you for your time and patience. Your depth of knowledge on this is just amazing. I have ordered the parts and will attempt setup over weekend and let you know the result. The MAX7129 setup is less complicated than the transistor driver circuits.

            Approvazioni
  3. Picmicro675
    Picmicro675 dice:

    Infatti ho adottato ancora il metodo per usare un doppio display a 7 segmenti in un altro progetto.
    Il progetto è per un timer che non è stato provato, ma alla simulazione sì. Dovrei trovare un attimo di tempo per metterlo alla prova.
    Di fatto si usa tutta la PORTC per scrivere un byte. Con i 7segmenti, meglio se si usa un array di dati che rappresentano i simboli da visualizzare.

    Approvazioni
  4. Amilcare
    Amilcare dice:

    Senza dubbio mi è piaciuta l’idea e ancor più apprezzabile la semplicità di realizzazione. Ti ruberò l’idea come base di partenza per altri impieghi anche se al momento sono impegnato con il charlieplexing sarà il mio studio futuro appena terminato quello in corso.

    Approvazioni

Lascia un Commento

Vuoi partecipare alla discussione?
Fornisci il tuo contributo!

Lascia un commento