Home Forum MICROCONTROLLORI GESTIONE LED RGB

Questo argomento contiene 10 risposte, ha 5 partecipanti, ed è stato aggiornato da  andrearock 3 anni fa.

Stai vedendo 11 articoli - dal 1 a 11 (di 11 totali)
  • Autore
    Articoli
  • #53703

    Giormatrix
    Partecipante

    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…

    #68101

    slovati
    Partecipante

    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

    #68216

    Anonimo

    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!

    #68343

    mingoweb
    Membro

    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

    #70251

    andrearock
    Membro

    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?

    #70253

    Fabrizio87
    Membro

    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.

    #70283

    andrearock
    Membro

    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.

    #70284

    Fabrizio87
    Membro

    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

    #70297

    andrearock
    Membro

    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

    #70340

    Fabrizio87
    Membro

    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

    #70399

    andrearock
    Membro

    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

Stai vedendo 11 articoli - dal 1 a 11 (di 11 totali)

Devi aver eseguito l’accesso per poter rispondere a questa discussione.