Indice |
Introduzione
Se ti piacciono da morire i led, quelle lucine vivaci e colorate che esplodono in tanti colori armoniosi, questo è il progetto che fa per te! Sono 64 led (4x4x4) di 4 colori diversi, collegati in multiplexing e comandati dal pic 16f876. Penso che sia uno dei pochi (se non l’unico, dato che non ho trovato nulla) cubi a led 4x4x4 controllato da un pic e programmato intermante in C con mikroC. Infatti si trovano molti progetti di cubi 3x3x3 o comunque controllati da altri tipi di microcontrollore (principalmente Atmel).
Realizzazione del cubo
Per realizzare il cubo di led, mi sono costruito una basetta di legno spessa almeno 2 cm, e forata con punta del 5,5 (il foro l’ho fatto leggermente più largo per agevolare l’uscita dei led a lavoro finito) in punti equidistanti e paralleli tra di loro.
La distanza tra i vari led è di 3 cm su ogni lato. Basta quindi prepararsi una semplice griglia a 9 quadrati di lato 3 cm e praticare i 16 fori necessari su ogni vertice. Fate attenzione ad bloccare bene il foglio sul pezzo di legno. Il risultato finale della basetta forata dovrebbe essere questo:
Ora non vi resta che mettere un led per ogni foro, in modo intelligente però. Infatti ogni catodo di tutti i led dello stesso piano devono essere collegati tra di loro. Mentre i anodi di tutti i led devono collegarsi con gli anodi dei led nella stessa posizione ma su piani diversi. Anche i colori dei led sono stati disposti con criterio: ho fatto in modo che non ci sia mai sulla stessa fila (sui assi x, y e z) due led dello stesso colore.
Ecco lo schema dei colori e catodi:
Ogni piano poi va ruotato di 90 gradi (il senso di rotazione non è rilevante, basta mantenerlo per ogni piano) rispetto a quello sottostante. Ecco alcune immagini:
Dato che i miei led avevano i reofori troppo corti, ho dovuto aggiungere dei fili di ferro (diametro 1mm) per dare più robustezza al cubo. Nella prima immagine si vedono i tre piani completi: quelli sono i primi tre piani. L’ultimo piano è quello che vedete nella seconda foto: dovere saldare agli anodi dei led, dei fili di ferro sufficientemente lunghi (almeno 5 volte la distanza tra un led e l’altro, quindi nel mio caso 3*5=15cm). Adesso viene la parte più difficile ovvero quella di inserire e saldare tutti gli altri 3 piani insieme e a distanza stabilita. Su questa fase non c’è molto da dire… è solo un gran sbattimento allineare il tutto e saldare ogni pezzo. Ricordatevi, se fate come me, di ruotare ogni volta il piano led, rispetto a quello sottostante.
Ed ecco il cubo finito (nell’immagine è collegato a dei connettori per una fase di prova generale):
Lo schema e il circuito stampato
Lo schema è molto semplice. Le porte B e C del pic sono state collegate ai 16 anodi del cubo tramite la solita resistenza di limitazione della corrente (calcolata su un singolo led, dato che il programma permette di accendere solo un piano alla volta) mentre le prime 4 porte A del pic sono state collegate alle basi di altrettanti transistor che controllano i vari piani del cubo. E’ presente il connettore ICSP per la programmazione on-board e il pulsante di reset.
Lista Componenti
Attenzione!! La scheda necessita di un’alimentazione regolata di 5volt. Serve un regolatore esterno di cui in seguito trovate lo schema:
Lista Componenti:
- SL1=Ingresso tensione alternata min. 6 V ac max 14 V ac
- B1=Ponte diodi (IN4001)
- SL2=Uscita 5 volt stabilizzati
Lo schema è il classico circuito di regolazione della corrente, quindi non c’è niente d’aggiungere.
Ecco l’alimentatore:
Questo è invece il master del circuito stampato:
L’unico errore in questo stampato è stato quello del connettore di alimentazione, di cui ho sbagliato le dimensioni. Per questo lascio allegato sia il file pdf del master e sia il file sorgente per eagle, in maniera da poter lasciare a voi la modifica del componente.
Ecco le varie
fasi per la preparazione
della basetta finale e la saldatura dei componenti:
Scheda dopo essere stata esposta alla luce ed essere trattata con lo sviluppo del positivo. E’ stata impressa con una luce alogena da 300 W a 15 cm di distanza per 2 minuti e 30 secondi.
Basetta appena immersa nel cloruro ferrico: la basetta galleggia e in questo modo si può verificare lo stato dell’incisione senza toccare nulla. Il cloruro è stato preriscaldato a 40°C.
Basetta dopo 10 minuti a mollo nel cloruro: già si intravedono le piste, ma l’incisione non è ancora completa.
Basetta dopo 15 minuti: sembra pronta, ma con un’accurata osservazione si notano ancora delle parti non completamente corrose (dove c’è il connettore ad esempio)
Scheda lavata e passata con solvente alla nitro per rimuovere il fotoresist sulle piste che su queste basette è molto spesso e non permette la saldatura. La scheda è stata infine forata.
Ecco completata (o quasi, manca il connettore perché non lo avevo ancora preso).
Lato saldature.
Per essere il mio primo circuito stampato della mia vita, non è uscito per niente male, vero? Mentre lo facevo già mi preparavo psicologicamente ad un insuccesso e invece va che lavoro!
Il programma
E ora arriva la parte veramente tosta. Il programma, per me che mi posso considerare un programmatore principiante, è davvero complesso e articolato. Ringrazio subito gli utenti del forum Electroportal.net che mi hanno aiutato nel stendere il codice nelle sue parti più cruciali. In particolare ringrazio posta10100 e c1b8 che mi hanno aiutato molto. Esso è stato scritto in C con MikroC PRO.
Per l'accensione dei led, il programma si affida principalmente su tre funzioni con compiti differenti:
acc_led; acc_leds; check_led;
Le prime due funzioni agiscono direttamente sulle porte del pic accendendo in multiplexing i led.
void acc_led(char x, char y, char z);
accende un singolo led alla volta, fornendo le coordinate del led d'accendere in numeri che vanno da 0 a 3.
void acc_leds(int xy, char z);
Accende invece un piano alla volta fornendo un numero a 16 bit (un bit per ogni led) e un numero da 0 a 3 del piano corrispondente. Questa funzione viene usata dalla funzione check_led.
void check_led (int tempo_effetto);
Questa funzione accende in multiplexing il cubo per un determinato tempo dato dalla variabile tempo_effetto. La funzione va a leggere l'array a 16bit "map[4]" che contiene lo stato di ogni singolo led di ogni piano. Attenzione, per questioni pratiche, il valore minimo del tempo è di 20ms.
Poi ci sono una serie di funzioni che hanno il compito di manipolare lo stato dei led, agendo direttamente sull'array "map".
Sono le funzioni:
cambiaStato, cambiaStati, getStato, reset, cambia_if.
La loro funzione è descritta nel programma.
Esistono poi due funzioni che hanno il compito di generare un numero pseudo-random necessario ad alcuni giochi di luce (pioggia e tempesta). Il programma affida la generazione del numero casuale al ritorno di un valore non specificato, che proprio per questo motivo, diviene casuale.
Il resto del programma serve come supporto ad alcuni effetti di luce e anche a queste funzioni. Ad ogni modo guardate il codice sorgente che è commentato. In caso di dubbi potete sempre chiedermi spiegazioni a riguardo. Purtroppo non sono riuscito a rientrane nel limite della versione demo di MikroC PRO di 2k di codice. Quindi se volete modificare il codice e cambiare, per esempio, l'ordine e il tempo degli effetti, dovete avere la versione completa del programma. Dato che non tutti lo hanno, vi posso aiutare io. Basta che mi inviate il sorgente modificato e ve lo compilo io per voi. Tanto è un operazione molto veloce per me.
Il Video
Ecco il video del cubo in funzione. Sotto ogni gioco di luce trovate il suo nome corrispondente nel codice in modo da rendervi conto di che giochi di luce si tratta.
Tutti i files
Qui potete trovare tutti i vari file che possono servire.
E qui è presente il file hex dello stesso codice ma per il PIC16F876A.
Ovviamente sono ben accetti critiche, consigli e domande sul cubo.
Il progetto completo è anche visitabile sul mio sito: Galaxi93.Altervista.org