RGB LED

Dit is voorbeeld van een simpele RGB controller. De controller stuurt middels PWM (Puls Breedte Mudulatie) een RGB LED aan, of drie losse rood, groene en blauwe LED's. De controller laat de kleur van de LED of LED's langzaam overvloeien van rood naar groen naar blauw. Bij het overvloeien ontstaat dan een steeds veranderende mengkleur.

Schema

Dit is het schema in de meest eenvoudige vorm. De AVR stuurt de LED's rechtstreeks aan vanuit zijn PWM poorten. De weerstandwaarde is gekozen aan de veilige kant. Zo zal dit schema veilig werken met de meeste LED's. Voor meer lichtopbrengst mogen de weerstanden kleiner gekozen worden. Let er dan op de maximum stroom van zowel de AVR als de LED's niet te overschreiden. De maximum stroom van de AVR is 20mA per poort. Bij meer stroom / meer LED's moet een buffer trap toegevoegd worden.

aansluitschema

Code

Dit is de C broncode van de simpele controller. Hieraan valt nog vanalles toe te voegen, zoals allerlie kleurpartronen en sturing via RS232.

C code / RGB LED
   
#include <avr/io.h>
#include <util/delay.h>

//Aliassen voor de PWM kanalen
//PWM kanaal OCR0B wordt niet gebruikt
#define PWM_RED   OCR0A
#define PWM_GREEN OCR1AL
#define PWM_BLUE  OCR1BL

void delay_ms(unsigned int t)
{
  while(t)
  {
    t--;
    _delay_ms(1);
  }
}

void fade_in(volatile uint8_t *pwm_channel)
{
  unsigned int i;
  for(i = 0; i < 255; i++)
  {
    *pwm_channel = i;
    delay_ms(100);
  }
}

void fade_out(volatile uint8_t *pwm_channel)
{
  unsigned int i;
  for(i = 0; i < 255; i++)
  {
    *pwm_channel = ~i;
    delay_ms(100);
  }
}

int main()
{
  // TIMER 0 Fast PWM, clear OC0A on match
  TCCR0A = (1 << COM0A1) | (1 << WGM01) | (1 << WGM00);
  // TIMER 0 Prescaler ck/8
  TCCR0B = (1 << CS01);

  // TIMER 1 Fast PWM 8-bit, clear OC1A, OC1B on match
  TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM10);
  // TIMER 1 Prescaler ck/8
  TCCR1B = (1 << CS11) | (1 << WGM12);

  //PWM kanalen als uitgang
  DDRB = (1 << PB2) | (1 << PB3) | (1 << PB4); //0C0A, 0C1A, OC1B

  //oneindige RGB fade loop
  while(1)
  {
    delay_ms(1000);       // 1 sec pauze
    fade_in(&PWM_GREEN);  // langzaam groen aan
    fade_out(&PWM_RED);   // langzaam rood uit
    delay_ms(1000);       // 1 sec pauze
    fade_in(&PWM_BLUE);   // langzaam blauw aan
    fade_out(&PWM_GREEN); // langzaam groen uit
    delay_ms(1000);       // 1 sec pauze
    fade_in(&PWM_RED);    // langzaam rood aan
    fade_out(&PWM_BLUE);  // langzaam blauw uit
  }

  return 0;
}