Hallo Digital-Stummis,
ich versuche über die Feiertage, alte Märklin-Weichenstellpulte (die blauen mit den ewig klemmenden Tasten) mit Hilfe eines ESP32 als Retro-Weichenstellpulte für meine MS2 anzubinden. Leider funktioniert die Kommunikation auf dem CAN aber noch nicht so ganz wie erhofft.
Ich habe einen BananaPi mit [user]bertr2d2[/user]'s Platine als "Debugger" an den CAN-Bus gehängt und schaue mir mit can-monitor an, was auf dem Bus so los ist. Wenn ich ein bisschen auf meinen Geräten herumdrücke, sieht man dort folgendes:
2
3
4
5
6
7
16:13:25.535 CAN 0x00169B07 [6] 00 00 30 00 00 01 Zubehör Schalten Lok unbekannt-0 Stellung 0 Strom 1
16:13:25.805 CAN 0x00169B07 [6] 00 00 30 00 00 00 Zubehör Schalten Lok unbekannt-0 Stellung 0 Strom 0
16:22:37.626 CAN 0x0016180A [6] 00 00 30 00 00 01
16:22:37.887 CAN 0x0016180A [6] 00 00 30 00 00 00
Bei den ersten beiden Zeilen habe ich den "Weiche Stellen"-Knopf auf meiner MS2 gedrückt. can-monitor hat das Paket wie erwartet decodiert. Wenn das Gleissignal an ist, schaltet meine Testweiche auch.
Bei den letzten beiden Zeilen habe ich den "Weiche Stellen"-Knopf auf dem Weichenstellpult am ESP32 gedrückt. Wenn ich die Bitschieberei von Märklin im CAN-Identifier richtig interpretiere sieht man hier, das Command und die Payload identisch sind. Lediglich der eingetragene Hash unterscheidet sich.
Wenn ich meinen Code anpasse und darin den Hash meiner MS2 spoofe, wird das Paket von can-monitor decodiert und Gleisbox schaltet meine Weiche wie erwartet. Wirklich überzeugt bin ich von diese "Lösung" aber nicht. Neben der offensichtlichen technischen Unschönheit wird auch die Anzeige der Weichenstellung in der MS2 nicht angepasst.
Entlang der Doku des Märklin-CS2-Protokoll V2 gehe ich so vor, um meinen Hash zu berechnen:
* Meinem ESP32 eine UID geben. In der Protokoll-spezifikation ist der Bereich 0x00001800 bis 0x00001BFF frei für Privatanwender. Ich habe 0x000018A0 gewählt.
* Hash berechnen, indem die oberen und unteren Bytes der UID ge-XOR't werden: 0x0000 ^ 0x18A0 = 0x18A0 (zugegeben, ein etwas langweiliges Ergebnis dieser Rechenoperation...)
* Hash ins Paket schreiben.
Bin ich bei der Hash-Berechnung auf dem Holzweg? Gibt es etwas (außer dem Hash) das ich falsch mache?
Gruß,
fantux