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.
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.
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
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?
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:
ZitatMä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:
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
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.