Unbekannte Anzahl an TLC5940NT

Liebes Team!
Lieber Doc!
Nach langer Arduino Abstinenz melde ich mich wieder zurück, und das gleich mit einer Frage:
Ich plane ein "Spielbrett", dass man zusammenstecken kann.
In jedem der Spielbretter ist ein TLC5940NT verbaut, dass LED in einer bestimmten Reihenfolge schaltet (vielleicht später auch Motoren, mal sehen was geht).
Alle Bretter sollen gleichzeitig erst die LEDs 1-9 nach einer Pause die LEDs 9-12 und nach einer weiteren Pause die LEDs 12-16 einschalten.
Also bei allen Brettern leuchten gleichzeitig die 1-9, dann die 9-12 und dann die 12-16er LEDs.
Alle Bretter machen also das gleiche!
So weit bisher recht einfach (glaube ich).
Ich denke, die Programmierung bekomme ich hin.
Nun das Problem:
Ich weiß NICHT, wie viele Spielbretter zu Spielbeginn zusammengesteckt werden!
Es können 4 sein (kleinstes Brett), oder es geht bis 20 (mehr passen nicht auf den Tisch).
Soweit ich weiß, muss ich die Anzahl der TLC5940 vorher in der Datei tlc_config.h festlegen.

Meine Frage:
Kann ich die Anzahl der TLC5940 auch im Code einstellen?
Dann könnte ich das durch einen Knopfdruck eingeben und müsste nicht für jede Spielrunde einen neuen Code einspielen.

Könnt ihr mir da helfen?
Vielen Dank und einen gute Rutsch
Tiff

Klingt so, als wolltest du die komplett parallel betreiben.
Aus Sicht des Arduino ist es dann nur eins, dessen SOUT nicht verwendet wird.

Da bin ich echt beruhigt. Danke! :slight_smile:
Ginge es denn auch, wenn die Treiber verschiedenes machen sollten?

Wenn 2 oder 3 TLC5940 jeden ihrer 32 oder 48 Kanäle unterschiedlich ansteuern sollen, sollte dein Sketch schon wissen, ob es 32 oder 48 sind. Kannst ja immer die max. Anzahl vorsehen.

Wenn du in deiner lib mehr TLC ansteuerst als tatsächlich in der Kette hängen, stört das nicht, denke ich.
(Ohne Gewähr)

Aber: Wenn du im laufenden Betrieb Module hinzufügst, solltest du das elektromechanisch sehr ordentlich machen. Wie stellst du sicher, dass erst GND, dann Vcc, dann Signalpins Kontakt bekommen und auch behalten, während du am Tisch herumhantierst?

Paralellschalten ist vom Punkt der Daten kein Problem. Alle TLC bekommen die gleichen Daten (BLANK, GSCLK, SCLK, SIN, XLAT, eventuel DCPRG und VPROG). Also der Sketch bleibt gleich egal ob es 1 oder 20 TLC sind. Vom Elektrischen sieht die Sache anders aus. 4 Eingänge brauchen einen anderen Strom als 20 Eingänge. Es ist möglich, daß die Arduino-Ausgänge nicht genügend Strom leifern können. Notfalls braucht es einige Bustreiber.

Reihenschaltung:
Das Problem mit der Pinbelastung ist das selbe außer dem Datenpin welches von TLC zu TLC geführt wird und deshalb am Arduino nur 1 Daten-Eingang hängt die anderen Signale gehen paralell an alle TLC. Hier braucht es auch gegebenenfalls Bustreiber. Softwaremäßig braucht es pro TLC jeweils einen Datensatz (PWM-Daten für die 12 x 16 bit) gegebenfalls noch falls verwendet auch Dot Correction (6 x 16 bit).
Die Module müssen Sout herausführen und dieser Pin muß zu Sin des nächsten Spielbrett zu führen. Der Sketch muß die Daten für 20 Spielbretter senden wobei die letzten Daten beim ersten Spielbrett landen. Man kann ruhig zuviel Daten hinaussenden. Wenn man verschiedene Anzeigen haben will muß man das überlegen wie verschiedene Daten geschickt erstellt werden können daß bei unterschiedlicher unbekannter Anzahl von Spielbrettern ein sinnvolles Risultat herauskommt.
Eventuell ist der Speicherplatz der Daten die an die TLCs verschickt werden im Auge zu behalten, daß dieser Wert nicht größer als der mögliche Speicherplatz wird.

Grüße Uwe

Es ist möglich, daß die Arduino-Ausgänge nicht genügend Strom leifern können

Ich meine, was von 1 mA gelesen zu haben. Das würde dann für 20 Module reichen.

Solange es um parallel-Schaltung geht: An 1 Channel können auch mehrere LED gehängt werden (in Reihe "beliebig" je nach Versorgungsspannung der LED und 60 mA (z.B. 3*20mA) parallel.

michael_x:
Ich meine, was von 1 mA gelesen zu haben. Das würde dann für 20 Module reichen.

Solange es um parallel-Schaltung geht: An 1 Channel können auch mehrere LED gehängt werden (in Reihe "beliebig" je nach Versorgungsspannung der LED und 60 mA (z.B. 3*20mA) parallel.

Nicht beliebig. Die Versorgungsspannung der LED darf 17V betragen.

C-Mos Bausteine verbrauchenStatisch gesehen eigentlich keinen Strom (außer dem Leckstrom in der Größenordnung von µA) dynamisch aber schon( bei Zustandsänderungen müssen aber die Kabel und die verschiedenen Eingänge geladen/entladen werden).

Grüße Uwe

Hallo,

der TLC5940 hat praktisch einen SPI Bus. Die ICs selbst arbeiten praktisch autonom, benötigen nur Daten wenn Einstellungen geändert werden sollen. Je nach Größe vom Tisch und damit Buslänge könntest du den SPI Takt senken.

Wegen dem Problem der unbekannten Anzahl der Steckbretter. Man könnte sich ein Kodiersystem ausdenken welches dem µC mitteilt wieviele Bretter angesteckt sind. Nach einem Hardreset sollte eine neue Konfiguration übernommen werden. Falls das zu aufwendig ist, könnte man eine Einstellmöglichkeit am Controller selbst vorsehen. Jumperbrücken oder ähnliches.
Wenn kein weiteres Display vorhanden ist oder vorhanden sein soll, könnte man auch mittels Poti und den zum Zeitpunkt vorhandenen Led Bretter eine optische Rückmeldung über die Einstellung programmieren. Die Potiunterteilung ist immer auf max. 20 Bretter vorbereitet, auf dem ersten Brett stellt man mittels Poti die Anzahl der Bretter ein, in dem man die Anzahl der LED mittels Poti auswählt. Also Poti könnte man einen einen Drehencoder verwenden. Kannste auch per Taster machen, jedes drücken zählt eine Led dazu und springt von 20 wieder auf 1. Du hast viele Möglichkeiten dafür.

Zur Lib. Wenn ich mir auf Github die von Sparkfun und Paul Stoffregen anschaue, dann sind die doch identisch? Sind alle schon horn alt. Macht es nicht einfacher. Man müßte eigentlich nur die Anzahl der benötigten Objekte erstellen die nicht eigenständig SlaveSelect schalten, sondern man macht das selbst in seinem Code, weil alle ICs per Daisy Chain verschalten sind bzw. sein müssen.

Mal laut weitergedacht. Benötigt man dafür eine Lib? Sicherlich und eigentlich auch wiederum nicht. Per Bitbanging legt man alle Daten in einen eigenen Buffer der dann rausgetaktet wird. Die Größe des Buffers, die Anzahl der Bytes, richtet sich nach der Anzahl der Bretter.
Bei einer Lib mit Anzahl von Objekten müßte dann jede "Datenrausschieb-Methode" nacheinander aufgerufen werden. Kann man sicherlich machen und halten wie Nolte. Das Ergebnis ist immer gleich, CS schalten, Bitstream raus, CS schalten. Soviel zu meinen Vorüberlegungen.

Edit:
Habe mir paar Libs angeschaut. Keine bietet eine Möglichkeit im Kontruktur o.ä. die Anzahl der ICs vorzugeben. Ging das damals mit C++ noch nicht? Man könnte überlegen die Lib zu überarbeiten.

der TLC5940 hat praktisch einen SPI Bus. Die ICs selbst arbeiten praktisch autonom, benötigen nur Daten wenn Einstellungen geändert werden sollen. Je nach Größe vom Tisch und damit Buslänge könntest du den SPI Takt senken.

Nein.
Der TLC5940 braucht ein Impuls auf BLANK und dann 4096 Impulse auf GSCLK. Das heißt er führt den PWM-Zyklus nicht automatisch durch sondern der PWM Zyklus wird von der Steuerung, in unserem Fall zB ein Arduino, getriggert bzw synchronisiert. Also ohne Ansteuerung macht der TLC kein PWM.

Braucht man das nicht (Synchronisation zB in einer LED-Matrix) nimmt man besser den TLC5947. Der hat einen internen Taktgenerator für das PWM Signal und zusätzlich als Bonus 24 LED-"Ausgänge" statt nur 16. Leider Gibt es den TLC5947 nicht im großen DIL Gehäuse sondern nur in SMD. Dafür gibt es aber dann Module.

Der Datentrasfer ist bei beiden gleich.

Und Nein; es ist kein SPI -Bus. Es fehlt das SS/EN Signal. Man kann Daten nicht gezielt auf einen TLC schicken, wenn diese Paralellgeschaltet sind. (Sin alle zusammengeschaltet). Um Daten gezielt aut einen TLC zu bekommen müssen die TLCs cascadiert (in Reihe geschaltet werden Sout zu Sin des nächsten).

Grüße Uwe

Hallo,

ich sehe das immer noch anders.
BLANK ist zum dunkeltasten > Outputs enabled oder nicht.
SIN ... MOSI
SOUT .... MISO
SCLK .... CLK
XLAT / VPRG ... CS
Die Kombination XLAT und VPRG möge eine etwas andere Funktionalität/Handhabung haben, entspricht aber weitgehend dem bekannten CS. Aktivierung und Datenübernahme. Man erkennt jedenfalls die SPI Funktionalität > Bits serial takten. Was ich nicht sehe ist, dass er ständig frische Daten benötigt. Nur bei einer gewünschten Änderung muss man neue Daten senden. Übrigens sollen die ICs nicht parallel geschalten werden sondern in Reihe. Stichwort Daisy Chain.

Vielen Dank für die vielen Antworten und Anregungen!
Ich versuche meine Gedankengänge mal zusammenfassen.

Anzahl der Treiber angeben
Die Spielbretter werden vor Spielbeginn zusammengsteckt.
Der Arduino wird angeschaltet.
Über Poti und Taster wird die Anzahl der Treiber festgelegt.
Gedacht ist ein 1604 LCD zur Anzeige der Zahl.
So weit hatte ich es schon geplant.
Also hier Frage 1:
Wie kann ich im Sketch des Arduinos die Anzahl der Treiber festlegen?
Damit ist nicht gemeint, wie ich mit Hilfe von Taster und Poti einen Wert einlese, sondern der Befehl an sich.
Vielleicht
#define NUM_TLCS 1 ?
Wenn ja, kann ich es einfach im loop ausführen?

Belastung der Treiber
Ein Brett sähe es vorraussichtlich so aus:
12 Blaue in vier Gruppen (4 Ausgänge)
4 rote (4 Ausgänge)
4 Grüne (4 Ausgänge)
4 gelbe (4 Ausgänge)

Die Einschaltdauer sind 4 Sekunden, dann wieder ca. 2 Minuten Pause im Regelbetrieb.
Der IC hat keinen Kühlkörper (bis jetzt) und sitzt in einer relativ engen Box. Nach oben sind vielleicht 8mm "Luft".
Wenn ich das Richtig verstehe kann der TLC5940NT 120mA.
In diesem Fall sind 6 LEDs gleichzeitig der schlimmste Fall (davon maximal 3 an einem Ausgang) .
Mit 120mA für eine kurze Zeit mit langer Pause (wird wahrscheinlich ohnehin auf 50% gedimmt) dürfe das gehen.
Frage 2:
Oder sehe ich das falsch?

Nun zur Stromversorgung:
Der Arduino bekommt ein USB Netzteil, für die LEDs möchte ich das passende Netzteil festlegen wenn ich die Leistung weiß, die ich brauche.
Fragen 3 & 3a & 3b:
Kann ich die LEDs mit einem seperaten Netzteil versorgen?
Wenn ja, welche Spannung wäre perfekt und an welche PINs muss ich gehen?

Fehlt noch die Festlegung der Querschnitte.
Um von einem Treiber zum nächsten zu springen, würde ich gerne das JST-XH Stecksystem benutzen.
Das ist mit einer Leitung ist mit AWG26 ausgestattet. 0,15qmm wenn mich nicht alles täuscht.
Reicht für den Steuerteil. Bei der Zuleitung für die LEDs hört es definitiv auf.
Mal angenommen ich rechne 150mA pro Brett.
Bei dem absoluten Maximum von 20 Brettern schiebe ich ins erste Gänseblümchen knackige 3A.
Da würde ich gerne auf H07V-K 0,5qmm zurückgreifen.
Frage 4:
Hat jemand einen Vorschlag, wie hier der Steckverbinder aussehen könnte?

/edit sagt:
Frage 5:
Muss ich die beiden Widerstände nur am Anfang (erster Treiber) setzen?

So....ob da noch Fragen sind fällt mir bestimmt erst ein, wenn ich den Post losgeschickt habe.
Vielen Dank für eure Mithilfe!

Tiff

Hallo,

jetzt habe ich es auch gelesen. :slight_smile: Ja der 5940 benötigt extern an GSCLK einen Takt für den internen Grayscale Counter. Was hat das für einen Vorteil, allgemein gefragt? Und ja der 5947 ist einfacher zu handhaben. Letzterer verkraftet allerdings weniger Strom. Kommt auf den TO an was letztlich alles geschaltet werden soll.
Kopfzerbrechen macht mir allerdings die Kontaktierung aller Bretter für die Signale.

jetzt habe ich es auch gelesen. :slight_smile: Ja der 5940 benötigt extern an GSCLK einen Takt für den internen Grayscale Counter.

Was hat das für einen Vorteil, allgemein gefragt?

Hab ich doch ansatzweise geschrieben.


Die PWM Modulation läuft nicht ungeregelt durch die Gegend: Nehmen wir mal das PWM Signal als Rechteckspannung wahr, so kann man gezielt den Startzeitpunkt bestimmen. Dies braucht man wenn man eine RGB LED Matrix mit 16k Farben aufbauen will. Schau mal die Bilder auf Seite 2 von https://forum.arduino.cc/index.php?topic=61407.0 an. Mit dem TLC steuere ich die Spalten, die Kathoden der RGB LED an; mit dem Transistor die Anoden / Reihe. Das ergibt bei 4x4 RGB LED eine Matrix von 12 x 4. Die Ansteuerung erfolgt synchronisiert; Ich schalte eine der Reihen scharf und starte dann den PWM Zyklus. Ich weiß jetzt nicht wieviele Zyklen hintereinander optimal sind aber das ist hier zur Funktionalität des TLC uninteressant. Wenn ein oder mehrere PWM-Zyklen fertig sind dann wird der Transistor abgeschaltet und der nächste aktiviert mit dem/n nächsten PWM-Zyklus/en.
In diesem Fall muß ich den PWM Zyklus in einem gewissen Moment starten können. Die Dauer eines PWM Zyklusses wäre auch bei einem ungesteuerten in groben Zügen bekannt.

Wegen CS/EN Einspruch.
Sout ist kein Tristate-Pin und somit kann es nicht MISO sein. Mehrere Sout können nicht zusammengeschaltet werden.

Grüße Uwe

Hallo,

okay Uwe, denke ich habs verstanden.

zum Tiff.

Ich lehne mich einmal aus dem Fenster.

Die Anzahl der ICs muss aktuell mittels #define NUM_TLCS 1 eingestellt werden. Hierfür kann man bestimmt die Lib abändern, um das flexibel zu handhaben. Hast du den TLC5940 schon da oder ist das nur eine Idee?

Die 120mA ist der Gesamtstrom. Nicht pro Ausgang.

Mit 5V und 3 Leds in Reihe wird das nichts. Wenn man pauschal 2V pro Led annimmt, ist man schon bei 6V Flußspannung. Würde pauschal 9V veranschlagen. Meinetwegen auch 12V.

Wie möchtest du die Bretter für den Tisch verbinden? Vorm Aufbau rückseitig immer erst alle Kabel stecken oder die Bretter einfach nur wie Lego zusammenstecken? Für letzteres musste nach Platinenstecksystemen Stecker/Buchse suchen. Da kannste dich bei Phoenix Contact, harting, Metz Connect und Wago umschauen. Die Maßhaltigkeit der Bretter und Positionen der Platinen muss dann natürlich perfekt sein damit alles flutscht.

Ansonsten wenn alles vorher/nachher steckbar sein soll und dass mehrfach gesteckt werden soll, dann halte ich JST-XH für eher ungeeignet, ist zu fummelig für ständiges stecken. Dann wäre vielleicht etwas "gröberes" zum anfassen besser. Solange der Bauraum vorhanden ist.

bspw. bei Conrad erhältlich von PTR:
STL1550/8G-3.5-H-BASALTGRAU
AK4551/8KD-3.5-BASALTGRAU

Bei Reichelt gibts ähnliches von Wago 714-108. Das Problem ist immer solches Zeug in Kleinstmengen irgendwo kaufen zu können.

Kabelquerschnitt 0,5 qmm für 3A Spitze ist okay laut meiner Meinung. Die Leitungen für den Bus solltest du auch verdrillen. Aber das sind alles nachgelagerte Dinge. Dein Hauptaugenmerk sollte erstmal dem grundsätzlichen Aufbau gewidmet sein.

Doc_Arduino:
Die Anzahl der ICs muss aktuell mittels #define NUM_TLCS 1 eingestellt werden. Hierfür kann man bestimmt die Lib abändern, um das flexibel zu handhaben. Hast du den TLC5940 schon da oder ist das nur eine Idee?

Ich habe zwar ein-zwei TLC5940NT zum rumprobieren, mich aber noch nicht festgelegt.
Die Lib abändern ist für mich Suboptimal. Das Spiel wird für Freunde entworfen, sollte also ohne große Programmierkünste einstellbar sein.
Geht das auch im Sketch?

Die 120mA ist der Gesamtstrom. Nicht pro Ausgang.

Wie viele LEDs kann ich an einen Ausgang hängen?

Mit 5V und 3 Leds in Reihe wird das nichts. Wenn man pauschal 2V pro Led annimmt, ist man schon bei 6V Flußspannung. Würde pauschal 9V veranschlagen. Meinetwegen auch 12V.

Also würde ich zur Versorgung der LED gerne ein 12V Netzteil nehmen.
An welche PINs muss ich damit gehen? An 19 oder 21? Und soll ich 12V Masse und 5V Masse verbinden?

Wie möchtest du die Bretter für den Tisch verbinden? Vorm Aufbau rückseitig immer erst alle Kabel stecken oder die Bretter einfach nur wie Lego zusammenstecken?

Das Spiel besteht aus Unterteilen und Oberteilen. Die Unterteile werden zusammen gesteckt, die Deckel locker aufgelegt.
Dann dachte ich, zwei flexible Verbinder zusammenzustecken und Deckel drauf. Es muss also micht passgenau sein.
Ich steh auf Wago. Mal sehen, was ich da finde.

Kabelquerschnitt 0,5 qmm für 3A Spitze ist okay laut meiner Meinung. Die Leitungen für den Bus solltest du auch verdrillen. Aber das sind alles nachgelagerte Dinge. Dein Hauptaugenmerk sollte erstmal dem grundsätzlichen Aufbau gewidmet sein.

Danke schonmal.

Meine wichtigste Fragen sind nun:
Gibt es eine Möglichkeit, die Anzahl der Treiber im Sketch zu Ändern?
An welchen PINs wird 12V angeklemmt?
Sind 3 LEDs am Ausgang Maximum?

Zur besseren Erläuterung:

Hallo,

überlege dir das nochmal.

Die Anzahl der Leds pro Ausgang richtet sich nach der Summe der Flußspannungen + einer mir unbekannten "IC Knee Voltage". Was auch immer das sein soll. Taucht im Datenblatt nur einmal auf. Die 12V kommen nicht an den IC. Die kommen an den Led Strang.

Flexibel stecken schon. Nur traue ich den JST-XH nicht unzählige Steckvorgänge zu. Zudem sie recht fummelig klein sind. Aber das musst du selbst wissen. Für mich sieht das nicht nach ständigen auf- und abbauen aus.

Das Hauptproblem ist jedoch die Lib. Hab einmal genauer reingeschaut. Einfach so ändern wie ich erst dachte geht nicht. Das blöde define wird in fast allen Headern verwendet und muss vorab als Konstante bekannt sein. Das zu ändern käme einer Neuprogrammierung der Lib gleich. Nein Danke. Wenn du dich für eine konstante Anzahl entscheiden kannst wäre das von Vorteil.

Die Anzahl der Leds pro Ausgang richtet sich nach der Summe der Flußspannungen + einer mir unbekannten "IC Knee Voltage". Was auch immer das sein soll. Taucht im Datenblatt nur einmal auf. Die 12V kommen nicht an den IC. Die kommen an den Led Strang.

Ich finde die Knee Voltage im Datenblatt nicht. Kannst Du bitte den Link zum Datenblatt das Du liest und die Stelle wo es steht.

Mir kommt in den Sinn daß die LED Ausgänge des TLC5940 Konstantstromsenken sind. Konstantstromsenken sind Konstantstromquellen wo der Strom hinein fließt genaugesagt vom Pluspol der LED-Versorgungsspannung über die LED in den TLC-Ausgang und intern über eine Konstantstromsenke nach Masse. Diese Konstantstromsenke braucht eine gewisse minimale Spannung um zu funktionieren.

Grüße Uwe

Doc_Arduino:
Die Anzahl der Leds pro Ausgang richtet sich nach der Summe der Flußspannungen + einer mir unbekannten "IC Knee Voltage". Was auch immer das sein soll. Taucht im Datenblatt nur einmal auf. Die 12V kommen nicht an den IC. Die kommen an den Led Strang.

Also würden die 12V an den gemeinsamen Pluspol der LED kommen.
Maximal 3 pro Ausgang, weil sonst die Spannung einbricht? Habe ich das Richtig verstanden?

Flexibel stecken schon. Nur traue ich den JST-XH nicht unzählige Steckvorgänge zu. Zudem sie recht fummelig klein sind. Aber das musst du selbst wissen. Für mich sieht das nicht nach ständigen auf- und abbauen aus.

Da suche ich mir was schönes von Wago raus. Hab mich nur noch nicht entschieden.

Das Hauptproblem ist jedoch die Lib. Hab einmal genauer reingeschaut. Einfach so ändern wie ich erst dachte geht nicht. Das blöde define wird in fast allen Headern verwendet und muss vorab als Konstante bekannt sein. Das zu ändern käme einer Neuprogrammierung der Lib gleich. Nein Danke. Wenn du dich für eine konstante Anzahl entscheiden kannst wäre das von Vorteil.

Nehmen wir an, ich verbaue 20 Treiber.
Die 20 Treiber haben aber nur 4 verschiedene "Bilder", also sollen jeweils 5 Bretter das gleiche machen.

Wie stelle ich das am besten an?
Was passiert, wenn ich weniger Treiber anstecke? Oder mehr?

Mal noch eine ganz andere Frage:
Wie die Bretter aufgebaut sind, habe ich hoffentlich vermitteln können.
Wie würdet IHR so etwas angehen?