Zum Inhalt springen
Arduino Bahnübergang mit Servo Schranke und Andreaskreuz

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.


    Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


    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 »Arduino Projekte Volume 1« an!

    • Die beliebtesten Arduino-Projekte von StartHardware
    • Inklusive Schaltplan, Beschreibung und Code
    • Arduino-Schnellstart-Kapitel
    • Kompakter Programmierkurs


    23 Gedanken zu „Bahnübergang: Schranke und Andreaskreuz mit Arduino“

    1. Hallo Stefan,
      den Sketch habe ich auf meinen Mega 2560 übertragen und probeweise aufgebaut.
      Funktioniert tadellos, bis auf das Ruckeln des Servos, aber das ist ein anderes Problem.
      Mein Ziel war, dass der Arduino, 2 Übergänge steuert.
      Den Sketch habe ich entsprechend erweitert und jetzt bekomme ich folgende Fehlermeldung,
      Arduino: 1.8.19 (Windows 10), Board: “Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)”

      C:\Users\h_nos\AppData\Local\Temp\ccJObzSh.ltrans0.ltrans.o: In function `main’:

      C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/main.cpp:43: undefined reference to `setup’

      C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/main.cpp:46: undefined reference to `loop’

      collect2.exe: error: ld returned 1 exit status

      exit status 1

      Fehler beim Kompilieren für das Board Arduino Mega or Mega 2560.

      Was habe ich da falsch gemacht?
      Wie kann ich Dir den Sketch zusenden?
      Gruß aus Bayern Herbert

    2. Die Lösung bezüglich Magnete an der Lok oder am letzten Wagen heisst: Lichtschranke! Barrieren schliessen, wenn die erste Lichtschranke aktiviert wird und öffnet erst, wenn die zweite Lichtschranke deaktiviert wird. So spielt die Zuglänge keine Rolle.
      Zum Code: suche im Interner nach “Arduino Interrupt FALLING RISING”

    3. hallo Moba Freunde
      Ich habe immer noch das Problem mit der Einstellung der Servo Geschwindigkeit.
      Ich habe die im Sctch auf 1 stehen, finde ich aber immer noch etwas zu schnell.
      hat jemand einen Vorschlag ?
      Außerdem ist eine Zugfeder dargestellt, kann man die wo kaufen oder gar selberstricken ?

    4. Wollte Sketch eingeben bin aber nur bis Void playTone gekommen dann kam immer die Fehler Meldung bin neu und versuche mich einzulesen. Was hab ich da falsch eingegeben?

      1. Hi Georg, tja, das ist natürlich schwer zu sagen. Kannst du den Code nochmal kopieren und in einen neuen Arduino-Sketch einfügen? (Am Anfang es Codes ist ein Kopieren-Button oben rechts) Vielleicht ist es nur ein Tippfehler. Liebe Grüße

      1. Würde ich auch gerne wissen in einer Richtung geht es super aber ich habe eine Pendelstrecke wie kann ich die Bedingung schreiben das es auch in Gegenrichtung funktioniert.

        Dankeschön

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

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

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

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

      1. Hi,
        das Problem kenne ich. Ich habe es wie folgt gelöst. Einer oder beide Zugrückmelder (also vor und hinter der Schranke) müssen belegt sein. so lange das so ist, bleibt die Schranke zu. Sind beide nicht belegt ist die Schranke offen. Die Richtung spielt dann bei eingleisigen Strecken keine Rolle. Allerdings sind Reedkontakte nicht ideal, wegen des Problems mit den Loks mit Anhängern, was ja der Normalfall ist. Deshalb ist es besser komplette Gleisstrecken als Rückmelder zu machen, was über Rückmeldedekoder problemlos funktioniert.

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

    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.