Eisenbahn_Header_5Eisenbahnbrett - Neues LayoutEisenbahnbrettBR24

 

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.

Ziel der Erweiterung ist, mit bis zu acht Handsets die gleiche Anzahl Loks alleine mit der DCC++ Base Station, dem Interface und den Handsets zu steuern. Ein Computer mit DCC++ Controller ist für die Steuerung der Loks nicht notwendig, wird allerdings im ersten Ansatz zur Steuerung der Weichen benötigt.

Hinweis
Der Anschluss des nachfolgend beschriebenen Handset-Interface ist nur möglich, wenn für die Base Station ein Arduino Mega2560 Verwendung findet. Beim Arduino Uno und beim Arduino 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 Clock-Treiber für die Taktleitung zu den Handsets. Dazu kommt noch der Einbauplatz für einen käuflich zu erwerbenden StepDown -Spannungsregler, 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 unter 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 6-poligen 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 zweite serielle Schnittstelle des Arduino Mega2560, die für die Kommunikation verwendet wird, 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 billigen 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 Aktuell hin und wieder nachschauen.


Update
Ich habe einen DCC-Decoder mit zusätzlichen Schaltausgängen verbaut und festgestellt, dass ich die Tasten an den Handsets falsche Codes senden lasse.

Mit Version V2.2 der Handset-Interface Firmware wird mit Taste F0 das Fahrlicht geschaltet. Die nachfolgenden Tasten generieren Codes für F2, F3 und F4, der erste Schaltausgang eines DCC-Decoders wird also nicht angesprochen.
Mit Firmware Version V2.3 senden die ersten vier Tasten jetzt die korrekten Codes für F0, F1, F2 und F3.

Update
Wird ein Handset abgeschaltet, wird die Lok abgebremst und bleibt stehen. Ändert man nichts am Poti und schaltet das Handset wieder ein, fährt die Lok wieder mit der zuvor eingestellten Geschwindigkeit los. Das ist unerwünscht und kann Verdruss bereiten.
In der Firmware Version V2.4 ist dieses Verhalten geändert. Nach Abschalten eines Handset muss das Poti bei eingeschaltetem Handset erst wieder auf Null gedreht werden, bevor Fahrbefehle an die Lok ausgegeben werden.

 


Beim Aufruf dieser Funktion werden Daten an Google in USA übermittelt. Neben Ihrer IP-Adresse wird auch die URL der besuchten Seite übertragen.
Besucherzaehler

Besucher seit
25.11.2000