64 RGB-LED Matrix, TLC5940, Leistungsversorgung

Wie willst Du die 12 TLC's den steuern ?

Alle 12 TLC in Reihe geschaltet durch eine MCU ?

Ja, hatte ich vor. Sollte der Arduino doch packen, oder?
Hoffentlich habe ich mir das nicht zu einfach vorgestellt... :blush:

Habe mal über ein ähnliches Projekt nachgedacht.

Das durchschieben der Daten durch 12 TLC's benötigt allerdings seine Zeit.

Kam dann auf die Idee mit 4 Atmega328 jeweils 3 TLC's und 2 RGB Matrixen zu steuern.

Alle 4 so programmiert das Sie die Daten für die Darstellung aus einem EEPROM auslesen, also nur mit dem Multiplexen und der Darstellung beschäftigt sind.

Während ein 5. Atmega328 die Daten im EEPROM konstant aktualisiert !

Hmm, danke für deinen Hinweis...
So wie du das beschreibst übersteigt das sicherlich meinen Horizont.

In welcher Größenordnung würdest du denn die Zeit einschätzen, die für die Reihenschaltung benötigt wird?
Ich habe auch weniger vor, mit der Matrix hoch-dynamische Vorgänge abzubilden, es soll mehr als Effektbeleuchtung dienen.
Wenn es dann eine paar ms verzögerte Darstellung gibt dürfte es mich (hoffentlich) nicht stören.

http://www.arduino.cc/playground/Learning/TLC5940

Damit die Darstellung flackerfrei wird brauchst Du mindestens 60Hz -> 60 * 8 Zeilen -> 480 mal pro Sekunde muss die Darstellung aktualisiert werden !

Bei der oben genanten Bibliothek würden die Daten vom ersten in den zweiten, vom zweiten in den dritten TLC etc. weitergeschoben. Also 12 Cyclen pro Zeile, keine Ahnung wieviele ms ein Cycle braucht.

Es werden 192 Bit proTLC verschickt (16 mal 12 bit) und das mit 1/4 des Prozessortackts (SPI).
Meine Erfahrung mit einer 6x5 Matrix ist daß ich eine Wiederholfrequenz pro LED von 100Hz habe also eine Multiplexfrequenz von 600Hz
@Megaionstorm
Ich verstehen Deine Rechnung nicht, wie kommst Du auf 60Hz? wollt Ihr Fernsehbilder ausgeben?
Grüße Uwe

Mit einem TLC kannst Du z.B. die blauen Leds in einer Zeile von zwei Matrixen steuern.

Schon überlegt womit Du zwischen den Zeilen hin- und herschalten willst ?

Hmm, ich hoffe ich habe da keinen Denkfehler drin, aber ich haber gar nicht vor die Matrix im Multiplexbetrieb anzusteuern sondern einfach jede LED seperat...

Wieviele Matrixen sollen es den insgesamt sein ?

Eine Matrix mit 8x8 RGB LEDs.

Bei der Verwendung von nur einer RGB-Matrix würde ich 3 TL5940 einen 74HC595 nehmen und mich für eine Common Anode RGB-Matrix entscheiden.

Ist wesentlich günstiger !

Der 595 bringt nicht den Sttrom um die Anoden ansteuern zu können; Du brauchst zusätzliche einen A2983.
Grüße Uwe

Der 595 bringt nicht den Sttrom um die Anoden ansteuern zu können; Du brauchst zusätzliche einen A2983. Grüße Uwe

3 TLC5940 und ein 74HC595 !

#include "Tlc5940.h"

char* Frame;
int Light1[48] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int Light2[48] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
byte Rot[128] = {255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,
                 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                 255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,
                 255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,
                 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                 255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte Gruen[128] = {255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,
                   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                   255,155,255,155,255,155,255,155,0,0,0,0,0,0,0,0,
                   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                   255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,
                   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                   255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte Blau[128] = {255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,
                  255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
byte Zaehler;
int Zufall;
byte Zufall2;
byte inByte;
long Zeit1;
long Zeit2;
byte Neu;
byte Alt;
int Sekunden;
byte MatrixZeile;
const int latchPin = 8; // digital Pin 8 connected to 74HC595 latch pin (ST_CP, Pin 12)
const int clockPin = 6; // digital Pin 6 connected to 74HC595 clock pin (SH_CP, Pin 11)
const int dataPin = 7;  // digital Pin 7 connected to 74HC595 Data in (DS, Pin 14)

void setup()
{
   Zufall = 0;
   Neu = 0;
   Alt = 0;
   Zeit1 = 0;
   Zeit2 = 0;
   Tlc.init();
   Tlc.clear();
   Tlc.update();
   randomSeed(analogRead(0));
   pinMode(latchPin, OUTPUT);
   pinMode(dataPin, OUTPUT);  
   pinMode(clockPin, OUTPUT);
}

void loop() {
  byte LedNr;
  Tlc.clear();
  for (MatrixZeile = 0; MatrixZeile <= 7; MatrixZeile++)
  {
    for (LedNr = 0; LedNr <= 15; LedNr++)
    {
      Tlc.set(LedNr, (Rot[MatrixZeile * 16] + LedNr) / 2);
    }
    for (LedNr = 16; LedNr <= 31; LedNr++)
    {
      Tlc.set(LedNr, Gruen[(MatrixZeile * 16) + (LedNr - 16)]);
    }    
    for (LedNr = 32; LedNr <= 47; LedNr++)
    {
      Tlc.set(LedNr, Blau[(MatrixZeile * 16) + (LedNr - 32)]);
    }    
    registerWrite(MatrixZeile, HIGH);
    Tlc.update();
    delayMicroseconds(500);
  }
}

// This method sends bits to the shift register:

void registerWrite(int whichPin, int whichState) {
// the bits you want to send
  byte bitsToSend = 0;

  // turn off the output so the pins don't light up
  // while you're shifting bits:
  digitalWrite(latchPin, LOW);

  // turn on the next highest bit in bitsToSend:
  bitWrite(bitsToSend, whichPin, whichState);

  // shift the bits out:
  shiftOut(dataPin, clockPin, MSBFIRST, bitsToSend);

    // turn on the output so the LEDs can light up:
  digitalWrite(latchPin, HIGH);

}

Der Code ist übrigens für 2 Matrixen ausgelegt !

Bei der von mir benutzen Matrix handelt es sich um eine 60mm square 8*8 LED Matrix - super bright RGB (circle).

http://iteadstudio.com/store/index.php?main_page=product_info&cPath=35_37&products_id=189

Wie heiß wird der 595?
Grüße Uwe

Hallo Uwefed,

der 74HC595 ist auch nach einer Laufzeit von 30 Minuten immer noch so kalt wie vor dem Einschalten !

Ich hab mir mal kurz den Code angeschaut.

Du hast keine Kontrolle eingebaut, wie hoch die Multiplexzeit ist. Das kann zu flackern führen, da die neue Zeile nicht synchronisiert zur PWM Zyklus übertragen/weitergeschlaltet wird.

Ich rate Dir die TLC5940Mux Bibiothek zu verwenden. Mini Monome unter Arduino Firmware. Diese muß aber angepasst werden, weil sie für eine 4x4 Matrix ausgelegt ist und die Zeile direkt über Transistoren ansteuert. Du müßtest die 595 Ansteuerung hinzufügen und die Anzahl der TLC auf 3 setzen. In wenigen Worten an die Bibiothek ist massiv Hand anzulegen.

Grüße Uwe

Das kann zu flackern führen ...

Da hast Du sogar sehr recht.

Deshalb habe ich die Zeile delayMicroseconds(500) eingefügt.

Bei jedem anderen Zeitwert kommt es zu einem Flackern, dazu reicht schon eine Erhöhung oder Veringerung um 5 Microseconds aus !

Ich hatte schon die Erfahrung mit dem Flackern gemacht, da ich beim Aufbau einer TIX-Uhr mit den Monome inspirierten Silikontasten von Sparkfun bin (baue gerade das Möbel), Rest ist fertig.

Der TLC5940 hat keine automatische PWM Zyklus Steuerung wie zB ein MAX7219 (7 segment Display 8 Stellen LED Treiber). Man muß ihm den Takt geben und jeden Zyklus nach 4096 durch einen Impuls am BLANK wieder starten. Wenn man nun nach x Zyklen die Daten für die nächste Zeile überträgt und die betreffende Zeile aktiviert und dann wieder x Zyklen macht kommt kein Flackern zustande. Genau das macht die TLC5940MUX - Bibiothek.

Grüße Uwe