Forum: Mikrocontroller und Digitale Elektronik Farbsensor - Regelungstechnik


von Andy (Gast)


Lesenswert?

Hallo,
Ich weiß nicht, ob ich hier im richtigen Forum bin, aber ich frag mal... 
:)

Ich habe hier einen Farbsensor, der mir die Tristimuluswerte (X,Y,Z) des 
aktuell gemessenen Lichts ausgibt. Des weiteren habe ich diesen Sensor 
mit einem uC verbunden, der auch eine RGB-LED ansteuert. Die XYZ-Werte 
habe ich in der Form 0-1 vorliegen - d.h. ich habe das Verhältnis der 
drei Werte zueinander und kann somit den eingestellten Farbort (in xy) 
messen. Wie stelle ich das nun an, wenn ich einen Farbort konstant 
halten will? Die einzelnen Farben der LED verlieren unterschiedlich an 
Helligkeit in Abhängigkeit von Temperatur und Lebensdauer. D.h. ich muss 
die PWM-Werte anhand der gemessenen XYZ-Werte immer neu berechnen. Nur 
wie?
Kann mir da jemand Tipps geben?
Vielen Dank!

Andy

von bitte löschen (Gast)


Lesenswert?

Kannst Du einen zweiten (identischen) Farbsensor so anbringen, dass er 
die Farbe der RGB-LED misst? Dann mache es über einen Regelkreis oder 
einer Kalibrierung mit Erstellung dreier Umsetzungstabellen über den 
gesamten Bereich nach dem Einschalten. Ansonsten kannst Du noch eine 
einmalige Kalibrierung nachdenken, oder die Umsetzungstabellen anhand 
von des Datenblattes von Hand kodieren, wenn das Datenblatt genügen 
Infos liefert.

von Andy (Gast)


Lesenswert?

Danke mal für deine Antwort. Nur hab ich das mit dem zweiten Sensor 
nicht ganz verstanden. Der eine, den ich habe, der misst doch schon die 
LED. Ich will nur die Farbe in Abhängigkeit der Temp. stabil halten.
Das habe ich mir schon gedacht, dass das ein regelungstechnisches 
Problem ist. Nur habe ich da überhaupt keine Ahnung, wie ich das 
mathematisch abbilden soll...

von bitte löschen (Gast)


Lesenswert?

OK, da hatte ich Dein Problem falsch verstanden. Ich dachte, Du willst 
eine Farbe reproduzieren.
Hast Du mal eine Bezeichnung oder besser ein Datenblatt von dem 
Farbsensor, damit man eine genauere Vorstellung von der Funktionsweise 
(reaktionsgeschwindigkeit, Verhalten bei Dunkelheit, Übersättigung 
etc..) bekommen kann? Ist z.B. die Summe X + Y + Z konstant oder 
abhängig von der Gesamthelligkeit?

von Purzel H. (hacky)


Lesenswert?

Ein sportliches Unterfangen. Sensor und LED muessen natuerlich beide im 
Dunkeln sein. Dann sollte man die Farbraeume vergleichen. Eine RGB Led 
besteht aus drei Farben, der Sensor liefert Werte fuer drei Farben. Sind 
die Farben identisch ?

von TestX .. (xaos)


Lesenswert?

wie genau soll das ganze sein ? wenn es wirklich bestmögliche ergebniss 
ein bezug auf das menschliche auge haben soll brauchst du noch einen 
sensor der die absoluten wellenlängen etc. misst

tendentiell, wenn du es einfach machen möchtest rechnest du die x,y,z 
werte in passende RGB werte für deien ansteuerung um. nimm am besten 
eine konstantstromquelle, da die helligkeit näherungsweise linear zum 
strom ist.
dann pro r,g,b kanal einen PI regler und gut..

von bitte löschen (Gast)


Lesenswert?

Hex Oschi schrieb:
> Sensor und LED muessen natuerlich beide im
> Dunkeln sein.

Guter Einwand! Könnte man das nicht noch ausgleichen, indem man einen 2. 
Sensor das Umgebungslicht messen lässt?

Nochmal zur Reaktionsgeschwindigkeit des Sensors:
Wenn der Sensor schnell reagiert, gibt es ein Problem mit der PWM und 
der Messwertaufnahme. Der Regelkreis wird evtl. so einfach nicht 
funktionieren, denn was der Sensor vielleicht nur messen kann, ist die 
Helligkeit bzw. Farbe der LED in der An-Phase, nicht aber die 
durchschnittliche Helligkeit bzw. Farbe. Dann könnte meiner Vorstellung 
nach die Regel-Logik in etwa so aussehen:
Gegeben ist die Soll-Farbe S als RGB-Triplet mit dem Bereich 0..1 pro 
Kanal, die mit maximaler Helligkeit übertragen werden soll.
1. Schalte alle 3 LEDs an.
2. Messe den sich daraus ergebenden Farbwert (RGB (0-1) Triplet X)
3. Schalte alle 3 LEDs aus.
4. Suche den Kanal f, für den (Sf / Xf) am größten ist.
5. Errechne den Basisfaktor k aus diesem Verhältnis und der maximalen 
Pulsdauer Wmax:
 k = (Wmax * Xf / Sf) / (Maximaler Leistungsverlust der LED als Faktor)
6. Schalte alle 3 LEDs an.
7. Messe den sich daraus ergebenden Farbwert (RGB (0-1) Triplet X)
8. Errechne die Pulsweite W pro Farbkanal aus der Soll-Helligkeit S 
(0-1):
 Wrot = k * Srot / Xrot
 Wgrün = k * Sgrün / Sgrün
 Wblau = k * Sblau / Sblau
9. Warte auf entsprechende Zeitpunkte, und schalte LEDs aus.
10. Weiter mit 6.

Weiterhin brauchen wir 3 PWM-Ausgänge, was uns zu einem phatten uC oder 
3-Kalnal Soft-PWM führt.

von Art Ickel aus W. (Gast)


Lesenswert?

Hallo Andy,
Du kannst das entweder eine Hin-und Rücktransformation in den HSL 
Farbraum machen, oder auch direkt. Du willst ja Farbton und Sättigung 
konstant halten, und die Helligkeit der LED auf einen festen Wert 
stellen (zum Beispiel so hell wie möglich).

Dazu musst Du aus dem gemessenen Istwert deines Sensor sowie aus dem 
Sollwert (welche Farbe es sein soll) die Helligkeit durch Normierung 
raus rechnen. Die Helligkeit der LED kann man entweder auf einen festen 
Wert einstellen, oder so, dass der hellste der 3 RGB Kanäle gerade 100% 
stellt.


Also:
Normiere die Helligkeit deines XYZ Sensors. Zum Beispiel so, dass der 
Mittelwert 1 ergibt.
Beispiel:
X = 0.2
Y = 0.4
Z = 0.6
Mittelwert M = (X + Y +Z)/3 = 0.4
X' = X / M = 0.5
Y' = Y / M = 1.0
Y' = Y / M = 1.5

Jetzt hast Du immer noch den gleichen Farbton und Sättigung, aber 
Helligkeit 1.0

Mach das Gleiche mit deinem Sollwert.
Um zum Beispiel auf Weiss zu regeln wäre der Sollwert:
Xsoll' = Ysoll' = ZSoll' = 1.0


Jetzt brauchst Du nur noch 3 digitale I-Regler in der Form:
Xr = Xr + Ki * (Xsoll' - X')

Da der I-Anteil recht hohe Werte hat, wirst Du den Ausgang nochmals 
skalieren, zum Beispiel / 1000.

Und nun musst Du nur noch den größten der 3 Werte ermitteln, und Xr, Yr, 
Zr dann so skalieren, dann der genau 100% PWM gibt.

von Andy (Gast)


Lesenswert?

Vielen Dank für die zahlreichen Antworten. Nur glaube ich, dass da was 
falsch verstanden wird. X,Y,Z haben nichts direkt mit den 
RGB-Einstellungen zu tun. X,Y,Z stellen lediglich den eingestellten 
Farbort im CIE-Chart dar. Die Koordinaten werde wie folgt berechnet:
x = X/(X+Y+Z) und y = Y/(X+Y+Z)
D.h. wenn ich nun z.B. nur den Rot-Wert ein bisschen verändere, ändert 
sich der Farbort und somit ändern sich auch alle drei Tristimuluswerte - 
also X,Y und Z.
D.h. eine Farbänderung hat eine Änderung aller drei Messgrößen zur 
Folge. Da sich nun die Farbe zwangsläufig ändern wird, obwohl die 
PWM-Werte konstant sind (wegen Temperatur), muss ein Algorithmus her, 
der mir sagt, welchen PWM-Kanal ich ändern muss, damit X,Y und Z wieder 
auf den Ausgangswert zurückkommen. Und da bräuchte ich Hilfe.
Ich hoffe, ich konnte mich verständlich ausdrücken... :)

lg
Andy

von Art Ickel aus W. (Gast)


Lesenswert?

ja. Du musst einfach deinen X-Y-Z-Vektor in den RGB Raum transformieren 
und dann die Regelung anwenden.

von Art Ickel aus W. (Gast)


Lesenswert?

Du kannst aber den Regler auch in deinem Farbraum ansetzen und nur die 
Ausgabe nach RGB transformieren.

.... ein Beispiel aus dem praktischen Leben:

Du hast eine alte Dusche mit 2 Regler: Heisswasserhahn und 
Kaltwasserhahn. Du willst eine konstante Temperatur und vielleicht auch 
konstanten Wasserfluss regeln.

Heisswasserhahn und Kaltwasserhahn entsprechen R-G (und B)
Um das regeln zu können, baut man eine Transformation von Konstanter 
Temperatur und Konstanem Fluss zu Heiss-Kaltwasser-Hahn ein.

Diese Transformation kann man mechanisch mit der Mischerbatterie machen.

Jetzt baut man 2 Regler. Einer misst die Temperatur und bewegt über 
einen Stellmotor den Hebel der Batterie nach recht/links.

Der 2. Regler musst nur den Durchfluss und regelt über einen 2. 
Stellmotor den Heben nach unten/oben.

Genauso kann man im Farbraum regeln. Die Transformation würde ich aber 
mathematisch, und nicht mechanisch machen.

Art

von Art Ickel aus W. (Gast)


Lesenswert?

So etwa:
1
//Variablen
2
long xregler = 0;
3
long yregler = 0;
4
int r,g,b;
5
int xdiff, ydiff;
6
7
// Sollwert
8
xsoll = irgendwas
9
ysoll = irgendwasandres
10
11
while (1) {
12
13
// Koordinaten im CIE-Chart
14
xist = X/(X+Y+Z)
15
yist = Y/(X+Y+Z)
16
17
//Regelabweichung
18
xdiff = xsoll - xist
19
ydiff = ysoll - yist
20
21
// I-Regler für x
22
xregler += xdiff * Ki (mit Begrenzung)
23
if (xregler < XREGLER_MIN)
24
  xregler = XREGLER_MIN;
25
if (xregler > XREGLER_MAX)
26
  xregler = XREGLER_MAX;
27
28
29
// I-Regler für y (mit Begrenzung)
30
yregler += ydiff * Ki
31
if (yregler < YREGLER_MIN)
32
  yregler = YREGLER_MIN;
33
if (yregler > YREGLER_MAX)
34
  yregler = YREGLER_MAX;
35
36
//Transformation in den RGB-Raum
37
TransformCIE2RGB(xregler * SKALIERUNGSFAKTOR ,yregler * SKALIERUNGSFAKTOR , HELLIGKEIT)
38
39
// Schreiben der PWM Register
40
PWM1 = r
41
PWM2 = g
42
PWM3 = b
43
44
warte_bis_10ms_wieder_rum_sind(); 
45
}

von Art Ickel aus W. (Gast)


Lesenswert?

und hier:
http://www.brucelindbloom.com/
findest Du unter "Math" die Transformation aus dem xyY Farbraum nach 
RGB, also das, was ich in der TransformCIE2RGB() Funktion versteckt 
habe.

von Andy (Gast)


Lesenswert?

Hallo,
Vielen Dank für deine Antwort - hat mir schon ein bisschen 
weitergeholfen.
Nur hänge ich gerade an der Korrekturmatrix M für die 
XYZ-zu-RGB-Transformation. Und zwar ist es bei mir der Fall, dass ich 
keinen echten RGB-Farbraum habe, sondern das Grün ist bei mir Cyan. Wie 
kann ich nun eine Matrix M speziell für meine Problemstellung berechnen? 
Ich hab schon ein bisschen probiert - weiß jedoch nicht, was ich als 
reference white annehmen muss...
Vielen Dank!!

mfg
Andy

von Willi W. (Gast)


Lesenswert?

Art Ickel aus W. schrieb:
> Du musst einfach deinen X-Y-Z-Vektor in den RGB Raum transformieren
> und dann die Regelung anwenden.

Das geht prinzipiell nicht, da RGB nicht den ganzen CIE Farbraum 
abdeckt, sondern nur ein Dreieck. Falls der gewünschte Farbwert 
außerhalb des Dreiecks liegt, muß man Kompromisse schließen.

von Matthias (Gast)


Lesenswert?

Andy schrieb:
> Nur hänge ich gerade an der Korrekturmatrix M für die
> XYZ-zu-RGB-Transformation. Und zwar ist es bei mir der Fall, dass ich
> keinen echten RGB-Farbraum habe, sondern das Grün ist bei mir Cyan.

Deine LEDs sitzen jeweils auf einem (temperaturabhängigen) Farbort und 
spannen im CIE ein Dreieck auf, dass nur einen Teil des Farbraumes 
abdeckt. Das Matrix existiert also möglicherweise gar nicht exakt.

von Andy (Gast)


Lesenswert?

OK, danke für eure Hinweise... Ich habs nun in Mathematica geschafft, 
das ganze nachzubauen. Und zwar ist das Referenzweiß jener Farbort, der 
sich einstellt, wenn alle drei LEDs voll angesteuert werden. Nur ist die 
Frage, bei welcher Temperatur dieses Referenzweiß ermittelt werden 
muss....
Bin noch am Tüffteln... :)

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.