nachdem in den letzten Tagen endlich meine Arduino-Module bei mir eingelangt sind, habe ich mich aufgemacht, meine Idee einer Geschwindigkeitmess-Station zu bauen. Im Moment ist es noch ein Prototyp, aber soweit scheint es zufriedenstellend zu funktionieren.
Zum Nachbau meines Prototypen benötigt man folgende Komponenten:
- Steckbrett
- 2 LEDs (in meinem Fall grün)
- 2 Widerstände 1kOhm
- 2 IR-Näherungssensoren
- 1 Arduino Uno R3 (es geht wohl auch ein Arduino Nano)
- Jumperkabeln in ausreichender Länge und Menge
Ein paar Worte zum IR-Näherungssensor: Dieses besteht im Wesentlichen aus einer IR-LED und einem IR-Empfänger. Es gibt 3 Anschlüsse: +5V, GND, DataOUT. Über das integrierte Poti kann man die Empfindlichkeit einstellen. Funktionieren tut es so, dass auf DataOUT ein HIGH-Signal anliegt, so lange kein Hindernis erkannt wird. Sobald ein Hindernis erkannt wird, wird DataOUT auf LOW gesetzt. Hier der Schaltplan von so einem IR-Näherungssensor:
Mein Aufbauplan sieht so aus:
Und zuletzt fehlt noch der zugehörige Sketch:
Code: Alles auswählen
// **************************************************
// Definition der Ports
// liinp = Links Input
// reinp = Rechts Input
// liout = Links Output
// reout = Rechts Output
// **************************************************
int liinp=8;
int reinp=9;
int liout=10;
int reout=11;
// **************************************************
// Status des Programmablaufs
// 0 = Warten auf Messbeginn
// 1 = Messung läuft; warte auf 2.Messung
// 2 = Messung abgeschlossen; Berechnung+Ausgabe
// **************************************************
int Status=0;
// **************************************************
// Richtung, in der die Lok fährt
// 1 = Lok fährt von links nach rechts
// 2 = Lok fährt von rechts nach links
// **************************************************
int Richtung;
// **************************************************
// Zwischenspeicher der beiden Werte vom IR-Modul
// **************************************************
int links;
int rechts;
// **************************************************
// Zeitstempel der beiden Messpunkte
// TSb = Zeitstempel Beginn
// TSe = Zeitstempel Ende
// **************************************************
long TSb;
long TSe;
// **************************************************
// Messstrecke = Länge der Strecke in Milimeter
// Massstab = Maßstab der Spurweite
// **************************************************
long Messstrecke=300;
int Massstab=160;
// **************************************************
// diverse interne Zwischenspeicher zum Berechnen der
// umgerechneten Vorbild-Geschwindigkeit
// **************************************************
float Fahrdauer;
long Tempo;
void setup() {
// Öffnen der Console
Serial.begin(9600);
// Definition der verwendeten Digitalpins
pinMode(liout,OUTPUT);
pinMode(reout,OUTPUT);
pinMode(liinp,INPUT_PULLUP);
pinMode(reinp,INPUT_PULLUP);
// Start-Meldung auf die Console
Serial.println("Warte auf Messbeginn ...");
}
void loop() {
// Lesen der Werte der beiden IR-Module
links=digitalRead(liinp);
rechts=digitalRead(reinp);
// **************************************************
// Phase 0
// Wenn eines der beiden IR-Module auf LOW steht:
// TSb setzen
// Fahrtrichtung merken
// Hinweis auf Console ausgeben
// zugehörige LED ausschalten
// Status auf Phase 1 setzen
// **************************************************
if (Status==0) {
digitalWrite(liout,links);
digitalWrite(reout,rechts);
if (links==0) {
TSb = millis();
Richtung = 1;
Serial.println("Start: Zug von links ...");
Status=1;
}
if (rechts==0) {
TSb = millis();
Richtung = 2;
Serial.println("Start: Zug von rechts ...");
Status=1;
}
}
// **************************************************
// Phase 1
// Wenn das zweite IR-Modul auf LOW steht:
// TSe setzen
// Status auf Phase 2 setzen
// Hinweis auf Console ausgeben
// **************************************************
if (Status==1) {
if (Richtung==2) {
if (links==0) {
TSe = millis();
Serial.println("Ende: hier die Auswertung ...");
Status=2;
}
}
if (Richtung==1) {
if (rechts==0) {
TSe = millis();
Richtung = 2;
Serial.println("Ende: hier die Auswertung ...");
Status=2;
}
}
}
// **************************************************
// Phase 2
// Berechnung Vorbildgeschwindigkeit
// Ausgabe auf Console
// Warte 5 Sekunden
// Status auf Phase 0 setzen
// Startmeldung ausgeben
// **************************************************
if (Status==2) {
Fahrdauer=(TSe - TSb);
Tempo=(Messstrecke*Massstab) / Fahrdauer * 3.6;
Serial.print("Geschwindigkeit: ");
Serial.println(Tempo);
delay(5000);
Status=0;
Serial.println("Warte auf Messbeginn ...");
}
}
Das Projekt kann sowohl für analoge als auch digitale Anlagen verwendet werden und ist nicht nur für die Spur N geeignet; man muss dann allerdings den Maßstab auf seine Spur ändern (steht derzeit auf 160 für Spur N). Die Genauigkeit der Messung steigt mit der Distanz der beiden Messpunkte. Allerdings dauert die Messung dann entsprechend lange, falls eine niedrige Geschwindigkeit gemessen werden soll. Auf jeden Fall ist die Distanz möglichst exakt einzugeben. Ich empfehle, vor der tatsächlichen Messung die jeweilige Stelle, an der die Messung greift, mit einem Wagen auszuloten und zu markieren. Das geht sehr einfach, weil das IR-Modul eine eigene LED hat, die anzeigt, ob ein Hindernis erkannt wird oder nicht. Genau dort, wo diese LED umspringt, sollte man eine Markierung setzen an beiden Modulen. Und die Entfernung ist dann im Sketch einzutragen (steht bei mir derzeit auf 300 = 30cm).
Hinweis: Natürlich kann man damit keine exakte Geschwindigkeit ermitteln, da das Erkennen der herannahenden Lok von deren Reflexionsverhalten abhängig ist. Helle Objekte werden in der Regel besser erkannt als dunkle, und je nach Fahrtrichtung kann es ebenfalls zu Unterschieden kommen. Trotzdem kann dieser Aufbau zu aufschlussreichen Ergebnissen führen.
Was das Zeug kostet: Ich habe die Bauteile in China bestellt. Ein Arduino Nano inkl Terminal-Adapter-Board schlug mit € 3,03 zu Buche, ein IR-Modul kostete € 0,27; dazu kommen noch die beiden LEDs samt Vorwiderstände (kann man auch weglassen; ich verwende sie, um visuell zu sehen, ob der Sketch arbeitet) sowie die Jumperkabel; insgesamt kommen die Bauteile auf nicht mal € 4,00.