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
2 commenti
  1. 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
  2. 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

Specify Instagram App ID and Instagram App Secret in Super Socializer > Social Login section in admin panel for Instagram Login to work