seriell Arduino Daten für TLC5940 geben...

Moin Arduinogemeinde,

ich baue seit einiger Zeit eine 8x8 Led Matrix mit 64 Leds , 4 Tlc5904 und einem Arduino Duemilanove… Ich bin gerade dabei ein Programm für den Arduino zu schreiben. Mit dem Programm versuche ich die einzelnen Leds einzeln anzusteueren, die Informationen sollen dem Arduino über den Serial-Monitor gegeben werden. Die Zahlen 0-63 schalten die Leds ein und 64-127 die Leds aus. Leider funktioniert das Programm nicht wirklich richtig und verbesserungsfähig ist es auch noch. Ich hoffe ihr könnt mir helfen…

Hier der Code:

int incomingByte;      

#include "Tlc5940.h"

void setup()
{
  Serial.begin(9600);
  Tlc.init();
  Tlc.clear();
}

void loop()
{
  int direction = 1;
  for (int channel = 0; channel < NUM_TLCS * 16; channel += direction) {

   

    if (Serial.available() != 0) {
 incomingByte = Serial.read();
 
  
  if (incomingByte == 0) {
      Tlc.set(0, 4095);
      Serial.write(incomingByte);
      delay(75);
    }
 
     if (incomingByte == 64) {
      Tlc.set(0, 0);
      Serial.write(incomingByte);
      delay(75);
    }
    
      
      
      if (incomingByte == 1) {
      Tlc.set(1, 4095);
      Serial.write(incomingByte);
      delay(75);
    }
 
     if (incomingByte == 65) {
      Tlc.set(1, 0);
      Serial.write(incomingByte);
      delay(75);
    }
    
      
      
      if (incomingByte == 2) {
      Tlc.set(2, 4095);
      Serial.write(incomingByte);
      delay(75);
    }
 
     if (incomingByte == 66) {
      Tlc.set(2, 0);
      Serial.write(incomingByte);
      delay(75);
    }
 
 Tlc.update();
 delay(75);
  }
  
  }

Gruß Jonas

Hallo Fujitsu313
Hab nicht verstanden wie Du die 4 TLC5940 auseinanderhalten willst. Ok verstanden, sie werden hinereinander geschaltet und die Bibliothek macht den Rest. Du mußt einen Wert in der Library löschen wie hier beschrieben http://students.washington.edu/acleone/codes/tlc5940arduino/img/breadboard-arduino-tlc5940.png ( if using more than one tlc edit"NUM_TLCS" in tlc_config.h (located in the library folder) and delete Tlc5940.o)

Also das Programm müßte folgendermaßen funktionieren: ( habs aus Mangel an TLC5940 nicht praktisch ausprobiert). Du mußt immer eine 3-stellige Zahl eingeben also für 1 mußt Du 001 eingeben.

int incomingByte;   
char Data[4];
int i;

#include "Tlc5940.h"

void setup()
{
  Serial.begin(9600);
  Tlc.init();
  Tlc.clear();
}

void loop(){
 
   do {
     // Wenn Daten verfügbar 3 Zeichen in Data schreiben
     if (Serial.available()) {
       Data[i] = Serial.read();
       i++;
     }
   } while (i<3);
  
   // Abschließende Null für gültigen String
   Data[i] = 0;    
  
   incomingByte = atof(Data);  // wert von String zu Zahl wandeln
   i=0;
   
if (incomingByte >= 0 && incomingByte < 64) {  // schaltet das LED ein
      Tlc.set(incomingByte, 4095);
      Serial.print("led: "); 
      Serial.print(incomingByte);
      Serial.println(" on"); 
      delay(75);
      Tlc.update();
      delay(75);
    }
if (incomingByte >= 64 && incomingByte < 128) {  // schaltet das LED aus
      Tlc.set((incomingByte-64), 0);
      Serial.print("led: ");
      Serial.print(incomingByte-64);
      Serial.println(" off"); 
      delay(75);
      Tlc.update();
      delay(75);
    }
if (incomingByte < 0 || incomingByte >=128) {  // unzulaessige Werte macht nichts und gibt Warnung an Terminal aus
      Serial.println("Warnung unzulaessiger Wert");
      }

}

Hey Uwe.

Vielen Dank, das war die Lösung und ja ich hatte vergessen zu erwähnen dass die 4 TLCs in Reihe geschaltet sind.

Das mit dem NumTlc weiß ich, hab ja irgendwie versucht nen Code zu basteln...

Gruß Jonas

Noch was
mit dieser do-while-Schleife kannst Du jetzt auch ein und 2 stellige Zahlen übertragen.

 do {
     // nach dem ersten Zeichen 0,5 Sekunden warten für die restlichen Zeichen oder maximal 7 übertragene Zeichen
     if (Serial.available()) {       
       Data[i] = Serial.read();
       i++;
       }     
     if(i<1)Zeit = millis(); 
     } while (i<7&&(millis()-Zeit) < 500);

Okay, aber der Code funktioniert nicht, was wird denn mit Zeit gemeint? die wurde nirgendwo deklariert..

Gruß

ups; Da hast Du recht.
nochmal den ganzen sketch:

int incomingByte;   
char Data[8];
int i;
unsigned long Zeit;

#include "Tlc5940.h"

void setup()
{
  Serial.begin(9600);
  Tlc.init();
  Tlc.clear();
}

void loop(){
   do {
     // nach dem ersten Zeichen 0,5 Sekunden warten für die 
     // restlichen Zeichen oder maximal 7 übertragene Zeichen
     
     if (Serial.available()) {       
       Data[i] = Serial.read();
       i++;
       }     
     if(i<1)Zeit = millis(); 
     } while (i<7&&(millis()-Zeit) < 500);
  
   Data[i] = 0;     // Abschließende Null für gültigen String
  
   incomingByte = atof(Data);  // Wert von String zu Zahl wandeln
   i=0;
   
if (incomingByte >= 0 && incomingByte < 64) {  // schaltet das LED ein
      Tlc.set(incomingByte, 4095);
      Serial.print("led: "); 
      Serial.print(incomingByte);
      Serial.println(" on"); 
      delay(75);
      Tlc.update();
      delay(75);
    }
if (incomingByte >= 64 && incomingByte < 128) {  // schaltet das LED aus
      Tlc.set((incomingByte-64), 0);
      Serial.print("led: ");
      Serial.print(incomingByte-64);
      Serial.println(" off"); 
      delay(75);
      Tlc.update();
      delay(75);
    }
if (incomingByte < 0 || incomingByte >=128) {  // unzulaessige Werte macht nichts und gibt Warnung an Terminal aus
      Serial.println("Warnung: unzulaessiger Wert");
      }

}

Grüße Uwe

Wow, vielen Dank..Jetzt versteh ich auch wie ich das anstellen soll, aber das mit dem Delay stört was, wenn ich das entfernen würde, würde dann irgendwann der TLC kaputtgehen?

Hallo Fujitsu313
ohne DELAY(75)
Nein, der TLC geht nicht kaputt; das was passieren kann, ist ,daß der TLC keine Daten annimmt, weil die Daten zu schnell kommen. Oder (noch schlimmer zu finden) daß hie und da geht und die anderen male nicht.
Grüße Uwe

Vielen Dank, hat alles geklappt :)

Also danke an Uwe erstmal genau so etwas habe ich gesucht ich den code mal auf meine rgb led mit 3 Tlc übernommen und die tlc config halt auf 3 TLC eingestelt. und somit an 16 rgb leb an geschlossen ok soweit geht es bei 0 geht rote led an bei 64 wieder aus . kann mann auch sagen das von 0 -15 ist ja rot 16- ist gelb das mann in der eingabe sagt 0 bis 16 alle an. gruss Tronig

Hallo ich habe auch einmal eine frage.
Ich beschaeftige mich seit kurzem mit dem tlc und habe schon mal einen basiscode geschrieben.
damit kann ich halt jeder 3. lampe einen eigenen wert geben.
(100,500,1000,100,500,1000,100 etc…)
jetz wollte ich einen RGB fader auf der basis dieses implementieren aber irgendwie funktioniert es nicht …
kann mir irgendwer bei der fehlersuche helfen?

Standartcode

#include “Tlc5940.h”
int Poti1=0;
int R;
int Poti2=5;
int G;

void setup()
{
/* Call Tlc.init() to setup the tlc.
You can optionally pass an initial PWM value (0 - 4095) for all channels.*/
Tlc.init();
pinMode(Poti1, INPUT);
pinMode(Poti2, INPUT);

}

void loop()
{
int direction = 1;
for (int channel = 0; channel < NUM_TLCS * 16; channel += direction) {

/* Tlc.clear() sets all the grayscale values to zero, but does not send
them to the TLCs. To actually send the data, call Tlc.update() */

/* Tlc.set(channel (0-15), value (0-4095)) sets the grayscale value for
one channel (15 is OUT15 on the first TLC, if multiple TLCs are daisy-
chained, then channel = 16 would be OUT0 of the second TLC, etc.).

value goes from off (0) to always on (4095).

Like Tlc.clear(), this function only sets up the data, Tlc.update()
will send the data. */

R=analogRead(Poti1);
G=analogRead(Poti2);

for (int channel = -1; channel < 30; channel +3) {
Tlc.set(channel + 1, 100);
Tlc.set(channel + 2, 500);
Tlc.set(channel + 3, 2000);
channel = channel+3;
Tlc.update();
}
Tlc.set(channel + 1, 100);
Tlc.set(channel + 2, 500);
Tlc.update();

channel= 0;

/* Tlc.update() sends the data to the TLCs. This is when the LEDs will
actually change. */

delay(100);
}

}

und hier der Fader…

unsigned int Rval=255;
unsigned int Gval=0;
unsigned int Bval=0;
unsigned long interval=50;
unsigned long pMillis;
int T=0;
#include “Tlc5940.h”

void setup (){
Tlc.init();
}

void loop(){

int direction = 1;
for (int channel = 0; channel < NUM_TLCS * 16; channel += direction) {

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 ;
}

for (int channel = -1; channel < 30; channel +3) {
Tlc.set(channel + 1, Rval);
Tlc.set(channel + 2, Gval);
Tlc.set(channel + 3, Bval);
channel = channel+3;
Tlc.update();
}
Tlc.set(channel + 1, Rval);
Tlc.set(channel + 2, Gval);
Tlc.update();
channel= 0;

}

}