TechTalk – Arduinos und DCC++ – Teil 2: IR

Heute habe ich erneut ein enig herum experimentiert um eine Art RFID Lese-System für meine Geplante Modellbahn zu erschaffen. Dabei verfolge ich mehrere Ansätze, unter anderem:

Arduino UNO mit Sensor Shield und IR-ProxiSensoren

In diesem Fall habe ich mich der Block Belegtmeldung gewidmet. Der Plan besteht darin jeweils mittels IR-Sensoren, wie dem TCRT5000 (nur der digitale Output dieses Abstandssensors) oder dem etwas günstigeren FC51 zu überwachen ob ein Gleisabschnitt (Block) belegt ist. Mittels logischer Auswertung der umliegenden Sensoren soll zudem Fahrtrichtung und Signalsteuerung erfolgen bzw. unterstützt werden.

Da diese Sensoren nur ein Signal abgeben wenn sich ein Zug darüber befindet, muss eine Auswertung erfolgen, ob und in welcher Reihenfolge weitere Sensoren davor oder danach mit ausgelöst wurden, um festzustellen ob sich ein Zug zwischen zwei Sensoren befindet. Aber dazu kommen wir später.

Der folgende Code ermittelt den Zustand von vier IR Sensoren an den Pins 8-11 eines Arduino. Die Sensoren werden mit VCC = +5V und GND an den entsprechenden Ports des Arduino angeschlossen

Hier mein Code

/* Test FC51 3 pin oder TCRT5000 4 pin IR Sensor als Block Belegtmelder
 * Liest den digitalen Input von mehreren IR Sensoren aus (hier noch 2 je Block),
 * speichert den Zustand in einer Variable und gibt eine Mitteilung
 *  auf dem Serial Monitor aus.
 */
int detectB01s;
int detectB01n;
int detectB02s;
int detectB02n;
int block01s = 0;
int block01n = 0;
int block02s = 0;
int block02n = 0;

void setup() {
    Serial.begin(9600);
    pinMode(8, INPUT); // set Pin 8 as input
    pinMode(9, INPUT); // set Pin 9 as input
    pinMode(10, INPUT); // set Pin 10 as input
    pinMode(11, INPUT); // set Pin 11 as input
}

void loop() {
    detectB01s = digitalRead(8);
    if (detectB01s == LOW) {
      
      Serial.println("Train detected on B01-S (block 01 south)");
      block01s = 1;
    }else{
      Serial.println("Block 01 south clear to proceed");
      block01s = 0;
    }
    detectB01n = digitalRead(9);
    if (detectB01n == LOW) {
      Serial.println("Train detected on B01-N (block 01 north)");
      block01n = 1;
    }else{
      Serial.println("Block 01 north clear to proceed");
      block01n = 0;
    }
    detectB02s = digitalRead(10);
    if (detectB02s == LOW) {
      Serial.println("Train detected on B02-S (block 02 south)");
      block02s = 1;
    }else{
      Serial.println("Block 02 south clear to proceed");
      block02s = 0;
    }
    detectB02n = digitalRead(11);
    if (detectB02n == LOW) {
      Serial.println("Train detected on B02-N (block 02 north)");
      block02n = 1;
    }else{
      Serial.println("Block 02 north clear to proceed");
      block02n = 0;
    }
    delay(500);

}

Zu den weiteren Verwendungen später mehr.