Home
Accesso / Registrazione
 di 

GESTIONE LED RGB

10 risposte [Ultimo post]
ritratto di Giormatrix
Offline
Ultima visita:
1 anno 33 settimane fa
Utente dal: 10/01/2010
Messaggi: 1

Salve amici d'elettronica,sono un appassionato di elettornica mi piacerebbe creare un circuito di pilotaggio led rgb con un microcontrollotr il famosisimo pic 16f84.Certo voi direte che sara semplice................ma io non ci riesco mi daresti un consiglio????????????
Ho fatto gia circuiti con il microcontrollore ma piccoli circuiti di pilotaggio led e rele con ingresso dei pulsanti..
Grazie hai fondatori di questo sito.Solo cosi si cresce confrontandosi con piu persone...

ritratto di slovati
Offline
Titolo: User+
Utente+
Ultima visita:
12 ore 20 min fa
Utente dal: 12/01/2009
Messaggi: 28
Utente PREMIUM
RGB led

Ciao Giormatrix,
comincia a dare un occhio a questi due articoli apparsi a suo tempo sull'Elettronica Open Source:
http://it.emcelettronica.com/rgb-led-cubo-natalizio-fai-da-te-con-il-picmicro
http://it.emcelettronica.com/rgb-led-driver-sincronizzato
e a quest'altro articolo (da un sito "esterno"):
http://picprojects.org.uk/projects/rgb/

Tieni presente che il controllo viene fatto solitamente con il PWM - sul 16f84 lo devi simulare via sw, quindi ti puo' servire anche il corso sul PIC che trovi sul sito per la programmazione del timer e degli I/O

Tienici aggiornati sui progressi

Saluti,
slovati

Luca_bizeta (non verificato)
ritratto di Luca_bizeta
RGB led

Ciao,
Io uso AVR e non PIC quindi sulla programmazione non ti posso aiutare, però ne ho fatto uno con un AVR. La base è leggere (e quindi avere attivato e funzionante) 3 canali di ADC collegati a potenziometri e fare uscire tre canali PWM collegati a dei mosfet con dutycycle dell'ampiezza letta dall'ADC da 0 a 100%.
Quindi:
leggo ADC1
imposto PWM canale 1
leggo ADC2
imposto PWM2
leggo ADC3
imposto PWM3
ricomincio daccapo cliclando all'infinito.

Se invece vuoi fare un controller automatico che faccia ad esempio un effetto di fade non ti servono neppure gli ADC devi solo inventarti dei cicli di for o while aumentando e diminuendo il PWM dei vari canali.

Se non hai capito di cosa sto parlando ti consiglio prima un buon corso di base sulla programmazione di PIC, googlando ne troverai a migliaia, anche in italiano.

spero di esserti stato utile...in bocca al lupo!

ritratto di mingoweb
Offline
Titolo: User+
Utente+
Ultima visita:
3 anni 21 settimane fa
Utente dal: 05/02/2011
Messaggi: 44
Se invece vuoi realizzare

Se invece vuoi realizzare tutto con un arduino, nel seguente link trovi tutto ciò che ti serve...

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1207331496

ritratto di andrearock
Offline
Titolo: User
Utente
Ultima visita:
2 anni 38 settimane fa
Utente dal: 21/10/2011
Messaggi: 4
ciao a tutti sono nuovo di

ciao a tutti sono nuovo di questo forum, sarei interessato anche io a creare un progetto di questo tipo,io sto imparando a aprogrammare i pic in assembler ho gia fatto qualche prova riguardo al lampeggio led, sono riuscito ad utilizzare il pwm del pic per creare una dissolvenza luminosa facendo variare il duty cycle il mio problema però è utilizzare il pwm per creare l'rgb. come posso fare?

ritratto di Fabrizio87
Offline
Titolo: User++
Utente++
Ultima visita:
1 anno 44 settimane fa
Utente dal: 30/01/2011
Messaggi: 91
non sono difficile da gestire

non sono difficile da gestire i LED RGB.
Semplicemente sono formati da tre comuni LED tutti tre separati elettricamente.
hanno in comune solo la massa.

per controllare con un picchio devi semplicemente usare usare un canale per colore.

ritratto di andrearock
Offline
Titolo: User
Utente
Ultima visita:
2 anni 38 settimane fa
Utente dal: 21/10/2011
Messaggi: 4
si fino a li ci sono arrivato

si fino a li ci sono arrivato anche io, in che modo posso pilotarli?pwm? timer? io ho tentato in tutti e due i modi ma più di 2 led non riesco a pilotarli.se vi interessa vi posto il codice che lavora con 2 led.

ritratto di Fabrizio87
Offline
Titolo: User++
Utente++
Ultima visita:
1 anno 44 settimane fa
Utente dal: 30/01/2011
Messaggi: 91
Iscriverei un codice così Qui

Iscriverei un codice così

Qui scrivo con un codice genetico mi molto simili alla linguaggio C e all'assemblea

Come ingresso uso il pin portB 1 e portB 2 e portB 3

sette all'inizio imposto i valori degli altri colori

int R = 100 # 0 to 255
inr B = 100 # 0 to 255
int V = 100 # 0 to 255
Un contatore generale
int cont = 0

portB 1 = 0
portB 2 = 0
portB 3 = 0

loop : inizio dell'anello

if(R == cont) {
portB 1 = 1
}
if(B == cont) {
portB 2 = 1
}
if(V == cont) {
portB 3 = 1
}

cont++ # incremento di contatore

stop 10 ns

Qui metto un ritar doconsidera che un mio onda quadra di riforma è questo ritardo moltiplicato per 255
ad esempio se usi un ritardo di 10 microsecondo ottieni un'onda quadra che ha durata 2550 visto che la frequenza è l'inverso del tempo fin verso la frequenza 400 Hz all'incerta

if ( cont = 255) {
cont == 0 # qui mettono zero contatore quando arriva al valore 255 sostiene Massimo
# Spengoi tre colori
portB 1 = 0
portB 2 = 0
portB 3 = 0
};

goto loop questo è la fine dell'anello

Il programma funziona così,
All'inizio spegne i tre LED,
Dopo parte in un anello dove viene incrementato a ogni giro un contatore,
quando il cuore dittatore corrisponde al valore desiderato delle livello di colore accende i LED corrispondente,
alla fine quando il contatore arriva ad 255 spegne tutti i Led e mette lui stesso a zero.

in realtà all'inizio del ciclo viene spento quindi in comincia a formarsi la parte dell'onda quadra bassa fino a un certo momento arbitrario deciso dal contatore e del valore impostato quest'onda passa a uno sino a fine ciclo dove tutto viene rimesso a zero è così continua il ciclo
considera che devi adattare il codice al tuo linguaggio di programmazione che usi ho usato il codice arbitrario per darti l'idea del concetto

ritratto di andrearock
Offline
Titolo: User
Utente
Ultima visita:
2 anni 38 settimane fa
Utente dal: 21/10/2011
Messaggi: 4
credo di non aver afferrato

credo di non aver afferrato il concetto perchè ci sono parole scritte in modo strano e incomprensibili.se saresti così gentile da spiegarmo il modo più semplice e comprensibile da me. dopo ovvio che lo scrivo in un linguaggio che io conosco.grazie

ritratto di Fabrizio87
Offline
Titolo: User++
Utente++
Ultima visita:
1 anno 44 settimane fa
Utente dal: 30/01/2011
Messaggi: 91
Devi creare un programma che

Devi creare un programma che conta da 0 a 255,

int cont = 0

Questo contatore rappresenta il tempo di incendio di un'onda quadra,
ogni volta che contatore passa per il valore 0 l'onda quadra deve passare da il valore alto a quello basso,

if ( cont == 0 ) {
portoB.1 = 0
};

Per fare passare l'onda da basso al alto di di nuovo usare le stesse istruzione ma al posto dello zero metti un valore che corrisponde all'ampiezza della duty cycle, ad esempio se vuoi un valore di 50% dei di usare il valore 256/2 = 128

if ( cont == 128 ) {
portoB.1 = 1
};

Ma la cosa interessante e di poter modificare questo valore quindi meglio fare così,
all'inizio del program fai una variabile con il colore ad esempio Red

Così puoi cambiare il valore durante l'esecuzione del programma.

a questo punto è necessario fare un ciclo che conta all'infinito,
Visto che stiamo usando Pic 16F84 l'ideale è il comando goto.

loop:

Qui c'è scritto il codice della gestione del led

goto loop

Alla fine di dovrebbe dare un codice similare a questo

int R = 128

loop:

# Questo gestisce La transizione dall'alto verso il basso dell'onda quadrata
if ( cont == 0 ) {
portoB.1 = 0
};

#Questo gestisce la transizione dal basso verso l'alto dell'onda quadra
if ( cont == R ) {
portoB.1 = 1
};
#questo incrementa il contatore
cont = cont + 1
Questo pezzo di programma si occupa di riportarlo a zero quando arriva 255
if( cont == 255){
cont = 0
};
goto loop

a questo punto si deve gestirle 3 led,
considero che i LED sono collegati secondo questo schema
led rosso portoB.1
led blue portoB.2
led verde portoB.3

int R = 128
int B = 64
int G = 200

loop:

if ( cont == 0 ) {
portoB.1 = 0
portoB.2 = 0
portoB.3 = 0
};

if ( cont == R ) {
portoB.1 = 1
};
if ( cont == B ) {
portoB.2 = 1
};
if ( cont == G ) {
portoB.3 = 1
};

cont = cont + 1
if( cont == 255){
cont = 0
};
goto loop

ritratto di andrearock
Offline
Titolo: User
Utente
Ultima visita:
2 anni 38 settimane fa
Utente dal: 21/10/2011
Messaggi: 4
sono riuscito a creare il

sono riuscito a creare il programma che hai detto tu ora il mio problema è creare la dissolvenza luminosa dei led come posso fare?questo è il codice dove sono arrivato

processor PIC16f887
#include "p16F887.inc"
errorlevel -302

ORG 0x00

cblock 0x20
count
resto
cred
cgreen
cblue
endc

#define red PORTC,1
#define green PORTC,2
#define blue PORTC,3
banksel TRISC
bcf TRISC,1
bcf TRISC,2
bcf TRISC,3
banksel OSCCON
bsf OSCCON,4 ;impostato oscillatore a 31 KHz stabili
bsf OSCCON,5
bcf OSCCON,6
bsf OSCCON,1
banksel PORTC
movlw 0x25
movwf cred
movlw 0x8F
movwf cgreen
movlw 0xE9
movwf cblue
clrw

main
incf count
call control1
goto main

control1
movf count,W
subwf cred,W
btfss STATUS,0
nop
bcf red
btfss STATUS,2
goto control2
bsf red
incf cred
control2
movf count,W
subwf cgreen,W
btfsc STATUS,0
nop
bcf green
btfss STATUS,2
goto control3
bsf green
incf cgreen
control3
movf count,W
subwf cblue,W
btfsc STATUS,0
nop
bcf blue
btfss STATUS,2
goto main
bsf blue
incf cblue
return

end

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 5 utenti e 52 visitatori collegati.

Ultimi Commenti