Bahnübergang: Schranke und Andreaskreuz mit Arduino

So baust du einen Bahnübergang mit Schranke und Andreaskreuz mit dem Arduino-Board. Als Antrieb verwenden wir einen Servo-Motor.

Funktionsweise

Sobald ein Zug über einen Magnetschalter fährt, blinkt die rote LED über dem Andreaskreuz und die Schranke schließt sich durch einen Servo-Motor, der unter der Schranke an einer Zugstange mit Feder zieht. Der Zug überquert den Bahnübergang. Überfährt der Zug den zweiten Magnetschalter, der Servo-Motor öffnet die Schranke wieder.

Phasen

  1. Untätig (Engl.: Idle), warten auf Signal vom ersten Magnetschalter
  2. Andreaskreuz blinkt für eine bestimmte Zeit
  3. Schranke schließt sich, warten auf Signal vom zweiten Magnetschalter
  4. Schranke öffnet sich

Schaltung und Aufbau

Die Schaltung besteht aus einem Arduino-Board, zwei Magnetschaltern, die auf der einen Seite mit dem GND und auf der anderen Seite mit zwei digitalen Eingangspins (10 und 12) des Arduinos verbunden sind. Eine LED ist über einen 220 Ohm-Widerstand mit dem Pin 2 verbunden. Ein Servo-Motor ist mit GND, 5V und Pin 9 verbunden. Darüber hinaus gibt es einen Lautsprecher (z.B. einen Piezo oder Transducer) am Pin 8 für eine akustische Ausgabe.

Anmerkung: Wenn der Servo lange im Einsatz sein soll, lohnt es sich, einen besseren Servo zu verwenden. (Alternativ kann die Zugfunktion auch mit einem Elektromagneten* realisiert werden. Dazu muss der Strom des digitalen Pins allerdings verstärkt werden.)

Bauteile

Arduino-Code

#include <Servo.h>

int ledPin = 2;
int servoPin = 9;
int magnetSensor1Pin = 10;
int magnetSensor2Pin = 12;

int speakerPin = 8;

int myState = 0; // speichert die aktuelle Programmphase
Servo myServo;  // erstellt Servo-Objekt

int servoPositionOffen = 30; // anpassen je nach Servo
int servoPositionGeschlossen = 120; // anpassen je nach Servo

int servoPosition;
int servoGeschwindigkeit = 2;

int blinkZeit = 5000; // Blinkzeit vor Schrankenschließung
long timer = 0;

void setup() {
  myServo.attach(servoPin); // initiert den Servo
  pinMode(ledPin, OUTPUT);
  pinMode(magnetSensor1Pin, INPUT_PULLUP);
  pinMode(magnetSensor2Pin, INPUT_PULLUP);

  // Servo auf Anfangsposition stellen
  servoPosition = servoPositionOffen;
  myServo.write(servoPosition);
  delay(1000);
}

void playTone(){
  if (millis() % 2000 > 1800) tone(speakerPin,3000);
  else noTone(speakerPin);  
}

void blinkLED() {
  if (millis() % 2000 > 1000) digitalWrite(ledPin, HIGH);
  else digitalWrite(ledPin, LOW);
}

void loop() {
  switch (myState) {
    case 0: // Untätig, warten auf ersten Magnetschalter
      digitalWrite(ledPin, LOW);
      if (digitalRead(magnetSensor1Pin) == LOW) {
        myState++;
        timer = millis(); // timer wird gestartet
      }
      break;
    case 1: // Andreaskreuz blinkt
      if (timer + blinkZeit < millis()) myState++; // wenn blinkZeit überschritten ist, Schranke schließen
      blinkLED();
      playTone();
      break;
    case 2: // Schranke schließt sich, warten auf zweiten Magnetschalter
      if (servoPosition <= servoPositionGeschlossen) servoPosition = servoPosition + servoGeschwindigkeit;
      if (digitalRead(magnetSensor2Pin) == LOW) myState++;
      blinkLED();
      break;
    case 3: // Schranke öffnet sich
      if (servoPosition <= servoPositionOffen) myState = 0;
      else servoPosition = servoPosition - servoGeschwindigkeit;
      blinkLED();
      break;
  }
  myServo.write(servoPosition);
  delay(20);
}


Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book an!

Darin findest du die beliebtesten Arduino-Projekte von StartHardware. Jedes Projekt umfasst Schaltplan, Bauteile, Beschreibung und Code. Für Einsteiger gibt es ein Arduino-Schnellstart-Kapitel und einen kompakten Programmierkurs. Zusätzlich findest du Zwischenkapitel mit Expertenwissen zu den Komponenten, die verwendet werden. Alle Code-Beispiele gibt es natürlich als Download.

Weitere Informationen findest du auf der Produktseite. Klicke jetzt auf den Button, um Details anzusehen.


Schreibe einen Kommentar

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

 

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

13 Kommentare zu »Bahnübergang: Schranke und Andreaskreuz mit Arduino«

  1. Hallo Stefan.Habe jetzt Deinen Sketch auf einen Atmega 88 geflasht.Dann mit “myMultiProg” ausgelesen.Die Hex-Datei dann auf dem Attiny 85 gespielt.Es läuft……Puhhhh.

    1. Hallo Michael,

      wow, das klingt ja nach einer Odyssee. Cool, dass du es zum laufen gebracht hast. Schick mir gern ein Foto von der Schranke auf der Eisenbahnplatte, dann packe ich es mit in den Beitrag. Hast du das RailFX-System gesehen? https://starthardware.org/railfx-effekte-fuer-modellbahn-und-modellbau-mit-arduino-nano/ Daran arbeite ich gerade. Vielleicht kannst du ein paar Programmschnippsel daraus bei dir verwenden.

      Liebe Grüße

      Stefan

      1. Hallo Stefan.Wenn die Hardware der Schrankensteuerung fertig ist lass ich Dir ein paar Bilder zukommen.Das RailFX-System werde ich mir mal genauer betrachten.Bestimmt für mich etwas dabei.

  2. Gute Bahnschrankensteuerung.Habe es ausprobiert.Würde den Sketch aber gerne auf einen Attiny 85 schieben.Bis jetzt ohne Erfolg.Von der Sketchgröße sollte es doch passen.Oder?Andere Sketche gleicher Größe lassen sich problemlos auf einen 85er flashen.Mach ich einen Denkfehler?Vielleicht hat da jemand eine Idee.Danke im voraus.

      1. Hallo Stefan.Arduino Nano klappt auch.Der Grund warum es ein Attiny sein sollte. Habe auf einer Europaplatine ( Eigenbau)16 Steckplätze für Attinys gelötet für sämtliche Aufgaben auf meiner Anlage.Seilbahnsteuerung,bewegte Häuser und und und.Und da möchte ich Deine gut funktionierende Eisenbahnsteuerung mit ins Boot nehmen.

        1. Hi Michael, ah, alles klar. Das macht dann natürlich Sinn, beim ATTiny zu bleiben. Tja, eigentlich sollte es mit dem Code auf dem ATTiny kein Problem geben. Liegt es vielleicht an der Servo-Library? Hast du Servos mit der Standard-Bibliothek an den ATTinys ausprobiert? Hab leider gerade keines rumzuliegen, sonst würde ich es selber testen.

          1. Ach so, du hast noch nach der Beeinflussung der Geschwindigkeit gefragt. Probier mal die SlowMotionServo-Bibliothek aus. Damit kann man die Servo-Geschwindigkeit beeinflussen. Ich hoffe, ich finde bald die Zeit, den Beitrag mal mit einem Beispiel-Code zu erweitern. Liebe Grüße

          2. Hallo Stefan.Ich habe die Standard-Bibliothek und einige andere Servo Librarys ausprobiert.Leider ohne Erfolg.

  3. Eine sehr gute Anleitung, gut nachvollziehbar und funktionell.
    Leider geht die Schranke ziemlich schnell auf und zu, leider konnte ich die Geschwindigkeitseinstellung nicht finden, wahrscheinlich muss man den Sketch umschreiben. Vielleicht hat jemand einen Vorschlag.
    Leider finde ich auch nirgends eine weiche Stahlfeder, die hier angegeben wird-

  4. a) Magnet an Zugspitze:
    Bei Betätigung des 2.Magneten geht Schranke auf, aber nach dem Magnet an der Zugspitze werden in der Regel auch noch Waggons hängen. Und die durchfahren die offene Schranke.
    b)Magnet an Zugende:
    Schranke geht erst zu, wenn der Magnetschalter betätigt wird, aber vor dem Magnet befinden sich Waggons, die die noch offene Schranke durchfahren.

    Fazit: Könnte nur funktionieren bei extrem langen Vor- bzw Nachlaufzeiten bezüglich dem Auf/Zu. Da wäre nur ein Magnetschalter direkt auf dem BÜ angebrachter.

    Eventuelle Lösung (die ich leider wegen mangelnder Programmiererfahrung nicht bieten kann):
    Links: Magnetschalter 1.1 und 2.1, Rechts Magnetschalter 1.2 und 2.2.
    Zug von Links: 1.1 ist für Zu, 1.2 ist für Auf. Mit 2.1 und 2.2 wird Zugende ausgewertet: Schranke Auf.
    Ist schön gedacht, eventuell könnte es so funktionieren…..

  5. Schrankensteuerung sehr gut dargestellt und offensichtlich auch nachbaubar. Ich habe noch im Freundeskreis Unterstützung, muss mich aber infolge meiner Arduinounkenntnis an dritte Personen wen den, um das Gewünschte umzusetzen. Das hat nun schon sehr lange gedauert, also viel Zeit gekostet. Ich erhoffe mir mit dem Stepper einen besseren Weg als mit “Servos”