Hausbeleuchtung mit Schieberegister – S88-Bus mal andersherum

50m² Märklin Modellbahn-Anlage mit TrainController Steuerung und Car-System

Hausbeleuchtung mit Schieberegister – S88-Bus mal andersherum

Anschluss eines Shift-Registers (Schiebe-Register) an den Arduino
Anschluss eines Shift-Registers (Schiebe-Register) an den Arduino
Anschluss eines Shift-Registers (Schiebe-Register) an den Arduino

Wir sind schon ganz lange am Überlegen, wie wir unsere Häuser sinnvoll beleuchten sollen. Wir wollen ja (fast) jedes Fenster eines Modellbahn-Hauses einzeln beleuchten und sie sollen dabei auch einzeln ein- und ausschaltbar sein. So soll die Illusion eines beleuchteten Hauses gewahrt werden, denn wenn man nachts Häuser beobachtet, leuchten hier auch nicht alle Fenster immer zusammen. Mal geht ein Licht an, ein anderes aus, …

Wie kann man dies auf der Modellbahn nun realisieren? In jedem Haus einen eigenen Decoder anzubringen wollten wir nicht… Jedenfalls nicht in den „Standardhäusern“, die sonst keine weitere Funktion aufweisen, wobei es von der Verkabelung das Einfachste wäre…

Also: dann muss eine andere Lösung her. Man beobachte einmal den S88-Bus (in seiner simpelsten Form). Hier frägt eine Zentrale alle angeschlossenen S88-Module nach dem Status ab. Also z.B.

Anschluss 1 an Modul 1, hast Du Strom? ja/nein bzw. 0/1
Anschluss 2 an Modul 1, hast Du Strom? ja/nein bzw. 0/1
Anschluss 3 an Modul 1, hast Du Strom? ja/nein bzw. 0/1

Anschluss 1 an Modul 5, hast Du Strom? ja/nein bzw. 0/1

Wie wäre es, wenn man diese Technologie verwenden würde, aber statt abzufragen (also einzulesen) wollen wir Befehle aussenden. Und genau so werden wir es machen:

Ablauf eines Schieberegisters
Ablauf eines Schieberegisters

Für eine Reihe von Häusern gibt es also eine „Digitalzentrale“ (Mikrocontroller), die überwacht, ab wann in den Häusern das „Licht angehen muss“. Wenn es soweit ist, werden über 3 Kabel (Steuerleitung) Daten an das 1., 2., 3., … x.te Haus gesendet. Und das in hoher Geschwindigkeit, mehrmals pro Sekunde (dieser Takt kann von der Programmierung vorgegeben werden). Die Technologie nennt man „Schieberegister“ oder „Shiftregister“. Später einmal mehr dazu, bestimmt mit Video. Wichtig ist für uns, dass wir nun auch dafür eine technische Lösung gefunden haben. Jetzt können Platinen dafür erstellt werden und die Prototypen können dann vorgestellt werden. Übrigens: unser Gefängnis „Santa Fu“, das gerade renoviert wird, wird eines der ersten Testgebäude sein. Dazu aber später auch mehr, denn die vielen, vielen Fenster ermöglichen noch weitere Gags…

Mehrere Shift-Register verbunden
Mehrere Shift-Register verbunden

Beispielcode für LED Beleuchtung mit einem Schieberegister

/*
Arduino mit Shift Register (Schieberegister) auf der Modellbahn-Anlage.de
*/

/*
Wir definieren zuerst die drei Pins die wir verwenden wollen. Dies sind die Digitalausgänge von Arduino, die mit den Einrängs-, Uhr- und Daten-Pins des 74HC595 verbunden sind.
*/

int latchPin = 5;
int clockPin = 6;
int dataPin = 4;

/*
Als nächstes wird eine Variable namens "leds" definiert. Dies wird verwendet, um das Muster zu halten, an dem die LEDs derzeit ein- oder ausgeschaltet sind. Daten des Typs "Byte" stellen Zahlen mit acht Bits dar. Jedes Bit kann entweder ein- oder ausgeschaltet sein, so dass dies perfekt ist, um zu verfolgen, welche unserer acht LEDs ein- oder ausgeschaltet sind.
*/

byte leds = 0;

void setup() 
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}

/*
Die Funktion "Schleifen" schalte zunächst alle LEDs aus, indem sie der Variable "leds" den Wert 0 gibt. Es nennt dann "updateShiftRegister", das das "Leds"-Muster an das Schieberegister sendet, damit alle LEDs abschalten. Wir werden uns später damit befassen, wie "UpdateShiftRegister" funktioniert.

Die Loop-Funktion hält eine halbe Sekunde inne und beginnt dann mit der "for" Schleife und der Variablen "i" zu zählen. Jedes Mal verwendet es die Arduino-Funktion "bitSet", um das Bit zu setzen, das die LED in der variablen "Leds" steuert. Es nennt dann auch "updateShiftRegister", so dass das Leitupdate widerspiegelt, was in der Variable "leds" ist.

Es gibt dann eine halbe zweite Verzögerung, bevor 'i' erhöht und die nächste LED beleuchtet wird.
*/

void loop() 
{
  leds = 0;
  updateShiftRegister();
  delay(500);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    updateShiftRegister();
    delay(500);
  }
}


/*
Die Funktion "updateShiftRegister", stellt den LatchPin zunächst auf niedrig, dann nennt die Arduino-Funktion "shiftOut", bevor sie den "LatchPin" wieder hoch legt. Dies dauert vier Parameter, die ersten beiden sind die Pins, die für Daten und Uhr verwendet werden.

Der dritte Parameter gibt an, an welchem Ende der Daten Sie starten möchten. Wir werden mit dem richtigen Bit beginnen, das als "Least Significant Bit" (LSB) bezeichnet wird.

Der letzte Parameter sind die tatsächlichen Daten, die in das Schichtregister verschoben werden, das in diesem Fall "geführt" ist.

*/
void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

Helligkeitsregelung über ein Schieberegister

Es ist auch möglich Helligkeitswerte über ein Schieberegister zu geben. Ein Beispiel dafür sieht man nachstehend:

/*
Shift Register - Helligkeit - Modellbahn-Anlage.de
*/

int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
int outputEnablePin = 3;

byte leds = 0;

void setup() 
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
  pinMode(outputEnablePin, OUTPUT); 
}

void loop() 
{
  setBrightness(255);
  leds = 0;
  updateShiftRegister();
  delay(500);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    updateShiftRegister();
    delay(500);
  }
  for (byte b = 255; b > 0; b--)
  {
    setBrightness(b);
    delay(50);
  }
}

void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

void setBrightness(byte brightness) // 0 to 255
{
  analogWrite(outputEnablePin, 255-brightness);
}

Tags: , , ,