Pages: 1 2 [3] 4   Go Down
Author Topic: (solved, but continued) Inhalt eines RGB Strips weich überblenden  (Read 3986 times)
0 Members and 1 Guest are viewing this topic.
Europe / Germany
Offline Offline
Sr. Member
****
Karma: 13
Posts: 427
keep it simple
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi qualidad,

Ein anderer Ansatz, um zwischen Farben zu faden wäre, vom HSV-Farbmodell auszugehen. Am Ende braucht man zwar wieder RGB-Werte, um die LED s anzusteuern, aber man bekommt diese sehr schön aus der Formel HSV-nach-RGB.

ja, diese Möglichkeit wurde weiter oben im Thread schon mal angesprochen. Welchen Vorteil siehst Du bei diesem Vorgehen? Welcher Vorteil rechtfertigt die doppelte Konvertierung (RGB nach HSV und wieder zurück)?
Wie löst Du das Problem der auftretenden Zwischenfarben, wenn Du z.B. von den Hue Wert von gelb nach blau fährst - dann willst Du doch nicht erst grün sehen...
In meiner Vorstellung wird das bei komplexen Inhalten während das Fadens ein buntes Durcheinander, bis es dann schließlich beim Zielbild "einrastet".

Grüße, Helmuth.

edit: Außer, beim Sonderfall von Regenbogeneffekten, hat es sich mir bisher noch nicht erschlossen, warum Leute überhaupt auf das HSV Modell zurückgreifen. Welche Funktionen oder Effekte sind damit leichter zu handeln, als mit dem RGB Modell? Bin für jede Anregung dankbar.
« Last Edit: March 04, 2013, 05:44:37 am by Helmuth » Logged

Europe / Germany
Offline Offline
Sr. Member
****
Karma: 13
Posts: 427
keep it simple
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@all:

Mal noch etwas Grundsätzliches zum eigentlichen Konzept / Usecase:

Man stelle sich eine Art von Ambi-/Moodlight für den Wohnraum vor. Auf dem Strip soll irgendetwas passieren - die Muster und die Farben ändern sich. Das menschliche Auge ist sehr empfindlich für HelligkeitsDIFFERENZEN. D.h., selbst wenn man nicht direkt in die Lichtquelle schaut, nimmt man die Summe aller r, g und b Werte wahr - und die schrittweise Änderung dieser Summe. Wenn jetzt irgenein Effekt auf dem Strip ausgeführt wird, hat man also immer das Problem, dass die Änderung der GESAMTHelligkeit wahrgenommen wird. Selbst, wenn der Effekt selbst mit z.B. 20 fps läuft, hat man subjektiv den Eindruck eines subtilen Strobeeffekts. Genau da setzt das Crossfading an: Man berechnet z.B. noch jeweils 100 Zwischenschritte und hilft somit der Framerate auf 200 fps (mit einem kurzen Strip...) - was deutlich weicher und flüssiger wirkt. Ich bin auch dazu übergegangen, den Fall Farbe = 0 auszuschließen und durch Farbe ist minimal 1 zu ersetzen - warum? - weil der WAHRGENOMMENE Helligkeitsunterschied zwischen 0 und 1 am größten ist, bedingt durch die logarithimische Helligkeitswahrnehmung des Auges. Selbst mit 24 Bit hat man "untenrum" immer ein Problem... Mir ist noch kein Strip/PWM Controller untergekommen, der dieses Problem löst.

Wenn man mit DMX Dimmern und analogen Leuchtmitteln (grühwendelhaltig) arbeitet, relativiert sich das Problem durch die Trägheit der Glühwendel, d.h. bedingt durch die physikalischen Eigenschaften verändert sich die Helligkeit vergleichsweise langsam. (LEDs sind dagegen einfach zu schnell...) Untenrum ist das Problem das Gleiche (man hat ja auch da nur 8 Bit / Kanal), weswegen bessere handelsübliche DMX Dimmer auch bei "0" das Leuchtmittel minimal leuchten lassen (sieht man nur im Dunkeln) - einerseits, um die Temperatur des Glühfadens zu halten, also ein (relativ) schnelles hochdimmen ermöglicht wird, andererseits, um das subtile "Geflacker" beim umschalten zwischen 0 und 1 zu minimieren.

Grüße in die Runde!



« Last Edit: March 04, 2013, 08:25:27 am by Helmuth » Logged

Wien
Offline Offline
Edison Member
*
Karma: 29
Posts: 1959
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi, helmut

alternativ wäre der tlc5940 zu nennen mit 12bit-auflösung. erst bei 1 zu beginnen ist natürlich keine schlechte idee, der farbunterschied wird kaum ins gewicht fallen. mir hilft's auch bei einer funktion, dazu später mehr...

gruß stefan
Logged

Offline Offline
Edison Member
*
Karma: 15
Posts: 1060
ATmega 2560
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

den PWM 0 auf 1 Effekt sehe ich bei meinen Spielereien mit reinen blauen LEDs auch. Manchmal denkt man es gibt eine Art Zündeffekt wenn man von 0 auf 1 schaltet. Deshalb gehe ich auch nie mehr unter 1.

Logged

Tschau
Doc Arduino

Europe / Germany
Offline Offline
Sr. Member
****
Karma: 13
Posts: 427
keep it simple
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi Doc,

wenn es nur ein "paar" LEDs sind und Dich der Sprung stört, kannst Du eine SW PWM schreiben, um zwischen 0 und 1 Zwischenhelligkeiten zu erzeugen.

Grüße
Logged

Europe / Germany
Offline Offline
Sr. Member
****
Karma: 13
Posts: 427
keep it simple
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@all: Gibt es Strips mit 12 Bit PWM Chips, wie z.B. TLC5940?
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 272
Posts: 21940
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
@all: Gibt es Strips mit 12 Bit PWM Chips, wie z.B. TLC5940?
Meines Wissens nicht.
Der TLC ist nicht für große hintereinander geschaltene Stückzahlen geeignet, da alle Ansteuerungssignale außer der Daten paralell vom SteuerIC zu allen TLC gehen. Durch den Ansteuerstrom der Eingänge können nicht unendlich viele TLC hintereinander geschaltet werden.
Die Treiber die in Strips verwenden werden sind viel einfacher aufgebaut und haben einen Datenbus der von IC zu IC geht und somit immer wieder verstärkt wird. Darum können elektrisch gesehen unendlich viele Treiber in Reihe geschaltet werden. Begrenzungen gibt es nur Aufgrund der Übertragunggeschwindigkeit der Daten und dem erwünschten Bildwiederholfrequenz bei dynamischen Ansteuerung. 

8 Bit pro Farbe ist Standart bei der Darstellung von Bildern und Farben. Es gibt wenige gebiete wo mehr Farbauflösung verwendet wird.

Grüße Uwe
Logged

Offline Offline
Edison Member
*
Karma: 15
Posts: 1060
ATmega 2560
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi Doc,

wenn es nur ein "paar" LEDs sind und Dich der Sprung stört, kannst Du eine SW PWM schreiben, um zwischen 0 und 1 Zwischenhelligkeiten zu erzeugen.

Grüße

Hallo,

wie soll man kleiner 1, also 0.x, als PWM ausgeben? Oder schielst Du darauf hinaus die PWM Frequenz zu ändern, sodass PWM Wert 1 im Vergleich zu jetzt ein noch kürzerer Impuls ist?

Und weil Ihr alle immer so lieb seit, habe ich mal meine Berechnungstabelle automatisiert. Zur einfachen Nutzung für alle. Man kann 3 Krümmungen vergleichen, den maximalen PWM Wert vorgeben (meistens 255) und die Anzahl der gewünschten Zwischenwerte (mehr als 64 macht eigentlich keinen Sinn). Das Ergebnis der PWM Werte kann man per Zelle anklicken und STRG-C und irgendwo als Text einfügen. Zum Bsp. im IDE.




* µC PWM Wert Berechnung.xlsx (26.19 KB - downloaded 10 times.)
Logged

Tschau
Doc Arduino

Europe / Germany
Offline Offline
Sr. Member
****
Karma: 13
Posts: 427
keep it simple
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Doc: Ich nehme an, Dir ist grundsätzlich klar, wie PWM funktioniert. http://de.wikipedia.org/wiki/Pulsweitenmodulation

Wenn Dir das Konzept klar ist, kannst Du das als Code abbilden.

Nehmen wir als fiktives Beispiel eine LED, mögliche Helligkeit 0-255. Nehmen wir an, Du wünschst Dir zusätzliche Helligkeitsstufen zwischen 0 und 1.

Indem Du die LED in regelmäßigen gleichkurzen Zeitintervallen zwischen 0 und 1 umschaltest, hast Du schonmal einen Zwischenschritt.

Jetzt unterteilst Du dieses Zeitinvervall weiter, sagen wir eine Millisekunde in 4 * 250 Mikrosekunden (=4 mögliche Zwischenhelligkeiten). Du schaltest die LED zum Beginn des Intervalls auf 1 und dann - in Abhängigkeit von der gewünschten Zwischenhelligkeit nach einer, zwei oder drei 250 µS Intervallen wieder aus. ...usw. Ergebnis: Eine vierstufige PWM zwischen 0 und 1.

Limitiert bist Du dadurch, dass das Ganze schnell gehen muss, damit es nicht sichtbar flackert und dass Du bei mehreren LEDs erstmal die Ausschaltreihenfolge rausbekommen musst, bevor Du das im richtigen Timing durchführst (nachdem Du sie synchron angeschaltet hast), was auch Zeit kostet und vor allem bei vielen LEDs mit vielen Zwischenhelligkeiten aufwendiger Code wird, jedenfalls nach meinem Kenntnisstand.

Soweit verständlich und hilfreich?

Gruß Helmuth



« Last Edit: March 05, 2013, 04:15:36 pm by Helmuth » Logged

Offline Offline
Edison Member
*
Karma: 15
Posts: 1060
ATmega 2560
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

ja, was PWM ist und macht ist mir klar.  smiley-wink

Du meinst, wenn der PWM Wert 1 ist, also die High-Pulsbreite noch sehr sehr kurz ist, dann soll ich in dieser kurzen Zeit zusätzlich den Ausgang zum Bsp. 2x umschalten? Der Standard PWM Takt ist 490Hz sein. Das kann man irgendwie ändern wie vorhin gelesen. Aber bleiben wie bei 490Hz, sonst ändern sich alle anderen Zeitbasen. Das würde bedeuten, PWM Wert 1 entspricht 8,0032µs Pulsbreite. In der Zeit nochmal schalten lassen. Na Hut ab.  smiley-grin  Werde das mal für einen Ausgang probieren.
« Last Edit: March 05, 2013, 06:10:05 pm by uwefed » Logged

Tschau
Doc Arduino

Europe / Germany
Offline Offline
Sr. Member
****
Karma: 13
Posts: 427
keep it simple
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Die Frequenz der "Buil in PWM" hat nichts damit zu tun, mit welcher Frequenz DU modulierst.

Keine Ahnung, welche Frequenz realistisch ist, aber 100 Hz sollten mit ein paar LEDs und ein paar Helligkeitsstufen kein Problem sein - was ja für den Anfang ok ist.

Zum schnell Testen (nur zur Verdeutlichung, natürlich verwendest Du später if (micros()>...))
Code:
void loop() {
  // 25% von 1, 4 Stufen
  // @250 Hz
  analogWrite(0,1);
  delay(1);
  analogWrite(0,0);
  delay(3);
}

void loop() {
  // 10% von 1, 10 Stufen
  // @100 Hz
  analogWrite(0,1);
  delay(1);
  analogWrite(0,0);
  delay(9);
}

void loop() {
  // 50% von 1, 2 Stufen
  // @500 Hz
  analogWrite(0,1);
  delay(1);
  analogWrite(0,0);
  delay(1);
}
« Last Edit: March 05, 2013, 06:33:47 pm by Helmuth » Logged

Offline Offline
Edison Member
*
Karma: 15
Posts: 1060
ATmega 2560
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

ja, habe verstanden. Werde ich demnächst testen.
Logged

Tschau
Doc Arduino

Offline Offline
Edison Member
*
Karma: 15
Posts: 1060
ATmega 2560
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

ich habe mir das nochmal überlegt. Es ist schon wichtig zu wissen mit welcher Frequenz PWM aktuell taktet. Das sind normalerweise besagte 490Hz.
Dann hatte ich ja schon berechnet wie lang der PWM Impuls ist beim Ausgabewert 1. Besagte 8,0032µs Pulsbreite. Das heißt ich muß ein delay von 2µs einbauen. Oder reden wir aneinander vorbei?

Logged

Tschau
Doc Arduino

Europe / Germany
Offline Offline
Sr. Member
****
Karma: 13
Posts: 427
keep it simple
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wir reden aneinander vorbei. Probier mal den Code mit dem hässlichen delay aus, spiele ein bisschen mit den Werten rum und schau es Dir an. DU machst eine PWM zwischen 0 und 1, dass die 1 dabei durch eine ANDERE PWM entsteht, spielt keine Rolle. Du legst die Frequenz selbst fest.

Grüße
Logged

Offline Offline
Edison Member
*
Karma: 15
Posts: 1060
ATmega 2560
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Helmuth,

habe heute eine lange Leitung.  smiley  Hab's jetzt verstanden, ist ja ein nachgebautes Software PWM.
Logged

Tschau
Doc Arduino

Pages: 1 2 [3] 4   Go Up
Jump to: