Pages: [1]   Go Down
Author Topic: RGB LED Sternenhimmel  (Read 1671 times)
0 Members and 1 Guest are viewing this topic.
AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1125
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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);
}
« Last Edit: June 21, 2010, 01:26:25 pm by volvodani » Logged

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

0
Offline Offline
Full Member
***
Karma: 1
Posts: 236
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.




« Last Edit: June 21, 2010, 01:53:07 pm by willich » Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1125
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

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

"The old Europe"
Offline Offline
Edison Member
*
Karma: 1
Posts: 2005
Bootloaders suck!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
unsigned int T;
?

Logged

• 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!

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21251
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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,
Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1125
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

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

0
Offline Offline
Full Member
***
Karma: 1
Posts: 236
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 236
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1125
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

0
Offline Offline
Full Member
***
Karma: 1
Posts: 236
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich wette es ist nen schusseliger Tippfehler, den wir alle übersehen smiley-wink
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21251
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: June 22, 2010, 03:48:43 pm by uwefed » Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1125
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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);
}
Logged

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

0
Offline Offline
Full Member
***
Karma: 1
Posts: 236
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1125
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

Pages: [1]   Go Up
Jump to: