Vai al precedente POST della serie
Come naturale conseguenza del precedente post, che ha introdotto i primi rudimenti sulla generazione di segnali PWM con i pic18f, questo articolo prosegue e estende il concetto applicandolo ad un led di tipo RGB.
I led RGB, come saprete benissimo, sono 3 led in uno ognuno dedicato ad un singolo colore primario della sintesi additiva: rosso, verde e blu.
Unendo quindi la possibilità di variare l'intensità della luce emessa da un led e la disponibilità di un led in grado di generare i tre colori fondamentali possiamo realizzare un simpatico esperimento con il 4431 e similari.
Intendo utilizzare 3 dei 4 generatori PWM del 4431 associando ad ognuno di essi la gestione dell'intensità di un singolo colore per produrre un effetto arcobaleno con una transizione graduale tra tutte le possibili sfumature.
L'algoritmo "arcobalenico"
Giocherellando con la tavolozza dei colori di 'Gimp' ho verificato che l'effetto si ottiene agendo sull'intensità di una singola componente RGB per volta seguendo questo semplice schema dove 255 rappresenta la massima luminosità e 0 quella minima:
- partenza: R=255, G=0, B=0
- incremento G: R=255, G=255, B=0
- decremento R: R=0, G=255, B=0
- incremento B: R=0, G=255, B=255
- decremento G: R=0, G=0, B=255
- incremento R: R=255, G=0, B=255
- decremento B: R=255, G=0, B=0
- ora mi ritrovo nella stessa condizione di partenza e quindi ripeto il ciclo dal punto 2
Per rappresentare questi passaggi sono sufficienti 4 bit organizzati nel registro Flags in questo modo:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
X | X | X | X | R | G | B | Dir |
I bit R, G e B indicano su quale colore agire (=1) mentre il bit Dir indica se l'intensità di quel colore va incrementata (=1) o decrementata (=0).
Quindi proviamo a codificare i passaggi elencati sopra in termini binari:
- partenza: settiamo il registro R a 255, G e B a 0
- incremento G: Flags = 0000 0101
- decremento R: Flags = 0000 1000
- incremento B: Flags = 0000 0011
- decremento G: Flags = 0000 0100
- incremento R: Flags = 0000 1001
- decremento B: Flags = 0000 0010
Mano al codice
Scaricate il progetto MPLAB-X qui.
Nel file main.asm il codice è organizzato nei seguenti blocchi:
Blocco interrupt
Qui abbiamo tutta la logica di interpretazione del registro Flags cioè il codice deputato ad aggiornare i segnali PWM dei rispettivi colori in base allo stato dei suoi bit.
Quando il comando impostato in Flags è stato completato (cioè quando il relativo registro del colore ha raggiunto il valore massimo o minimo) l'esecuzione passa alla label int_next che provvede ad impostare il registro Flags con la successiva sequenza da eseguire reperita tramite la tabella get_seq con il classico sistema dell'incremento del PCL (che però nel caso dei pic 18f deve essere doppio).
Qui abbiamo l'inizializzazione dei registri LED_R, LED_G, LED_B, Flags e SeqIndex in modo da impostare il punto di partenza della sequenza dei colori.Blocco main
Si procede poi con inizializzare il modulo PWM impostando una risoluzione di 8 bit e i tempi opportuni per produrre il passaggio tra i singoli colori.
Si abilitano qui i pin da PWM0 a PWM5 come uscita PWM.
Si continua inizializzando gli interrupt ed in particolare quello del modulo PWM.
Schema elettrico
In questo caso la corrente totale richiesta per pilotare il led RGB supera i 25 mA massimi erogabili dal PICkit2 e quindi è ASSOLUTAMENTE NECESSARIO ALIMENTARE IL CIRCUITO ESTERNAMENTE se non si vuole buttare nel secchio il PICkit2.
Inoltre è indispensabile utilizzare dei transistor per evitare di sovra caricare le porte del PIC: nel mio caso avendo un led RGB con anodo in comune utilizzo degli NPN tipo BC337 per adattare anche il segnale al catodo di ogni singolo led.
Nel caso che disponiate di un led RGB con catodo comune basterà semplicemente utilizzare dei PNP tipo BC327 invertendo tutte le polarità.
Nota: il led RGB in mio possesso ha in realtà una Fv (caduta di tensione) pari a 3,2 volt per G e B e di 2,0 volt per R (max 20mA per tutti) quindi per pignoleria avrei dovuto diversificare il valore delle resistenze R2 e R3 rispetto alla R4.
Inoltre è indispensabile utilizzare dei transistor per evitare di sovra caricare le porte del PIC: nel mio caso avendo un led RGB con anodo in comune utilizzo degli NPN tipo BC337 per adattare anche il segnale al catodo di ogni singolo led.
Nel caso che disponiate di un led RGB con catodo comune basterà semplicemente utilizzare dei PNP tipo BC327 invertendo tutte le polarità.
Nota: il led RGB in mio possesso ha in realtà una Fv (caduta di tensione) pari a 3,2 volt per G e B e di 2,0 volt per R (max 20mA per tutti) quindi per pignoleria avrei dovuto diversificare il valore delle resistenze R2 e R3 rispetto alla R4.
La BB alimentata esternamente e con la sezione 'di potenza' costituita dai tre NPN |
![]() |
Particolare del PICkit2 che non deve alimentare il circuito (filo rosso non connesso alla BB) |
![]() |
Risultato
Stay tuned!
ap
Vai al successivo POST della serie
NB: l'autore non risponde di eventuali danni causati da omissioni, inesattezze o errori eventualmente presenti nell'articolo pubblicato.
Prego, segnalare suggerimenti e migliorie commentando questo post o inviando una email a padnest@gmail.com.
Ottimo! Finalmente una guida comprensibile per chi è alle prime armi!!! Grazie!!
RispondiElimina