Go Down

Topic: RGB LED Sternenhimmel (Read 1 time) previous topic - next topic

volvodani

Jun 21, 2010, 08:23 pm Last Edit: Jun 21, 2010, 08:26 pm by volvodani Reason: 1
Hallo liebes Forum,
ich hab schon einige Erfahrung mit dem Arduino jetzt habe ich folgendes Problem.
Ich steuere  mit einem Arduino MEGA mit den ersten 3 PWM über 3 Darlington Array des ULN2803 (TTL-Version) 3 RGB LED die gegeneinander verschaltet sind
1 Kanal    LED1 R, LED2 G, LED3 B,
2 Kanal    LED1 G, LED2 B, LED3 R
3 Kanal    LED1 B, LED2 R, LED3 G,

Ich steuer das mit folegenem Code an und Fade damit zwischen den einzelnen Kanälen hin und her. Es Funktioniert solange Zähler T< 500 ist sobald der Zähler >500 bekommt  Der Arduino ein Pulsen im ca 1 Sekunden Takt auf allen PWM´s den man mit dem Auge wahrnimmt (Es ist aber kein blinken sondern Pulsen. Ausgeschlossen ist die Stromversorgung ich hab max 100mA beim dimmen. Mit USB bzw 1,6A Netzteil gleiches Bild.)
Die Programm kann doch nicht mit der Geschwindigkeit des Mega 1280 liegen. DIe ULN2803 Array haben eine anstiegszeit von max 1µs laut datenblatt das wären 100kHZ.
Ich brauche ein paar anstöße von euch.Ich will einen "Sternenhimmel" bauen mit diesem Fadeeffekt kann das aber mit dem Pulsen nicht gerbauchen.

Code: [Select]
int Rval=250;
int Gval=5;
int Bval=5;
int Rout=2;
int Gout=3;
int Bout=4;
unsigned long interval=120;
unsigned long pMillis;
int T=0;

void setup (){
 pinMode(Rout,OUTPUT);
 pinMode(Gout,OUTPUT);
 pinMode(Gout,OUTPUT);
}

void loop(){
 if(millis()-pMillis > interval){
   pMillis=millis();
   T++ ;
   if (T>=0 && T<=250){
     Rval--;
     Gval++;
   }
   if(T==250){
     delay(1000);
   }
   if (T>=251 && T<=500){
     Gval--;
     Bval++;
   }
   if(T==500){
     delay(1000);
   }
   if (T>=501 && T<=750){
     Rval++;
     Bval--;
   }
   if(T==750){
     delay(1000);
   }
   if (T>=751){
     Rval=250;
     Gval=5;
     Bval=5;
     T=0;  
   }
 }
 analogWrite(Rout,Rval);
 analogWrite(Gout,Gval);
 analogWrite(Bout,Bval);
}

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Pumbaa

#1
Jun 21, 2010, 08:44 pm Last Edit: Jun 21, 2010, 08:53 pm by willich Reason: 1
Bin grad zu faul GENAU durchzudenken.
Aber der Fall T=250/500/750/1000 erfüllt jeweils 2 ifBedingungen.
check das mal eben.

EDIT: Oh, und deine außen-ifabfrage geht alle 120ms an.
Aber zwischendurch wartest du ab und zu mal ne Sekunde. Das ist auch unrund, denke ich.





volvodani

Das soll jau auch so sein mit den If-Befehlen ich will das bei T=250 ein letztemal incementiernt bzw decrementiert wird und wenn dass dann bei 250 pasisiert ist noch ne 1 sek da verharen bevor man weiter geht.
Wenn ich das Warten auf 251 setzte un den rest anpasse 252 bis 502 503 watren etc. Dann bleibt es so. Dies flacken ist nur beim tatsächlichen faden als ob der zwischendurch (1 oder 2 Zyklen eine 0 schriebt).

Frage wie lange "dauert" es den Befehl Analog.Write auszuführen mehr als ein Zyklus?
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

madworm

• Upload doesn't work? Do a loop-back test.
• There's absolutely NO excuse for not having an ISP!
• Your AVR needs a brain surgery? Use the online FUSE calculator.
My projects: RGB LED matrix, RGB LED ring, various ATtiny gadgets...
• Microsoft is not the answer. It is the question, and the answer is NO!

uwefed

Hallo volvodani

Ich würde die 3 anlaogWrite - Anweisungen innerhalb der if(millis()-pMillis > interval){ - Schleife vor der abschließenden Klammer geben.

Diese Anweisugen müssen nur einmal gemacht werden und nicht andauernd wie Du es machst. Ich weiß nicht ob die in kurzen Abständen wiederholte Anweisungen nicht schlecht funktionieren, weil die Initialisation etwas Zeit beansprucht und sie Du dann schon wieder wiederholst.

Grüße Uwe,

volvodani

unsigned int T brauch ich nicht da ich den Zähler T nur bis maximal 751 Zähle um ihn dann wieder auf 0 zu setzten. int kann ich dann bis 32.767 zählen und bis dahin komme ich nicht.
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Pumbaa

Quote
Frage wie lange "dauert" es den Befehl Analog.Write auszuführen mehr als ein Zyklus?

Wenn du mit Zyklus deine 120ms meinst, dann Nein.
Wenn du mit Zyklus einen Prozessortakt meinst, dann ja.

Pumbaa

Um noch mal Uwe aufzugreifen.
Die writes in die Schleife, würde ich auch sagen.
Wenn du die mit mordstempo wiederholst, fängt der ja immer wieder mit dem PWM-Takt an.

zB: die PWM sollte so aussehen: 1111000000 11110000000
Wenn du aber nun andauernd den Writebefehl neu gibst passiert:
1111000 (jetzt neu da Loop durch) 1111000 (Jetzt neu) 11110000

volvodani

So jetzt habe ich die analog Write mit in die Schleife gebracht. Es hat sich leider nichts verändern. Wenn ich jetzt das Testprogramm aus den Wxampels für den AnalogWrite vom MEGA nehme habe ich keine Porbleme damit. Werde mal versuche das mit for Schleifen zu versuch  incl der Delays
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Pumbaa

Ich wette es ist nen schusseliger Tippfehler, den wir alle übersehen ;)

uwefed

#10
Jun 22, 2010, 10:07 pm Last Edit: Jun 22, 2010, 10:48 pm by uwefed Reason: 1
Hallo volvodani
Hallo Pumbaa

Ich weiß nicht in welche Kategorie von Fehlern man das geben soll. Sicher in die: "das hätte ich sehen müssen".

Die Ausgänge 2 und 4 sind keine PWM Ausgänge.

PWM ist auf folgenden digitalen Ausgängen möglich: 3, 5, 6, 9, 10 und 11.

http://arduino.cc/en/uploads/Main/ArduinoDuemilanove.jpg
und
http://arduino.cc/en/Main/ArduinoBoardDuemilanove

Grüße Uwe

Nachtrag

Ich ziehe alles zurück
Ich hatte nicht gelesen, daß volvodani einen Arduino Mega hat.
Da sind die Pins 2, 3, und 4 PWM fähig

Grüße Uwe

volvodani

So liebe Leute da das mit den for schleifen mal voll in die Hose gegangen ist. (Nach Erfüllung der Bedingungen der for schleife bis zum nächsten kontrollieren der Bedingungen schreibt er die Ausgänge auf null bzw auf irgendwelche nicht genauer zu definierenden Werte.)
Ich habe mich nochmal mit meinem Alten Programm versucht und es funktioniert perfekt. Hier ist das Finale Programm. Die Hauptänderung ich habe die Kompletten Setup Definitionen rausgenommen da es sich beim kompilieren des Programmes selbst ergibt und ich habe die PWM Ausgänge geändert und das scheint das Hauptproblem zu sein da die Augänge alle vom selben internen Timer kamen hatte er Porbleme mit der Geschwindigkeit des setzten der einzelenen PWM-Out Frequenzen das sich in so einem Pulsen deutlich machte. Auf unterschiedlichen intenen Timers funktioniert es perfekt.

Code: [Select]
unsigned int Rval=255;
unsigned int Gval=0;
unsigned int Bval=0;
unsigned long interval=10;
unsigned long pMillis;
int T=0;

void setup (){
 //nothing for setup  
}

void loop(){
 if(millis()-pMillis > interval){
   pMillis=millis();
   if (T>=0 && T<=255){
     Rval=Rval-1;
     Gval=Gval+1;
     Bval=0;  
   }
   if (T>=255 && T<=510){
     Rval=0;
     Gval=Gval-1;
     Bval=Bval+1;
   }
   if (T>=510 && T<=765){
     Rval=Rval+1;
     Bval=Bval-1;
     Gval=0;
   }
   if (T>=765){
     T=0;  
     Bval=0;
     Gval=0;
     Rval=255;
   }
   T=T+1 ;  
 }
 analogWrite(2,Rval);
 analogWrite(7,Gval);
 analogWrite(12,Bval);
}
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Pumbaa

Ja fein.
Als addenum fällt mir noch ein: Farbwahrnehmung is Logarithmisch. Evtl ne logtabelle benutzen, damit das Faden linear "erscheint".

volvodani

Das habe ich mir auch schon gedacht ich habe schonmal tabellen s
gesehen mit welchen werten man in 8 Bit-Raum das "linear"für Auge steuert
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Go Up