Gleisbildstellpult – Weichensteuerung mit Arduino

Für mein Gleisbildstellpult war ich auf der Suche nach einer einfachen Weichensteuerung mittels Start- und Ziel-Taster. Mit Hilfe eines Arduino Mega konnte ich all meine Anforderungen umsetzen. Wie ich es im detail gelöst habe lest ihr hier….

Weichensteuerung mit ArDuino

In Zeiten von Modellbahnsteuerung via Tablet und Smartphone alla Z21 habe ich mich bewusst dazu entschieden die Kinderanlage mit Hilfe eines klassischen Gleisbildstellpults und Drucktastern zu steuern. Das möchte zunächst altmodisch klingen ist es aber nicht, da die Steuerung der Weichen und Signale ein Arduino übernimmt.  Aber der reine nach….

Bau GleisbildstellpulT

Das Gleisbildstellpult habe ich ganz einfach aus einer Polystyrolplatte, die mit Drucktastern und LED´s versehen ist, gebaut. Die nötigen Arbeitsschritte von der Erstellung des Geisschemas in Corel Draw  bis zur Montage der Taster habe ich den Bau  in einem Video schritt für schritt Dokumentiert.

Welche Funktionen soll das Gleisbildstellpult nun übernehmen?

Mittels Start- und Zieltaster sollen die entsprechenden Fahrstraßen geschaltet werden. Hierfür gibt es natürlich verschiedene Möglichkeiten wie z.B. Dioden Matrix, allerdings bei Einsatz von klassischen Doppelspulenantrieben wird es schwierig mehrere Weichen gleichzeitig zu schalten. Der Stromverbrauch pro geschalteter Weiche ist sehr hoch und die Modellbahntrafos gehen sehr schnell in die Knie, als folge dessen wird die Weichen nicht sicher geschaltet.  Mittels entsprechender elektrischer Schaltungen die einen ausreichend hohen Stromstoß erzeugen (Brückengleichrichter und Kondensatoren) kann man dieses Problem zwar lösen, aber eleganter wäre es meiner Meinung nach die Weichen in einer Sequenzen nacheinander zu schalten.

Des Weiteren möchte ich zukünftig Formsignale einsetzen, die in Vorbildgeschwindigkeit den Flügel heben und senken. Das lässt sich eigentlich nur durch den Einsatz von Modellbau Servos realisieren. Zur Ansteuerung kann man eine Vielzahl von Servo-decoder auf dem Markt kaufen, allerdings erlauben die meisten keine direkte Ansteuerung des Servos über einen Drucktaster (… meistens wird der Schaltbefehl über das  Digitalsystem an den Decoder geschickt…).

Zu guter Letzt soll natürlich mittels LED´s der aktuell Schaltzustand der Weichen und Signalen im Schaltpult angezeigt werden.

Die Lösung für mein Gleisbildstellpult!

Nach etwas Recherche  im Netz bin ich dann auf den Arduino gestoßen (www.arduino.cc).  Die Hardware besteht aus einem einfachen E/A-Board mit einem Mikrocontroller und analogen und digitalen Ein- und Ausgängen. Die Programmierungsumgebung ist recht einfach gehalten und soll auch technisch weniger Versierten den Zugang zur Programmierung ermöglichen.

Der Arduino erfüllt alle meine Anforderungen an das Schaltpult:

  • Direkte Ansteuerung von Servos
  • Ansteuerung von Relais
  • Ansteuerung von LED´s
  • Einlesen Taster Status

Elektrischer Aufbau des Gleisbildstellpults

Der prinzipielle Aufbau meines Schaltpults ist in untenstehenden Schema dargestellt. Der Kern des ganzen stellt ein Arduino Mega von Elagoo (link zu Amazone) da, der die Servors zur Signalsteuerung antreibt und mit Hilfe eines Relais board die Weichen schaltet. Die Taster zur Wahl der Fahrstraßen und die LED´s zur Anzeige der Weichen und Signalstellungen sind ebenfalls an den Arduino angeschlossen. Zu guter Letzt werden die LED´s vom Bahnübergang auch über den Arduino angesteuert. 

Schema Stellpult mit Arduino
Übersicht Verkabelung des Stellpults mit dem Arduino

Damit ich den Überblick über die verwendeten PIN´s nicht verliere, habe ich mir ein PIN out in Excel erstellt. In dieser Tabelle sind die verwendeten PIN´s mit ihrer Funktion und ihrer Bezeichnung in der Arduino Programmierung aufgeführt. Die Pin out Excel Tabelle könnt ihr hier herunterladen –> Download Stellpult PIN Out
Die Verkabelung des Arduinos zur Weichensteuerung und Anzeige der Weichenstellung im Stellpult seht ihr unten. 

Arduino Weichensteuerung Sc
Verkabelung Schema zur Weichensteuerung mittels Arduino

Nun zum eigentlichen Arduino Sketch…

Das hier gezeigte Sketch der Stellpultsteuerung umfasst die Funktionalität der Weichensteuerung über Start- und Ziel- Taster. Die Signalsteuerung ist  in der Entwicklung und wird in einem zukünftigen Bericht vorgestellt.

Das Stellpult sketch mit der Weichensteuerung könnt ihr hier herunterladen –>  Download Arduino Weichensteuerung Sktech

Im Header vom Sketch wird die EEPROM und Servo Bibliothek aufgerufen.  Die EEPROM Bibliothek ist notwendig um den Status der LED´s zur Anzeige der Weichen und Signalstellung im EEPROM zu speichern. Damit ist sichergestellt, dass nach abschalten und wieder anschalten des Arduino immer der letzte Status der Weichen oder Signalstellung angezeigt wird. Die Servo Bibliothek ist zur Ansteuerung der Signale notwendig, wird aber jetzt noch nicht verwendet. 

#include <EEPROM.h>
#include <Servo.h>

// **********************Deflector PIN********************

// Definition of constants. They're used here to set pin numbers:
//Definition of input PINs for Deflector control pushbutton
const int Button_inStartLft = 22;      // the number of the Start track left pushbutton pin
const int Button_inStartRgt = 23;      // the number of the Start track right pushbutton pin
const int Button_inGleis1 = 24;        // the number of the track 1 pushbutton pin
const int Button_inGleis2 = 25;        // the number of the track 2 pushbutton pin
const int Button_inGleis3 = 26;        // the number of the track 3 pushbutton pin

// Definition of output PINs for Deflector indication LEDs:
const int Led_outWeiche1Straight = 32;   // the number of the Deflector 1 Straight LED pin
const int Led_outWeiche1Turn = 33;       // the number of the Deflector 1 Turn LED pin
const int Led_outWeiche2Straight = 34;   // the number of the Deflector 2 Straight LED pin
const int Led_outWeiche2Turn = 35;       // the number of the Deflector 2 Turn LED pin
const int Led_outWeiche3Straight = 36;   // the number of the Deflector 3 Straight LED pin
const int Led_outWeiche3Turn = 37;       // the number of the Deflector 3 Turn LED pin

// Definition of output PINs for Deflector Relays:
const int Relay_outWeiche1Straight = 38;     // the number of the Deflector 1 Straight Relay pin
const int Relay_outWeiche1Turn = 39;         // the number of the Deflector 1 Turn Relay pin
const int Relay_outWeiche2Straight = 40;     // the number of the Deflector 2 Straight Relay pin
const int Relay_outWeiche2Turn = 41;         // the number of the Deflector 2 Turn Relay pin
const int Relay_outWeiche3Straight = 42;     // the number of the Deflector 3 Straight Relay pin
const int Relay_outWeiche3Turn = 43;         // the number of the Deflector 3 Turn Relay pin

Anschließend werden alle nötigen Variablen definiert.

// **********************Variables for Pushbutton status********************

// variables for reading Deflector pushbutton status:
int Button_stStartLft = 1;              // variable for reading the Start track left pushbutton
int Button_stStartRgt = 1;              // variable for reading the Start track right pushbutton
int Button_stGleis1 = 1;                // variable for reading the track 1 pushbutton
int Button_stGleis2 = 1;                // variable for reading the track 2 pushbutton
int Button_stGleis3 = 1;                // variable for reading the track 3 pushbutton

// **********************Variables for LED status********************
// variables for reading Deflector LED status:
int Led_stWeiche1Straight = 0;              // variable for reading the Deflector 1 Straight LED pin
int Led_stWeiche1Turn = 0;                  // variable for reading the Deflector 1 Turn LED pin
int Led_stWeiche2Straight = 0;              // variable for reading the Deflector 2 Straight LED pin
int Led_stWeiche2Turn = 0;                  // variable for reading the Deflector 2 Turn LED pin
int Led_stWeiche3Straight = 0;              // variable for reading the Deflector 3 Straight LED pin
int Led_stWeiche3Turn = 0;                  // variable for reading the Deflector 3 Turn LED pin

Im “void  setup ()” ist die Funktion der einzelnen PIN´s, ob es sich um einen Input oder Output handelt, genau definiert. Des Weiteren ist noch wichtig zu erwähnen, dass  der internen Pull Up Widerstand  (INPUT_PULLUP) des Atmega chip für die Inputs verwendet wurde . Alle Eingangssignale sind daher invertiert d.h. Taster gedrückt = Low und Taster nicht gedrückt = High .

Der Befehl CheckLedState() startet ein Unterprogramm, der den im EEPROM gespeicherten LED Status bei jedem Programmstart abfragt.

void setup() {

  //*******************Deflector PIN Mode******************

  // initialize the Deflector pushbutton pin as an input:
  pinMode(Button_inStartLft, INPUT_PULLUP);
  pinMode(Button_inStartRgt, INPUT_PULLUP);
  pinMode(Button_inGleis1, INPUT_PULLUP);
  pinMode(Button_inGleis2, INPUT_PULLUP);
  pinMode(Button_inGleis3, INPUT_PULLUP);

  // initialize the Deflector LED pins as an output:
  pinMode(Led_outWeiche1Straight, OUTPUT);
  pinMode(Led_outWeiche1Turn, OUTPUT);
  pinMode(Led_outWeiche2Straight, OUTPUT);
  pinMode(Led_outWeiche2Turn, OUTPUT);
  pinMode(Led_outWeiche3Straight, OUTPUT);
  pinMode(Led_outWeiche3Turn, OUTPUT);

  // initialize the Deflector Relay pins as an output:
  pinMode(Relay_outWeiche1Straight, OUTPUT);
  pinMode(Relay_outWeiche1Turn, OUTPUT);
  pinMode(Relay_outWeiche2Straight, OUTPUT);
  pinMode(Relay_outWeiche2Turn, OUTPUT);
  pinMode(Relay_outWeiche3Straight, OUTPUT);
  pinMode(Relay_outWeiche3Turn, OUTPUT);

  //initialize the Deflector Relay pins status:
  digitalWrite(Relay_outWeiche1Straight, HIGH);
  digitalWrite(Relay_outWeiche1Turn, HIGH);
  digitalWrite(Relay_outWeiche2Straight, HIGH);
  digitalWrite(Relay_outWeiche2Turn, HIGH);
  digitalWrite(Relay_outWeiche3Straight, HIGH);
  digitalWrite(Relay_outWeiche3Turn, HIGH);

    
  //*******************Init LED Status from EEPROM******************
  checkLedState();

}

Im “void loop ()” steht nun der eigentliche Programmcode für die Steuerung. Zunächst wird ständig der Status der Weichentaster abgefragt. Wird beispielsweise Start-taster Links & Taster Gleis 1  gedrückt, läuft folgendes im Programm ab:
Das Relay zum Schalten der Weiche 1 in Abbiegerichtung wird angesteuert. Die LED zur Anzeige der Weichenstellung in gerader Position wird aus und die LED in Abbiegerichtung eingeschaltet. Anschließend wird der LED Status im EEPROM gespeichert.
Damit der Doppelspulenantrieb nicht durchbrennt, wird das Relay zur Weichenansteuerung nach einer gewissen Zeit abgeschaltet. Die Schaltdauer ist in der Variable “DelayTimeWeiche”  individuell einstellbar (Wert entspricht Millisekunden)

void loop() {

  // ########### read the state of the Deflector pushbutton value: ###########
  Button_stStartLft = digitalRead(Button_inStartLft);
  Button_stStartRgt = digitalRead(Button_inStartRgt);
  Button_stGleis1 = digitalRead(Button_inGleis1);
  Button_stGleis2 = digitalRead(Button_inGleis2);
  Button_stGleis3 = digitalRead(Button_inGleis3);


  // ########### Deflector control: ###########

  if ((Button_stStartLft == LOW) && (Button_stGleis1 == LOW))      // check if the Start left & Gleis 1 Button is pressed
  {
    digitalWrite(Relay_outWeiche1Turn, LOW);                      // Switch Relay ON for Weiche 1 Turn position
    digitalWrite(Led_outWeiche1Turn, HIGH);                       // Switch LED ON for Weiche 1 Turn position indication
    digitalWrite(Led_outWeiche1Straight, LOW);                    // Switch LED OFF for Weiche 1 Straight position indication
    Led_stWeiche1Straight = 0;                                    // Status LED Weiche 1 Straight position indication for EEPROM
    Led_stWeiche1Turn = 1;                                        // Status LED Weiche 1 Turn position indication for EEPROM
    EEPROM.update(EEprom_id0, Led_stWeiche1Straight);             // Status LED Weiche 1 Straight position stored in EEPROM if value different to already stored value
    EEPROM.update(EEprom_id1, Led_stWeiche1Turn);                 // Status LED Weiche 1 turned position stored in EEPROM if value different to already stored value
    Time_tilast1 = millis();                                      // Write actual time in Time_tilast1
    IfPath_st1 = 1;                                               // Write status of path = 1 (needed to ensure proper working of millis function)
  }
  if (((millis() - Time_tilast1) >= DelayTimeWeiche) && (IfPath_st1 == 1))       //check if delay time to switch off the relay is elapsed & IfPath is true
  {
    digitalWrite(Relay_outWeiche1Turn, HIGH);                     // Switch Relay OFF for Weiche 1 Turn position
    IfPath_st1 = 0;                                                // Set IfPath back to 0
  }

Ich habe für euch das ganze noch in form eines Videos zusammengefast.

Als nächstes Arduino Projekt werde ich mich mit der Ansteuerung der LEDs in den Andreaskreuzen beschäftigen

5 comments on “Gleisbildstellpult – Weichensteuerung mit ArduinoAdd yours →

  1. Hallo,

    ich hab mal eine Frage. Ich habe meine Weichen am Decoder Lenz LS150, damit soll zusätzlich möglichkeiten geben Weichen per Handsteuerung zu schalten. Die Wariante mit dem Arduino finde ich sehr interressant, ist es möglich statt der Relais den LS 150 zu nehmen?

  2. Hallo die Beiträge von euch sind super. Da habe ich mal eine frage, kann ich das auch mit einem Raspberry pi3  b + machen

    1. Hallo Jürgen,
      Leider kenne ich mich mit dem Raspberry pi nicht aus, daher kann ich dir hierzu keine Antwort geben.

      LG Sebastian
      von N-Modellbahn

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Translate »