64 RGB LEDs mit Schieberegistern 74HC595 steuern

Hallo Forum,

Bilder:
Imgur
Imgur

ich verzweifel gerade daran zwei diagonal zu einander liegende RGB LEDs zum leuchten zu bringen. Da dies mein erstes Projekt mit einem Arduino ist und ich das Brett nicht selbst zusammen gelötet hab brauchte ich ziemlich lange bis überhaubt etwas geleuchtet hab. Folgendes habe ich jetzt verstanden:

Mit dem orangen Register kann man die 8 Reihen auswählen. Mit dem grünen Register wählen man orthogonal dazu zwischen 4 Reihen. Außerdem bestimmt man die Farbe der LED. Jede Farbe besteht aus 2 Bits. Das rote Register funktioniert wie das grüne Register, nur für die andere Hälfte der LEDS. Überall wo sich dann grün und orange bzw. rot und orange überschneiden leuchten die LEDs.

Mit folender Methode schreibe ich die Muster in die Schieberegister:

void musterSchreiben(int muster[8], int dataPin, int storePin, int shiftPin) {
  digitalWrite(storePin, LOW);

  for (int i=0; i<8; i++) {
    digitalWrite(shiftPin, LOW);
    digitalWrite(dataPin, muster[i]);
    digitalWrite(shiftPin, HIGH);
  }

  digitalWrite(storePin, HIGH);
}

Eine einzelne Reihe bringe ich folgendermaßen zum leuchten:

int muster1[] = {0,0,1,0,0,0,0,0};
musterSchreiben(muster1, dataPin2, storePin2, shiftPin2);
  
int muster2[] = {1,1,1,1,1,1,1,1};
musterSchreiben(muster2, dataPinAnAus, storePinAnAus, shiftPinAnAus);

Eine einzelne LED, indem muster2 z.B. so aussieht {0,1,0,0,0,0,0,0}.

Meine Frage: Wie schaffe ich es jetzt 2 LEDs zum leuchten zu bringen die nicht in einer gemeinsamen Reihe liegen? Am Ende würde ich gerne ganze Buchstaben undso darstellen können.

Eine solche Matrix muß im Zeitmultiplex angesteuert werden. Dazu der Reihe nach die Muster aller Zeilen (oder Spalten, je nach Schaltung) ausgeben, und das in einer Endlosschleife. Für ordentliche Helligkeit müssen dann aber die Spalten (oder Zeilen) mit Transistoren angesteuert werden, die die hohen Ströme aushalten.

Für weitere Hilfestellung solltest Du ein Schaltbild posten, oder im Forum nach brauchbaren Schaltungen suchen.

Wie DrDiettrich schreibt, musst Du „multiplexen“. D.h. Du schaltest in schneller Folge Zeile für Zeile an, wartest kurz und schaltest sie dann wieder aus. Vor dem Einschalten musst Du dafür sorgen, dass auch die Spalten passend gesetzt sind.

Wenn das in schneller Folge abläuft, sieht das wie eine gleichmäßig leuchtende 8x8-Matrix aus.

Ich habe hier eine 7x7-Matrix aus roten LEDs an der Wand hängen, die alle paar Minuten ein anderes bewegtes Muster anzeigt.

Der Code zum Zeigen der Matrix sieht bei mir so aus:

// displayMatrix()
// ----------------------------------------------------------------------------

void displayMatrix()
{ for(char i=0; i<=numOfIntensityValues; i++)
  { for(char y=0; y<displayHeight; y++)
    { for(char x=0; x<displayWidth; x++)
      { if((matrix[x][y].getIntensity()>i))
        {
          digitalWrite(colPins[x], HIGH);
        }
      }
      digitalWrite(rowPins[y], HIGH);
      delayMicroseconds(rowOnTime);
      digitalWrite(rowPins[y], LOW);
      for(char x=0; x<displayWidth; x++)
      { digitalWrite(colPins[x], LOW); }
    }
  }
}

Gruß

Gregor

PS: Wenn Du mehrere LEDs einer Zeile gleichzeitig leuchten lassen möchtest, musst Du diese Zeile über einen Transistor schalten, weil viele LEDs viel Strom bedeuten.

Vielen vielen Dank für die Antworten. Hat mir sehr weitergeholfen :slight_smile: :slight_smile: :slight_smile:

Bezüglich der genannten Transistoren: Ich nehme an daß auf der Platine ein ULN2803 verbaut ist.

Ich sehe daß jedes Schieberegister einzeln am NANO angeschlossen ist. Das kann man auch anders machen. Die Schieberegister können auch in Reihe geschaltet werden und nur mit 3 Anschlüssen gesteuert werden. Außerdem hätte ich die 2 Schieberegister (rot und grün) jedes jeweils für eine LED-Farbe verwendet da so einfach zwei 8x8 Matrix herausgekommen wäre, eine für jede Farbe. Die Strombelastung der Schiberegister bei gleichzeitige Ansteuerung beider Farben wäre geringer.

Grüße Uwe