Steuerung mehrerer LEDs mit Arduino und TLC5940NT

Ich arbeite zu Hause an einem DIY-Projekt, bei dem ungefähr 150 LEDs mit unterschiedlichen Helligkeitsstufen beleuchtet werden müssen. Ich möchte diese LEDs schließlich auch in bestimmten Mustern leuchten lassen, damit sie wirklich von einem Mikrocontroller (einer steuerbaren LED-Matrix, wenn Sie so wollen) angesteuert werden müssen.

Nach einiger Überlegung habe ich angefangen, mich mit dem Ardunio zu beschäftigen, da es für die anstehende Aufgabe geeignet zu sein scheint und es mir ermöglicht, LEDs und so weiter zu multiplexen.

Ich habe sowohl den Arduino Uno als auch den Arduino Mega 2560. Zum Testen habe ich den Mega verwendet, da er 15 PWM-Kanäle hat, sodass ich die Helligkeit jeder LED usw. einstellen kann, ohne mit unterschiedlich bewerteten Widerständen herumspielen und genügend LEDs anschließen zu müssen, um mir zu geben eine gute Vorstellung davon, was los ist.

Ich hatte einen guten Machbarkeitsnachweis, bei dem LED1 1800 Mikrosekunden lang aufleuchtete, dann ausgeschaltet wurde und LED2 aufleuchtete ... und so weiter für alle 15 LEDs. Keine der LEDs leuchtete tatsächlich gleichzeitig, aber es gab den anhaltenden Sichteffekt (alle LEDs scheinen gleichzeitig zu leuchten) und verbrauchte keine große Menge Strom. Das ist es, was ich anstrebe, in einem größeren Maßstab von ~ 150 LEDs.

Also musste ich das als nächstes skalieren. Der nächste Machbarkeitsnachweis kam in Form der Verwendung des LED-Treibers TLC5940, nachdem wir einige Artikel und Blogs online gelesen hatten.

Ich habe den TLC5940 an den kleineren Arduino Uno angeschlossen und 16 LEDs an die 16 Ausgangskanäle des Chips angeschlossen. Ich habe ein Testprogramm ausgeführt (ich denke, es verblasste / lief Muster entlang der LEDs und es funktionierte gut).

Dann begann ich, eine Schleife zu schreiben, die die erste LED wieder einschaltete, einen Sekundenbruchteil wartete, sie dann ausschaltete und zur nächsten LED überging.

Der Code funktionierte bis zu etwa 3 LEDs, aber sobald er die 4. LED traf, konnte ein Flackern beobachtet werden. Als es auf alle 16 LEDs skaliert wurde, gab es ein deutlich sichtbares Muster (wie eine mexikanische Welle), das über die LEDs lief.

Ich habe versucht, die Verzögerungszeit zu ändern und sie auf 1 Mikrosekunde zu reduzieren, aber das hatte wenig Wirkung.

Mein Code war in etwa so:

#include "Tlc5940.h"
int DELVAR = 1

void setup()
{
  Tlc.init(0); // initialise TLC5940 and set all channels off
}


void loop()
{
    Tlc.clear();
    Tlc.set(1, 4096);
    Tlc.update();
    delayMicroseconds(DELVAR);
    Tlc.set(1, 0);
    Tlc.update();

    Tlc.clear();
    Tlc.set(2, 4096);
    Tlc.update();
    delayMicroseconds(DELVAR);
    Tlc.set(2, 0);
    Tlc.update();

    Tlc.clear();
    Tlc.set(3, 4096);
    Tlc.update();
    delayMicroseconds(DELVAR);
    Tlc.set(3, 0);
    Tlc.update();   


    // ....and so on for all 16 channels .....   
    // (not optimal I know but at this point I'm still just getting my head around the logic)
}

Gibt es eine Beschränkung der "Geschwindigkeit" des TLC5940 oder der Kanäle, die er vom Arduino verwendet?

Wie kann ich das umgehen, damit alle LEDs gleichzeitig leuchten. Gehe ich richtig in der Annahme, dass der Arbeitszyklus des Arduino 16 MHz beträgt? und wenn ja, sollte ich nicht theoretisch > 50.000 LEDs nacheinander in weniger als einer Sekunde ein- und ausschalten können?

Haftungsausschluss - Ich habe sehr grundlegende elektronische Kenntnisse aus meiner Schulzeit vor etwa 15 Jahren, also ist dies alles eine sehr steile Lernkurve für mich!


HINWEIS: *Für alle, die sich fragen, woran ich arbeite - es ist eine riesige Weltkarte - die LEDs repräsentieren große städtische oder besiedelte Gebiete (Städte usw.), wie sie nachts vom Weltraum aus gesehen werden. Ich möchte, dass diese schließlich an Echtzeit angeschlossen werden, sodass die beleuchteten LEDs tatsächliche städtische Gebiete darstellen, die zu diesem bestimmten Zeitpunkt nachts beleuchtet sind - hier wäre der Arduino sehr nützlich.

Es ist eine String-Art-Karte, die auf einer Karte basiert, die ich letztes Jahr gemacht habe (unten).

Es ist eine String-Art-Karte, die auf einer Karte basiert, die ich letztes Jahr gemacht habe (unten).

Nur viel größer - es wird 8ft x 4ft sein - Fortschritt bisher - Löcher für LEDs gebohrt sind fertig:

Geben Sie hier die Bildbeschreibung ein

Nein, die Arduino-Taktfrequenz beträgt 16 MHz, die PWM-Frequenz beträgt nur etwa 500 Hz , und der Arbeitszyklus ist ein völlig anderes Konzept.
Danke Dimitri. Gibt es also eine Methode, mit der ich die Ein / Aus-Frequenz dieser LEDs "beschleunigen" kann?
Ja, Sie können die Dinge beschleunigen, indem Sie PWM nicht verwenden.
Kurze Frage also - könnte ich alternativ den I2C-Bus verwenden - geht das schneller?
Das eingebaute SPI-Peripheriegerät des Arduino ist der schnellste Weg, um einen TLC5940 anzusteuern. Der TLC6940 unterstützt kein SPI. Außerdem ist SPI deutlich schneller als I2C. Sie haben bereits alle Teile, um die 16-Kanal-LED-Helligkeitssteuerung in einem TLC5940 zu unterstützen, und sie kann etwa 5 Mal pro Millisekunde aktualisiert werden. Kaufen Sie 10 weitere und Ihr Projekt ist fertig.
Ich werde etwas über den Anschluss der TLC5940 an das SPI lesen. Danke für deinen Rat, sehr nützlich.
Bitte kommen Sie zurück und stellen Sie eine neue Frage, wenn Sie weitere Hilfe benötigen. Viel Glück. Bitte posten Sie ein Foto oder Video, wenn Sie es zum Laufen bringen, und aktualisieren Sie Ihre Frage mit einem Link. Ich stelle mir vor, es könnte gut aussehen.
Aktualisiert mit Bildern - wenn ich es jemals geschafft habe, das SPI-Zeug herauszufinden und alles zum Laufen zu bringen, werde ich auf jeden Fall ein aktualisiertes Foto posten!
Wow! Das sieht schon sehr beeindruckend aus. Muss ich wohl auch machen!
Sie müssen SPI nicht lösen. Selbst das Aktualisieren aller 10 TLC5940 mit Software-„Bit-Banging“ dauert nur etwa 10 Millisekunden. Wie ich schrieb, würde es nicht viel Sinn machen, schneller als die Bildwiederholfrequenz des Fernsehers zu aktualisieren. Selbst wenn Sie die Helligkeit aller LEDs bei der TV-Aktualisierungsrate geändert haben, bleibt immer noch ziemlich viel freie CPU-Zeit. Ich würde mir vorstellen, dass das einmalige Wechseln der LEDs für eine Echtzeitanzeige ausreichend schnell genug wäre. Der TLC5940 PWM unterstützt 4096 Helligkeitsstufen, sodass eine einzige Helligkeitsänderung weit unter der menschlichen Wahrnehmung liegt.

Antworten (1)

Dein Beitrag klingt etwas wirr. Es hört sich so an, als würden Sie versuchen, PWM zu simulieren, indem Sie den TLC5940 aktualisieren, was nicht erforderlich ist.

Ein TLC5940 enthält 16 PWM-Kanäle, jeder PWM-Kanal treibt die Helligkeit einer LED an. Sie aktualisieren den TLC5940 also nur, wenn die Helligkeit einer LED geändert werden muss. In der restlichen Zeit behält der TLC5940 die eingestellte Helligkeit jeder LED unter Verwendung seiner eigenen PWM-Kanäle bei.

Die Zeit zwischen den einzelnen Aktualisierungen muss für das menschliche Auge sichtbar sein, verwenden Sie also delay()Millisekunden und nie, delayMicroseconds()was nur für einige 10 Millisekunden gut ist.

Der Effekt, den Sie sehen, ist wahrscheinlich darauf zurückzuführen, dass die gesamte Schleife () in etwa einer Millisekunde abgeschlossen ist.

Der Code aktualisiert den TLC5940 wahrscheinlich mit weniger als einem Zyklus seiner PWM-Rate (ich kann mich nicht erinnern, ob der TLC594 eine Logik enthält, um etwas Hilfreicheres zu erzwingen, aber ich glaube nicht). Sie sehen also möglicherweise das visuelle Äquivalent eines „Beats“ zwischen den beiden Frequenzen (Update vs. PWM).

Tou konnte diese Hypothese schnell beweisen, indem er alle zu
delayMicrosecond()änderte
delay(1000)

Bitte aktualisieren Sie Ihre Frage, wenn dies nicht behoben wird oder Sie dies bereits versucht haben.

Ihr Code muss die visuelle Helligkeit der LEDs nicht steuern, das erledigt der TLC5940 für Sie. Wenn Sie die Helligkeit einer LED einstellen, verwendet der TLC5940 kontinuierlich PWM, um diese Helligkeit für diese LED zu halten.

Für Ihr Projekt aktualisieren Sie also möglicherweise die gesamte Szene alle paar Sekunden, vorausgesetzt, jede LED wird von einem einzelnen Kanal angesteuert und Sie verwenden mehrere TLC5940 mit jeweils bis zu 16 LEDs.

Ich habe nicht den gesamten Code in dieser Bibliothek gelesen, aber die SPI-Hardware des Arduino sollte in der Lage sein, einen TLC5940 (192 Bit) mit etwa 4 Mbit (oder 8 Mbit mit den richtigen Einstellungen) zu aktualisieren.

Alle 16 LEDs auf einem TLC5940 sollten also etwa 5 Mal pro Millisekunde aktualisiert werden. Daher wären 160 LEDs 10 TLC5940s und würden alle 2 Millisekunden aktualisiert, was viel besser ist als die Reaktion des menschlichen Auges.

Jede dieser LEDs wird vom TLC5940 helligkeitsgesteuert, sodass der Code nichts zu tun hat, bis eine der „Städte“ ihre Helligkeit ändern muss.

Bearbeiten:
Der entscheidende Punkt ist, dass Ihr Arduino nichts über PWM tut. Die Arduino-Programme senden die TLC5940-Werte, die die Helligkeit jeder LED darstellen. Das war's, sonst nichts zu tun.

Der TLC5940 hat 16 PWM-Kanäle, er übernimmt die LED-Helligkeitssteuerung über seine PWM-Kanäle ganz von selbst, autonom, ohne weitere Beteiligung des Arduino.

Das Arduino-Programm spricht nur mit dem TLC5940, wenn eine oder mehrere LEDs ihre Helligkeit ändern müssen.

Ich denke, es ist undenkbar, dass Sie die LEDs schneller als 50/60 Bilder / Sekunde (TV-Bildwiederholfrequenz) ändern, was 10 TLC5940 problemlos tun könnten. Zwischen jeder Änderung der LED-Helligkeit behält der TLC5940 diese eingestellten Helligkeiten bei.

Edit2:
Vielleicht wollten Sie 74HC595-Schieberegister kaufen? Sie sind viel einfachere Geräte. Eine LED wäre entweder an oder aus. Mit diesen wäre der Host-Mikrocontroller für die Aktualisierung des 74HC595 verantwortlich, um eine PWM-ähnliche Helligkeitssteuerung zu simulieren.

Tut mir leid, wenn es verwirrend klingt - der PoV-Effekt in diesem Fall impliziert für mich, dass die LEDs alle gleichzeitig eingeschaltet zu sein scheinen - das ist der Effekt, den ich zu erreichen versuche. Ich habe ursprünglich damit begonnen, nur delay(some_small_number) zu verwenden, aber das leuchtet die LEDs sehr langsam auf.
Dies ist also nur eine Einschränkung bei der Verwendung von PWM - ich kann einfach nicht das tun, was ich mit den PWM-Kanälen des Arduino anstrebe? Es ist einfach zu langsam für meine Anforderungen?
Ich glaube, ich habe erklärt, dass Ihr Code dem TLC5940 mitteilt, welche Helligkeit Sie möchten, und es dann für alle 16 LEDs für Sie erledigt. Es hat 16 PWM-Kanäle, einen pro LED.
Entschuldigung - ich habe gerade Ihren Absatz über die SPI-Hardware gesehen - das scheint eine weitere Untersuchung wert zu sein