Visualizzazione post con etichetta RGB. Mostra tutti i post
Visualizzazione post con etichetta RGB. Mostra tutti i post

lunedì 30 maggio 2011

Laboratorio: illuminazione LED

I LED (Light Emitting Diode) sono sempre più presenti nella nostra quotidianeità. Sviluppati a partire dagli anni '60, essi si sono progressivamente imposti come sostituti ideali per molte fonti di illuminazione, anche al di fuori dello spettro visibile (es. IR, UV).
I vantaggi? Lunga durata, bassi consumi, colori saturi.


Oggi, troviamo i LED nelle automobili (interni, luci di posizione, stop, frecce), negli elettrodomestici (retroilluminazione di televisori LCD) e in tantissime altre applicazioni. Non possono quindi mancare anche nel nostro laboratorio!

Prima di proseguire, guardiamo insieme questo video che ho preparato per Voi. Giocheremo con i LED e altro.


Ecco lo schema elettrico del circuito a quattro canali PWM. Esso viene pilotato dalla Linux-Toolbox, che è il nostro sistema tuttofare.

(fare click sull'immagine per ingrandire)

Le porte di I/O LVCMOS sono state prelevate dal connettore DIN41612, come in figura:


Il codice Ansi C, per pilotare ogni I/O è:

/* this function generate four pwm signal */
void pwm(unsigned char p0, unsigned char p1, unsigned char p2, unsigned char p3)
{
    int i, count;

    /* set gpio 0-3 (PC10-PC13) */
    for (i=0; i<256; i++) {

        if (i >= p0)
            *((unsigned long *) (map_base + (PIOC_CODR & MAP_MASK))) = PIO_C10;
        else
            *((unsigned long *) (map_base + (PIOC_SODR & MAP_MASK))) = PIO_C10;

        if (i >= p1)
            *((unsigned long *) (map_base + (PIOC_CODR & MAP_MASK))) = PIO_C11;
        else
            *((unsigned long *) (map_base + (PIOC_SODR & MAP_MASK))) = PIO_C11;

        if (i >= p2)
            *((unsigned long *) (map_base + (PIOC_CODR & MAP_MASK))) = PIO_C12;
        else
            *((unsigned long *) (map_base + (PIOC_SODR & MAP_MASK))) = PIO_C12;

        if (i >= p3)
            *((unsigned long *) (map_base + (PIOC_CODR & MAP_MASK))) = PIO_C13;
        else
            *((unsigned long *) (map_base + (PIOC_SODR & MAP_MASK))) = PIO_C13;

        for (count=0; count<400; count++); //dummy delay
    }

    return;
}

int main(int argc, char **argv) {

    /* locale variable */
    int i;
    unsigned char led_r = 0;
    unsigned char led_g = 42;
    unsigned char led_b = 137;
    unsigned char led_g2 = 201;

    init_pio(); //inizialize gpio pin

    while(1) {       
        pwm(sinetable[led_r++],

            sinetable[led_g++],
            sinetable[led_b++],
            sinetable[led_g2++]);
    }

    return 0;
}


Qui Pianeta Terra, a presto.