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
unsigendcharwerte[64]={???};
2
if(farbe<64)
3
{
4
rot=werte[farbe];
5
gruen=werte[64-farbe];
6
}
7
elseif(farbe<128)
8
{
9
farbe-=64;
10
gruen=werte[farbe];
11
blau=werte[64-farbe];
12
}
13
elseif(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?
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.
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)
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.
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.
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.
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
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.
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 ...
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.
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.
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.
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.
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.
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.
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.
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 ;-)
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.
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.
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...
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?
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
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?
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
:-)