Wie du eine RGB LED Matrix mit 8 Zeilen und 12 Spalten bauen kannst, zeige ich dir in diesem Post.
Die LED Tafel eignet sich als Zimmerdeko und als Uhr. Jede LED ist einzeln adressierbar und kann 8 Farben anzeigen. Die Ansteuerung funktioniert mit einem Linux oder Windows PC.
Mit dem Programm LED_Matrix (im Anhang) kannst du LEDs samt Farbe adressieren. Zusätzlich hat es eine grafische Oberfläche mit der du Animation erstellen, abspielen und speichern kannst. Lauftexte und Uhrzeitdarstellung ist ebenfalls möglich. Die Installation und die Funktionsweise des Programms findest du im späteren Teil dieses Posts.
Als Grundplatte habe ich einfach ein Stück Karton genommen, in den ich die LEDs reingesteckt und anschließend dahinter verkabelt habe. Für weitere Verbindungen zwischen eingestochen LEDs und der Platine habe ich Flachbandkabel mit Stecker benutzt, damit ich die LEDs von der Schaltung abstecken kann. Aufgrund der Vielzahl an benötigten Bauteilen und Verbindungen hat der Schaltungsaufbau mit dem Lötkolben lange gedauert.
Gerne kann ich dir die Fritzing Datei schicken und du kannst daraus ein PCB layouten. Den Schaltplan findest du hier hier oder im Anhang dieses Posts.
Das Ergebnis sieht dann in etwa so aus.
Auf dem PC kannst du die Animationen und Einstellungen ändern und per USB Kabel auf den Controller (bei mir Arduino Nano) übertragen. Der Arduino wertet die Datenpakete aus und steuert die Lichter dabei an. so aus.
Die LED Tafel besteht aus insgesamt 96 LEDs. Aufgeteilt ist sie in 8 rows(Zeilen) und 12 columns(Spalten).
Um jede einzelne LED mit den Digital Pins des Arduino anzusteuern wären 96 LED * 3 Farben= 288 Digital Out Pins nötig. Um diesem Problem abhilfe zu leisten, gibt es den SN74HC595N Chip, der als PIN Expander genutzt werden kann.
Zum Verständnis: Die 12 Anoden (12 pro Zeile) der LEDs sind in Serie geschaltet. Für jede Zeile wird eine Steuerleitung benötigt. Also sind 8 Steuerleitungen nötig.
Alle Kathoden (3 Farben * 12 Spalten = 36 Steuerleitungen) werden angesteuert.
44 Steuerleitungen
Wie die Ansteuerung im Detail mit den verwendeten Transistoren funktioniert, erkläre ich im nächsten Abschnitt.
Als nächstes beschreibe ich die Funktionsweise der Schieberegister.
Über die Leitung Data Signal (DS), sendet der Arduino eine 0 oder eine 1 zum Schieberegister. Sobald an ShiftClock (SH_CP) ein Flankenwechsel von 0V auf 5V stattfindet, wird der momentane Wert (0 oder 1) der DS Leitung in den Schieberegisterspeicher geschoben. Nach erneutem Flankenwechsel von 0V auf 5V, wird ein weiteres Bit in den Speicher einfügt und das erste wandert einen Platz weiter. Sobald der erste Speicher voll ist (8Bit), wird das nächste Bit in das 2. Register geschoben usw... Falls kein Register mehr nachgeschaltet ist, "fallen" die Bits raus.
Nach vollendeter Schiebeoperation wird der Wert im Speicher an die Ausgänge übergeben. Das geschieht durch den Flankenwechsel von 0 auf 1 an der ST_CP Leitung (StoreClock) . Dadurch werden zur gleichen Zeit die Zustände an die Ausgänge übergeben und das LED Bild entsteht. Zum besseren Verständnis, habe ich ein gif erstellt, das den Schiebevorgang zeigt.
Es wäre bei kleineren Strömen durchausmöglich die LEDs ohne die Transistoren an die Ausgänge der Schieberegister anzuschließen. Jedoch besteht die Gefahr, dass alle 8 Ausgänge eines Register mit Strom belastet sind. Bei 20mA pro Spalte, wären es 20mA*8 =160mA die durch das Register fließen. Im Datenblatt ist ein Maximum von 70mA angegeben, weshalb das SR kaputt gehen würde.
Im Detail funktioniert die Transistorschaltung so:
♦ Q4 High Pegel (Basisstrom an T4)
⇒ Spannung an LED2.
♦ Q3 High Pegel (Basisstrom an T3)
⇒ LED2 leuchtet blau.
Angenommen:
Q4 Hig♦h Pegel, Q5 High Pegel
⇒ Spannung an LED1 und LED2.
♦ Q2 High Pegel
⇒ LED1 und LED2 leuchten Grün
♦ Q1 High Pegel
⇒LED1 und LED2 leuchten Gelb!!!
LED 1 soll aber grün und LED 2 rot leuchten!
Ja das geht trotzdem... und zwar:
Aus diesem Grund wird immer nur eine Zeile kurz eingeschaltet. Damit jede Zeile leuchten kann wird "Multiplexing" angewendet. Dabei werden die Zeilen werden nacheinander in einem schnellen Takt, ein und aus geschaltet. Da der Umschaltvorgang so schnell ist nimmt das menschliche Auge die Off- Zeit der LED nicht wahr. Parallel zu jedem Zeilensprung schalten die Spaltentransistoren den Strom durch nach Farbwunsch durch und er fließt auf Masse ab. So ist es möglich jede Farbe einzustellen.
Der Nachteil daran ist, dass die LEDs nur noch 1/8 der Zeit leuchten und dadurch die Helligkeit sinkt. Es ist möglich den Helligkeitsunterschied auszugleichen, indem man die Vorwiderstände(rot: 150 Ohm, grün: 140 Ohm, blau: 52 Ohm) niedriger wählt, jedoch steigt dadurch der kurzzeitige Spitzenstrom der LEDs. Da ich über meine LEDs keine Angabe über den maximalen Spitzenstrom im Datenblatt gefunden habe, sind die Widerstandswerte so gewählt, dass die LEDs nicht kaputt gehen.
auteilberechnungen LED Matrix 8x12
Flussspannungen der LEDS:
V;rot=1,8V;Imax=20mA
Vgrün=2V;Imax=20mA
Vblau=3,1V;Imax=20mA
Igewählt=12,5mA
Die Widerstände können auch mit einem Strom von 20mA berechnet werden.
Im Schaltkreis der LEDs sind neben den Vorwiderständen 2 Transistoren, an denen Spannung abfällt.
An der Basis-Emitterstrecke des Transistors(BD139) fallen ca.VTBE=0,65Vab.
RFarbe=V-VT1- V T2 - V Farbe I LED
R Rot = 5V - 0,65V - 0,65V - 1,8V 12,5mA=152Ω≈150Ω
R Grün = 5V - 0,65V - 0,65V - 2V 12,5mA=136Ω≈140Ω
R Blau = 5V - 0,65V - 0,65V - 3,1V 12,5mA=48Ω≈52Ω
Maximaler Strom durch eine Zeile:
I max = 3 * 12,5mA / LED * 12 LED = 450mA
Transistor Verstärkungsfaktor: h fe = 250
Basisstrom Zeilentransistoren: I B = V Q / R br = 5V/1kΩ=5mA
Kollektorstrom Zeilentransistoren: I C = I B * h fe =5mA*250=
1,25A>Imax
Maximaler Strom durch eine Spalte:
I max = 12,5mA
Transistor Verstärkungsfaktor: h fe = 250
Basisstrom Spaltentransistor: I B = V Q /Rbc=5V/47kΩ=;0,106mA
Kollektorstrom Spaltentransistoren: I C = I B*hfe&=0,106*250=
26mA>Imax
Die Ansteuerungssoftware wird auf dem Eingabegerät(PC, Raspberry Pi...) gestartet. Über den Python Code wird der Arduino angesprochen. Dafür gibt es die umfangfreiche Python lib "pyserial", mit der eine USB Verbindung aufgebaut werden kann. Es können Daten gesendet und empfangen werden. Am Arduino wird eine serielle Verbindung erstellt, die auf die Daten von PySerial wartet und an die Schieberegister weiterführt.
Die Oberfläche (GUI) habe ich mit dem Python modul "pygame" erstellt, mit der du in Echtzeit ein Bild zusammenbauen kannst und auf die Tafel übertragen. Wie die Oberfläche genau funktioniert siehst du anhand dem folgendem Gif. Den Source Code bzw. die kompilierte Windows Version kannst du im Anhang dieses Posts downloaden. Damit sowohl die USB Kommunikation funktioniert, als auch die richtige Bitreihenfolge in die Schieberegister geschoben wird, müssen folgende Werte angepasst werden.
Die Software kann im Anhang gedownloadet werden!
Die folgenden Listenwerte müssen im Arduino eingestellt werden, da sie je nach Verkabelung unterschiedlich sind.
19 20 21 22 |
const int LEDS_R[] = {10,13,27,24,37,30,21,18,29,34,43,40}; //Kathode Rote LEDS const int LEDS_G[] = {8,11,14,26,39,36,23,20,17,28,33,42}; //Kathode Grüne LEDS const int LEDS_B[] = {9,12,15,25,38,31,22,19,16,35,32,41}; //Kathode Blaue LEDS const int zeilen[] = {0,1,2,3,4,5,6,7} //Anode Alle LEDs |
►Lade die Datei serial_arduino_python.rar im Anhang herunter und entpacke Sie. In der .rar Datei befindet sich der Arduino Code, den du anpassen musst.
►Öffne die Datei Led_Matrix_Control.ino. Falls du noch noch nicht die Arduino IDE hast, lade Sie auf der Herstellerseite herunter.
►Ändere die Schieberegisterausgänge in die Listen LEDS_R, LEDS_G, LEDS_B auf deine Schieberegisterausgänge ab. Die Listenwerte für die Spalten entsprechen der LED Anordnung von Links nach Rechts. Die Listenwerte für die Spalten entsprechen der Anordnung von oben nach unten.
►Kompiliere die Datei und lade Sie auf den Arduino.
Über die "config.txt" kann auf die Software zugegriffen werden. Mögliche Einstellungen sind dort auskommentiert. Um die Anwendung zu benutzen müssen 2 Grundeinstellungen getätigt werden. Zum einem muss der USB Port angegeben werden, indem der Arduino angeschlossen ist und zum anderen der Ordnerpfad, in denen die erstellten Animationen gespeichert sind.
►Lade die LED_Matrix_Control.rar runter und entpacke die Ordner.
►Wechsle in den Ordner "LED_Matrix".
►Öffne die Datei config.txt.
►Ändere den COM_PORT Variablenwert in die Nummer des USB Ausgangs, indem der Arduino mit dem PC verbunden ist.
►Schreibe in die Variable "pathname" die vollständige Pfadbezeichnung zu dem Ordner "animationen". Achte auf das Backslash (\) hinter dem Wort animationen!
►Weitere Einstellmöglichkeiten sind in der Datei config.txt beschrieben.
►Wichtig ist es dabei, Groß und Kleinschreibung zu beachten und die Pfadstruktur der Variable "pathname" einzuhalten.
LED Animationssoftware benutzen
Im Anhang des Posts findest du die LED Matrix Control Software.
Die Software kann unter Windows über die LED_Matrix_Control.exe gestartet werden. Für den Python Interpreter der SourceCode verfügbar. Um das Programm darin zu starten werden neben den Standardbibliotheken das PySerial und PyGame Modul benötigt.
Sobald die USB Verbindung aufgebaut ist (dauert ca. 5 Sekunden) kannst du Animationen abspielen, die Umschaltzeit zwischen Bildern ändern oder neue Animationen erstellen. Dabei auf "Neue Animation" klicken und eine Farbe auswählen. Mit gedrückter linker Maustaste kann ein Muster erstellt werden.
Um ein Bild zu speichern auf den Button " Bild Speichern" drücken. Das Bild wird daraufhin als "neue_animation.txt" im Ordner "animationen" gespeichert.
Wenn die Animation fertig ist auf den Button "Speichern" drücken und die Datei "neue_animation.txt", wird in "animation0.txt" umbenannt.
Über den Button "Animationsauswahl" wird die Animation ausgewählt und durch den Button "Start Animation" auf die Tafel übertragen.
Falls du der Animation einen Namen geben willst, kannst du den Dateinamen umbenennen.
Bauteil | Beschreibung | Link |
---|---|---|
100x 2.54mm RGB LEDs | Common Cathode RGB LEDs | amazon* affiliate Bestellen |
Netzteil 5V | 5V, 1A, 5W Netzteil | amazon* affiliate Bestellen |
44x BD139 Transistoren | BD139 NPN Bipolar Transistor | amazon* affilliate Bestellen |
SN74HC595N | 8 Bit Schieberegister | amazon* affiliate Bestellen |
Arduino Nano | Entwicklerboard mit CH340 Chip Atmega328P | amazon* affiliate Bestellen |
Elektrobauteile | 12x 52 Ohm, 12x 140 Ohm, 12x 150 Ohm, 44 x 1k Ohm | |
Elektroaurüstung | Kabel, Stecker, Lochrasterplatine |