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

21 comments on “Gleisbildstellpult – Weichensteuerung mit ArduinoAdd yours →

  1. Hallo,
    erst mal ein Kompliment zu euren Videos, die gefallen mir sehr gut.
    Da ich meine komplette Anlage(LEGO) mit Arduinos, 1x Mega, 4xNano, 1xUno, steuere, habe ich eine Frage zu der Methode mit dem EEPROM und zwar wenn ich das im Sketch richtig gesehen habe speichert ihr bei jedem Schaltvorgang in den EEPROM, oder?
    Kommt ihr da nicht relativ schnell an das Ende der Lebensdauer des EEPROM, da der ja nur ca. 100.000 mal beschrieben werden kann?
    Wäre es da nicht besser den Aktuellen Ist Zustand, z.B. mit einem extra Knopf, vor dem Ausschalten zu Speichern?
    Viele Grüße
    Sascha

    PS.: Diesen Kommentar habe ich auch unter das Video geschrieben 😉

  2. Hallo noch ein Zusatz zumeiner vorherigen Mail
    Wie ist eigentlich der Stand Signalsteuerung. Momentan hatte ich immer noch den Gedanken die Signale über Schaletr bzw. Module zu steuern. aber bei Verwendung der Arduino Steuerung würde eine Signalsteuerung darüberauch mehr Sionn machen, was dei Anzahl der Ein- Ausgänge natürlich nochmal erhöht.

    1. Hallo Peter,

      Leider habe ich noch nicht an der Signalsteuerung gearbeitet, da ich aktuell etwas mit dem Landschaftsbau begonnen habe.
      Ich habe allerdings schon eine grobe Idee wie ich meine Signale steuern möchte. Zum Antrieb der Formsignale werde ich Servos einsetzten und versuchen das Nachwippen der Flügel zu simulieren. Dazu habe ich ein gutes Beispiel auf der Seite von Bodo Noethlich gefunden … Bodo war so nett und hat mir sein Arduino Sketch geschickt…

      Gruss
      Sebastian

  3. Guten Morgen
    Danke für die interessante Seite.
    Ich fahre Märklin digital, möchte aber über ein Gleisstellpult „analog“ schalten. Über Deine Seite bin ich auf die Arduino Steuerung gestoßen und kann mir eine Realisierung gut vorstellen.
    Ich bin aber kein Elektroniker und werde mir erst einmal einen Grund- baukasten bestellen und ausprobieren.
    Vorab aber schon mal eine Frage. Mein Bahnhof hat ca. 30 Weichen und daraus resultierend 22 Taster (Start- Ziel- und Gleistaster)
    Das sind ja mehr digitale Aus- und Eingänge als ein Mega hat. Wie gehe ich denn da vor. Kann ich Bauteile zusammenschalten?
    Es wäre schön, wenn ich eine kurze Rückmeldungb bekäme. Ich Habe schon im Internet gesucht aber Beiträge dazu nicht verstanden.

    Danke schon mal vorab

    1. Hallo Peter,

      Vielen Dank für Deinen Kommentar und es freund uns wenn Dir unserer Seite gefällt.
      Meiner Meinung nach gäbe es zwei Möglichkeiten Dein I/O Problem zu lösen:

      1. Arduinos zusammenschalten
      In Deinem Fall könntest Du mehrere Arduinos einsetzten und mit Hilfe der I2C-Schnittstelle verbinden. Soweit ich das richtig verstanden habe ist der I2C ein Datenbus, der die Kommunikation zwischen mehreren ICs (z.B. Arduinos) ermöglicht und benötigt nur zwei Kabel…
      Bis jetzt habe ich das noch nie ausprobiert und kann daher nicht garantieren ob es funktioniert oder Dir hier Tipps geben. Auf folgender Seiter wird das Zusammenschalten von mehreren Arduinos mit Hilfe der I2C Schnittstelle beschrieben:

      2. Verwendung Analog Inputs und Widerstandskaskade
      Eine weiter Möglichkeit um I/Os zu sparen wäre die Möglichkeit mit Hilfe der Analogen Inputs die Spannung von Widerstandskaskaden auszulesen… d.h. wenn Du Fahrstraße 1 drückst wird z.B. ein 200ohm widerstand geschaltet… wenn Fahrstraße 2 werden zwei 200ohm widerstand in Reihe geschaltet (=400Ohm) usw… In dem folgenden Beitrage etwas in der Mitte findest Du eine Beschreibung dazu:

      Gruss
      Sebastian

    2. Hallo Sebastian,

      danke für Deine Rückmeldung.
      Zur Erweiterung der I/Os werde ich das Zusammenschalten zweier ARDUINOS mit dem I2C Datwenbus probieren, hatte ich auch schon gelesen.
      Du wolltest im Text Seiten zu diesem Thema nennen, sind aber nicht aufgeführt. Wäre interessant zu sehen, ob es Seiten sind, die ich noch nicht kenne.
      Auf der Seite von Bodo Noethlich bez. Signalsteuerung war ich auch schon, interessant.
      Danke für den Tip.
      Es wäre also nett, wenn Du noch Seiten zum I2C Bus aufführen könntest.
      Viel Erfolg beim Landschaftsbau.

      Grüße

      Peter

  4. Guten Morgen,
    danke für Deine intersannte Seite, habe mir schon oft Inspiriation eingeholt.
    Zuletzt bin ich ich über die Arduino Steuerung gestolpert.

    Hast Du zufällig schon eine Gleisbesetztmeldung integriert?

    Es soll möglicherweise über den Stromsensor gehen?

    Gruß aus Hessen

    Marc

    1. Hallo Marc,
      Ich habe an meinem zweiten Gleisbilstellpult eine Gleisbesetztmeldung eingebaut. Hierzu gibt es auch ein Video –> https://youtu.be/XF1KzLbugPc. Ich benutze allerdings die Information der Belegmeldung nicht zum Steuern der Züge aber das wäre sicher auch mit Hilfe des Arduinos möglich.
      Ich hoffe ich konnte Dir etwas weiterhelfen.

      Guss
      Sebastian

  5. Hallo Sebastian,
    ein super gutes Tutorial. Ich habe den Aufbau und das Programm bei mir getestet und er funktioniert wirklich toll.
    Ich habe versucht eine vierte Weiche über der W1 zu integrieren, um auch hier geradeaus fahren zu können. Aktuell habe ich es allerdings mit den Millis noch nicht ganz raus, sprich das Relais schaltet nicht ab. Vielleicht könntest du mal kurz in meinen angepassten Code schauen und entdeckst den Fehler? Darf ich den Code hier posten oder ist es besser, wenn ich ihn dir per eMail sende?

    Danke nochmal für das super Tutorial und auch für die tollen Hilfsdateien (Excel).

    Viele Grüße
    Gregor

    1. Hallo Gregor,

      Ich hatte Dir bereits direkt eine Mail geschickt, bin mir aber nicht sicher ob sie Dich erreicht hat.
      Es freut mich und den Jörg sehr wenn unsere Tutorials auf Interesse stoßen.
      So nun zu Deinem Arduino Problem
      Am besten schickst Du mir mal Deinen Code per mail (info@n-modellbahn.de) und ich schau Ihn mir die Tage mal an.

      LG
      Sebastian

  6. Hallo,

    verstehe ich richtig, dass für eine Weiche 2 Relais des Boards gebraucht werden? D. h. mit einem Relais-Board könnte ich insgesamt 4 Weichen anschließen? Viele Grüße!

    1. Hallo Mario,
      Leider habe Ich Deine Anfrage erst jetzt gesehen. Dein Verständnis ist vollkommen richtig. Um einen klassischen Weichenantrieb (Spulenantrieb) schalten zu können benötigst Du 2 Relais.
      Gruss
      Sebastian

  7. Hey, super System, tolle Anleitung!
    Ich plane nun meine analoge Anlage auf dieses System umzurüsten.

    Wollte ebenfalls nach dem verwendeten Relaisboard fragen, das wurde aber bereits beantwortet.

    Habe gesehen, dass pro Weiche je ein Relais für Gerade und Abbiegen verwendet wurde.
    Ist es denn nicht möglich mit einem Relais beide Zustände zu schalten. Schließlich sind es ja bistabile Relais, die 2 Schaltzustände haben.

    Danke,
    Paul

    1. Hallo Paul,
      Sorry, dass ich erst so spät antworte….
      Freut mich, wenn Dir unsere Anleitung gefällt.
      Nun zu Deiner Frage:
      Wenn Du Weichenantriebe mit einer zuverlässigen Endabschaltung verwendest, kannst Du natürlich ein Relais zum Anteuern der Weiche verwenden. Ich musste leider bereits leidvoll feststellen, dass die Endabschaltung bei den Minitrix Antrieben nicht immer sicher funktioniert und am Ende die Spulen bei mir durchgebrannt sind. Daher habe ich den sicheren Ansatz gewählt und die Endabschaltung selbst in die Hand genommen über den Einsatz zweier Relais pro Weiche.

      Gruss

      Sebastian

  8. 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?

  9. 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

    2. Hallo Jürgen,
      ja geht auch mit einem Raspberry. Der hat auch GPIOs die man ähnlich wie beim Arduino steuern kann.
      Viele Grüße Steffi

    3. Hallo Steffi,
      Vielen Dank für Deinen Input. Echt Super wenn die community hilft fragen vim anderen Modellbahnern zu beantworten.

      Gruss
      Sebadtian

Schreibe einen Kommentar

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

Translate »