Schnittstellenbeschreibung

Hier wird die Schnittstelle zwischen Steuerungsprogramm auf dem PC und den Arduino-Prozessoren beschrieben. Es findet eine byte-weise bidirektionale Datenübertragung statt. Alle Kommandos werden vom Steuerungsprogramm gesendet. Einige Kommandos haben eine Antwort des Prozessors zu Folge.
Initial wird an jeden Prozessor COMD_ID (Liste der Kommandos siehe unten) gesendet, um zu prüfen, ob die Prozessoren an den richtigen COM-Ports angeschlossen sind.
Anschließend wird an Loks und Magnetartikel COMD_GO gesendet. Damit wird die Anlage in Betrieb genommen und mit Strom versorgt. Zur Beendigung des Betriebs wird COMD_STOP gesendet.

Loks

Ein Kommando für einen DCC-Decoder sieht z.B. so aus:
Command Address Data Err
COMD_LOC_DCC_S1 0AAAAAAA 01DCSSSS EEEEEEEE
Das Byte "Command" ist für den Arduino bestimmt. Auf das Gleis werden nur die 3 weiteren Bytes ausgegeben.
Die Details stehen in s-92-2004-07.pdf und s-9.2.1_2012_07.pdf.
Verwendet wurden bisher "Speed and Direction Instruction" und "Function Group One Instruction".
Die Abfolge der Kommandos bei einer Fahrstufen/Richtungsänderung sieht so aus:
wait 14 ms
COMD_LOC_DCC_S1
wait 14 ms
COMD_LOC_DCC_S2
wait 14 ms
COMD_LOC_DCC_S3

Zwischen zwei Kommandos muss 14 ms gewartet werden. Zur Vereinfachung ist hier nur das Command-Byte gezeigt. Die restlichen 3 Bytes müssen natürlich auch gesendet werden.
Die Abfolge der Kommandos bei einer Funktionsänderung sieht so aus:
wait 14 ms
COMD_LOC_DCC_S1
wait 14 ms
COMD_LOC_DCC_Fx1
wait 14 ms
COMD_LOC_DCC_S2
wait 14 ms
COMD_LOC_DCC_Fx2
wait 14 ms
COMD_LOC_DCC_S3
wait 14 ms
COMD_LOC_DCC_Fx3

Ein Kommando für einen Motorola-Decoder sieht z.B. so aus:
Command Address Fl Data
COMD_LOC_M2_S1 0xf0 F SSSSSSSS
Das Byte "Command" ist für den Arduino bestimmt. Auf das Gleis werden nur die 3 weiteren Bytes ausgegeben. Address=0xf0 ist Adresse 4. Siehe dazu die Tabelle "triAddr" (unten).
Die Details stehen in Andrea Scorzoni.
Verwendet wird ausschließlich das neue Motorola-Format (Motorola 2).
Die Abfolge der Kommandos bei einer Fahrstufen/Richtungsänderung sieht so aus:
COMD_LOC_M2_S1
COMD_LOC_M2_S2
Die Abfolge der Kommandos bei einer Funktionsänderung sieht so aus:
COMD_LOC_M2_S1
COMD_LOC_M2_F1
COMD_LOC_M2_S2
COMD_LOC_M2_F2
COMD_LOC_M2_S3
COMD_LOC_M2_F3
COMD_LOC_M2_S4
COMD_LOC_M2_F4
Zum Auslesen der Handregler gibt es die Kommandos COMD_LOC_THROT und COMD_LOC_THROT2. Dies ist ein Beispiel für die Antwort:
o.k. Richtung Funktion Fahrstufe
0 RSPD_DIR_FWD 0 46
Das erste Byte ist immer 0. Das vierte Byte (Fahrstufe) kann den Wert 0..255 annehmen.

Magnetartikel

Bislang wird ausschließlich das Motorola-Format verwendet. Der einzige Befehl im Betrieb heißt COMD_SOL. Die Details stehen in Andrea Scorzoni.
Command Address Fl Data
COMD_SOL 0xf0 0 SSSSSSSS

Rückmelder

Für jede Auslesung sendet der Host das Kommando COMD_CAPT. Es werden immer alle 3 Stränge mit je 20 Rückmeldemodulen ausgelesen, egal ob dort etwas angeschlossen ist oder nicht. Daraus ergeben sich 120 Bytes bzw. 960 Kontakte.

Kommandocodes und Tabellen

Nachfolgend ist der Inhalt der Datei arduino.h gezeigt.
// commands ------------------------------------------------------------------------------
#define COMD_LOC_DCC_S1         0x10        // erstes  DCC Fahrstufenkommando
#define COMD_LOC_DCC_Fx1        0x11        // erstes  DCC Kommando für F1..F4
#define COMD_LOC_DCC_S2         0x12        // zweites DCC Fahrstufenkommando
#define COMD_LOC_DCC_Fx2        0x13        // zweites DCC Kommando für F1..F4
#define COMD_LOC_DCC_S3         0x14        // drittes DCC Fahrstufenkommando
#define COMD_LOC_DCC_Fx3        0x15        // drittes DCC Kommando für F1..F4
#define COMD_LOC_M2_S1          0x83        // erstes  Motorola Fahrstufenkommando
#define COMD_LOC_M2_F1          0x84        // Motorola Kommando für F1
#define COMD_LOC_M2_S2          0x85        // zweites Motorola Fahrstufenkommando
#define COMD_LOC_M2_F2          0x86        // Motorola Kommando für F2
#define COMD_LOC_M2_S3          0x87        // drittes Motorola Fahrstufenkommando
#define COMD_LOC_M2_F3          0x88        // Motorola Kommando für F3
#define COMD_LOC_M2_S4          0x89        // viertes Motorola Fahrstufenkommando
#define COMD_LOC_M2_F4          0x8a        // Motorola Kommando für F4
#define COMD_LOC_THROT          0x8b        // Abfragekommando Handregler 1.
        // Antwort: 1) 0 2) RSPD_DIR_FWD|RSPD_DIR_BKWD|RSPD_DIR_NO 3) Function 4) Fahrstufe 0..255
#define COMD_LOC_THROT2         0x8c        // Abfragekommando Handregler 2.
        // Antwort: 1) 0 2) RSPD_DIR_FWD|RSPD_DIR_BKWD|RSPD_DIR_NO 3) Function 4) Fahrstufe 0..255
#define COMD_GO                 0xa0        // Go
#define COMD_STOP               0xe0        // Stop
#define COMD_ID                 0xc0        // Abfragekommando ID.
        // Antwort: ID_LOCO|ID_SOL|ID_CAPT|ID_PROG
#define COMD_CAPT               0x80        // Abfragekommando Rückmelder.
        // Antwort: 120 Bytes
#define COMD_SOL                0xf0        // Magnetartikelkommando

// Fahrtrichtung --------------------------------------------------------------------------
#define RSPD_DIR_FWD     0x20
#define RSPD_DIR_BKWD    0x10
#define RSPD_DIR_NO      0x00

// id's -----------------------------------------------------------------------------------
#define ID_LOCO          0x10        // Lokomotiven Ausgabe
#define ID_SOL           0x20        // Magnetartikel Ausgabe
#define ID_CAPT          0x40        // Rückmelder
#define ID_PROG          0x80        // Programmer

// TRI-Adressen für Motorola --------------------------------------------------------------
static uchar triAddr[81] =   { 0xaa, 0xc0, 0x80, 0x30, 0xf0, 0xb0, 0x20, 0xe0, 0xa0, 0x0c,
                               0xcc, 0x8c, 0x3c, 0xfc, 0xbc, 0x2c, 0xec, 0xac, 0x08, 0xc8,
                               0x88, 0x38, 0xf8, 0xb8, 0x28, 0xe8, 0xa8, 0x03, 0xc3, 0x83,
                               0x33, 0xf3, 0xb3, 0x23, 0xe3, 0xa3, 0x0f, 0xcf, 0x8f, 0x3f,
                               0xff, 0xbf, 0x2f, 0xef, 0xaf, 0x0b, 0xcb, 0x8b, 0x3b, 0xfb,
                               0xbb, 0x2b, 0xeb, 0xab, 0x02, 0xc2, 0x82, 0x32, 0xf2, 0xb2,
                               0x22, 0xe2, 0xa2, 0x0e, 0xce, 0x8e, 0x3e, 0xfe, 0xbe, 0x2e,
                               0xee, 0xae, 0x0a, 0xca, 0x8a, 0x3a, 0xfa, 0xba, 0x2a, 0xea,
                               0xaa };        // can be extended to 256 addresses

// Fahrstufen -----------------------------------------------------------------------------
static ushort dccStage14[16] = { 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
                                 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01 };
                                                                 // 0x01=emergency stop

static ushort dccStage28[32] = { 0x00, 0x02, 0x12, 0x03, 0x13, 0x04, 0x14, 0x05,
                                 0x15, 0x06, 0x16, 0x07, 0x17, 0x08, 0x18, 0x09,
                                 0x19, 0x0a, 0x1a, 0x0b, 0x1b, 0x0c, 0x1c, 0x0d,
                                 0x1d, 0x0e, 0x1e, 0x0f, 0x1f, 0x01, 0x01, 0x01 }

static uchar m2Stage[16] = { 0x00, 0x20, 0xa0, 0x08, 0x88, 0x28, 0xa8, 0x02,
                             0x82, 0x22, 0xa2, 0x0a, 0x8a, 0x2a, 0xaa, 0x80 };
                                                                 // 0x80=reverse, old m1 format


Zurück

KONTAKT IMPRESSUM NUTZUNGSBEDINGUNGEN DATENSCHUTZ