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


5 1 vote
Article Rating
Abonnieren
Benachrichtige mich bei
27 Comments
Newest
Oldest Most Voted
Inline Feedbacks
Alle Kommentare anzeigen
Berbhard Wübert
6 Tage zuvor

Kann man das Programm auf 2 Servos erweitern, wenn ja, wie?
Herzlichen Gruß
Bernhard

Bernhard
8 Tage zuvor

Der Code ist prima und funktioniert einwandfrei, mein Problem ist, dass ich einen zweiten Servolenkung betreiben muß für die andere Gleisseite. wie mach ich das?
Herzlichen Gruß

Herbert Nosalek
3 Jahre zuvor

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

Matthias Schopfer
3 Jahre zuvor

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“

Günter Müller
3 Jahre zuvor

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 ?

Troll Georg
4 Jahre zuvor

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?

felix
4 Jahre zuvor

Ist es auch möglich, das die schranke in beide richtungen funktionirt?

Gerhard
Antworte an  felix
3 Jahre zuvor

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

Bernhard
Antworte an  felix
8 Tage zuvor

hallo Felix, schalte in beide Richtungen jeweils zwei Readcontakte, also
K1 = Schranke auf, K2 = Schranke zu

Michael
5 Jahre zuvor

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.

Michael
Antworte an  Stefan Hermann
5 Jahre zuvor

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.

Michael
5 Jahre zuvor

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.

Michael
Antworte an  Stefan Hermann
5 Jahre zuvor

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.

Michael
Antworte an  Stefan Hermann
5 Jahre zuvor

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

Günter
5 Jahre zuvor

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-

Bernhard
Antworte an  Günter
8 Tage zuvor

Hallo Günter,
in Zeile 17 steht. int servoGeschwindigkeit = 2; ersetze die 2 durch eine 1
Gruß Bernhard

27
0
Ich würde mich über deine Meinung freuen.x