Arduino Lektion #100: Schieberegister 74HC595N N2B5

In diesem Beitrag möchte ich das Schieberegister 74HC595N N2B5 vorstellen.

Schieberegister 74HC595N auf 170 Pin Breadboard
Schieberegister 74HC595N auf 170 Pin Breadboard

Mit diesem Schieberegister kann man seine vorhandenen digitalen Pins um ein vielfaches erweitern.

Bezug

Es gibt die Schieberegister in größeren Verpackungseinheiten (5,10 usw.) mit diesen Packungen spart man auf ebay.de deutlich gegenüber dem kauf eines einzelnen Chips.

Auf ebay.de kann man zbsp. das Schieberegister im 10er Pack für ca. 4€ aus China bestellen.

Technische Daten des Schieberegisters 74HC595N N2B5

  • 8bit,
  • Sockel 16 DIP,
  • Betriebsspannung 2VDC bis 6VDC
  • Ausgangsstrom 35mA
  • Betriebstemperatur -40°C bis 85°C

Aufbau

Der Chip verfügt über 16 Pins welche wie folgt belegt sind.

Pinbelegung des Schieberegisters 74HC595N
Pinbelegung des Schieberegisters 74HC595N
PinBeschreibung
Q0 … Q7Ausgangspins 0 bis 7
GNDGround
VCC5V Anschluss
DSSerieller Eingang
OEEin -/ Ausschalten der Ausgangspins
STCPShift Register, beim Wechsel von LOW auf HIGH wird das an DS anliegende Bit um eine Stelle weiter geschoben
SHCPStorage Register, beim Wechsel von LOW auf HIGH werden die Daten des Schieberegisters in das Speicherregister übertragen.
MRZurücksetzen des Speicher & Schieberegisters
Q7SPin für den Anschluss eines weiteren Schieberegisters

Aufbau & Anschluss am Arduino

Für den Anschluss des Schieberegisters am Arduino benötigt man nur ein paar Breadboardkabel (6 Stück) und natürlich für die Ausgänge (pro Schieberegister 8 Stück).

In meinem Beispiel verwende ich einen Arduino Nano V3.0 und ein 720 Pin Breadboard. Dieses Breadboard bietet genügend Platz für den Microcontroller, das Schieberegister sowie 8, 5mm LEDs.

Schieberegister 74HC595 am Arduino Nano
Schieberegister 74HC595 am Arduino Nano

Aufbau der Schaltung

Nachfolgend möchte ich zeigen wie du das Schieberegister am Arduino Nano V3.0 mit 8 LEDs anschließen kannst.

Aufbau der Schaltung - Schieberegister am Arduino Nano V3.0
Aufbau der Schaltung – Schieberegister am Arduino Nano V3.0
ArduinoSchieberegister
digitaler Pin D8 SHCP
digitaler Pin D9 STCP
digitaler Pin D10  DS

schreiben eines Wertes in das Schieberegister

Das Schieberegister 74HC595 verfügt über 8 digitale Ausgänge, d.h. wir können mit einem solchen Element 8 Aktoren betreiben. Im nachfolgenden Beispiel möchte ich 8 LEDs im Zustand verändern.

int shiftPin = 8; //SHCP
int storePin = 9; //STCP
int dataPin = 10; //DS

//Status der einzelnen LEDs
int led1 = 1;
int led2 = 1;
int led3 = 1;
int led4 = 1;
int led5 = 1;
int led6 = 1;
int led7 = 1;
int led8 = 1;

//maximale Anzahl der LEDs
//(Wenn ein weiteres Schieberegister angeschlossen wird
//muss diese Zahl ensprechend erhöht werden.)
const int ANZAHL_LEDS = 8;

//Array mit Daten für das Schieberegister.
int muster[ANZAHL_LEDS] = {
    led1,led2,led3,led4,
    led5,led6,led7,led8
    };
 
void setup() {
 //setzen der Pins als Ausgang
 pinMode(storePin, OUTPUT);
 pinMode(shiftPin, OUTPUT);
 pinMode(dataPin, OUTPUT);

 //setzen des Pins am digitalen Pin D8
 //auf LOW quasi Status "AUS"
 digitalWrite(storePin, LOW); 

 //Schleife über das Muster welches
 //auf das Schieberegister geschrieben
 //werden soll.
 for (int i=0; i<ANZAHL_LEDS; i++) {
  digitalWrite(shiftPin, LOW);
  digitalWrite(dataPin, muster[i]);
  digitalWrite(shiftPin, HIGH);
 }

  //aktivieren des Musters
 digitalWrite(storePin, HIGH);
}
 
void loop () {
 //bleibt leer
}

Der Code bewirkt das alle LEDs aktiviert werden. (led1 … led8 steht auf 1)

alle LEDs am Schieberegister 74HC595 aktiviert
alle LEDs am Schieberegister 74HC595 aktiviert

Wenn man nun eine LED deaktivieren möchte so kann man den Wert auf 0 setzen.

Lauflicht mit dem Schieberegister realisieren

Nachdem wir im ersten Beispiel ein einfaches Muster ausgegeben haben, wollen wir nun ein Lauflicht erstellen.

int shiftPin = 8; //SHCP
int storePin = 9; //STCP
int dataPin = 10; //DS

//globale Variable 
//dient als Index für die aktive LED
//im Lauflicht
int activeIndex = -1;

void setup() {
  //setzen der Pins als Ausgang
  pinMode(storePin, OUTPUT);
  pinMode(shiftPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  //setzen des Pins am digitalen Pin D8
  //auf LOW quasi Status "AUS"
  digitalWrite(storePin, LOW);
}

void loop () {
  writeMuster();
  //eine kleine Pause von 150ms.
  delay(150); 
}

void writeMuster() {
  //den aktiven Index um 1 erhöhen
  ++activeIndex;
  //Das "Ausgangsmuster" wo alle LEDs 
  //deaktivert sind.
  int muster[8] = {0, 0, 0, 0, 0, 0, 0};

  //Wenn der aktive Index größer als die
  //maximale Anzahl der LEDs ist, dann...
  if (activeIndex > 7) {
    activeIndex = 0; //den activen Index auf 0 setzen.
    //Dieses sorgt dafür dass, das Lauflicht wieder von vorne beginnt.
  }

  //den Wert im Array manipulieren
  //es wird an der Stelle "x" im Array eine 1 gesetzt
  muster[activeIndex] = 1;

  //Von 0 bis 8 mache...
  for (int i = 0; i < 8; i++) {
    digitalWrite(shiftPin, LOW);
    digitalWrite(dataPin, muster[i]);
    digitalWrite(shiftPin, HIGH);
    Serial.print(muster[i]);
  }
  //schreiben der Daten
  digitalWrite(storePin, HIGH);
  delay(20); //eine kleine Pause
  //zurücksetzen 
  digitalWrite(storePin, LOW);
}

Video

mehrere Schieberegister mit einander verbinden

Bisher habe ich nur ein Schieberegister an den Arduino Nano V3.0 angeschlossen. Eigentlich bräuchte man für die bisherigen Aufgaben kein Schieberegister denn der Arduino Nano verfügt über 13 digitale Pins welche frei programmiert werden können. Somit könnte man also auch 13 LEDs anschließen und ein Lauflicht etc. aufbauen. 

Nun möchte ich jedoch 16 LEDs an dem Microcontroller betreiben und somit werden min. 2 Schieberegister benötigt.

Aufbau mit zwei Schieberegister

Das erste Schieberegister wird wie aus dem ersten Beispiel angeschlossen.

zwei Schieberegister /4HC595 am Arduino Nano
zwei Schieberegister /4HC595 am Arduino Nano
ArduinoSchieberegister #1Schieberegister #2
digitaler Pin D8 SHCP SHCP
digitaler Pin D9 STCP STCP
digitaler Pin D10  Q7S DS

Die Pins für die 16 LEDs sind mit blauen Drähten „markiert“.

Text „XMAS“ mit 16 LEDs

Da dieser Beitrag zum 09.12.2019 veröffentlicht wird, möchte ich nun ein ein Beispiel passend zur Weihnachtszeit präsentieren.

Text "XMAS" für 16 LEDs
Text „XMAS“ für 16 LEDs

Der Schriftzug verfügt über 6 Löcher, mit einem Durchmesser von 5mm für die Aufnahme von LEDs. Erstellt habe ich die Buchstaben mit dem Onlinetool TinkerCad.com und gedruckt wurden diese mit dem 3D Drucker Creality Ender2.

3D Druck Modelle

Hier findest du diese Modelle zum bequemen Download.

Vorbereitung

Für den betrieb müssen wir zunächst die 16 LEDs mit entsprechende Vorwiderstände und einer Platine verbinden.

Wir benötigen dazu:

  • 16x LED, 5mm, rot,
  • 16x Vorwiderstand, 220 Ohm,
  • 16 Stiftleisten, Rastermaß 2,54mm
  • 1x Lochrasterplatine,
  • 1x ca.1m, 0,20mm Kupferdraht (jeweils weiß & lila)

Sowie

  • Lötkolben, Lötzinn, hitzebeständige Unterlage
  • Seitenschneider
Platine mit Vorwiderständen für die LEDs
Platine mit Vorwiderständen für die LEDs

Quellcode

Video

Quellenangabe

Für dieses Tutorial habe ich mir zuvor die Informationen des Beitrages „Das Schieberegister 74HC595 am Arduino“ vom Makerblog.at durchgelesen und durchgearbeitet, daher werden sich sicherlich einige Elemente in diesem Beitrag wiederfinden.

9 Kommentare

  1. Ich finde die Erklärungen angemessen,
    Mich hat der Beitrag positive angesprochen.
    Ich möchte den Beitrag der 2 Schieberegister test weise aufbauen.
    Für die Probleme die sich sicherlich noch einstellen,
    bitte ich jetzt schon um Unterstützung.
    Mein Ziel wird sein, unterschiedliche Funktionen aufzurufen.

    1. Hi,

      danke für dein Kommentar.
      Gerne helfe ich dir weiter.
      Du kannst dich gerne per E-Mail (info@draeger-it.blog) oder über das Kontaktformular an mich wenden.

      Gruß,

      Stefan Draeger

  2. Hallo,
    Super Anleitung, vielen Dank.
    Kurze Frage:
    wieso werden die LEDs hier so „durcheinander“ zugeordnet?
    zB:
    void x(int led1, int led2, int led3, int led4, int led5){
    leds[0] = led2;
    leds[1] = led1;
    leds[2] = led3;
    leds[3] = led5;
    leds[4] = led4;
    }

    Danke und schöne Vorweihnachtszeit
    Bernd

    1. Hallo Bernd,

      bei der Verkabelung ist mir aufgefallen das die positionierten LEDs nicht ganz mit den Reihen / Spalten passte, daher habe ich das im Code entsprechend angepasst.

      Gruß,

      Stefan Draeger

  3. Hallo Stefan,
    muss bei „schreiben eines Wertes in das Schieberegister“ nicht das digitalWrite(storePin, LOW); am Anfang und am Ende digitalWrite(storePin, HIGH); in die for Schleife mit rein? Sonst speichert er den Wert nicht. Ist bei mir so. Habe es auf einem ESP8266 D1 mini probiert.
    Aber super Anleitung. Ohne die wäre ich nicht im Ansatz auf die Lösung gekommen. Die PIN Bezeichnung ist bei jedem Bord unterschiedlich. Hatte beim D1 mini mit shiftPin = D5, storePin = D6, dataPin = D7, Erfolg. Vielleicht nützt es jemanden. Viele Grüße und vielen Dank für den guten Einstieg!
    Gruß, Peter

  4. Vorsicht mit dieser Schaltung. Das Datenblatt von TI gibt 35 mA pro Ausgang als zulässige Leistung an, bei 220 Ohm kommen da schon 23 mA raus; ist also kein Problem.
    Die maximale Leistung durch VCC oder GND wird aber mit 70 mA angegeben. Bei mehr als drei eingeschalteten LEDs wird der Chip deutlich ausserhalb seiner Spezifikation betrieben.

    Soll die Schaltung dauerhaft stabil betrieben werden, würde ich Treiber nachschalten, z.B. einen aus der ULN2001 bis ULN2004 Reihe.

  5. Hallo Stefan,

    dein X-Mas Schriftzug hat mich auf eine ähnliche Idee gebracht.

    Ich möchte gerne eine Leuchtreklame mit 7 Buchstaben (jeweils mit 4 bis 9 Leds pro Buchstaben) also insgesamt 50 Led illuminieren. Die Buchstaben sollen der Reihe nach aufleuchten und dann zusammen blinken bzw. faden.

    Kann ich das mit einem Schieberegister realisieren? Ich brauche doch dafür pro Buchstaben nur ein Beinchen vom Schieberegister mit dann z.B. parallel 9 Leds, oder?

    Zusätzlich möchte ich weitere 14 Leds gleichzeitig aber unterschiedlich faden lassen.
    Geht das mit einem weiteren Pin-Beinchen?

    Vielen Dank und viele Grüße
    Jörn

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert