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.