Automatischer Bahnübergang: Arduino-Schaltung & Quellcode mit Ultraschallsensoren
Hochgeschwindigkeits-Automatischer Bahnübergang mit Arduino und Ultraschallsensoren
In diesem Tutorial lernen wir, wie man ein einfaches und effizientes automatisches Hochgeschwindigkeits-Bahnübergangssystem entwirft. Dies ist ein relativ einfacher Ansatz für dieses Projekt, aber Sie können dies als grundlegenden Baustein nehmen und in weiteren Modifikationen auch die Geschwindigkeit des Zuges erfassen, mit der er vorbeifährt, und vieles mehr. Bevor wir direkt in das Tutorial einsteigen, müssen wir eine Vorstellung davon bekommen, was Automatisierung ist und was man genau davon erwarten kann.
Automatisierung bedeutet im Grunde, eine Methode zu entwickeln, um menschliche Anstrengungen/Eingriffe zu reduzieren oder zu eliminieren. In diesem Tutorial erklären wir, wie man einen Bahnübergang mit Arduino und Servomotor sowie der Proteus-Software automatisiert.
Die Komplexität der Automatisierung kann von einer einfachen „Ein/Aus“-Steuerung bis zu hochkomplexen multivariablen Algorithmen variieren. Die Steuerungssysteme für Automatisierungszwecke können entweder offen oder geschlossen sein, d. h. sie können entweder mit einem einzelnen Eingangsparameter arbeiten oder als Reaktion auf den als Eingang zurückgefügten Ausgang, wie bei geschlossenen Regelkreisen. Die Automatisierung in der Bahnindustrie ist ein wichtiges Bedürfnis, da wir in das fortschrittliche Zeitalter eintreten und um das Risiko von Unfällen durch menschliche Fehler zu reduzieren, ist es sehr wichtig, dass diese Aufgaben von diesen intelligenten Maschinen übernommen werden.
- Verwandter Beitrag: Geschwindigkeitsmesser für Autos – Funktionsweise und Quellcode
Wie bei jeder Technologie hat Automatisierung Vor- und Nachteile:
Vorteile
- Produktivitätssteigerung
- Vorhersagbare Qualität (Qualitätsverbesserung)
- Erhöhte Robustheit
- Hohe Ausgabe-Konsistenz
- Reduzierung der Personalkosten
- Hohe Genauigkeit
- Reduziert menschliche Anstrengung bei monotonen Arbeiten
Nachteile
- Anfällig für Sicherheitsbedrohungen
- Entwicklungskosten können Vorhersagen übersteigen
- Hohe Einrichtungs- und Anschaffungskosten
- Ursache für Arbeitslosigkeit in vielen Sektoren
Die genannten Vorteile überwiegen die Nachteile bei weitem, und deshalb schreitet die gesamte Welt in das Zeitalter der Automatisierung voran.
In diesem Tutorial versuchen wir, einen Bahnübergang zu automatisieren, der sich öffnet und schließt, wann immer die Schaltung einen Zug auf der Strecke erkennt. Wir initiieren auch einen Summer oder Alarm, der die Geschwindigkeit des Zuges anzeigt, wenn diese einen bestimmten Schwellenwert überschreitet. Dafür verwenden wir zwei sehr weit verbreitete elektronische Komponenten: Arduino und Servomotor.
Der in diesem Tutorial verwendete Sensor ist der Ultraschallsensor, aber es ist nicht zwingend, diesen zu verwenden. Wir können auch eine andere Version dieses Projekts mit dem IR-Sensormodul erstellen – es hängt von unserer Wahl ab, was wir verwenden möchten und was uns readily verfügbar ist.
- Verwandter Beitrag: Smart Home Automation System – Schaltung und Quellcode
Benötigte Komponenten für Bahnübergangssteuerung
- Arduino UNO
- Summer (Buzzer)
- Ultraschallsensor (HC-SR04)
- Servomotor
Benötigte Software:
- Arduino IDE
- Proteus
Schaltplan des Bahnübergangscontrollers

Komponentenbeschreibung
Arduino UNO
Arduino ist im Grunde ein Open-Source-Entwicklungsboard, das primär den Microchip ATmega328P Mikrocontroller nutzt und von Arduino.cc hergestellt wird. Das Board verfügt über einen Satz Ein-/Ausgangspins, bestehend aus digitalen und analogen Pins, die mit verschiedenen Erweiterungsboards und externen Schaltungen verbunden werden können.
Das Board kommt mit 14 digitalen Pins und 6 analogen Pins, die mit Hilfe einer IDE (Integrated Development Environment), die mitgeliefert wird (Arduino IDE), programmierbar sind. Das Programm wird über ein USB-Kabel Typ B hochgeladen. Stromversorgungsmethoden für das Board können entweder über das USB-Kabel oder durch Anschließen einer 9V DC-Versorgung erfolgen. Der akzeptable Spannungsbereich liegt zwischen 7 und 20 Volt. Vom Design und Funktionsprinzip her unterscheidet es sich nicht stark von seinen anderen Familienmitgliedern Arduino Nano und Arduino Leonardo.
STK500 ist immer noch das ursprüngliche Protokoll für Uno zur Kommunikation. Der Hauptunterschied zu seinen Vorgängern ist, dass es den FTDI USB-zu-Serial-Treiberchip nicht verwendet. Stattdessen nutzt es ATmega 16U2 (Atmega8U2 bis Version R2), das als USB-zu-Serial-Konverter programmiert ist.
- Verwandter Beitrag: Variables Netzteil mit Arduino UNO – Schaltung und Code

Ultraschallsensor (HC-SR04)
Der Ultraschallsensor ist der Basissensor, den wir zur Bestimmung der Entfernung eines Objekts verwenden. Anders ausgedrückt: Er misst, wie weit ein Objekt von einem bestimmten Referenzpunkt entfernt ist. Er hat im Wesentlichen 4 Pins:
- Trig-Pin (Trigger)
- Echo-Pin
- GND-Pin
- VCC-Pin (+5V)
Wie funktioniert Ultraschall? Der Sender (Trig) sendet ein hochfrequentes Schallsignal, das vom Objekt reflektiert wird und dann am Empfänger (Echo) empfangen wird. Da die Schallgeschwindigkeit in Luft bekannt ist, können wir die Entfernung berechnen. Dieser Sensor ist extrem beliebt unter Arduino-Bastlern, die ihn täglich in ihren Projekten verwenden. Zum Auslösen des Sensors benötigen wir einen High-Puls von 10 Mikrosekunden oder mehr.
Eigenschaften des Ultraschallsensors:
- Stromversorgung: +5V DC
- Ruhe-Strom: <2mA
- Arbeitsstrom: 15mA
- Effektiver Winkel: <15°
- Messbereich: 2 cm – 400 cm / 1″ – 13 ft
- Auflösung: 0,3 cm
- Messwinkel: 30 Grad
- Trigger-Eingangspulsbreite: 10 µS
- Abmessungen: 45 mm x 20 mm x 15 mm
Verwandter Beitrag: Automatische Pflanzenbewässerung & Bewässerungssystem – Schaltung, Code & Projektbericht

Servomotor
Dies sind spezielle Motoren, die für sehr spezifische Bewegungen an einem bestimmten Winkel eingesetzt werden. Es handelt sich um einen Dreh- oder Linearaktuator, der präzise Kontrolle an bestimmten Winkel- oder Linearpositionen ermöglicht. Ein Servomotor ist keine einzelne Einheit, sondern eine Kombination aus einem geeigneten Motor und einem Sensor, der die Rückmeldung der aktuellen Motorgeometrie gibt.
Um diesen Servomotor zu nutzen, müssen mehrere andere fortschrittliche Module verwendet werden, da er in Bezug auf Benutzerfreundlichkeit nicht mit dem DC-Motor vergleichbar ist. Diese Motoren werden hauptsächlich in der Robotik und in großen Fertigungsindustrien eingesetzt.
Diese Motoren haben eine gewisse Ähnlichkeit mit Schrittmotoren, die Offene-Regelkreis-Steuerung darstellen. Schrittmotoren haben eingebaute Schritte, an denen sie rotieren, aber mangels Rückkopplungssystem ist ihre Verwendung auf eine spezifische Anwendung beschränkt, für die sie entwickelt und hergestellt wurden.
Dieser Mangel an Rückmeldung unterscheidet den Servomotor von Schrittmotoren und gibt ihm die Oberhand, da er dynamisch ist und mit geringer Programmänderung an die jeweilige Aufgabe angepasst werden kann. Ein dediziertes Steuerungsmodul wird in der Regel vom Hersteller mit dem Servomotor mitgeliefert.
Mechanismus – Es handelt sich im Grunde um einen geschlossenen Regelkreis (Closed-Loop Servomechanismus), der das Rückkopplungssystem zur Aktualisierung der Bewegung und der endgültigen Position des Rotors nutzt. Die Eingabe zur Motorsteuerung kann entweder analog oder digital sein.
- Verwandter Beitrag: Entfernungsmessung mit Arduino und Ultraschallsensor
Ein Encoder irgendeines Typs ist mit dem Motor gekoppelt, um Position und Geschwindigkeitsrückmeldung an die Steuerung zu geben, die ein Fehlersignal erzeugt, bis der gewünschte Ausgang nicht erreicht ist. Und um dieses Fehlersignal zu reduzieren, kann sich der Motor in beide Richtungen bewegen, um das Fehlersignal schließlich auf null zu reduzieren. Wenn diese Bedingung erreicht ist, ist der gewünschte Ausgang erreicht. Erweiterte und anspruchsvolle Servomotoren haben einen optischen Drehencoder an der Ausgangswelle zur Geschwindigkeitsmessung.

Summer (Buzzer)
Summer können mechanisch, elektronisch, elektromechanisch oder piezoelektrisch sein. Allgemein verwenden wir den elektronischen in Öfen, Spielshows und Geräten etc. Diese Summer haben eine interne Schaltung. Der erzeugte Ton entsteht durch die Bewegung einer Scheibe. Die Scheibe ist ferromagnetisch. Es ist ein stromgetriebenes Gerät, das eine Spannungsquelle als Eingang hat.

Funktionsweise des automatischen Bahnübergangscontrollers
In dieser Schaltung haben wir Ultraschallsensoren und Servomotoren verwendet, um die Funktionsweise eines Bahnübergangs nachzubilden. Beide Sensoren werden über die an das Arduino-Board angeschlossenen Trigger-Pins ausgelöst und die Entfernung berechnet. Die weitere Funktionsweise der Schaltung hängt vollständig von der gemessenen Entfernung ab.
Wenn die Strecke frei ist, tun die Servomotoren nichts. Wenn ein Zug auf einer Seite der Strecke ankommt, ändert sich die von einem der Sensoren gemessene Entfernung vom vorherigen Wert. Auf diese Weise werden wir über die Ankunft des Zuges informiert, und Arduino setzt seine digitalen Pins 7 und 8 sofort auf HIGH.
Diese Pins sind mit den zwei Servomotoren verbunden, und dann drehen die Servos einen Winkel von 90°, wodurch das Schranken geschlossen wird, um den Weg für Fahrzeuge zu blockieren. Wenn der Zug vom anderen Sensor wegfährt, wird Arduino über die Abfahrt des Zuges benachrichtigt, und die Servomotoren kehren wieder in ihre ursprüngliche Position zurück, um das Schranken zu öffnen.
Zur Sicherheit der Personen haben wir eine weitere Funktion hinzugefügt: Warnung bei Hochgeschwindigkeitszügen. Dies wird erreicht, indem die Zeit zwischen den Übergängen der beiden Sensoren in einem Zyklus berechnet wird. Wenn die Zeit unter einen bestimmten Wert fällt, erzeugt der Summer ein Summergeräusch, um Personen in der Nähe des Übergangs zu warnen.
- Verwandter Beitrag: Intelligentes Bewässerungssystem – Schaltplan und Code
Projekt-Quellcode & Erklärung
In diesem Sketch haben wir fünf Integer-Variablen und vier Long-Variablen definiert. Die Variablen tr1, tr2, eh1 und eh2 dienen zum Senden des Pulses und Empfangen des Zeitwerts in Mikrosekunden, während val1, val2, dis1 und dis2 zum Speichern der Zeitwerte in Mikrosekunden und Entfernungen in cm dienen. Die Baudrate ist auf 9600 Bit/s eingestellt und verantwortlich für die Kommunikation zwischen Board und Serial Monitor.
const int tr1 = 13, eh1 = 12, tr2 = 3, eh2 = 2;
int bz = 11;
unsigned long val1, dis1, val2, dis2;
#include <Servo.h>
Servo myservo1;
Servo myservo2;
int pos = -1;
Die im void setup() enthaltenen Funktionen werden nur einmal während der Ausführung durchgeführt und ihre Aufgabe ist es, Baudrate und Pin-Modus als Eingang oder Ausgang zu definieren.
void setup() {
pinMode(tr1, OUTPUT);
pinMode(tr2, OUTPUT);
pinMode(bz, OUTPUT);
pinMode(eh1, INPUT);
pinMode(eh2, INPUT);
myservo1.attach(8);
myservo2.attach(7);
Serial.begin(9600);
}
Gemäß der erforderlichen Funktionsweise messen wir kontinuierlich die Entfernung durch Auslösen des Ultraschallsensors, und die berechnete Entfernung wird als Parameter der bedingten Anweisung verwendet. Wenn die Bedingung wahr ist, inkrementiert die Variable „pos“ ihren Wert, um die Servomotoren anzusteuern, und wenn die Bedingung falsch ist, dekrementiert die „pos“-Variable ihren Wert, um die Servomotoren in ihre vorherige Position zurückzubringen.
Es gibt eine weitere bedingte Anweisung, die prüft, ob zwei Sensoren das Objekt schnell erfassen – dann wird Pin 11 auf HIGH gesetzt, um den Summer zu aktivieren und Personen zu warnen. All diese Prozesse sind in void loop() enthalten und werden wiederholt, bis der Arduino zurückgesetzt wird oder die Stromversorgung unterbrochen wird.
void loop() {
digitalWrite(tr1, LOW);
delayMicroseconds(2);
digitalWrite(tr1, HIGH);
delayMicroseconds(10);
digitalWrite(tr1, LOW);
val1 = pulseIn(eh1, HIGH);
dis1 = (val1 * 0.0343) / 2;
digitalWrite(tr2, LOW);
delayMicroseconds(2);
digitalWrite(tr2, HIGH);
delayMicroseconds(10);
digitalWrite(tr2, LOW);
val2 = pulseIn(eh2, HIGH);
dis2 = (val2 * 0.0343) / 2;
Serial.println("distance is ");
Serial.println(dis1);
Serial.println(dis2);
if(dis1 < 100 || dis2 < 100) {
if(pos == -1) {
for (pos = 0; pos <= 90; pos += 1) {
myservo1.write(pos);
myservo2.write(pos);
delay(15);
}
}
delay(1000);
digitalWrite(tr1, LOW);
delayMicroseconds(2);
digitalWrite(tr1, HIGH);
delayMicroseconds(10);
digitalWrite(tr1, LOW);
val1 = pulseIn(eh1, HIGH);
dis1 = (val1 * 0.0343) / 2;
digitalWrite(tr2, LOW);
delayMicroseconds(2);
digitalWrite(tr2, HIGH);
delayMicroseconds(10);
digitalWrite(tr2, LOW);
val2 = pulseIn(eh2, HIGH);
dis2 = (val2 * 0.0343) / 2;
if(dis1 < 100 || dis2 < 100) {
digitalWrite(bz, HIGH);
Serial.println("distance2 is ");
Serial.println(dis1);
Serial.println(dis2);
}
} else if(dis1 >= 100 && dis2 >= 100) {
if(pos == 91) {
for (pos = 90; pos >= 0; pos -= 1) {
myservo1.write(pos);
myservo2.write(pos);
delay(15);
}
}
digitalWrite(bz, LOW);
delay(200);
}
}
Hex-Datei mit Proteus verbinden für Simulation: In Ihrer Arduino IDE klicken Sie auf Datei → Voreinstellungen und aktivieren Sie unter „Ausführliche Ausgabe anzeigen“ beide Optionen Kompilierung und Hochladen. Nach der Kompilierung des Codes wählen Sie im unteren Fenster den Speicherort der Hex-Datei aus und kopieren ihn. In Proteus doppelklicken Sie auf den Arduino und fügen den Dateipfad in die Option „Program File“ ein und klicken auf OK. Jetzt ist Ihre Schaltung bereit für die Simulation in Proteus.
Verwandte Projekte
- Automatische Türklingel mit Objekterkennung durch Arduino
- Automatische Nachttischlampe mit Arduino
- Arduino PWM-Programmierung und ihre Funktionen
- Arduino Serial: Serielle Kommunikation mit Arduino
- Elektronik-Abschlussprojekt-Ideen Liste
- Elektronik-Ingenieur-Projektideen für Studenten
- Einfache und grundlegende Elektronik-Mini-Projektideen für Anfänger
Industrietechnik
- NOR-Gatter SR-Latch: Digitalen Speicher aufbauen und verstehen
- Häufige Ausfallmodi in bewährten elektrischen Systemen
- TTL NOR- und OR-Gatter: Schaltungsanalyse und Umwandlung
- Fortgeschrittene Motorkontrollschaltungen: Selbsthaltung, Stopp und Zeitverzögerung
- PIR-Sensor gesteuertes automatisches Türöffnungssystem: Schaltung, Funktionsweise & Anwendungen
- M-TECH: Fortschrittliches CNC-Steuerungssystem für Apollo-Fräser
- DIY Automatische Modellbahn-Steuerung mit Arduino – Einfach & Flexibel
- SERENA: Eigenes Arduino Mega 2560 Alarmsystem mit TFT-LCD-Touchscreen
- Arduino Power Control Center: N-FET, P-FET, Relais & RTC Kit
- Cloud Monitoring: Fernsteuerungssystem für Echtzeit-Asset-Management