www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Algorithmus zur optimalen RGB Farbmischung


Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: sudo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier in der Codesammlung nach "Moodlight" oder "HSV to RGB" suchen.

Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist HSV das absolute optimum?

Werde ich dadurch alle Farben einmal erzeugen?

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: sudo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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.

#define HUE_STEPS 256
#define HUE_MAX (HUE_STEPS * 6)
typedef uint16_t Hue_t;

/**
 *  generates the waveform for the green color
 */
static uint8_t hueWaveform(Hue_t x)
{
  if(x < HUE_MAX/6){
    return x*((HUE_STEPS*6)/HUE_MAX);
  }else if(x< (HUE_MAX*3)/6){
    return HUE_STEPS-1;
  }else if(x< (HUE_MAX*4)/6){
    return (((HUE_MAX*4)/6)-1-x)*((HUE_STEPS*6)/HUE_MAX);
  }else{
    return 0;
  }
}


/**
 * generates rgb from hue with saturation 1 and brightness 1
 */
void hue2rgb(
              Hue_t h,
              uint8_t* r, uint8_t* g, uint8_t* b
            )
{
  uint16_t barg = (((uint16_t)h)+2*HUE_MAX/3);
  uint16_t rarg = (((uint16_t)h)+HUE_MAX/3);

  if(barg>=HUE_MAX){
    barg-=HUE_MAX;
  }
  if(rarg>=HUE_MAX){
    rarg-=HUE_MAX;
  }

  *g = hueWaveform(h);
  *b = hueWaveform( (Hue_t)barg );
  *r = hueWaveform( (Hue_t)rarg );
}



Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.