CAN-Weichenstellpult mit Arduino

#1 von FlorianG , 28.05.2021 19:48

Hallo,

ich wollte Euch mein Weichenstellpult vorstellen, das ich mit Arduino für den CAN-Bus erstellt habe.



Es ist sehr einfach gehalten. Meinen nicht vorhandenen Programmierkenntnissen im Bezug auf Bitmanipulationen zu verdanken ist die Lösung, als CAN-ID einfach eine fixe ID zu verwenden, die von der Gleisbox verwendet wurde. Vielleicht kann mir jemand dabei helfen, die Generierung richtig zu implementieren.

Angeschlossen ist es nur an CAN-H und CAN-L der Gleisbox, die Stromversorung der 3 Komponenten (Arduino, CAN-Shield und LCD-Display) erfolgt über ein 5V-Netzteil.

Was kann es?
Über die Tasten gibt man die Weichennummer ein, das Display zeigt den derzeitigen Schaltzustand der Weiche, daraufhin kann die Weiche auf rot oder grün geschaltet werden (Tasten C/D)
Ich verwende zur Zeit den Servedecoder von Rudy der sich nach dem Einschalten immer im Grundzustand befindet, daher kann ich mit dem Pult (2x B nacheinander drücken) auf pauschal alle Weiche auf gerade setzten (Schaltung erfolgt hier nacheinander).
Außerdem eine rudimentäre Weichenstrassenfunktion. Manuell werden hier Kombinationen von bis zu 6 Weichen und deren gewünschte Stellungen angelegt, die dann automatisch alle in die entsprechenden Stellungen gebracht werden. (Taste A + Nummer der gewünschten Weichenstrasse)

Was muss konfiguriert werden?
Nur die Gesamtzahl der Weichen, die Adressen der Weichen und den Wert der höchsten Weiche.
Das System nimmt nur Schaltbefehle für eingetragene Weichennummern an.
Und dazu auf Wunsch die Weichenstrassen

Weitere Infos und den Code gibt es auf http://frax7890.gerstmeier.biz/can-bus/can-weichenstellpult/

Demnächst kommt noch der auf CAN umprogrammierte Servodecoder von Rudy dazu.


Viele Grüße,
Florian


bertr2d2 und Hardi haben sich bedankt!
FlorianG  
FlorianG
Regionalbahn (RB)
Beiträge: 40
Registriert am: 23.11.2014
Gleise C-Gleis
Steuerung Mobile Station 2, CAN-Interface Eigenbau
Stromart AC, Digital

zuletzt bearbeitet 28.05.2021 | Top

RE: CAN-Weichenstellpult mit Arduino

#2 von st-oldie , 29.05.2021 20:59

Hallo Florian,

Zitat von FlorianG im Beitrag #1
Es ist sehr einfach gehalten. Meinen nicht vorhandenen Programmierkenntnissen im Bezug auf Bitmanipulationen zu verdanken ist die Lösung, als CAN-ID einfach eine fixe ID zu verwenden, die von der Gleisbox verwendet wurde. Vielleicht kann mir jemand dabei helfen, die Generierung richtig zu implementieren.


Du könntest dir mal mein Projekt anschauen:
MS2 und Beaglebone Black als Zentrale: viewtopic.php?f=7&t=131311
Den Quellcode gibt es über die Beschreibung auf meiner Homepage: http://www.mbernstein.de/modellbahn/can/index.htm

Unter dem "libs" Verzeichnis gibts es auch ein Verzeichnis "cs2" mit Encodern/Decoder für das CS2 Protokoll. Und dort findest du auch 2 Funktionen, die eine Märklin CAN ID zusammenbauen bzw. auseinandernehmen können.

Tschüß
Michael


Moba_Nicki und Hardi haben sich bedankt!
st-oldie  
st-oldie
InterRegioExpress (IRE)
Beiträge: 458
Registriert am: 22.12.2009
Homepage: Link
Ort: Friedberg (Hessen)
Gleise Märklin K-Gleis
Spurweite H0
Steuerung Märklin Systems
Stromart Digital


RE: CAN-Weichenstellpult mit Arduino

#3 von FlorianG , 30.05.2021 21:30

Hallo Michael,
ich habe so Codeschnipsel auch schon bei Railuino entdeckt. Aber bisher habe ich es noch nicht geschafft, diese bei mir zum laufen zu bringen. Entweder übernehme ich die Teile nicht komplett oder die Variablentypen stimmen nicht, da reichen meine Programmierkenntnisse anscheinend nicht aus. Aber ich schaue mir gerne mal deine Bibliotheken an. Vielleicht komme ich damit weiter.


Viele Grüße,
Florian


FlorianG  
FlorianG
Regionalbahn (RB)
Beiträge: 40
Registriert am: 23.11.2014
Gleise C-Gleis
Steuerung Mobile Station 2, CAN-Interface Eigenbau
Stromart AC, Digital


RE: CAN-Weichenstellpult mit Arduino

#4 von vikr , 31.05.2021 09:20

Hallo Florian,

Zitat von FlorianG im Beitrag #3

ich habe so Codeschnipsel auch schon bei Railuino entdeckt. Aber bisher habe ich es noch nicht geschafft, diese bei mir zum laufen zu bringen. Entweder übernehme ich die Teile nicht komplett oder die Variablentypen stimmen nicht, da reichen meine Programmierkenntnisse anscheinend nicht aus. Aber ich schaue mir gerne mal deine Bibliotheken an. Vielleicht komme ich damit weiter.

wenn man sich vergegenwärtigt, dass das eigentlich alles schon vor fast 10 Jahren in der sich jetzt "Make" nennenen Zeitschrift an jedem Bahnkiosk und mit Quelltext zum Download veröffentlicht wurde, ist man immer wieder erstaunt wie wenig echte "Maker" es unter den Märklin-Modellbahnern gibt, schließlich gibt es auch die Arduinos schon seit 25 Jahren...

MfG

vik


im Übrigen - Märklin am liebsten ohne Pukos, z.B. als Trix


vikr  
vikr
ICE-Sprinter
Beiträge: 6.372
Registriert am: 23.10.2011
Gleise M, C u. K.
Spurweite H0, N
Stromart Digital, Analog

zuletzt bearbeitet 31.05.2021 | Top

RE: CAN-Weichenstellpult mit Arduino

#5 von Ixam97 , 31.05.2021 09:24

Hallo Florian,

willkommen in der CAN-Welt :D

Zitat von FlorianG im Beitrag #1

Es ist sehr einfach gehalten. Meinen nicht vorhandenen Programmierkenntnissen im Bezug auf Bitmanipulationen zu verdanken ist die Lösung, als CAN-ID einfach eine fixe ID zu verwenden, die von der Gleisbox verwendet wurde. Vielleicht kann mir jemand dabei helfen, die Generierung richtig zu implementieren.



Welche ID meinst du genau? Die 32-Bit UID oder den 16-Bit Hash? Die UID kannst du dir grundsätzlich frei aussuchen. Nur sollte sie einzigartig sein. Ich verwende dafür ein von mir festgelegtes 16-Bit Prefix und hole mir die restlichen 16 Bit aus der Seriennummer des Microcontrollers. Das sieht dann so aus:

1
2
3
4
 
#include <avr/boot.h>
//...
UID = 0x12340000 + (uint16_t)(boot_signature_byte_get(22) << 8) | boot_signature_byte_get(23);
//...
 



Damit ist beinahe garantiert, dass die UID einzigartig ist. Bei mir ist bisher noch kein Edgecase aufgetreten, bei dem UIDs doppelt aufgetreten sind. Wenn man es ganz sauber machen will, dann fängt man den Fall natürlich auch noch ab, aber dafür war ich bisher zu faul .

Wenn es dir um den Hash geht, folgend die Funktion, die ich zur Erzeugung davon verwende:

1
2
3
4
5
6
7
8
9
 
uint16_t generateHash(uint32_t _uid) {
uint16_t uid_high = (uint16_t)(_uid >> 16);
uint16_t uid_low = (uint16_t)(_uid);

uint16_t _hash = uid_high ^ uid_low;
_hash = (_hash | 0x300) & ~0x80;

return _hash;
}
 



Auf meiner Github-Seite habe ich auch eine relativ umfassende Bibliothek für den CAN-Bus. Angefangen habe ich auch mit Railuino, aber das hat bei mir alles nicht so funktioniert wie es sollte, darum habe ich das (mittlerweile zum zweiten mal) selber von Grund auf neu aufgebaut. Da kannst du dich ja mal umsehen, wenn du magst. Bei bedarf erstelle ich dir auch ein Minimalbeispiel, wie du die Bibliothek in der Arduino-IDE benutzen kannst.


Viele Grüße und Clausthaler Glück Auf,

Maxi.
____________________________________________________

github.com/Ixam97
MäCAN Reborn


 
Ixam97
InterRegioExpress (IRE)
Beiträge: 255
Registriert am: 13.01.2014


RE: CAN-Weichenstellpult mit Arduino

#6 von st-oldie , 02.06.2021 21:08

Hallo Florian,

Zitat von FlorianG im Beitrag #3
ich habe so Codeschnipsel auch schon bei Railuino entdeckt. Aber bisher habe ich es noch nicht geschafft, diese bei mir zum laufen zu bringen. Entweder übernehme ich die Teile nicht komplett oder die Variablentypen stimmen nicht, da reichen meine Programmierkenntnisse anscheinend nicht aus. Aber ich schaue mir gerne mal deine Bibliotheken an. Vielleicht komme ich damit weiter.


Wenn du nur die beiden Funktionen für die CAN ID nimmst, sollte es kein Problem sein, die bei dir einzubinden. Diese beiden Funktionen haben keine weiteren Abhängigkeiten.

Die gesamte Lib hängt noch von einer andern eigenen Lib ab, die nicht Bestandteil meiner Modellban Software ist. Für den Einsatz in der Arduino IDE fehlen da auch noch Metadaten. Wenn jemand Interesse hat, die Lib in ein Arduino Projekt einzubinden, kann ich mich mal damit beschäftigen.

Tschüß
Michael


vikr hat sich bedankt!
st-oldie  
st-oldie
InterRegioExpress (IRE)
Beiträge: 458
Registriert am: 22.12.2009
Homepage: Link
Ort: Friedberg (Hessen)
Gleise Märklin K-Gleis
Spurweite H0
Steuerung Märklin Systems
Stromart Digital


RE: CAN-Weichenstellpult mit Arduino

#7 von FlorianG , 04.06.2021 23:11

Michael und Maxi, danke für Eure Antworten. Ich werde mich in den nächsten Tagen damit auseinandersetzen. Irgendwann werde ich es hoffentlich hinbekommen. Da ich neben meiner MS2 keine weiteren Eingabegeräte nutze, reicht die hemdsärmelige Lösung für mich halt zur Zeit aus.
Ich geben auf jeden Fall Bescheid.

PS.: Mit CAN-ID meine ich die Meldungskennung. Für die benötige ich ja die Message-Prio, das Kommando, Responsebit und Hash (der wird ja aus der Geräte-ID errechnet). Und das ganze muss ja in einen Wert eingetragen werden. Genau da fehlen mir, glaube ich, grundlegende Kenntnisse, um die entsprechenden Stellen in den Libraries zu verstehen.


Viele Grüße,
Florian


FlorianG  
FlorianG
Regionalbahn (RB)
Beiträge: 40
Registriert am: 23.11.2014
Gleise C-Gleis
Steuerung Mobile Station 2, CAN-Interface Eigenbau
Stromart AC, Digital

zuletzt bearbeitet 05.06.2021 | Top

RE: CAN-Weichenstellpult mit Arduino

#8 von Ixam97 , 05.06.2021 13:14

Hallo Florian,

Zitat von FlorianG im Beitrag #7

PS.: Mit CAN-ID meine ich die Meldungskennung. Für die benötige ich ja die Message-Prio, das Kommando, Responsebit und Hash (der wird ja aus der Geräte-ID errechnet). Und das ganze muss ja in einen Wert eingetragen werden. Genau da fehlen mir, glaube ich, grundlegende Kenntnisse, um die entsprechenden Stellen in den Libraries zu verstehen.


eigentlich ist das ziemlich einfach. Das Kommando wird 17 Bits nach links geschoben, das Response-Bit auf bit 16 gesetzt und der Rest ist der Hash. Ganz einfaches Beispiel für den Fall "Zubehör schalten" mit Dummyhash:

1
2
3
4
5
 
uint16_t hash = 0x0300;        // Dummy Hash
uint8_t response_bit = 0x01; // Ist eine Antwort, 0 bei Befehl
uint8_t cmd = 0x0B; // Kommando "Zubehör schalten"
 
uint32_t txID = (((uint32_t)cmd << 17) | ((uint32_t)response_bit << 16) | hash);
 



Wenn sich bei dir der Hash nicht verändert ist aber auch nichts verkehrt daran diese ID für die von dir benötigten Fälle fix zu lassen.

Was die Prio betrifft: Hier habe ich noch nie ein gerät gesehen, das diese benutzt. Das muss nicht heißen, dass es keine Geräte gibt, die das tun, aber für den regelbetrieb kann die getrost vernachlässigt werden. Die Kollisionsauflösung bezieht ja nicht nur die ersten vier Bits ein, sondern das ganze CAN-Datagramm. Darum hatte ich bisher immer eine Null als Prio und sogar Datenintensive Updatevorgänge funktionieren einwandfrei.

Mein Angebot mit dem Minimalbeispiel steht noch. Dann bräuchtest du dich um den CAN-Teil gar nicht mehr kümmern und kannst dich voll auf die eigentliche Logik des Gerätes konzentrieren 😉


Viele Grüße und Clausthaler Glück Auf,

Maxi.
____________________________________________________

github.com/Ixam97
MäCAN Reborn


FlorianG hat sich bedankt!
 
Ixam97
InterRegioExpress (IRE)
Beiträge: 255
Registriert am: 13.01.2014


RE: CAN-Weichenstellpult mit Arduino

#9 von FlorianG , 05.06.2021 20:19

Hallo Maxi,
damit komme ich schon ein gutes Stück weiter. Nur eine Frage: Wieso ist der Command-Befehtl 0x0B und nicht 0x016? Beide Werte kommen ja in der CAN-Dokumentation von Märklin vor.


Viele Grüße,
Florian


FlorianG  
FlorianG
Regionalbahn (RB)
Beiträge: 40
Registriert am: 23.11.2014
Gleise C-Gleis
Steuerung Mobile Station 2, CAN-Interface Eigenbau
Stromart AC, Digital


RE: CAN-Weichenstellpult mit Arduino

#10 von Ixam97 , 05.06.2021 20:26

Zitat von FlorianG im Beitrag #9
Hallo Maxi,
damit komme ich schon ein gutes Stück weiter. Nur eine Frage: Wieso ist der Command-Befehtl 0x0B und nicht 0x016? Beide Werte kommen ja in der CAN-Dokumentation von Märklin vor.



Das hängt damit zusammen, an welcher Bitposition der Befehl in der ID liegt. Der eigentliche Befehl ist 0x0B, binär ist das 0b00001011. Wenn man das nun um 17 Bits nach links schiebt, dann sind das 4 Bytes und 1 Bit. 0x0B << 1 = 0x16, oder in binärer Schreibweise 0b00010110. Das "dazugewonnene" Bit ist für das Response-Bit. Darum ist ein Zubehörbefehl 0x16 und eine Zubehörrückmeldung 0x17. Bei beidem erhält man bei einem Verschieben um 1 Bit nach Rechts wieder 0x0B.

Der Windows-Rechner hat einen Programmierer-Modus. Dort kannst du die ganzen verschiedenen Bitoperationen mal ausprobieren.


Viele Grüße und Clausthaler Glück Auf,

Maxi.
____________________________________________________

github.com/Ixam97
MäCAN Reborn


 
Ixam97
InterRegioExpress (IRE)
Beiträge: 255
Registriert am: 13.01.2014


RE: CAN-Weichenstellpult mit Arduino

#11 von FlorianG , 05.06.2021 23:14

Maxi, jetzt ist es mir auch aufgegangen, durch die Bitverschiebung verdoppele ich ja den Wert, aus Bhex (11) wird 16hex (22).
Dann werde ich mich an die Umsetzung geben.


Viele Grüße,
Florian


FlorianG  
FlorianG
Regionalbahn (RB)
Beiträge: 40
Registriert am: 23.11.2014
Gleise C-Gleis
Steuerung Mobile Station 2, CAN-Interface Eigenbau
Stromart AC, Digital


RE: CAN-Weichenstellpult mit Arduino

#12 von FlorianG , 15.06.2021 21:17

So, mittlerweile läuft das ganze einwandfrei.
Und, mit freundlicher Genehmigung von Rudy, ist auf http://frax7890.gerstmeier.biz/sketch-can-weichedecoder-servo-im-dcc-format/ auch eine Version seines DCC-Servo-Decoders für den CAN-Bus.


Viele Grüße,
Florian


Moba_Nicki hat sich bedankt!
FlorianG  
FlorianG
Regionalbahn (RB)
Beiträge: 40
Registriert am: 23.11.2014
Gleise C-Gleis
Steuerung Mobile Station 2, CAN-Interface Eigenbau
Stromart AC, Digital


RE: CAN-Weichenstellpult mit Arduino

#13 von Hardi , 17.06.2021 11:30

Hallo Florian,

Vielen Dank, dass Du uns Dein Projekt vorgestellt hast.

Ich will schon seit langem so eine ähnliche Geschichte bauen. Dabei will ich aber anstelle einer Tastatur einen Infrarot Empfänger benutzen. Diesen will ich mit einer TV-Fernbedienung ansteuern. Dann kann man von überall aus mal schnell eine Weiche umstellen. Eigentlich ist das kein Problem. Bibliotheken zum Einlesen der IR Signale gibt es genug. Mit Deiner Schaltung könnte man dann wahlweise per Tastatur oder per IR Weichen schalten.
Es fehlt mir nur die Zeit...
Vielleicht hast Du ja welche übrig...

Hardi


Haltet Euch unbedingt von diesen Seiten fern:
viewtopic.php?f=7&t=165060
https://wiki.mobaledlib.de/
sonst wird Eure Anlage niemals fertig…

Unsere Anlage findet Ihr hier:
RE: Unsere Kinder und Vater Anlage(n)


Moba_Nicki hat sich bedankt!
 
Hardi
InterCityExpress (ICE)
Beiträge: 2.142
Registriert am: 28.12.2015
Homepage: Link
Ort: Mainz
Gleise C
Spurweite H0
Steuerung MS2 + Eigenbau
Stromart Digital


RE: CAN-Weichenstellpult mit Arduino

#14 von FlorianG , 20.06.2021 17:39

Hallo Hardi,

mit IR-Empfängern und deren Bibliotheken habe ich mich noch nicht beschäftigt.
Aber die Eingabe aus dem Tastatur wir in Zeile 164 einer Variablen "event" zugeordnet, die dann entsprechend weiterverarbeitet wird. Also prinzipiell müsste es reichen, hier "event" den Wert aus der entsprechenden Library eines IR-Empfängers zuzuweisen.
In den darauf folgenden Zeilen bis 198 werden dann die entsprechenden Aktion abhängig vom Inhalt von "event" ausgeführt.
Soweit ich es aus dem Beispiel https://funduino.de/nr-11-fernbedienung gesehen habe, sind die Werte bei der Fernbedienung Zahlenkombinationen, will heißen, die Variable "event" müsste als long definiert werden.

Wenn Du mir sagst, welchen Empfänger bzw. welche IR-Bibliothek du verwendent willst, kann ich gerne weiterhelfen.


Viele Grüße,
Florian


Hardi hat sich bedankt!
FlorianG  
FlorianG
Regionalbahn (RB)
Beiträge: 40
Registriert am: 23.11.2014
Gleise C-Gleis
Steuerung Mobile Station 2, CAN-Interface Eigenbau
Stromart AC, Digital


RE: CAN-Weichenstellpult mit Arduino

#15 von Hardi , 20.06.2021 19:40

Hallo Florian,

vielen Dank für das Angebot.

Ich fürchte, dass ich das selber machen muss. Es soll ja in unsere bestehende Steuerung Integriert werden. Siehe Unsere Kinder und Vater Anlage(n) (2) Beitrag #33 Ab Bild 7.

Hardi


Haltet Euch unbedingt von diesen Seiten fern:
viewtopic.php?f=7&t=165060
https://wiki.mobaledlib.de/
sonst wird Eure Anlage niemals fertig…

Unsere Anlage findet Ihr hier:
RE: Unsere Kinder und Vater Anlage(n)


 
Hardi
InterCityExpress (ICE)
Beiträge: 2.142
Registriert am: 28.12.2015
Homepage: Link
Ort: Mainz
Gleise C
Spurweite H0
Steuerung MS2 + Eigenbau
Stromart Digital


   

Planungssoftware für Chrome OS???
Arduino-Multiplex-Signaldecoder mit Blindschaltbildern

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