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 

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);
}

Anzeige: Böse Shirts für Menschen mit Humor

Findest Du die Möglichkeiten mit Arduino auch so faszinierend? Blickst Du auch gern hinter die Kulissen um zu verstehen, wie die Welt funktioniert? Dann empfehle ich Dir das Buch: Arduino: Kompendium: Elektronik, Programmierung und Projekte* – Damit wirst Du zum Arduino-Profi!

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.