Brauche Hilfe bei RGB LED DemoBox

Hallo an alle.
Für eine Präsentation versuche ich eine RGB LED DemoBox aufzubauen, die Box ist Zweigeteilt. Im ersten Bereich wird die Farbe der LEDs über 3 Potis, für jede Grundfarbe ein Poti, eingestellt und in dem zweiten Bereich soll die Farbe aus dem ersten Bereich kopiert werden. Die Farben werden mit Hilfe von zwei RGB Sensoren erfasst und las RGB Wert(R:0-255; G:0-255; B:0-255) über I2C-Bus an eine Arduino UNO gesendet. Das Arduino UNO soll diese RGB Werte des Sensor_1 und Sensor_2 vergleichen und die LEDs im zweiten Bereich automatisch ansteuern.

Was schon am Laufen ist:

  • Die Farbe kann mit den 3 Potis eingestellt werden
  • Die Kommunikation mit den beiden RGB Sensoren

Was noch nicht am Laufen ist:

  • Die automatische Regelung der Farbe in dem zweiten Bereich der Box

Ich habe es mall mit dem PID-Regler aus der Library versucht und konnte so eine Farbe automatisch regeln. Sobald ich aber 3 PID Regelkreise (für jede Farbe ein) gemacht habe wollte es nicht funktionieren.

Mit einer if…else Abfrage habe ich es auch versucht, leider kam ich da zu keinem gewünschten Ergebnis.

Wie kann ich so was realisieren, ist meine Vorgehensweise Falsch oder ist es einfach nicht möglich?
Was noch etwas genauere Informationen benötigt werden, schreibt einfach und ich werde sie Posten.

Danke schon mal im Voraus für die Hilfe.

Pengo10: Wie kann ich so was realisieren, ist meine Vorgehensweise Falsch oder ist es einfach nicht möglich? Was noch etwas genauere Informationen benötigt werden, schreibt einfach und ich werde sie Posten.

Also fällt auch Streulicht in wechselnden Anteilen auf die Sensoren und das Streulicht soll ebenfalls mit ausgeregelt werden?

Denn wenn wechselndes Streulicht nicht berücksichtigt werden müßte, würde nur ein Sensor benötigt werden, um eine Nachführ-Regelung zu realisieren. Dann wäre der Aufbau einfacher.

Aber so wie Du es nun aufbauen möchtest, wäre das Vorgehen wie folgt: - Messwerte an Sensor 1 ermitteln (vier Werte für Lichtstärke gesamt, R, G, B) - Messwerte an Sensor 2 ermitteln (vier Werte für Lichtstärke gesamt, R, G, B)

Und dann kannst Du eine einfache Proportionalregelung machen: Wenn Sensor 2 weniger Licht mißt als Sensor 1, erhöhe die Lichtstärke und umgekehrt. Und bei den Farbanteilen R, G, B einzeln für sich genau so.

Etwa so habe ich mir vorgestellt sollte das aussehen, Hofe man kann es verstehen. Der Deckel soll aus matten Acryl oder sowas endlichem sein was ein Teil des Lichtes zum Sensor zurück reflektiert.

Nur mit einem Sensor habe ich das Testweise aufgebaut und es hat funktioniert, es erfühlt nicht meine Anforderungen. Ich möchte das Licht vergleichen was ich bekomme und anhand dieses Lichtes die Regelung durchführen. Zum Beispiel kann es ja sein das die LEDs in der zweiten Box bei PWM 200 für Rot, das gleiche Rot haben wie bei der ersten Box mit PWM 255 (ist etwas übertriebener Beispiel aber es kann sein, auf Grund von Erwärmung etc.) deswegen möchte ich das Licht vergleichen was ich erfasse.

Aber so wie Du es nun aufbauen möchtest, wäre das Vorgehen wie folgt:

  • Messwerte an Sensor 1 ermitteln (vier Werte für Lichtstärke gesamt, R, G, B)
  • Messwerte an Sensor 2 ermitteln (vier Werte für Lichtstärke gesamt, R, G, B)

Warum 4 Werte für Lichtstärke, haben doch nur die 3 Grundfarben.

Habe das ganze Mal mit einer if….else Abfrage gemacht aber zu keinem brauchbaren Ergebnis gekommen. So sieht meine Abfrage für Rot aus:

// ### Regelung für rot
void rot()
{
  if(Sensor_1_rot < Sensor_2_rot || dimRot == 0) {
    dimRot = dimRot + 1;
  }
  else if(Sensor_1_rot > Sensor_2_rot || dimRot >=255) {
    dimRot = dimRot - 1;
  }
}

Pengo10: Etwa so habe ich mir vorgestellt sollte das aussehen, Hofe man kann es verstehen. Der Deckel soll aus matten Acryl oder sowas endlichem sein was ein Teil des Lichtes zum Sensor zurück reflektiert. https://www.dropbox.com/s/rysaua7rnni6ilk/DemoBox.jpg

Dass sich bei diesem Aufbau Farbverschiebungen durch Streulicht von außen ergeben ist Dir aber schon klar? D.h. wenn vor Box1 jemand mit einem roten Hemd steht und vor Box2 jemand mit einem blauen Hemd, dann gibt es einen Farbstich, denn Dein Sensor mißt auch von außen einfallendes Licht.

Frage: Berücksichtigst Du mit einer Kalibrierung zu Versuchsbeginn die Lichteinstreuungen aus der Umgebung?

Also bei komplett ausgeschalteten LEDs: Lichtmessung an Sensor 1 und Sensor 2 machen. Die dann ermittelten Sensorwerte sind komplett durch Umgebungslicht bedingt und müssen im späteren Verlauf des Versuchs von den dann ermittelten Messwerten abgezogen werden.

Machst Du das?

Oder kannst Du den Versuchsaufbau so abändern, dass die Sensoren nur das von den LEDs abgestrahlte Licht messen bzw, das Streulicht aus der Umgebung vernachlässigbar klein ist?

jurs: Frage: Berücksichtigst Du mit einer Kalibrierung zu Versuchsbeginn die Lichteinstreuungen aus der Umgebung?

Ja die beiden Sensoren können Kalibriert und an die Umgebung angepasst werden.

jurs: Dass sich bei diesem Aufbau Farbverschiebungen durch Streulicht von außen ergeben ist Dir aber schon klar? D.h. wenn vor Box1 jemand mit einem roten Hemd steht und vor Box2 jemand mit einem blauen Hemd, dann gibt es einen Farbstich, denn Dein Sensor mißt auch von außen einfallendes Licht.

Aufgrund dessen das die Box1 und Box2 in demselben Gehäuse sitzen und nicht groß sein werden, werden die Sensoren fast den gleichen Lichtverhältnissen ausgesetzt.

Mir geht es in erster Linie darum überhaupt eine Regelung der 3 Farben zu bekommen. Ich habe mit dem PID-Regler aus der Library probiert, konnte aber nur eine Farbe Regeln dafür aber sehr gut (aus der optischen Sicht). Sobald die Regelung am Laufen ist kann ich die DemoBox an die Gegebenheiten anpassen. Auf dem Bild habe ich nur einen groben Entwurf gemacht wie ich mir das ungefähr vorstelle, das Endergebnis kann natürlich ganz anderes werden.

Ist es überhaupt möglich auf dem Arduino UNO 3 PID-Regler laufen zu lassen? Brauche Unterstützung von Euch weil ich ein Anfänger und kein Profi bin. Das alles was bis jetzt gemacht wurde, habe ich mit Hilfe diverser Foren und Code Beispielen mir erarbeitet und jetzt ist es so das ich einfach nicht weiter komme.

Pengo10: Aufgrund dessen das die Box1 und Box2 in demselben Gehäuse sitzen und nicht groß sein werden, werden die Sensoren fast den gleichen Lichtverhältnissen ausgesetzt.

Und gleichartige LEDs sind auch in beiden Boxen eingebaut?

Dann würde ich aufgrund der Tatsache, dass Du - von Regelungstechnik keine Ahnung hast und - von der PID-Regler Library keine Ahnung hast und - in beiden Boxen sowieso dieselben Größen-, Streulicht- und Beleuchtungsverhältnisse herrschen einfach mit nur EINEM EINZIGEN Lichtsensor eine einfache Nachführregelung aufbauen.

Ich selbst habe von der PID-Regler Library ehrlich gesagt auch keine Ahnung, und meine Kenntnisse in Regelungstechnik sind auch schwer eingerostet.

Für eine einfache Nachführregelung müßtest Du erstmal ausmessen, was der Lichtsensor überhaupt mißt und mit welchem Zeitverhalten (wie lange braucht der Sensor nach einer Lichtänderung, um auf geänderte Lichtverhältnisse mit geänderten Sensorwerten zu reagieren, ggf. im Datenblatt nachschauen).

Also messen nur in Box 1: Bei ausgeschalteten LEDs in Box 1 das Umgebungs-Streulicht ausmessen: R, G, B Messwerte des Sensors? Dies entspricht einer Ansteuerung der LEDs in Box 1 mit RGB (0,0,0) und entsprechend werden mit diesem Sensorwert auch die LEDs in Box 2 mit RGB (0,0,0) angesteuert.

Dann bei voll angesteuerten LEDs in Box 1 das volle Licht ausmessen: R, G, B Messwerte des Sensors? Dies entspricht einer Ansteuerung der LEDs in Box 1 mit RGB (255,255,255) und entsprechend werden mit diesem Sensorwert auch die LEDs in Box 2 mit RGB (255,255,255) angesteuert.

Aus den beiden Messungen bei "null Licht" und bei "voll Licht" ergibt sich der Stell- und Regelbereich.

Und dann brauchst Du eigentlich nur noch folgende Nachführ-Regelschleife: 1. Aktuelle Messwerte des Lichtsensors in Box 1 messen (da wo die Vorgabe per Poti-Einstellung erfolgt) 2. Die Messwerte proportional umrechnen auf eine Lichtansteuerung mit RGB-Werten 3. Die LEDs in Box2 mit diesen neuen RGB-Werten ansteuern 4. Nach Ablauf einer kleinen Zeit (Abhängig vom Zeitverhalten des Sensors) weiter mit Punkt 1. (man braucht nicht 1000 mal pro Sekunde neue RGB-Werte zu berechnen, wenn der Sensor z.B. überhaupt nur 10 Messungen pro Sekunde ausführen kann)

Eine Feedback-Regelung mit zweitem Lichtsensor würde ich erstmal als zu kompliziert und aufgrund der identischen Verhältnisse in beiden Lichtboxen auch als überflüssig ansehen und stattdessen die einfache Nachführ-Regelung aufbauen.

Für eine jederzeitige Kalibrierungsmöglichkeit im laufenden Betrieb könnte man zwei Buttons vorsehen, die man zur Kalibrierung wie folgt drücken kann: Runterregeln der Beleuchtung in BOX 1 auf null an den Potis, dann Button "Umgebungslicht-Kalibrierung" drücken. Dann hochregeln der Beleuchtung in BOX1 an den Potis und Button "Max. Licht Kalibrierung" drücken. Jeweils beim Drücken des Buttons wird der Lichtsensor ausgelesen und der Kalibrierwert für "Umgebung-Streulicht" und "Maximale Beleuchtung" gesetzt. So dass man während einer Demonstration jederzeit neu Kalibrieren kann, auch wenn die Lichtverhältnisse am Ort der Demonstration andere sind als am Ort der Softwareentwicklung und selbst wenn sich bei der Demonstration die Lichtverhältnisse stark ändern sollten. Z.B. wenn sich ein Typ im knallroten oder einfarbig blauen Hemd davor stellt und das gemessene Streulicht sich verändert.

Die Regelung wird aber um so besser, je weniger Umgebungs-Streulicht der Sensor aufnimmt. Die beste Regelung bekommst Du, wenn der Sensor nur Licht der LEDs mißt und Streulicht aus der Umgebung vom Lichtsensor komplett ferngehalten wird.

Pengo10: ...Sobald ich aber 3 PID Regelkreise (für jede Farbe ein) gemacht habe wollte es nicht funktionieren

Kannst du mal beschreiben, was genau nicht funktioniert? Wie sieht denn der Code mit den 3 PiDs aus?

Hast du dir schonmal über Serial.print() deine Ist- und Sollwerte ausgegeben? etwa so:

Serial.print("Rot1: "); Serial.print(Sensor_1_rot); 
Serial.print("     Rot2: "); Serial.print(Sensor_2_rot);
Serial.print("     Rot_Out: "); Serial.println(dimRot);

( Natürlich für alle 3 Farben!) Dann kannst du schön sehen, was deine Sensoren messen und wie die Regler darauf reagieren.

guntherb: Kannst du mal beschreiben, was genau nicht funktioniert?

Also wenn ich das Starte, dann habe ich das Gefühl das nur der erste PID-Regler in der Loop-Schleife ausgeführt wird weil sich nur die Farbe verändert. Habe mal zum Testen nur eine Farbe (z.B. nur Grün) mit dem PID-Regler getestet und es hat funktioniert, mit besseren Einstellungen würde es sogar vollkommen ausreichen.

guntherb: Wie sieht denn der Code mit den 3 PiDs aus?

Hier ist mein Code, hoffe das es verständlich ist, wie gesagt Anfänger habe bestimmt auch einiges zu umständlich gelöst. https://www.dropbox.com/s/8zzlg5bj49c3ze7/DemoBox_Skech_PID.rtf

Hier noch ein Bild wie ich mir das Ganze vorstelle von dem Ablauf her. https://www.dropbox.com/s/0x44hiwzh5t0y92/Funktionsprinzip%20DemoBox.jpg

Ich habe hier leider keinen Dropbox zugriff.

Pengo10: Also wenn ich das Starte, dann habe ich das Gefühl das nur der erste PID-Regler in der Loop-Schleife ausgeführt

Das kannst du mit Serial.print() überprüfen, so wie oben vorgeschlagen. Dann siehst du schön, was jeder Regler macht. wenn du das so schreibst:

Serial.print(char(9)); Serial.print(Sensor_1_rot); // char(9) ist das Tab-Zeichen
Serial.print(char(9)); Serial.print(Sensor_2_rot);
Serial.print(char(9)); Serial.print(dimRot);
Serial.print(char(9)); Serial.print(Sensor_1_gelb); 
//... weiter für alle Farben
Serial.println()

dann kannst du den Inhalt vom Seriellen Monitor in Excel kopieren und dir als Grafik anschauen.

Hallo
Ich habe heute an dem Code etwas gearbeitet und „Serial.print“ eingefügt und die PID-Regler etwas verändert und es läuft, zwar ist die Regelung noch nicht 100% und die Kalabrierin kommt auch noch dazu aber die Farben werden geregelt. Habe die beiden LEDs und Sensoren in zwei Kartons zum Testen gepackt und in ein kleinen Schlitz reingeschaut.

Hier mal mein “Serial.print” Code:

// ### Rot ###
  Serial.println("### Rot ###");
  Serial.print("Poti_Rot = ");
  Serial.println(currentColorValueRed);
  Serial.print("Sensor1_Rot = ");
  Serial.print(Sensor_1_rot);
  Serial.print(" Sensor2_Rot = ");
  Serial.println(Sensor_2_rot);
  Serial.print("rot_Setpoint = ");
  Serial.print(rot_Setpoint);
  Serial.print(" rot_Input = ");
  Serial.print(rot_Input);
  Serial.print(" rot_Output = ");
  Serial.print(rot_Output);
  Serial.print("\n");

  // ### Grün ###
  Serial.println("### Gruen ###");
  Serial.print("Poti_Gruen = ");
  Serial.println(currentColorValueGreen);
  Serial.print("Sensor1_Gruen = ");
  Serial.print(Sensor_1_gruen);
  Serial.print(" Sensor2_Gruen = ");
  Serial.println(Sensor_2_gruen);
  Serial.print("gruen_Setpoint = ");
  Serial.print(gruen_Setpoint);
  Serial.print(" gruen_Input = ");
  Serial.print(gruen_Input);
  Serial.print(" gruen_Output = ");
  Serial.print(gruen_Output);
  Serial.print("\n");

  // ### Blau ###
  Serial.println("### Blau ###");
  Serial.print("Poti_Blau = ");
  Serial.println(currentColorValueBlue);
  Serial.print("Sensor1_Blau = ");
  Serial.print(Sensor_1_blau);
  Serial.print(" Sensor2_Blau = ");
  Serial.println(Sensor_2_blau);
  Serial.print("blau_Setpoint = ");
  Serial.print(blau_Setpoint);
  Serial.print(" blau_Input = ");
  Serial.print(blau_Input);
  Serial.print(" blau_Output = ");
  Serial.print(blau_Output);
  Serial.print("\n");
  Serial.print(" Kp,Ki,Kd = ");
  Serial.print(Kp);
  Serial.print(",");
  Serial.print(Ki);
  Serial.print(",");
  Serial.println(Kd);