lauschen per candump und testen der Steuer-Befehle mit cansend
für die folgende Beschreibung sind grundlegende Kenntnisse in Linux und der Aufbau des CAN-Bus Systems hilfreich.
alle paar Sekunden schickt die Gleisbox bzw. die MS2 ihren Status:
1
2
3
4
5
6
7
8
9
10
11
x@bahnpi:~ $ candump can0 -a
can0 0030C310 [0] ''
can0 0031832A [8] 47 46 6D C4 01 2F 00 11 'GFm../..'
can0 0030C310 [0] ''
can0 0031832A [8] 47 46 6D C4 01 2F 00 11 'GFm../..'
can0 0030C310 [0] ''
can0 0031832A [8] 47 46 6D C4 01 2F 00 11 'GFm../..'
can0 0030C310 [0] ''
can0 0031832A [8] 47 46 6D C4 01 2F 00 11 'GFm../..'
Wie man sieht, wird ein 23bit Identifier benutzt (ID oder Adresse genannt, z.B. hier 0031832A). Der ist leider auch Bitweise codiert und man kann nicht auf den ersten Blick sehen, wer was sendet. Alle Werte sind Hexadezimal. Danach kommt eine Information, wie viele Datenbytes die Nachricht enthält (hier z.B. [8]) dann kommt die entsprechende Anzahl Datenbytes in hexadezimaler form codiert und kann also Werte zwischen 0 und 255 darstellen. Sollen größere Werte benutzt werden, kann man 2 Bytes zusammenziehen. Weiter unten z.B. die Lok-Geschwindigkeit von Hexadezimal 0000 bis 03FF was nach dezimal umgerechnet einem Wert von 0 bis 1023 entspricht. Den hexadezimalen Zahlen wird oft zur Verdeutlichung ein 0x und den dezimalen Zahlen ein 0d vorangestellt aber nicht mit übertragen.
Es wird immer der Befehl auf einer bestimmten CAN-ID geschickt und die Rückmeldung kommt auf einer anderen ID. Der Nachrichteninhalt kann maximal 8 Bytes lang sein. Die Antwort beinhaltet immer die Nachricht der Anfrage und je nach Befehl auch noch im Anhang den angefragten Wert wie z.B. Spannung, Strom, Temperatur... und hoffentlich für die Zukunft auch Zustände von Loks, Weichen, usw.
Weiche 1 mit der MS2 schalten:
1
2
3
4
5
6
can0 0016C310 [6] 00 00 30 00 01 01 '..0...'
can0 0017832A [6] 00 00 30 00 01 01 '..0...'
can0 0016C310 [6] 00 00 30 00 01 00 '..0...'
can0 0017832A [6] 00 00 30 00 01 00 '..0...'
Gesendet wird:
1
2
3
can0 0016C310 [6] 00 00 30 00 01 01
Die Rückmeldung, ob der Befehl angekommen ist und ausgeführt wurde:
1
2
3
can0 0017832A [6] 00 00 30 00 01 01
Byte 3: "30" ist vermutlich die Adresse des Pi oder der MS2. Das kann man sich aus dem Märklin CAN-Protokoll (link oben) rausrechen.
Byte 4: "00" ist die Weichennummer. Auf dem Bus wird ab Null gezählt. Das ist also die Weiche mit der Nummer 1 am Weichendecoder.
Byte 5: "01" ist Weiche grün, "00" ist Weiche rot
Byte 6: "01" Strom an" und ein paar Milisekunden später nochmal das ganze, diesmal "00" für Strom aus
Wichtig hier: Werden hier nicht 6 sondern 7 oder 8 Bytes gesendet, wird der Befehl nicht akzeptiert, auch wenn die letzten Bytes 0 sind
Sendetest
1
2
3
4
5
6
7
@bahnpi:~ $ cansend can0 0016c310#00.00.30.00.01.01
@bahnpi:~ $ cansend can0 0016c310#00.00.30.00.01.00
@bahnpi:~ $ cansend can0 0016c310#00.00.30.00.00.01
@bahnpi:~ $ cansend can0 0016c310#00.00.30.00.00.00
Damit lässt sich die Weiche 1 per Raspi steuern. Die Antwort auf dem Bus, über candump mitgelauscht, ist die selbe, wie oben beim senden von der MS2.
Alle weiteren Tests laufen nach dem selben Schema:
- Befehl mit der MS2 senden
- Befehl und Antwort am Raspi über candump mitprotokollieren
- Test am raspi mit dem Befehl cansend, ob das selbe passiert.
Loks steuern
Lok 1 (DCC Adresse 60 Mäuseklavier) per MS2 steuern und am Bus lauschen:
Fahrstufe einstellen
Befehl und Rückmeldung:
1
2
3
4
can0 0008C310 [6] 00 00 00 3C 01 E1 '...<..'
can0 0009832A [6] 00 00 00 3C 01 E1 '...<..'
Lok 2 (DCC Adresse 15, ESU LokPilot Basic) per MS2 steuern und am Bus lauschen:
Befehl und Rückmeldung:
1
2
3
4
can0 0008C310 [6] 00 00 C0 0F 01 1B '......'
can0 0009832A [6] 00 00 C0 0F 01 1B '......'
Byte 3 und 4 scheinen die Lok-Adresse zu beinhalten.
Lok 1 mit dem alten Decoder hat die Adresse dezimal 60 = Hexadezimal 00 3C
Lok 2 kann lange Adressen. Da muss wohl irgendwie umgerechnet werden. Was die C0 bedeutet weiß ich noch nicht. Dezimal 15 = Hexadezimal 0F passt wieder auf die Lok-Adresse
Byte 5 und 6 beinhalten die Fahrstufe von "00 00" bis "03 FF" Hier im Beispiel 0x01E1 also ca. 47% bzw. 0x011B also ca. 28% der Maximalgeschwindigkeit.
Richtung einstellen
Befehl und Rückmeldung der Lok 2 an der MS2:
Lok vorwärts:
1
2
3
4
5
6
can0 0000C310 [5] 00 00 C0 0F 03 '.....'
can0 0001832A [5] 00 00 C0 0F 03 '.....'
can0 000AC310 [5] 00 00 C0 0F 01 '.....'
can0 000B832A [5] 00 00 C0 0F 01 '.....'
Lok rückwärts:
1
2
3
4
5
6
can0 0000C310 [5] 00 00 C0 0F 03 '.....'
can0 0001832A [5] 00 00 C0 0F 03 '.....'
can0 000AC310 [5] 00 00 C0 0F 02 '.....'
can0 000B832A [5] 00 00 C0 0F 02 '.....'
Wozu der Befehl mit der 03 am Ende ist, weiß ich noch nicht. es reicht auch der zweite Befehl für die Richtungswahl:
Bytes 3 und 4: "C0 0F" ist wieder die Lok-Adresse
Byte 5: "01" vorwärts, "02" rückwärts
F-Tasten
Taste 1:
1
2
3
4
5
6
can0 000CC310 [6] 00 00 C0 0F 00 01 '......'
can0 000D832A [6] 00 00 C0 0F 00 01 '......'
can0 000CC310 [6] 00 00 C0 0F 00 00 '......'
can0 000D832A [6] 00 00 C0 0F 00 00 '......'
Bytes 3 und 4: "C0 0F" ist wieder die Lok-Adresse
Byte 5: Tastennummer, wieder bei 0 beginnend für Taste 1
Byte 6: 01=an, 00=aus
Stopp Kommando
Ganz wichtig der Nothalt. Auf der MS2 wurde der Nothalt gedrückt und wieder aufgehoben:
1
2
3
4
5
6
7
8
9
10
can0 0000C310 [5] 00 00 00 00 00 '.....'
can0 0001832A [5] 00 00 00 00 00 '.....'
can0 0000C310 [7] 00 00 00 00 09 00 02 '.......'
can0 0000C310 [6] 00 00 00 00 08 07 '......'
can0 0001832A [7] 00 00 00 00 09 00 02 '.......'
can0 0000C310 [5] 00 00 00 00 01 '.....'
can0 0001832A [6] 00 00 00 00 08 07 '......'
can0 0001832A [5] 00 00 00 00 01 '.....'
Es scheinen wieder zusätzliche Kontrollkommandos gesendet zu werden, wie auch bei den Magnetartikeln.
Für die reine Funktion ohne zusätzliche Kontrolle reicht auch
"Stop" mit Rückmeldung
1
2
3
4
can0 0000C310 [5] 00 00 00 00 00 '.....'
can0 0001832A [5] 00 00 00 00 00 '.....'
"Stop" aufheben:
1
2
3
4
can0 0000C310 [5] 00 00 00 00 01 '.....'
can0 0001832A [5] 00 00 00 00 01 '.....'
Abfrage Strom und Spannung
Strom 0,3A bis 0,4A schwankend:
1
2
3
4
can0 0000C310 [6] 47 46 6D C4 0B 01 'GFm...'
can0 0001832A [8] 47 46 6D C4 0B 01 01 64 'GFm....d'
Spannung 18,4V (bei Stop):
1
2
3
4
can0 0000C310 [6] 47 46 6D C4 0B 03 'GFm...'
can0 0001832A [8] 47 46 6D C4 0B 03 06 16 'GFm.....'
Temperatur 31°C:
1
2
3
4
can0 0000C310 [6] 47 46 6D C4 0B 04 'GFm...'
can0 0001832A [8] 47 46 6D C4 0B 04 00 56 'GFm....V'
Die Codierung ist noch unklar. Auf jeden Fall sind die letzten 2 Bytes jeweils die Antwort
Byte 6 ist die Unterscheidung für Strom (01) und Spannung (03) bzw. Temperatur (04)
Mögliche Interpretation
Strom=Wert/800 => 0x0164=0d356 => 356/800 entspricht dann 0,445A (das kommt hin)
Spannung=Wert/80 => 0x0616=0d1558 => 1558/80 entspricht dann 19,475V ??? Vielleicht ein Offset von 1 ????
Temperatur=Wert/ => 0x0056=0d86 => möglicherweise ein Offset von 55
Für erste Tests für die Steuerung über Internet sollte das ausreichen.
Jetzt geht es ans Programmieren.
Welche Sprache für die Steuer-Skripte soll benutzt werden?
- php
- python
- c
- ...
Die Webseite wird erstmal mit statischem html angelegt. Das ist einfach und geht schnell.
Ich wünsche einen schönen Sonntag
Haldamir