Handset-Interface

DCC++ spricht von Hause aus nicht mit Handsets zur Steuerung der Loks sondern setzt voll und ganz auf die Bedienung über das grafische Interface von DCC++ Controller.

Da ich diese Art der Steuerung nicht sonderlich schätze und für die Steuerung meiner Loks sogenannte Handsets verwenden will, muss ich der DCC++ Base Station beibringen, Handsets zu akzeptieren.

Hinweis:
Der Anschluss des Handset-Interface ist nur möglich, wenn für die Base Station ein Arduino Mega2560 Verwendung findet. Beim Arduino Uno und beim Nano ist keine zweite serielle Hardware-Schnittstelle vorhanden, die für die Kommunikation zwischen Handset-Interface und Base Station verwendet wird.

Um die Änderungen an der Software der Base Station so gering wie möglich zu halten, habe ich als Interface zwischen den Handsets und der Base Station einen Arduino Nano befeuerten Adapter entworfen.

Neben dem Arduino Nano enthält das Design im Wesentlichen acht RJ12-Stecker an dem die Handsets über Wendelschnüre angeschlossen werden, ein paar PullUps und Glättungskondensatoren sowie einen Treiber für die Clock-Leitung Richtung der Handsets. Dazu kommt noch der Einbauplatz für einen käuflich zu erwerbenden StepDown-Spannungsregeler, der die Versorgung mit 5 V für die Handsets sowie den Arduino aus der höheren Layout-Spannung erledigt. Der StepDown-Regler wird in einem beliebten Onlinekaufhaus mit folgendem Suchbegriff massenhaft angeboten:
10Pcs Mini DC-DC Converter Step Down Module Adjustable 1V 5V 12V 16V”.

Ein Wort zu den Wendelschnüren:
Im Prinzip sind es handelsübliche Schnüre aus dem Kommunikationszubehör mit sechspoligen Steckern und sechs Adern. Allerdings muss an einer Seite der Schnur der Stecker abgeschnitten und ein Neuer 180 Grad gedreht wieder aufgecrimpt werden. Das ist leider beim Original-Handset damals aus Unachtsamkeit beim Layouten passiert und da ich dieses erste, bereits aufgebaute Handset ebenfalls verwenden will, habe ich auch alle neuen Anschlüsse identisch ausgelegt - Die Handsets sind nicht an einen bestimmten Steckplatz am Interface gebunden.

DCCpp_Handset_MK2_Adapter_V2             (Click auf das Bild für volle Auflösung)

 

Die Platzierung der acht RJ12-Stecker nebeneinander reizt die Platinengrößenbeschränkung der Freeware Version von EAGLE voll aus, die äußeren Lötpads der beiden jeweils außen platzierten Buchsen liegen gerade noch innerhalb der erlaubten 10 cm, die Platine selbst ist größer :)

DCCpp_Handset_MK2_Adapter_V2             (Click auf das Bild für volle Auflösung)

 

Die Platine ist einseitig ausgeführt, ein paar Drahtbrücken müssen deshalb anstelle der rot eingezeichneten Leiterbahnen eingelötet werden.

Im Original erkennt man die Feinheiten :)

Handset-Interface

Links oben sitzt der StepDown-Spannungswandler. Der dicke Kondensator hat seinen Platz eigentlich auf der Rückseite des Wandlers, interferiert dort aber leider mit dem USB-Stecker, wenn der Arduino programmiert werden soll. Daher die etwas unglücklich verzwirbelten Anschlüsse des Elko.


Die Informationen der Handsets werden im Arduino Nano gesammelt, ausgewertet und über die serielle Schnittstelle als ASCII-Kommandos an die Base Station übertragen.

Im Code der Base Station muss die Routine zur seriellen Kommunikation erweitert werden, so dass parallel zur bereits realisierten Kommunikation von und zum DCC -Controller (Processing Applikation auf dem Rechner) auch die Kommandos vom Handset-Interface angenommen werden.

In der Datei “SerialCommand.cpp” wird die Routine “process()” erweitert um den Teil nach und inklusive
“#if defined (ARDUINO_AVR_MEGA) || defined (ARDUINO_AVR_MEGA2560)” bis zum nächsten “#endif” (inklusive):

void SerialCommand::process(){
  char c;

  #if COMM_TYPE == 0
  if (INTERFACE.available() > 0)
  {
   while (INTERFACE.available() > 0) {    // while there is data on the serial line
    c = INTERFACE.read();
    if (c == '<')                    // start of new command
     sprintf(commandString, "");
    else if (c == '>')               // end of new command
     parse(commandString);
    else if (strlen(commandString) < MAX_COMMAND_LENGTH)    // if comandString still has space, append character just read from serial line
     sprintf(commandString, "%s%c", commandString, c);     // otherwise, character is ignored (but continue to look for '<' or '>')
   } // while
  }

#if defined (ARDUINO_AVR_MEGA) || defined (ARDUINO_AVR_MEGA2560)
  // added second serial connection to my Handset interface which allows to operate the DCC++ Base Station with MERG handsets MK2
  // see www.harald-sattler.de/html/handset-interface.htm for details on that interface
  if (Serial1.available() > 0)
  {
   //digitalWrite(52, 1);    // debug

   while (Serial1.available() > 0) {    // while there is data on the serial line
    c = Serial1.read();
    if (c == '<')                    // start of new command
     sprintf(commandString, "");
    else if (c == '>')               // end of new command
     parse(commandString);
    else if (strlen(commandString) < MAX_COMMAND_LENGTH)    // if comandString still has space, append character just read from serial line 2
     sprintf(commandString, "%s%c", commandString, c);     // otherwise, character is ignored (but continue to look for '<' or '>')
   } // while

   digitalWrite(52, 0);
  }
#endif
....
 

Die hierdurch Verwendung findende, zweite serielle Schnittstelle des Arduino Mega2560 muss natürlich auch initialisiert werden. Dies erfolgt im “setup()” in der Datei “DCCpp_uno.ino”, ebenfalls ab und inklusive
“#if defined (ARDUINO_AVR_MEGA) || defined (ARDUINO_AVR_MEGA2560)” bis zum nächsten “#endif” (inklusive):

void setup(){ 

  Serial.begin(115200);            // configure serial interface
  Serial.flush();

#if defined (ARDUINO_AVR_MEGA) || defined (ARDUINO_AVR_MEGA2560)
  Serial1.begin(115200);           // configure serial interface 2 (connection to up to 8 hardware handsets MERG MK2)
#endif
....
 

Soweit die Änderungen am DCC++ Code.


Verbunden werden die beiden Arduinos über eine dreiadrige Leitung mit den Signalen Rx, Tx sowie Masse.

Beim Arduino Mega2560 liegt die zweite serielle Schnittstelle auf den Pins 18 und 19.

Achtung!
Bei meinem biligen Mega2560 Clone ist die Bezeichnung der Pins falsch aufgedruckt.

Hier das Original...

Arduino_Mega2560_Serial1

...und hier der Clone:

Arduino_Mega2560_Serial1 Fehldruck beim Clone

Nicht verwirren lassen und tapfer die Tx-Leitung vom Interface auf den ebenfalls mit Tx gekennzeichneten Pin 19 des Mega2560 stecken, hier ist tatsächlich Rx1 angeschlossen, nur der Platinenaufdruck ist falsch.


Die Firmware für das Interface stelle ich als Download zur Verfügung. Im Code sind ausführliche Kommentare (auf Deutsch) vorhanden, so dass der geneigte Nachbauer eigene Erweiterungen leicht selbst einbringen kann.

Hinweis:
Die Entwicklung der Firmware ist noch nicht endgültig abgeschlossen.
Sollte ich Änderungen oder Erweiterungen einbauen, stelle ich diese neue Firmware hier ebenfalls zur Verfügung, bitte ggf. hier oder auf der Seite Was ist neu? hin und wieder nachschauen.


 


Besucher seit
25.11.2000

>