mit TLC5940 RGB LEDs ansteuern, Problem bei der Ansteuerung

Hallo zusammen,

ich stehe gerade etwas auf dem Schlauch und hoffe ihr könnt mir helfen.

Ich möchte RGB LEDs mit einem TLC5940 ansteuern hierfür verwende ich den Arduino Mega2560 und diese Library (klick). Ich habe mich durch das Beispiel BasicUse gearbeite und die Ansteuerung funktioniert auch prinzipiell.

Nun möchte ich aber den jeweiligen Channel mit einem Wert den ich als char (unsigned char RGB[10]; .) vom SerialPort lese ansteuern.

Ich habe hierzu folgende Funktion:

 void setRGBs()    //check: NUM_TLCS is defined in "tlc_config.h" in the library folder if ther are problems
 {  
   digitalWrite(21, HIGH);
  /* Tlc.clear() sets all the grayscale values to zero, but does not send
       hem to the TLCs.  To actually send the data, call Tlc.update() */
  Tlc.clear();
  for (int channel = 0; channel < 10; channel++)
  {
              Tlc.set(channel, map((unsigned long)RGB[channel], 0, 255, 0, 4095)); //map 0-255 to 0-4095 (8bit to 12bit)
  }  
   Tlc.update();
  
  digitalWrite(21, LOW);
 }

allerdings wird der Channel immer auf die maximale Helligkeit gesetzt => die Umrechnung funktioniert so nicht.

Kann mir jemand einen Tipp geben wo es hakt?

Pin 21 ist nur zum Überprüfen ob die Funktion setRGBs auch ausgeführt wird.

Grüße

Dies ist wieder einmal ein gutes Beispiel, wieso immer der ganze Sketch gepostet werden soll. Der Code-Ausschnitt ist nämlich nicht self-contained, d.h. er ist von externen (wahrscheinlich globalen) Variablen abhängig und von denen ist nichts ersichtlich.

Abgesehen davon ist die Umrechnung 8bit -> 12bit viel schneller, wenn Du einfach RGB[channel] << 4 nimmst. Ist dann zwar ein Mapping von 0-4080, aber das dürfte nicht wirklich relevant sein.

Das

  for (int channel = 0; i < 10; i++)

ist etwas merkwürdig, der Compiler müsste hier eigentlich reklamiert haben, aber wie gesagt, der Rest des Sketches fehlt. Mal geraten: Du wolltest immer channel anstatt i nehmen?

Bzgl. channel das war vorher i. Aber um es hier besser dazustellen hab ich es umbenannt aber scheinbar dabei geschlafen. (habe es oben ausgebessert)

außer unsigned char RGB[10]; was ich oben auch beschrieben habe gibt es global nichts was in dieser Funktion verwendet wird... Oder habe ich etwas übersehen?
Ist aber echt Lustig, in manchen Foren wollen sie nur den betreffenden Code in anderen alles. Da soll man es einem recht machen :wink:

Mapping habe ich auf RGB[channel] << 4 umgestellt, selbes Ergebniss.

Ist aber echt Lustig, in manchen Foren wollen sie nur den betreffenden Code in anderen alles. Da soll man es einem recht machen :wink:

Hier haben wir lieber den kompletten Sketch, da das Problem meist nicht dort verborgen ist, wo es der Poster vermutet. Wenn möglich, sind wir froh, wenn das Problem schon so eingegrenzt wird, dass der Sketch minimal wird, aber immer noch das gleiche Problem produziert, aber dazu sind die Hilfesuchenden häufig nicht in der Lage.

In Deinem Fall wäre interessant zu wissen, was denn in den RGB[]-Werten enthalten ist. Lese sie mal nicht von der seriellen Schnittstelle, sondern setze sie fest im Code und schau, ob die Umrechnung wirklich das Problem ist.

Ich habe das Problem jetzt gelöst, es war ein Problem beim Empfang habe es jetzt etwas umgebaut.

Hier noch der Code:

 #include "Tlc5940.h"

 #define MaxMessageSize 30
 const char Start = '!';
 const char Stop = '#';
 int bufferSize;
 char buffer[MaxMessageSize+1];
 unsigned char RGB[10][10][3];
 boolean newSerialData = false; 

 void setup()                                                          //hardware setup
 {
   Serial.begin(250000);
   //clear Buffer
   while(Serial.available())
     Serial.read();
        
   //TLC5940 init
   Tlc.init();
 }

 void loop()                                                            //main-loop
 {
   if(Serial.available() >= MaxMessageSize)
   {
     if(Serial.read() == Start)
     {
       for(int i = 0; i <= (MaxMessageSize-1); i++) //Message without Stop-Byte
       {
         buffer[i] = Serial.read();
       }
       
       //handle new serial Data
       if(Serial.read() == Stop)
       {
         addSerialRowToBuffer();
       }
     }
     else
     {
       //clear Buffer
       while(Serial.available())
         Serial.read();
     }
    }
    
   if(newSerialData)
   {
     setRGBs();
     newSerialData = false;
   }
 }
 
  //subroutines
 
 void addSerialRowToBuffer()
 {
   int g = 1;
   
   for (int j = 0; j < 10; j++)
   {
       for (int k = 0; k < 3; k++)
       {
           RGB[buffer[0]][j][k] = buffer[g];    //move data to RGB value
           g++;
       }
   }
   
   if(buffer[0] == 9)
     newSerialData = true;
 }
 
  void setRGBs()    //check: NUM_TLCS is defined in "tlc_config.h" in the library folder if ther are problems
 {
  int channel;
  /* 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.clear();
  for (int i = 0; i < 10; i++)
  {
      for (int j = 0; j < 10; j++)
      {
          for (int k = 0; k < 3; k++)
          {
             channel = ((i * 30) + (j * 3) + (k * 1)); //+1 because channels start at 1
                //Tlc.set(channel, 4089);
              Tlc.set(channel, ((int)(RGB[i][j][k] << 4))); //map 0-255 to 0-4095 (8bit to 12bit)
              Tlc.update();
          }
      }
  }  
  Tlc.update();
  delay(5);
 }

Allerdings habe ich noch Probleme mit der Ansteuerung der TLCs (19 Stück). Manchmal kommen die Daten an, manchmal kommen falsche Daten an manchmal gehen die LEDs aus obwohl sie ein gehen sollten. Habe das TLC.update() in der for-Schleife auch schon weggelassen allerdings gab das mehr Probleme. Hat jemand nen Tipp?

Wie versorgst Du die LEd und welchen LED-Strom hast Du eingestellt. Hast Du die jeweiligen Eingänge der 19 TLC alle paralellgeschaltet und je ein einsamer Arduino -Ausgang muß alle treiben???
Grüße Uwe

Eben, 16 RGB-LEDs x 3 x 0,02A = 0,96A plus was der TLC selber braucht. Das macht 1A pro TLC!
Wenn du da nicht an jedem IC einen KerKo und einen kleinen Elko nahe an den Versorgungspins anordnest und direkt von Chip zu Chip mit Masse und Ub gehst, dann kommst du auf keinen grünen Zweig. Und der von Uwe angesprochene Bus sollte IC für IC erweitert werden, damit man mitbekommt, wann Ende Gelände ist. Ich kann nur für den 74HC595 sprechen, aber 6 Stück davon sind kein Problem. Die sitzen aber auch fast Gehäuse an Gehäuse, damit sind die Leitungslängen minimal.

Gruß Gerald

nix_mehr_frei:
Eben, 16 RGB-LEDs x 3 x 0,02A = 0,96A plus was der TLC selber braucht. Das macht 1A pro TLC!
Wenn du da nicht an jedem IC einen KerKo und einen kleinen Elko nahe an den Versorgungspins anordnest und direkt von Chip zu Chip mit Masse und Ub gehst, dann kommst du auf keinen grünen Zweig. Und der von Uwe angesprochene Bus sollte IC für IC erweitert werden, damit man mitbekommt, wann Ende Gelände ist. Ich kann nur für den 74HC595 sprechen, aber 6 Stück davon sind kein Problem. Die sitzen aber auch fast Gehäuse an Gehäuse, damit sind die Leitungslängen minimal.

Gruß Gerald

@nix_mehr_frei: Entschulde da hast Du etwas zu großzügig gerechnet.
Der TLC5940 hat 16 Ausgänge und man kann nur 16 LED ansteuern. Ob diese einzeln sind oder je 3 in verschiedenen Farben im gleichen Gehäuse ist unerheblich.
Bei eingestellten LED-Strom von 20mA ist der Gesamtstrom pro TLC 16*20mA = 320mA. Bei 19 TLC sind das ca 6A !!!!

Ich tippe aber auf Probleme mit der Ansteuerung der TLC Eingänge da diese zum schalten zuvile Strom brauchen. Da helfen Bustreiber um die nötige Leistung zu bringen.

Grüße Uwe

Hallo zusammen,

sorry den Hardwareaufbau habe ich ganz vergessen da ich den Fehler in der Firmware vermute.

Die TLC sind über ein extra 5V (12A) Netzteil versorgt. Direkt nach dem Einspeisen der Spannung auf der Platine sind zwei 2200µF Elkos. An jedem TLC zwischen VCC und GND ein 100n Kerko. Zwischen den TLCs und dem Arduino ist noch ein 74HC245 Bustreiber. Nach diesem Bustreiber ist alles parallel bis auf den SIN/SOUT. Eingestellt sind die TLCs auf 40mA.

Hast Du pro TLC-Steuerleitung nur je einen Treiber geschaltet? Ich glaube nicht daß ein Treiber es schafft.
Grüße Uwe

Ja genau einen 74HC245. Ok dann werde ich da noch einen zweiten einbauen.

PS: das Problem zeigt sich am Steckbrett mit einem/zwei TLC direkt am Arduino aber auch.


Hast du, wie dort beschrieben, in der tlc_config.h NUM_TLCS angepasst? Ist meiner Meinung nach etwas unglücklich gelöst, das nicht im eigentlichen Sketch konfigurieren zu können.

Gruß Gerald

ja habe ich gemacht, habs mir sicherheitshalber auch im Sketch notiert :slight_smile: