Die folgende Software ist noch im Alphastadium vom Alphastadium. Sie tut nur das Allernötigste: Anzeigen der Lok auf dem Display. Hierzu wird die CV1-Adresse auf Lokbezeichnungen gemappt - siehe switch-Anweisung im Code weiter unten.  In den jeweiligen Loks muss natürlich Railcom für Channel 1 aktiviert werden. Es sind kaum Algorithmen für Fehlerkorrekturen vorhanden. Ausserdem sind die Lokbezeichnungen im Sketch hard-coded. 

Achtung: die Adressen werden nicht im ASCII-Code übertragen, sondern sind 4/8-el codiert. Zum Durchführen der Zuordnung die Lok auf das Gleis stellen, den angezeigten Binärcode in der Switch-Anweisung hinterlegen und eine Lokbezeichnung zuweisen. Sketch kompilieren und auf Arduino laden.

An Pin 8 - 13 hängen LED's. Diese haben nur Debugzwecke und werden nicht benötigt.

/*
 * Railcom detection and display
 * Version: 20161023
 * ©2012,Thomas Hörndlein
 */

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

byte receivedByte     = B00000000;
byte locoAddressByte1 = B00000000;
byte locoAddressByte2 = B00000000;
String loco = "hmm...?";


void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // initialize the serial communications:
  Serial.begin(250000);

  // DDRB/PORTB ist hier gemappt auf Pin 8-13
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  // All LED's off:
  PORTB = B00000000;
}

void loop() {
  // when characters arrive over the serial port...
  if (Serial.available()) {
    // wait a bit for the entire message to arrive. 100ms ~ 11 Cutouts
    delay(100);

   // According to spec channel1 1 is used for sending the loco address.
   // ESU decoders send additional information in channel 1
    while (Serial.available() > 0) {
      receivedByte = Serial.read();
      // Filter to ensure we really received a loco address:
      if (receivedByte == B10011001) {
        locoAddressByte1 = receivedByte;
        locoAddressByte2 = Serial.read();
        // clear serial buffer...
        while (Serial.read() > 0);
      }
    }

    switch(locoAddressByte2) {
      case B10010101:
        loco = "BR218";
        break;
      case B10100110:
        loco = "GFN1309";
        break;
      case B10010110:
        loco = "BR39";
        break;
      case B10110010:
        loco = "ICE";
        break;
      case B10100101:
        loco = "R250";
        break;   
      case B10011010:
        loco = "E103A";
        break;
      case B10011100:
        loco = "E103B";
        break;
      default:
        loco = "unbek.";
        break;
    }

    PORTB = B00000001;
        
    // clear the screen
    lcd.clear();
    // display each character to the LCD
    lcd.setCursor(0, 0);
    lcd.print("Lok:");
    lcd.setCursor(8, 0);
    lcd.print(locoAddressByte1, BIN);
    lcd.setCursor(0, 1);
    lcd.print(loco);
    lcd.setCursor(8, 1);
    lcd.print(locoAddressByte2, BIN);

    //show last six bits of locoAddressByte2 on LED's:
    // auskommentiert. verursacht takten des displays
    //PORTB = locoAddressByte2;
      PORTB = B00000010;
      delay(100); // nur damit LED 2 leuchtet
  }

  PORTB = B00000100;
  // There is no loco on the rails if we don't receive data
  // within on second (serial buffer is empty)
  delay(1000);
  if (Serial.available() == 0) {
      PORTB = B00001000;
      locoAddressByte1 = B00000000;
      locoAddressByte2 = B00000000;
      loco = "hmm...? ";
      // clear the screen
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Lok:");
      lcd.setCursor(0, 1);
      lcd.print(loco);
  }
 
}

 

Kommentare   

#1 Christian Lösel 2018-04-08 13:53
Hallo,
ein sehr tolles und seltenes Glanzstück.
Da ich auch gerade auf die Idee eines RailCom Displays gekommen bin wollte ich mal nachfragen, wie der Arduino an das DCC Signal angeschlossen wird?
Viele Grüße
Christian Lösel

You have no rights to post comments