Anzeige

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.


Welches Projekt würdest du gern auf dieser Seite finden? Worüber soll ich schreiben? *


Stefan Hermann

Ich bin Stefan und arbeite seit 2007 mit Arduino. Als Designer und Produktmanager setze ich das Board in erster Linie zum Bau von Prototypen ein. Hier teile ich meine Faszination und Erfahrung mit dir!

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.