Forum: Mikrocontroller und Digitale Elektronik Algorithmus zur optimalen RGB Farbmischung


von C. H. (hedie)


Lesenswert?

Hallo

Ich habe hier einen kleinen Print entwickelt welcher eine 3W RGB LED 
ansteuert.

Ich habe ein 3phasen PWM Signal mit einem Attiny25 erzeugt.
Die derzeitig maximalen werte sind 0 - 1024 (software pwm somit 
grundsätzlich erhöhbar!)

Meine frage nun, wie bekomme ich es hin, das ich möglichst alle Farben 
nacheinander in schönen übergängen darstellen kann?

Danke schon mal für eure tipps...

von sudo (Gast)


Lesenswert?

Hier in der Codesammlung nach "Moodlight" oder "HSV to RGB" suchen.

von C. H. (hedie)


Lesenswert?

Ist HSV das absolute optimum?

Werde ich dadurch alle Farben einmal erzeugen?

von avr (Gast)


Lesenswert?

Man kann z.B. uber den HSV-Farbraum gehen. Dort von
0 bis 360° deckt das sichtbare Spektrum ab.
Es gibt dann Formeln zum Umrechnen in RGB.
http://de.wikipedia.org/wiki/HSV-Farbraum

Gab es auch schon hier im Forum, must mal suchen ;)

Der Tiny25 dürfte etwas knapp werden aber mit mehr
Flash dann Tiny45 oder 85.

avr

von C. H. (hedie)


Lesenswert?

Habe

avr schrieb:
> Der Tiny25 dürfte etwas knapp werden aber mit mehr
> Flash dann Tiny45 oder 85.

Habe aber eben nur den Tiny25 :)

von sudo (Gast)


Lesenswert?

http://www.mikrocontroller.net/topic/goto_post/433279

Claudio Hediger schrieb:
> Werde ich dadurch alle Farben einmal erzeugen?

Naja... alle Farben aus dem HSV-Farbraum ;)
Aber glaub mir... nach ein paar Millionen verschiedenen Farben merkts 
auch keiner wenn die sich wiederholen.

von C. H. (hedie)


Lesenswert?

sudo schrieb:
> Naja... alle Farben aus dem HSV-Farbraum ;)
> Aber glaub mir... nach ein paar Millionen verschiedenen Farben merkts
> auch keiner wenn die sich wiederholen.

Ja da hast du wohl recht :)

Ich werde mich mal umsehen nach einer entsprechenden konverting funktion

Danke

von Vlad T. (vlad_tepesch)


Lesenswert?

HSV-Farbmodell benutzen. Saturation und Value kannst du konsant auf 1 
lassen, so dass nur der Hue-Wert durchlaufen werden muss.

hier mal etwas Code, vielleicht nützt es dir was.

Der Code ist so geschrieben, dass die Anzahl der Schritte pro Farbe 
mittels HUE_STEPS geändert werden kann.
Da hier aber nur die Skalierbarkeit nach unten berücksichtigt wurde, 
muss bei Werten größer 256 allerdings die Datentypen verändert werden.

1
#define HUE_STEPS 256
2
#define HUE_MAX (HUE_STEPS * 6)
3
typedef uint16_t Hue_t;
4
5
/**
6
 *  generates the waveform for the green color
7
 */
8
static uint8_t hueWaveform(Hue_t x)
9
{
10
  if(x < HUE_MAX/6){
11
    return x*((HUE_STEPS*6)/HUE_MAX);
12
  }else if(x< (HUE_MAX*3)/6){
13
    return HUE_STEPS-1;
14
  }else if(x< (HUE_MAX*4)/6){
15
    return (((HUE_MAX*4)/6)-1-x)*((HUE_STEPS*6)/HUE_MAX);
16
  }else{
17
    return 0;
18
  }
19
}
20
21
22
/**
23
 * generates rgb from hue with saturation 1 and brightness 1
24
 */
25
void hue2rgb(
26
              Hue_t h,
27
              uint8_t* r, uint8_t* g, uint8_t* b
28
            )
29
{
30
  uint16_t barg = (((uint16_t)h)+2*HUE_MAX/3);
31
  uint16_t rarg = (((uint16_t)h)+HUE_MAX/3);
32
33
  if(barg>=HUE_MAX){
34
    barg-=HUE_MAX;
35
  }
36
  if(rarg>=HUE_MAX){
37
    rarg-=HUE_MAX;
38
  }
39
40
  *g = hueWaveform(h);
41
  *b = hueWaveform( (Hue_t)barg );
42
  *r = hueWaveform( (Hue_t)rarg );
43
}

von C. H. (hedie)


Lesenswert?

Vielen dank für den code...

Habe ich das so richtig verstanden,

HUE_Steps gibt die maximale anzahl möglicher farben an.

Und in der funktion hue2rgb übergebe ich einen wert von 0 - 256 ?
mit dem aktuellen code könnte ich dann am schluss wieder von 256 - 0 
richtig?

von Karl H. (kbuchegg)


Lesenswert?

Claudio Hediger schrieb:

> HUE_Steps gibt die maximale anzahl möglicher farben an.

Nein.
Du lässt deine Laufvariable von 0 bis HUE_MAX laufen

> Und in der funktion hue2rgb übergebe ich einen wert von 0 - 256 ?
> mit dem aktuellen code könnte ich dann am schluss wieder von 256 - 0
> richtig?

Brauchst du nicht.
Diese Farbräume sind kreisförmig geschlossen.

Hue ist ein 'Farbwert', der von rot über gelb über grün über cyan über 
blau über magenta wieder zurück zu rot führt.

ein Wert von 0 ergibt rot.
Ein Wert von HUW_MAX ergibt wieder rot.

Hast du sicher schon in deversen Malprogrammen gesehen: Ein Ring mit den 
Farben in dieser Reihenfolge.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.