Hallo zusammen,
ich bin ganz neu hier im Forum, da ich auch gerade erst anfange mit dem Arduino zu programmieren. Etwas Programmiererfahrung habe ich bereits im Bereich JavaScript.
Ich habe einen Arduino Mega 2560 (aktuell noch auf dem Weg zu mir) und möchte diesen zusammen mit IR-Hindernissensoren (Bezeichnung gemäß Reichelt) für die Gleisbelegtmeldung auf meiner Modellbahn (Spur N; 1:160) einsetzten. Dabei soll pro zu überwachendem Gleisblock /-abschnitt je ein Sensor am Anfang und einer am Ende verbaut werden.
Mittels dem Arduino soll dann Auswertung der Sensoren erfolgen. Dabei wird in folgende Ergebnisse unterschieden:
- Block frei
- Block in Regelrichtung belegt
- Block in Gegenrichtung belegt
Mittels tinkercad habe ich den (Prototypen-) Code erfolgreich getestet. Anstelle der IR-Sensor habe ich Schiebeschalter eingebaut, da ich mit diesen problemlos die notwendigen HIGH- und LOW-Signale erzeugen kann.
Allerdings habe ich aktuell noch das Problem, dass der Zähler zur Wagenerfassung bei einem LOW-Signal (Sensor erkennt Hindernis) solange hochzählt, bis wieder ein HIGH-Signal erkannt wird.
Damit nun die Wagen genau eingezählt werden, müsste eigentlich die negative Flanke - also der Wechsel von HIGH auf LOW - gezählt werden. Zum auszählen am Ende vom Block benötige ich im Gegensatz dazu dann die positive Flanke - also den Wechsle von LOW zu HIGH, wenn der Wagen vollständig den Sensor verlassen hat.
Wie stelle ich dies am Besten an?
Vielen Dank schonmal für eure Antworten, Ideen oder auch Verbesserungsvorschläge.
Viele Grüße
Mika
PS: Anbei auch der Prototypencode.
// Deklaration der Sensor_Eingangspinnne
int Sensor_Block1_2 = 10;
int Sensor_Block2_1 = 11;
int Sensor_Block2_2 = 12;
int Sensor_Block3_1 = 13;
// Deklaration der Blockzaehler
int Zaehler_Block1 = 0;
int Zaehler_Block2 = 0;
int Zaehler_Block3 = 0;
// Deklaration des Blockmodus
// 0 => Block frei
// 1 => Block belegt als Regelgleis
// 2 => Block belegt als Gegengleis
int Modus_Block1 = 0;
int Modus_Block2 = 0;
int Modus_Block3 = 0;
/*
IDEEN:
Speichern des Betriebszustandes zum Ende und automatisches Lesen bzw. Laden zu Anfang
Speichern mittels Taster auslösen
*/
void setup() {
Serial.begin(9600); // Initialisierung serielle Ausgabe
// Initialisierung Sensorpinne
pinMode (Sensor_Block1_2, INPUT);
pinMode (Sensor_Block2_1, INPUT);
pinMode (Sensor_Block2_2, INPUT);
pinMode (Sensor_Block3_1, INPUT);
}
// Das Programm liest den aktuellen Status des Sensor_Pins aus und
// gibt in der seriellen Konsole aus, ob ein Hindernis aktuell erkannt wird
// oder ob kein Hindernis sich vor dem Sensor befindet
void loop() {
// Die gegenwaertigen Signale der Sensoren werden ausgelesen
bool val1_2 = digitalRead (Sensor_Block1_2);
bool val2_1 = digitalRead (Sensor_Block2_1);
bool val2_2 = digitalRead (Sensor_Block2_2);
bool val3_1 = digitalRead (Sensor_Block3_1);
//Nur Block 2 zum Test programmiert; alle Blöcke _ bis auf Variablenbezeichnung _ identisch
//Grundzustand = HIGH
//Pegelauswertung zu Testzwecken
/*
if (val2_1 == HIGH) {
Serial.println("2_1 (11) High");
}
else {
Serial.println("2_1(11) Low");
}
if (val2_2 == HIGH) {
Serial.println("2_2 (12) High");
}
else {
Serial.println("2-2 (12) Low");
}
*/
// Frei-Meldung, wenn keine aktive UND vorhergegangene Beeinflussung
if (val2_1 == HIGH && val2_2 == HIGH && Zaehler_Block2 == 0 ){
Modus_Block2 = 0;
//Serial.println("Block frei");
}
// Belegt-Meldung als Regelgleis eines freien Blocks
if (val2_1 == LOW && val2_2 == HIGH && Zaehler_Block2 == 0 && Modus_Block2 == 0){
Modus_Block2 = 1;
//Serial.println("Block als Regelgleis belegt");
Zaehler_Block2++;
Serial.println(Zaehler_Block2);
}
// Belegt-Meldung als Gegengleis eines freien Blocks
if (val2_1 == HIGH && val2_2 == LOW && Zaehler_Block2 == 0 && Modus_Block2 == 0){
Modus_Block2 = 2;
//Serial.println("Block als Regelgleis belegt");
Zaehler_Block2++;
Serial.println(Zaehler_Block2);
}
// Zählen der weiteren Fahrzeuge bei Fahrt in Regelrichtung
if (val2_1 == LOW && Zaehler_Block2 != 0 && Modus_Block2 == 1){
Zaehler_Block2++;
Serial.println(Zaehler_Block2);
}
// Zählen der weiteren Fahrzeuge bei Fahrt in Gegenrichtung
if (val2_2 == LOW && Zaehler_Block2 != 0 && Modus_Block2 == 2){
Zaehler_Block2++;
Serial.println(Zaehler_Block2);
}
// Ausbuchen der Fahrzeuge in Regelrichtung
if (val2_2 == LOW && Zaehler_Block2 != 0 && Modus_Block2 == 1){
Zaehler_Block2--;
}
// Ausbuchen der Fahrzeuge in Gegenrichtung
if (val2_1 == LOW && Zaehler_Block2 != 0 && Modus_Block2 == 2){
Zaehler_Block2--;
}
//Ausgabe des Blockmodus als Text im Testbetrieb
if (Modus_Block2 == 0){
Serial.println("Block 2 frei");
}
if (Modus_Block2 == 1){
Serial.println("Block 2 belegt; Modus: Regelgleis");
}
if (Modus_Block2 == 2){
Serial.println("Block 2 belegt; Modus: Gegengleis");
}
Serial.println("Fahrzeuge in Block2:");
Serial.println(Zaehler_Block2);
Serial.println("--------------------------");
delay(500);
}