LED-Matrix mit Schieberegistern und Arduino

LEDs sind was Tolles. Nicht nur leuchten und blinken sie schön und bunt, je nach LED auch in verschiedenen Farben bei RGB LEDs, man sieht bei LED Schaltungen auch direkt, ob sie funktioniert, oder nicht.
Nach ein paar einfachen LED Schaltungen wird das aber irgendwann weniger spannend, daher habe ich mich irgendwann daran gemacht, mir eine LED Matrix zu überlegen.

Grundlage ist hier das Prinzip des Multiplexens, von dem ich zuerst in einem Arduino Buch beim Thema 7-Segmentanzeige gelesen habe. Multiplexing ist im Prinzip ganz einfach. Von allen anzeigbaren Lichtpunkten (Pixeln) ist zur gleichen Zeit immer nur ein einziger an und das ganze wird so schnell aktualisiert, dass unser menschliches Auge das nicht erfassen kann. Für uns sieht es so aus, als wäre zB eine ganze Reihe angeschaltet. Selbst für eine Kamera ist das manchmal zu schnell, wie man auf den Bildern unten sehen kann.

Die Schaltung der Matrix ist eigentlich auch recht simpel. Die LEDs sind in einem Gitter angeordnet und reihen- bzw. spaltenweise mit ihren Anoden bzw Kathoden verbunden. So hat man wie ein Koordinatensystem. Schließt man den Stromkreis für eine Koordinate, so leuchtet die LED. Den Kontaktschluss habe ich hier mit Transistoren und Schieberegistern realisiert. Dafür existieren viele gute Anleitungen im Netz, ich selber habe diesen Aufbau vor mehr als 6 Jahren gebaut und kann mich leider nicht mehr genau im Detail daran erinnern.

Nichts desto trotz ist das eine gute Fingerübung, um Transistoren und Schieberegister zu verstehen. Transistoren werden z.B. auch im Informatikstudium in der Technischen Informatik behandelt.

Eine Alternative zu den Schieberegistern sind Multiplexer. Ein Mux kann ein Eingangssignal auf einen von meistens 8 Ausgängen mappen anhand eines mitgelieferten Signals an den Chip. Bei 8 Ausgängen braucht man damit 3 zusätzliche Bit, um die Ausgangskennung in Binär zu codieren.

Der Arduino Code ist auch ziemlich simpel. In Binär sind alle Reihen- und Spaltenindizes abgebildet und in der Funktion rows() werden die Elemente der entsprechenden Arrays so in die Schieberegister geschoben, dass der Effekt ein Durchlaufen aller Pixel ist.

Code:

int clock1 = 8;
int mem1 = 9;
int data1 = 10;

int clock2 = 5;
int mem2 = 6;
int data2 = 7;

int arrk[] = {0b10000000, 0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100, 0b00000010, 0b00000001};
int arra[] = {0b10000000, 0b01000000, 0b00100000, 0b00010000, 0b00001000};

void setup()
{
 pinMode(clock1, OUTPUT);
 pinMode(mem1, OUTPUT);
 pinMode(data1, OUTPUT);
 pinMode(clock2, OUTPUT);
 pinMode(mem2, OUTPUT);
 pinMode(data2, OUTPUT);
 resetPins();
 
 digitalWrite(clock1, LOW);
 shiftOut(data1, clock1, MSBFIRST, 0b00000000);
 digitalWrite(mem1, HIGH);
 delay(200);
 digitalWrite(clock2, LOW);
 shiftOut(data2, clock2, LSBFIRST, 0b10000000);
 digitalWrite(mem2, HIGH);
}

void loop()
{
  rows();
}

void rows()
{
 for(int j = 0; j < 5; j++)
 {
   digitalWrite(clock1, LOW);
   shiftOut(data1, clock1, LSBFIRST, arra[j]);
   digitalWrite(mem1, HIGH);
   
   for(int i = 0; i < 8; i++)
   {
     digitalWrite(clock2, LOW);
     shiftOut(data2, clock2, LSBFIRST, arrk[i]);
     digitalWrite(mem2, HIGH);
     delay(50);
     resetPins();
   }
 } 
}

void resetPins()
{
 digitalWrite(clock1, LOW);
 digitalWrite(mem1, LOW);
 digitalWrite(data1, LOW); 
 digitalWrite(clock2, LOW);
 digitalWrite(mem2, LOW);
 digitalWrite(data2, LOW); 
}

Die Matrix war ein Projekt, als ich in der Oberstufe war. Damit hatte ich nicht wirklich Ahnung davon, wie die verschiedenen Chips funktionieren. Die Funktion von Transistoren habe ich mir damals komplett selbst erschlossen, was im Nachhinein eine Hilfe im Infostudium war. Nur kannte ich damals Mux und Demux noch nicht und die beiden Chips finde ich seit der Vorlesung vor ein paar Jahren ziemlich cool, weil man sich einige Datenpins einsparen kann.

LED-Matrix mit Schieberegistern und Arduino
Markiert in:                         
Abonnieren
Benachrichtige mich bei
guest

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x