Bau einer Geschwindigkeitsmessanlage
Zum Einmessen meiner Fahrzeuge bediente ich mich bisher einer Stoppuhr. Das hat natürlich den Nachteil, dass
die Messung nicht ganz exakt wird, weil die Messstrecke nicht immer auf die Millisekunde genau gestoppt werden kann,
hier ist der Mensch einfach nicht "hochauflösend" genug. Am besten ist also eine automatische Messstrecke,
die über zwei Kontakte die Zeit misst, die das Fahrzeug für eine bestimmte Distanz benötigt.
Nach kurzem Suchen bin ich fündig geworden. Es kommen zwei TCRT5000 Infrarot Lichtschranken zum Einsatz. Diese
bekommt man zum Stückpreis von etwa 30 Cent. Zum Anzeigen wird ein LC Display HD44780 mit 2 X 16 Zeichen verwendet.
Diese Komponenten werden an ein Arduino Uno angeschlossen.
Nun muss natürlich noch ein Code geschrieben werden. Nach ein wenig probieren ist er fertig:
#include
#include "TimerOne.h"
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int Sensor_A = A0;
int Sensor_B = A1;
int Sensor_1 = 900;
int Sensor_2 = 900;
int Zeitmesser = 0;
int Loeschen = 0;
int Start = 0;
int Stop = 0;
int Geschwindigkeit = 0;
void setup()
{
lcd.begin(16,2);
lcd.setCursor(3,0);
lcd.print("Bereit f");
lcd.setCursor(11,0);
lcd.print(char(245));
lcd.setCursor(12,0);
lcd.print("r");
lcd.setCursor(2,1);
lcd.print("eine Messung");
Timer1.initialize(50000);
Timer1.attachInterrupt(Zeitkonstante);
Serial.begin(9600);
}
void Zeitkonstante()
{
// Start der Zeit
if (Start == 1 || Start == 2 && Stop == 0)
{
Zeitmesser++;
}
// Zeit zum Löschen des Displays auf Grundstellung
if (Loeschen > 0)
{
Loeschen++;
}
/*
// Ausgabe der Sensorwerte
Serial.println("Sensor_1");
Serial.println(Sensor_1);
Serial.println("Sensor_2");
Serial.println(Sensor_2);
*/
}
void loop()
{
Sensor_1 = analogRead(Sensor_A);
Sensor_2 = analogRead(Sensor_B);
// Messung wenn Zug aus Richtung 1 kommt
if (Sensor_1 < 500 && Sensor_2 > 500 && Start == 0)
{
Start = 1;
lcd.begin(16,2);
lcd.setCursor(4,0);
lcd.print("Messung");
lcd.setCursor(3,1);
lcd.print("gestartet");
}
// Messung gestoppt
if (Sensor_2 < 500 && Start == 1)
{
Stop = 1;
}
// Messung wenn Zug aus Richtung 2 kommt
if (Sensor_2 < 500 && Sensor_1 > 500 && Start == 0)
{
Start = 2;
lcd.begin(16,2);
lcd.setCursor(4,0);
lcd.print("Messung");
lcd.setCursor(3,1);
lcd.print("gestartet");
}
// Messung gestoppt
if (Sensor_1 < 500 && Start == 2)
{
Stop = 1;
}
// Ausgabe der Geschwindigkeit
if (Stop == 1 && Loeschen == 0)
{
// v = s / t; s = Streckenlänge (in cm) / 100 * Maßstab * 3,6 * 20 (Auflösung des Interrupts)
Geschwindigkeit = 3182 / Zeitmesser;
Zeitmesser = 0;
Loeschen = 1;
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print("Geschwindigkeit:");
if (Geschwindigkeit < 100)
{
lcd.setCursor(4,1);
lcd.print(Geschwindigkeit);
lcd.setCursor(7,1);
lcd.print("km/h");
}
else
{
lcd.setCursor(4,1);
lcd.print(Geschwindigkeit);
lcd.setCursor(8,1);
lcd.print("km/h");
}
}
// Displays löschen, Grundstellung
if (Loeschen > 150)
{
Start = 0;
Stop = 0;
Zeitmesser = 0;
Loeschen = 0;
lcd.begin(16,2);
lcd.setCursor(3,0);
lcd.print("Bereit f");
lcd.setCursor(11,0);
lcd.print(char(245));
lcd.setCursor(12,0);
lcd.print("r");
lcd.setCursor(2,1);
lcd.print("eine Messung");
}
// Ausgabe wenn beide Sensoren auslösen = Gleis ist belegt
if (Sensor_1 < 500 && Sensor_2 < 500 && Start == 0)
{
Start = 3;
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print("Gleis ist belegt");
}
// beide Sensoren wieder in Grundstellung = Gleis ist nicht mehr belegt
if (Sensor_1 > 500 && Sensor_2 > 500 && Start == 3)
{
Start = 0;
Zeitmesser = 0;
lcd.begin(16,2);
lcd.setCursor(3,0);
lcd.print("Bereit f");
lcd.setCursor(11,0);
lcd.print(char(245));
lcd.setCursor(12,0);
lcd.print("r");
lcd.setCursor(2,1);
lcd.print("eine Messung");
}
// wenn nach dem Auslösen des ersten Sensors eine Zeit von 40 Sekunden überschritten wird: Grundstellung und Ausgabe "Messung ungültig"
if (Zeitmesser > 800)
{
Zeitmesser = 0;
Loeschen = 1;
lcd.begin(16,2);
lcd.setCursor(3,0);
lcd.print("Ung");
lcd.setCursor(6,0);
lcd.print(char(245));
lcd.setCursor(7,0);
lcd.print("ltige");
lcd.setCursor(4,1);
lcd.print("Messung");
}
}
Der Programmablauf ist folgender:
Die Messung funktioniert in beide Richtungen. Sobald sich an eine der beiden Lichtschranken ein Objekt nähert (also ein
Fahrzeug vorbei fährt), wird die Zeit gestartet. Wenn die zweite Lichtschranke befahren wird, wird die Zeit gestoppt
und der Zeitwert in Form der Geschwindigkeit in km/h ausgegeben.
Für die Berechnung der Geschwindigkeit muss eine Formel angewendet werden. Die bekannte Formel v=s/t muss dazu angepasst
werden. "s" wird in m/s angegeben und muss dadurch schon mal mit 3,6 multipliziert werden. Daher wird die Streckenlänge
in cm durch 100 geteilt. Das Ergebnis wird mit dem Maßstab multipliziert und abschließend noch mit der Anzahl der
Interrupts pro Sekunde multipliziert. Bei meinem Code sind es 20, was eine Auflösung von 50 ms ergibt. Daher lautet die
Formal am Ende "s = Streckenlänge (in cm) / 100 * Maßstab * 3,6 * 20". Bei mir besitzt die Messstrecke eine Länge von
50,8 cm, so dass sich der Wert 3182 ergibt.
Dann sind noch ein paar zusätzliche Funktionen notwendig. Wenn beide Sensoren gleichzeitig von einem Fahrzeug verdeckt
werden, gibt das Display "Gleis belegt" aus. Eine Messung ist dann erst wieder möglich, wenn beide Lichtschranken
frei gefahren sind. Sollte nach dem Auslösen der ersten Lichtschranke eine Zeit von 40 Sekunden überschritten werden und
ein Auslösen der zweiten Lichtschranke aus bleibt, wird die Grundstellung hergestellt und am Display erscheint die Anzeige
"Ungültige Messung". Die Zeit entspricht in etwa einer Geschwindigkeit von 0,6 km/h.
Der Aufbau schaut schließlich wie folgt aus:
Die beiden Lichtschranken werden auf eine Platine gelötet und diese auf ein am Winkel befestigt Holzstück geklebt.
Ein Testaufbau:
Die beiden Sensoren werden schließlich im Schattenbahnhof am Durchfahrgleis montiert. Nach der Montage muss der
Abstand exakt ausgemessen werden und gemäß obiger Formel der Faktor "s" berechnet werden.
Für das Display wird im Stellwerk auf der unteren Ebene eine Halterung gebaut.