Daten im MM2-Format von Arduino an Interface 6051 senden

#1 von Celle , 10.12.2023 11:31

Hallo liebe Eisenbahnfreunde,

Seit Tagen durchsuche ich das www nach Infos, wie ich mit einem Arduino und einem Interface 6051 meine Loks mit dem MM2-Protokoll ansteuern kann. Leider habe ich die gewünschten Infos nicht gefunden und wende mich deshalb an Euch.

Zur Zeit steuere ich meine Loks mit einem Arduino und dem Interface 6051 mit dem MM-Protokoll. Das funktioniert für meine Ansprüche auch ganz gut. Der nachfolgende Code lässt die Lok mit der Adresse 78 auf einem Gleis mit der Geschwindigkeit hin- und herfahren. Dabei gebe ich die Steuerbefehle über die 2. Serielle Schnittstelle des Arduino Mega 2560 mit dem Serial1.print Befehl vom Arduino an das Interface.

void loop () {
// Lok startet
Serial1.print(03, HEX); // Geschwindigkeit 3
Serial1.println(78, HEX); // Lokadresse 78
delay (2000);
// Lok stoppt
Serial1.print(0, HEX); // Geschwindigkeit 0
Serial1.println(78, HEX); // Lokadresse 78
delay (2000);
// Richtungswechsel
Serial1.print(15, HEX); // Fahrtrichtungswechsel
Serial1.println(78, HEX); // Lokadresse 78
delay (2000);
}

Nun möchte ich gerne meine Loks mit dem MM2-Protokoll ansteuern,. Allerdings finde ich keine Infos darüber, in welchem Format ich die Daten vom Arduino an das Interface schicken muss.

Konkret möchte ich eigentlich nur wissen, wie die Codezeile für das MM2-Protokoll im Arduino aussehen muss, wenn ich die Lok mit der Adresse 78 und der Geschwindigkeit 3 fahren lassen möchte.

Es wäre für mich hilfreich, wenn ihr mir Tipps geben könnt oder Beispiele.

Vielen Dank im Voraus für Eure Bemühungen

MfG Marcel


Celle  
Celle
Beiträge: 6
Registriert am: 07.03.2023


RE: Daten im MM2-Format von Arduino an Interface 6051 senden

#2 von DiegoGarcia , 10.12.2023 12:01

Hallo Marcel,

den passenden SourceCode in Pascal findest Du bei:
https://simpledigitallocomotive.hpage.co...ascal-1995.html

AFAIR ist der Code der selbe. Denn dem Interface6051 ist es egal, was auf dem Gleis steht. Es gibt nur eine Schnittstellen-Definition von Märklin aus den 80ger Jahren. Die lag als kleines Heftchen dem 6051 bei. Siehe dort: RE: Märklin Interface 6051

Ciao
Diego


talks are cheap, and they don't mean much .…


 
DiegoGarcia
Metropolitan (MET)
Beiträge: 2.797
Registriert am: 15.04.2007
Steuerung mfx

zuletzt bearbeitet 10.12.2023 | Top

RE: Daten im MM2-Format von Arduino an Interface 6051 senden

#3 von Celle , 10.12.2023 12:37

Hallo Diego,

Vielen Dank für die Info.

Das Heftchen hab ich, danach habe ich den Arduino programmiert.

Ich hatte anscheinend nur ein Verständnisproblem. Ich kann mit dem Heft die f1-f4 Funktion programmieren. Das ist ja dann MM2, oder nicht? MM1 hatte ja max. F1.

Aber wie kann ich die 28 Fahrstufen anstatt nur 14 programmieren? Oder geht das gar nicht?


Celle  
Celle
Beiträge: 6
Registriert am: 07.03.2023


RE: Daten im MM2-Format von Arduino an Interface 6051 senden

#4 von DiegoGarcia , 10.12.2023 12:46

Hallo Marcel,

um 27 Fahrstufen statt der ursprünglichen 14 zu haben, verwendet man das Halbfahrstufenkonzept. Dazu habe ich auf die Schnelle nix im Netz gefunden und ich selber kann mich nur noch vage daran erinnern:
- bei ungerader Halbfahrstufe: erst eine Fahrstufe kleiner senden, dann die höhere Fahrstufe senden.
- bei gerader Halbfahrstufe: erst eine Fahrstufe höher senden, dann die niedrigere Fahrstufe senden.

Hier mal ein Zitat aus dem ersten Ecos-Handbuch von ESU:

Zitat
Märklin baute in die populären Decoder der Reihe 6090x eine Erweiterung ein, um 27 Fahrstufen zu erreichen: so genannte „halbe“ Fahrstufen zwischen den eigentlichen Fahrstufen erhöhen die Auflösung. Die Zentrale muss hierbei spezielle Befehlsfolgen absetzen, um diese Fahrstufen zu erreichen. Die ESU ECoS kennt diesen Modus als „Motorola 27“. Wenn auf der ECoS eine Lok unter „Motorola 27“ gefahren wird, und die Funktionstasten können nur bei jeder zweiten Fahrstufe geschaltet werden, unterstützt der Decoder den 27-Fahrstufenmodus leider nicht. Dann ist dieser Decoder mit „Motorola 14“ zu fahren.



Daher aus meinem eigenen Source-Code-Fundus mein aktuelles Beispiel für das Halbfahrstufenkonzept:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 
Procedure LokNewSpeed(LokNr As Integer, newGeschwindigkeit As Integer, MitFunktion As Boolean)
const Vstop = 0
const Vmin = 1
const Vnewmax = 27
const Vturn = 15
const LokAdresseMin = 1
const LokAdresseMax = 255
begin
dim Geschwindigkeit As Integer
Geschwindigkeit = newGeschwindigkeit
if (LokNr >= LokAdresseMin) and (LokNr <= LokAdresseMax) then
if (Geschwindigkeit < Vstop) then
Geschwindigkeit = Vstop
elseif (Geschwindigkeit > Vnewmax) then
Geschwindigkeit = Vnewmax
end if

if (Geschwindigkeit <= 1) then REM --- anhalten oder Fahrstufe 1: direkt setzen, da zwischen "0" und "1" keine Zwischenfahrstufe möglich ist!
if MitFunktion then
WriteByte(Bitwise.BitAnd(Geschwindigkeit , Vturn) + 16)
else
WriteByte(Bitwise.BitAnd(Geschwindigkeit, Vturn))
end if
WaitAfterSendingByte
WriteByte(LokNr)
WaitAfterSendingCommand

else
if Bitwise.BitAnd(Geschwindigkeit, 1) = 1 then REM ---- Odd(Geschwindigkeit), ab "3" oder höher
REM ---- erst eine Fahrstufe kleiner senden
if MitFunktion then
WriteByte(Bitwise.BitAnd(((Geschwindigkeit + 1) / 2) - 1, Vturn) + 16)
else
WriteByte(Bitwise.BitAnd(((Geschwindigkeit + 1) / 2) - 1, Vturn))
end if
WaitAfterSendingByte
WriteByte(LokNr)
WaitAfterSendingCommand

REM ---- dann die hoehere Fahrstufe senden
if MitFunktion then
WriteByte(Bitwise.BitAnd((Geschwindigkeit + 1) / 2, Vturn) + 16)
else
WriteByte(Bitwise.BitAnd((Geschwindigkeit + 1) / 2, Vturn))
end if
WaitAfterSendingByte
WriteByte(LokNr)
WaitAfterSendingCommand

else REM ---- Even(Geschwindigkeit), ab "2" oder höher
REM ---- erst die hoehere Fahrstufe
if MitFunktion then
WriteByte(Bitwise.BitAnd((Geschwindigkeit + 2) / 2, Vturn) + 16)
else
WriteByte(Bitwise.BitAnd((Geschwindigkeit + 2) / 2, Vturn))
end if
WaitAfterSendingByte
WriteByte(LokNr)
WaitAfterSendingCommand

REM ---- dann die niedrigere Fahrstufe
if MitFunktion then
WriteByte(Bitwise.BitAnd(Geschwindigkeit / 2, Vturn) + 16)
else
WriteByte(Bitwise.BitAnd(Geschwindigkeit / 2, Vturn))
end if
WaitAfterSendingByte
WriteByte(LokNr)
WaitAfterSendingCommand
end if
end if
end
end procedure
 



Ciao
Diego


talks are cheap, and they don't mean much .…


Dölerich Hirnfiedler, vikr und Peter BR44 haben sich bedankt!
 
DiegoGarcia
Metropolitan (MET)
Beiträge: 2.797
Registriert am: 15.04.2007
Steuerung mfx

zuletzt bearbeitet 10.12.2023 | Top

RE: Daten im MM2-Format von Arduino an Interface 6051 senden

#5 von Celle , 10.12.2023 13:34

Hallo Diego,

Auch hier nochmals vielen Dank für die Info. Da ich ziemlich am Anfang der Programmierung bin, ist dass noch absolut unverständlich für mich. Ich hätte gedacht, dass die zusätzlichen Fahrstufen einfacher zu programmieren sind.

Ich bleibe erstmal bei meinen 14 Stufen und werde mich mit der Programmierung beschäftigen.

MfG und alles Gute
Marcel


Celle  
Celle
Beiträge: 6
Registriert am: 07.03.2023


   

Märklin Lok BR 486 36624 defekt
nummerierende Beschriftung Magnetartikel oben auf Platte ??

  • Ähnliche Themen
    Antworten
    Zugriffe
    Letzter Beitrag
Xobor Einfach ein eigenes Forum erstellen
Datenschutz