PWM Styring af RGB LED

Hey.

Jeg er stadig ret ny i det her arduino, og kodningen generelt, jeg har nu længe kæmpet med at få en rgb styring til at virke, men har ikke rigtigt haft held med det, og når jeg forsøger at google emnet, kommer der en helt masse løsninger med 100 RGB leds, som kører sammen, det er slet ikke det jeg skal bruge, jeg har en RGB led, som jeg gerne vil styre med to knapper, den ene knap vil jeg gerne have så den starter en sekvens, hvor den dimmer mellem et hav af farver, et enekt tryk mere på knappe, skifter en en konstant farve, et tryk mere, giver en konstant anden farve, osv osv osv. indtil man er nået en masse forskellige farver igennem, og til sidst, så slukker knap nummer 2 for det hele,

Problemet med mig er kodning, er at jeg pt ikke selv kan regne det hele ud, jeg det bedst med at snupper kodestumper andre steder fra, og ændre lidt i dem, så det tilpasser mit brug, så jeg håber der er nogle herinde, der kan hjælpe mig på vej med noget kode, så jeg kan komme vidre med projektet,

På forhånd tak.

Mvh Brian

Hej Brian.
Du kan jo starte med at lege med kommandoen analogWrite(pin, value);

Her er et eksempel på hvordan du kan styre din RGB diode ved at koble dioden til pin 3, 5 og 6:

#define RedPin 3
#define GreenPin 5
#define BluePin 6

byte RedValue, GreenValue, BlueValue = 0;
byte currentSerialPos = 0;

void setup()
{
  pinMode(RedPin, OUTPUT);
  pinMode(GreenPin, OUTPUT);
  pinMode(BluePin, OUTPUT);
  Serial.begin(9600);
}  

void loop()
{
  if (Serial.available() > 0) {
    switch (currentSerialPos) {
      case 0:
        RedValue = Serial.read();
        currentSerialPos = 1;
        break;
      case 1:
        GreenValue = Serial.read();
        currentSerialPos = 2;
        break; 
      case 2:
        BlueValue = Serial.read();
        currentSerialPos = 0;
        break;   
    }
  }    
  analogWrite(RedPin, RedValue);
  analogWrite(GreenPin, GreenValue);
  analogWrite(BluePin, BlueValue);    
}

Den her kode er hurtigt smækket sammen, og derfor ikke testet. Men den burde virke ved at du sender 3 bytes - R, G, B (OBS, ikke decimal) til seriel porten, hvorefter rgb-dioden skifter farve til disse bytes!
Fx for at få gul, sendes: 0xFF 0xFF 0x00

Med Venlig Hilsen
Thomas Jespersen

Takker for koden.. det er bare ligesom om det ikke virker helt.. jeg har 3 gule dioder tilkoblet på et testprint, (har ikke lige en rgb diode) og når jeg sender koderne til den, så er det ligesom om at alle dioder dimmer en smule, men lyser stadig lige meget, hvis jeg eks. sender 0xFF 0x00 0x00, så burde jeg få rød, og dermed kun en dioder der lyser, men alle lyser stadig lige meget.

Og så kunne jeg godt tænkte mig at sætte farverne i programmet, jeg tænker, at jeg må kunne angive en værdi for de tre dioder, og så måske sætte et delay hvorefter jeg sætter en ny værdi, og endnu et delay, og osv, og dermed får jeg et automatisk farveskift.. men ved bare ikke helt fordan jeg får det gjort, og det skulle gerne være uden brug af computeren når opstillingen er færdig

//Brian

Hmm, hvad det angår så prøv denne nye kode, som fader mellem farverne...

#define RedPin 3
#define GreenPin 5
#define BluePin 6

byte RedValue, GreenValue, BlueValue = 0;

void setup()
{
  pinMode(RedPin, OUTPUT);
  pinMode(GreenPin, OUTPUT);
  pinMode(BluePin, OUTPUT);
}

void loop()
{
  for (RedValue = 0; RedValue <= 255; RedValue++) {
    analogWrite(RedPin, RedValue);
    delay(10);
  }
  for (GreenValue = 0; GreenValue <= 255; GreenValue++) {
    analogWrite(GreenPin, GreenValue);
    delay(10);
  }  
  for (BlueValue = 0; BlueValue <= 255; BlueValue++) {
    analogWrite(BluePin, BlueValue);
    delay(10);
  }    

  for (RedValue = 255; RedValue >= 0; RedValue--) {
    analogWrite(RedPin, RedValue);
    delay(10);
  }
  for (GreenValue = 255; GreenValue >= 0; GreenValue--) {
    analogWrite(GreenPin, GreenValue);
    delay(10);
  }  
  for (BlueValue = 255; BlueValue >= 255; BlueValue++) {
    analogWrite(BluePin, BlueValue);
    delay(10);
  }     
}

nu fader det, eller det vil sige, at det kun er pin 3 der går, 5 og 6 er hele tiden tændt på fuld styrke.

ups.. 3 fader.. 5 og 6 er slukket når man lige vender dioderne rigtigt :wink:

//Brian

Fandt lige denne her kode, som ser ud til at virke ganske glimrende, nu skal jeg bare have en RGB Led på, så jeg bedre kan se effekten..

// 2009 Kenneth Finnegan
// kennethfinnegan.blogspot.com

// Pins. Must be PWM pins.
#define REDLED  3
#define BLUELED  5
#define GREENLED  6
// Can't be higher than 255
#define MAXBRIGHT  200

// s[tate] t[arget] colors
byte s[3] = {0}, t[3] = {0};

void setup() {
  // Make the random MORE RANDOM!
  randomSeed(analogRead(0));
  
  // Initialization wiring check
  // You should see RED, BLUE, then GREEN.
  // If you don't, then you ballsed something up.
  analogWrite(REDLED, MAXBRIGHT);
  delay(1000);
  analogWrite(REDLED, 0);
  analogWrite(BLUELED, MAXBRIGHT);
  delay(1000);
  analogWrite(BLUELED, 0);
  analogWrite(GREENLED, MAXBRIGHT);
  delay(1000);
  analogWrite(GREENLED, 0);
}

void loop() {
  byte i, offset;
  
  // Select the next target color
  // Start from a random one of the three colors to prevent
  // the cycle from being red biased.
  offset = random(3);
  t[offset] = random(MAXBRIGHT);
  t[(offset+1)%3] = random(MAXBRIGHT - t[offset]);
  t[(offset+2)%3] = MAXBRIGHT - t[offset] - t[(offset+1)%3];
  
  // Slowly drift to the new target color 1 at a time until
  // it has been reached
  while(s[0]!=t[0] || s[1]!=t[1] || s[2] != t[2]) {
    for (i = 0; i<3; i++) {
      if (s[i] > t[i]) {
        s[i] = s[i] - 1;
      } else if (s[i] < t[i]) {
        s[i] = s[i] + 1;
      }
      analogWrite(REDLED, s[0]);
      analogWrite(BLUELED, s[1]);
      analogWrite(GREENLED, s[2]);
      delay(10);
    }
  }
  analogWrite(REDLED, s[0]);
  analogWrite(BLUELED, s[1]);
  analogWrite(GREENLED, s[2]);
  // Let the viewer enjoy the new color before
  // selecting the next target color.
  delay(2000);
}

Mystisk at min kode ikke virker... Nå, men godt at du har fundet et eksempel der virker :slight_smile:

har sat og leget lidt med den kode jeg har fundet, ville det være muligt at skydt et potmeter ind, til at justere hastigheden den skifter farve med ?

Ja sagtens...
Smæk et potentiometer på Analog Pin 0 og erstat den sidste kommando "delay(2000);" med denne

delay(analogRead(0));

Nu var det her jo ikke min stærke side, men er det noget med at jeg sætter gnd på det midterste ben på potmeteret, og et af de andre på analog pin 0 ?

Og hvilken værdi skal jeg gå efter? 1kohm?

Du sætter +5V på enten det venstre eller højre ben, og så ground på det modsatte. Benet i midten kobler du til Analog Pin 0...
Til noget som dette vil et potentiometer på 1K være fint. 10K vil også være fint :slight_smile:

Super.. så vil jeg lige bestille sådan en samme med et par RGB Led..

Takker for hjælpen

Jeg havde en hel del sjov med de der RGB LEDs (læs - bunke frustrationer). Ved et tidspunkt, hvor jeg havde to RGB-LEDS så slukkede den ene når jeg tændte en bestemt farve på den anden.

Jeg brugte laaaang tid på mit program, men der var ingen fejl?! Til sidst erstattede jeg RGB-LEDene med 6 almindelige. Nu virkede programmet bedre..?!? Altså måtte der være en fejl i mit kredsløb! Osv... hele natten lang [smiley=undecided.gif]

Mine erfaringer er at man skal have sin modstand i serie mellem output-pin'en og hver LED-ben, ikke på RGB-LEDens fælles anode/katode. Ellers vil en tændt LED højne spæningsniveaut på fælles benet så man får forstyrrelser. En fin side effekt er at man kan vælge en passende modstand for hver farve så (det virker som) de lyser med ens styrke. Men ja, det kræver en dele flere modstande.