Forum: Mikrocontroller und Digitale Elektronik RGB Farbkreis RGB werte


von Dani (Gast)


Lesenswert?

Ich würde gerne ein paar RGB LEDs mit PWM ansteuern. Ich mache 8 bit PWM 
und möchte mit den LEDs langsam den ganzen farbkreis durchgehen.
Mir ist eine Möglichkeit eingefallen wie man das lösen konnte, dazu 
brauch ich aber die RGB Werte für die Farben.
Gibt es eine einfache Möglichkeit aus dem Winkel die RGB Werte zu 
berechnen?

Da sich die Werte im Kreis drei Mal, nur bei anderen Farben widerhohlen 
würde ich eine LookUp Table machen und die Werte je nach Winkel den 
Farben zuweisen. Ich würde 1/3 des Kreises in 64 Teile teilen und für 
jeden Teil einen Eintrag in der Tabelle machen, ich habe den Kreis also 
in 192 Teile geteilt.

In Code würde das dann ca so aussehen:
1
unsigend char werte[64]={???};
2
if(farbe<64)
3
{
4
  rot=werte[farbe];
5
  gruen=werte[64-farbe];
6
}
7
else if(farbe<128)
8
{
9
  farbe-=64;
10
  gruen=werte[farbe];
11
  blau=werte[64-farbe];
12
}
13
else if(farbe<192)
14
{
15
  farbe-=128;
16
  blau=werte[farbe];
17
  rot=werte[64-farbe];
18
}
Was haltet ihr davon? Könnte das so funktionieren?

von Sven (Gast)


Lesenswert?

Such hier mal nach 'HSV', da gibt es ein paar Beispiele...

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Angehängte Dateien:

Lesenswert?

Erstmal den Wikiartikel zum HSV Farbraum lesen und dann den Anhang 
durchgucken.

von c-hater (Gast)


Lesenswert?

Dani schrieb:
> Ich würde gerne ein paar RGB LEDs mit PWM ansteuern. Ich mache 8
> bit PWM
> und möchte mit den LEDs langsam den ganzen farbkreis durchgehen.

Dann hast du ein sehr ernstes Problem. Im RGB-Farbraum gibt es nämlich 
überhaupt keinen "Farbkreis", denn der RGB-Farbraum ist ein Kubus.

Aber natürlich muß das Runde in das Eckige passen, das weiß man ja als 
Gebildeter Deutscher bereits vom grundlegenden Kulturgut Fußball. Also 
kann man natürlich auch in einen Würfel beliebige Kreise legen. Blöd 
nur: keiner dieser Kreise wird jemals den vollen RGB-Farbraum 
überstreichen können, denn dazu müßte er den vorgegeben Raum partiell 
verlassen.
Nur an zwei Singulariten geht das Runde wirklich in das Eckige. 
Blöderweise ist das genau dort, wo der Durchmesser des Kreises null und 
der Farbwinkel dementsprechend irrelevant ist...

Was deiner Vorstellung wahrscheinlich am nächsten kommt, ist der 
größtmögliche Kreis auf der Ebene, die sich genau in der Mitte zwischen 
den beiden gegenüberliegenden Würfeleckpunkten (0,0,0) und (max,max,max) 
befindet und die senkrecht zu der Geraden ausgerichtet ist, die diese 
beiden Punkte verbindet.

Eine Auffrischung deiner Geometriekenntnisse bei Wikipedia oder so 
verrät dir, wie man für jeden Punkt auf dieser Kreislinie die 
Koordinaten im Bezugssystem des Würfelraums berechnen kann. Das sind 
dann genau die gesuchten Werte für RGB.

von Dani (Gast)


Lesenswert?


von Frank (Gast)


Lesenswert?

Ich kann nur ebenfalls die Beschäftigung mit dem HSV bzw. HSB-Farbmodell 
empfehlen.

H (hue) ist dabei die Farbe, die auf einem Kreisumfang definiert wird 
(dementsprechend in Grad). 0 (und 360) Grad ist Rot, danach in jeweils 
60-Grad-Schritten die anderen Grundfarben 
(Rot-Gelb-Grün-Cyan-Blau-Magenta und schliesslich wieder Rot).

S (Saturation - Sättigung) bewegt sich (je nach Formel) zwischen 0 und 1 
oder 100 oder 255. Null ist dabei keine Sättigung (Buntheit) sondern ein 
neutrales Weiß/Grau/Schwarz, der Maximalwert ist die "reine" Farbe, im 
theoretischen Idealfall nur eine Wellenlänge.

V oder B (value bzw. brightnes) ist einfach nur die 
Intensität/Helligkeit und belegt den gleichen Wertebereich wie S. 0 ist 
aus, 1 oder 100 oder 255 das Maximum.

Mit keiner Formel sonst (also HSV-nach-RGB) bekommt man so einfach 
gleitende saubere Übergänge zwischen den Farben ausgerechnet (HSV für 
die Eingabe/Definition und RGB für die Ansteuerung der Ausgabe)

von Frank (Gast)


Lesenswert?

c-hater schrieb:
> Dann hast du ein sehr ernstes Problem. Im RGB-Farbraum gibt es nämlich
> überhaupt keinen "Farbkreis", denn der RGB-Farbraum ist ein Kubus.
>
> Aber natürlich muß das Runde in das Eckige passen, das weiß man ja als
> Gebildeter Deutscher bereits vom grundlegenden Kulturgut Fußball. Also
> kann man natürlich auch in einen Würfel beliebige Kreise legen. Blöd
> nur: keiner dieser Kreise wird jemals den vollen RGB-Farbraum
> überstreichen können, denn dazu müßte er den vorgegeben Raum partiell
> verlassen.

Ich verstehe die Heftigkeit deiner Gegenrede nicht. "Farbkreis" ist eine 
gängige Vokabel aus der Physiologie, nicht aus der Physik. Und die 
beruht darauf, dass das menschliche Auge eben kein spektrales Organ ist, 
sondern die Farben aufgrund der Überlagerung von drei Frequenzbereichen 
wahrnimmt (z.B. kannst du kein "echtes" Gelb mit 580nm von der 
Überlagreung eines Rot 70nm mit einem Grün 500nm unterscheiden). Die 
gleichzeitige Wahrnehmung von Rot und Blau wied deshalb als Magenta 
ermfunden - für das es gar keine Wellenlänge gibt und damit schleisst 
sich der "Kreis". Die Wahrnehmung ("Farbreiz") ist also nicht 
ein-eindeutig - die durch Kombination möglichen Reize lassen sich 
grafisch in einem Kreis anordnen - so what?

Und dann muss ich nochmal klugscheissen:

Es gibt keinen RGB-Farbaum, jedenfalls nicht so allgemein. Was du 
meinst, ist ein Farbmodell. Ein Farbraum ist es erst dann, wenn durch 
Angabe der Wellenlängen und Intensitäten (z.B. mittels ICC-Farbprofil) 
ein genau definierter Wertebereich ("Gamut") daraus wird.

von Frank (Gast)


Lesenswert?

Tippfehler: Rot 700nm.

von c-hater (Gast)


Lesenswert?

Dani schrieb:

> Mit dem Farbkreis habe ich so etwas geneint:
>  http://www.bilder-plus.de/bilder/farbkreis/farbkre...

Das dürfte jedem klar sein.

Du kannst jetzt die Luft anhalten bis du blau wirst oder ähnlichen 
pubertären Unfug versuchen, das wird dein Problem nicht lösen.

Nö. Das wird erst lösbar, wenn du dir die nötigen Kenntnisse über 
Farbräume und Farbraumtransformationen aneignest. Und das beginnt halt 
mit trivialer  Geometrie, die du im Übrigen im Rahmen der Schulbildung 
bereits vermittelt bekommen haben solltest.

von Dani (Gast)


Lesenswert?

Martin Wende schrieb:
> Erstmal den Wikiartikel zum HSV Farbraum lesen und dann den Anhang
> durchgucken.
Werde ich tun, hatte aber noch keine Zeit, war nur unterwegs mit dem 
Handy online.

c-hater schrieb:
> Dann hast du ein sehr ernstes Problem. Im RGB-Farbraum gibt es nämlich
> überhaupt keinen "Farbkreis", denn der RGB-Farbraum ist ein Kubus.
Dann habe ich mich vllt. falsch ausgedrückt, ich habe dann einen Link 
gepostet, dass klar ist, welchen Farbkreis ich meine.

Frank schrieb:
> Mit keiner Formel sonst (also HSV-nach-RGB) bekommt man so einfach
> gleitende saubere Übergänge zwischen den Farben ausgerechnet
Dann ist das was ich suche. Die Formel werde ich schon finden, wenn ich 
Wikipedia durchlese und falls nötig die Suchmaschine meines Vertrauens 
benutze.

c-hater schrieb:
> Du kannst jetzt die Luft anhalten bis du blau wirst oder ähnlichen
> pubertären Unfug versuchen, das wird dein Problem nicht lösen.
Ich denke dafür bin ich schon etwas zu alt.

c-hater schrieb:
> Nö. Das wird erst lösbar, wenn du dir die nötigen Kenntnisse über
> Farbräume und Farbraumtransformationen aneignest.
Da ich jetzt weiß, dass ich mit dem HSV-Farbmodell beschäftigen muss um 
das Problem zu lösen, werde ich jetzt damit anfangen.

von Dani (Gast)


Lesenswert?

Denk ihr der Code könnte passen, sobald ich die Werte fürs die LookUp 
Table berechnet habe?

von Radig (Gast)


Lesenswert?

Hallo,

evt. hilft dir der Link:

http://www.ulrichradig.de/home/index.php/projekte/hsv-to-rgb-led

Gruß
Uli

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Also den Gleitkomma aus Radigs Code kann man ja noch rauswerfen.
Weiterhin will er ja nur den Farbkreis durchgehen für Regenbogen LED, da 
stand ja nix von Helligkeit.

Die Tabelle in meinem Code einfach von 10 bit auf 8 bit anpassen.
Dafür gibts hier eine Exceltabelle:
http://www.mikrocontroller.net/attachment/112077/PWM-Table-Comfort.xls

von Dani (Gast)


Lesenswert?

Radig schrieb:
> evt. hilft dir der Link:
>
> http://www.ulrichradig.de/home/index.php/projekte/hsv-to-rgb-led

Genau das habe ich gesucht. Vielen Dank :-)

Jetzt schreibe ich mit noch ein kleines Programm, das mit die Werte für 
die LUT berechnen, ich will das Ganze dann auf einem kleinen µC in asm 
laufen lassen und da wäre Multiplikation und Komma zahlen ein Problem.

von Frank (Gast)


Lesenswert?

Hier ist eine Arduino-Version der Funktion HSV nach RGB. H im Berich von 
0-360, S und V zwischen 0 und 100. Wenn nur die Farbe verändert werden 
soll, dann S und V auf 100 setzen ...

https://gist.github.com/hdznrrd/656996

Die mit * gekennzeichneten Paramter sind Zeiger auf globale Variablen, 
die nach jedem Aufruf der Funktion dann die richtigen RGB-Werte 
enthalten - im berich von 0-255. Die musst du an deine PWM-Routinen 
übergeben ...

von Marius S. (lupin) Benutzerseite


Angehängte Dateien:

Lesenswert?

Wenn es dir nur um den Farbkreis geht, also ohne Sättigung / Hellwert, 
dann kannst dir auch mal meine Funktion anschauen.

Die Funktion ist auf das aller nötigste runter gebrochen und steuert 
direkt die Timer-Register an.

Verwende ich in ähnlicher Form hier:
Beitrag "Moodlight mit Touchpad"

Habe die Funktion nur etwas vereinfacht und ein paar Kommentare 
hinzugefügt.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Frank schrieb:
> Hier ist eine Arduino-Version der Funktion HSV nach RGB. H im Berich von
> 0-360, S und V zwischen 0 und 100. Wenn nur die Farbe verändert werden
> soll, dann S und V auf 100 setzen ...

Wasn das fürn scheiss ?!?!
Den einen Wert auf 16 Bit aufblasen und viele Bits nicht nutzern und bei 
den 8bit Werten nicht den ganzen Wertebereich nutzen
Kopf -> Tisch

Seh grad, dasses float is -> noch bekloppter...

Ganz unten gibts was zu saugen wo das besser gelöst is:
http://www.zabex.de/site/sofabeleuchtung.html

das Ding hab ich auch bei meinem Code adaptiert, also auf Tabelle und 
rein hue umgebaut.

von Dani (Gast)


Lesenswert?

Martin Wende schrieb:
> Also den Gleitkomma aus Radigs Code kann man ja noch rauswerfen.
> Weiterhin will er ja nur den Farbkreis durchgehen für Regenbogen LED, da
> stand ja nix von Helligkeit.
>
> Die Tabelle in meinem Code einfach von 10 bit auf 8 bit anpassen.
> Dafür gibts hier eine Exceltabelle:
> http://www.mikrocontroller.net/attachment/112077/PWM-Table-Comfort.xls
Habe deine Antwort erst jetzt gesehen, das ist auch eine gute Lösung 
danke.
Es gibt nur den Unterschied, dass bei deiner Lösung der PWM-Wert der 
einzelnen Farben logarithmisch zunimmt. Da das Auge ja logarithmisch 
sieht, werde ich dann damit die besseren Ergebnisse bekommen?

Frank schrieb:
> Hier ist eine Arduino-Version der Funktion HSV nach RGB.
Die ist mir aber zu kompliziert in ASM umzuschreiben, da wir eine LUT 
einfacher und schneller.

von Marius S. (lupin) Benutzerseite


Lesenswert?

Dani schrieb:
> Es gibt nur den Unterschied, dass bei deiner Lösung der PWM-Wert der
> einzelnen Farben logarithmisch zunimmt. Da das Auge ja logarithmisch
> sieht, werde ich dann damit die besseren Ergebnisse bekommen?

Habe das bei mir auch mal versucht, ich konnte subjektiv keine 
Verbesserung feststellen.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Dani schrieb:
> Es gibt nur den Unterschied, dass bei deiner Lösung der PWM-Wert der
> einzelnen Farben logarithmisch zunimmt. Da das Auge ja logarithmisch
> sieht, werde ich dann damit die besseren Ergebnisse bekommen?

Viel bessere Ergebnisse sogar!
Kannst ja mal linear von 0 bis 255 eintippen und dann das berechnete ;)

Bei dem Code von mir sieht man selbst bei langsamen Verläufen keine 
Stufen, bei 8bit PWM kann das natürlich wieder anders sein.

von Dani (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe mir jetzt dank eurer Hilfe in Excel ein Diagramm mit den 
PWM-Werten gezeichnet. Das müsste so passen.
Und auf dem µC werde ich das Ganze mit einer Look Up Table lösen.

Vielen Dank für eure Hilfe.

von Dani (Gast)


Lesenswert?

Denkt ihr mit diesen Kurven bekomme ich eine gut Regenbogen LED hin?
Mir fehlen noch einige Bauteile und es zu testen.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Angehängte Dateien:

Lesenswert?

Hab jetz kein Video von aber das Teil im Bild macht das hervorragend.

von Marius S. (lupin) Benutzerseite


Lesenswert?

Martin Wende schrieb:
> Bei dem Code von mir sieht man selbst bei langsamen Verläufen keine
> Stufen, bei 8bit PWM kann das natürlich wieder anders sein.

Ich sehe bei mir ohne Logarithmierung auch keine Stufen. Kann aber auch 
daran liegen, dass ich die LEDs über Konstantstrom betreibe oder weil 
ich nur sehr langsam die Farben ändere oder weil mein Code auch keine 
Rundungsfehler haben kann - bei deinem Code wäre ich mir da nicht ganz 
sicher, bei den ganzen Divisionen/Modulo die du da drin hast.

Dani schrieb:
> Und auf dem µC werde ich das Ganze mit einer Look Up Table lösen.

Nicht notwendig und Platzverschwendung.
Die Kurven sind mit Logarithmierung, oder? Sieht jedenfalls so aus.

Ich glaube bei 8 Bit PWM macht die Logarithmierung nicht all zu viel 
Sinn, weil man einiges an Auflösung verliert. Dadurch entstehen dann 
tatsächlich erst die Stufen bei den Farbübergängen die man eigentlich 
verhindern will.

von Marius S. (lupin) Benutzerseite


Lesenswert?

Martin Wende schrieb:
> Hab jetz kein Video von aber das Teil im Bild macht das hervorragend.

Ist das nicht ein wenig groß geraten? :-)

Gibt doch auch AVRs im SOT23 Gehäuse, oder? Und Widerstände könnte man 
doch auch 0402 nehmen ;-)

von Dani (Gast)


Lesenswert?

Martin Wende schrieb:
> Hab jetz kein Video von aber das Teil im Bild macht das hervorragend.
In welchem Winkel löst du den Farbkreis auf?

Marius S. schrieb:
> Die Kurven sind mit Logarithmierung, oder? Sieht jedenfalls so aus.
Ja habe ich mit der oben verlinkten Excel Tabelle gemacht

Marius S. schrieb:
> Nicht notwendig und Platzverschwendung.
Logarithmieren auf einem µC wäre Zeitverschwendung. So viel Platz 
verbraucht die Tabelle nicht. Ich brauche ja nur einmal die log. 
Steigung: 40 Byte.

Marius S. schrieb:
> Ich glaube bei 8 Bit PWM macht die Logarithmierung nicht all zu viel
> Sinn, weil man einiges an Auflösung verliert.
Ich habe die Tabelle so gemacht, dass ich eine Auflösung von 1.5° im 
Farbkreis habe.

von Marius S. (lupin) Benutzerseite


Lesenswert?

Dani schrieb:
> Ich brauche ja nur einmal die log. Steigung: 40 Byte.

Also 40 8-Bit Werte mit denen du deine PWM fütterst? Damit nutzt du nur 
noch 40 der möglichen 256 Werte der 8 Bit PWM und hast somit deine 
Auflösung verringert und bekommst Stufen.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Die 42 Stufen kommen aus dem 8bit Farbkreis mit seinen 6 
Unterteilungen-> 255/6 = 42,5 -> also 0 ... 41 hat jede RGB Rampe
Da is nicht mehr drinne seidenn man geht auf 16bit hoch.
Winkelauflösung somit 360°/256 = 1,4°
Durch die Kommazahl ist der Wertebereich allerings nur 0 ... 251, also 
Winkelauflösung von 1,43°

Zudem nutz ich ja auch "nur" 42 Werte der 1024 möglichen bei 10bit

Natürlich geht das kleiner g
Der angesprochene Tiny9 im SOT23 und die RGB LED gibts ja auchnoch ne 
numemr kleiner.
Nur hab ich kein Programmer für die SOT23 Tiny Serie.

Ach ich such das Teil mal noch raus und mach nen Video...

von Dani (Gast)


Lesenswert?

Marius S. schrieb:
> Also 40 8-Bit Werte mit denen du deine PWM fütterst?
Ja. Ich habe diese Zahl gewählt, da ich mit 8 bit die Farben im 
Farbkreis adressieren will. 40*6=240. Es sind 240 geworden, da ich dann 
Schritte von genau 1.5° habe.

Wenn man es linear machen würde, dass sieht man in Bereich wo eine Farbe 
sehr dunkel ist die Schritte.

OT: Gibt es eig. eine Möglichkeit eine Zelle in Excel abhängig von den 
RGB Werten einzufärben, dass ich eine Vorschau habe wie die Farben 
aussehen würden?

von Dani (Gast)


Lesenswert?

Martin Wende schrieb:
> Hab jetz kein Video von aber das Teil im Bild macht das hervorragend.
Darf ich fragen, ob das Teil irgendeinen tieferen Sinn hat oder nur eine 
mini Regenbogen LED ist.

Martin Wende schrieb:
> Die 42 Stufen kommen aus dem 8bit Farbkreis mit seinen 6
> Unterteilungen-> 255/6 = 42,5 -> also 0 ... 41 hat jede RGB Rampe
> Da is nicht mehr drinne seidenn man geht auf 16bit hoch.
Du hast also eine Winkelauflösung von 1.4° und du sagst es sieht gut 
aus, bei 1.5° denke ich wird man nicht viel unterschied zu 1.5° 
Winkelauflösung sehen.

Martin Wende schrieb:
> Ach ich such das Teil mal noch raus und mach nen Video...
Danke für deine Anstrengung mit zu helfen!

Meine Werte für die Rampe sind:
0, 0, 0, 1, 2, 3, 4, 6, 8, 10, 13, 16, 19, 23, 27, 31, 36, 41, 47, 52, 
59, 65, 72, 80, 88, 96, 105, 114, 123, 133, 143, 154, 165, 177, 189, 
201, 214, 227, 241, 255

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

da isses:
10bit/log - http://youtu.be/lxVc_leS9GM
8bit log - http://youtu.be/Y-KG4z2ztBY
8bit/lin - http://youtu.be/3iT7wVo2ktc

Die 10bit sorgen vor allem am Anfang für eine bessere Farbabstufung, 
weil da dann nicht so oft 0,0,0 kommt

Und ne das Teil hat kein Sinn.

von Dani (Gast)


Lesenswert?

Martin Wende schrieb:
> da isses:
> 10bit/log - Youtube-Video "MVI 3187"
> 8bit log - Youtube-Video "MVI 3188"
> 8bit/lin - Youtube-Video "MVI 3189"
Sind die alle mit 1.4° Winkelauflösung und nur die Auflösung des PWM 
ändert sich?

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Hab nur an der PWM + Tabelle gespielt, Rest blieb gleich.

von Dani (Gast)


Lesenswert?

Martin Wende schrieb:
> Hab nur an der PWM + Tabelle gespielt, Rest blieb gleich.

Dann denke ich, dass ich mit 8bit/log PWM und 1.5° Winkelauflösung gute 
ergebnisse erhalten werde.

Ich würde das Problem jetzt als gelöst betrachten. Danke für eure Hilfe 
:-)

von Dani (Gast)


Lesenswert?

Und falls es jemanden interessier:
Hier der C Code mit dem ich meinen Algorithmus getestet habe:
1
 
2
unsigned char pwmtable[40] = {0, 0, 0, 1, 2, 3, 4, 6, 8, 10, 13, 16, 19, 23, 27, 31, 36, 41, 47, 52, 59, 65, 72, 80, 88, 96, 105, 114, 123, 133, 143, 154, 165, 177, 189, 201, 214, 227, 241, 255};
3
    for(cnt=0;cnt<240;cnt++)
4
    {
5
        winkel=cnt;
6
        if(winkel<40)
7
        {
8
            R=255;
9
            G=pwmtable[winkel];
10
            B=0;
11
        }
12
        else if(winkel<80)
13
        {
14
            winkel-=40;
15
            R=pwmtable[39-winkel];
16
            G=255;
17
            B=0;
18
        }
19
        else if(winkel<120)
20
        {
21
            winkel-=80;
22
            R=0;
23
            G=255;
24
            B=pwmtable[winkel];
25
        }
26
        else if(winkel<160)
27
        {
28
            winkel-=120;
29
            R=0;
30
            G=pwmtable[39-winkel];
31
            B=255;
32
        }
33
        else if(winkel<200)
34
        {
35
            winkel-=160;
36
            R=pwmtable[winkel];
37
            G=0;
38
            B=255;
39
        }
40
        else if(winkel<240)
41
        {
42
            winkel-=200;
43
            R=255;
44
            G=0;
45
            B=pwmtable[39-winkel];
46
        }
47
        printf("%d\t%d\t%d\n",R,G,B);
48
        fprintf(datei,"%d\t%d\t%d\n",R,G,B);
49
    }
Da ich den Algorithmus jetzt habe, wird es kein Problem mehr das in ASM 
umzusetzen...

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.