Einfaches Drucktastenstellwerk auf Arduino-Basis mit Loconet-Schnittstelle - Entwicklungsstadium

#1 von Draisine , 18.04.2024 07:47

Ausgangspunkt meiner Arbeit waren Überlegungen zum Bau eines Weichenstellpults, das ich zur Steuerung der Weichen meines Betriebswerks nutzen wollte. Hier wird bis auf ein Ein-/Ausfahrsignal nur auf Sicht gefahren und die Weichen manuell gesteuert. Außerdem soll in einem späteren Ausbauschritt auch die Drehscheibe in das Stellpult mit einbezogen werden.

Die ersten Überlegungen zur Realisierung liegen schon einige Jahre zurück, kamen aber aufgrund mangelnder Zeit und anderer wichtigerer Tätigkeiten über einen einfachen Testaufbau nie hinaus, Allerdings war es mir bereits vor längerer Zeit schon möglich Fahrstraßen über die Auswahl von Weichen festzulegen, geplante Weichenstellbefehle über eine UNDO-Funktion rekursiv zurückzunehmen oder aber auch die gesamte Auswahl über einen weiteren Taster zu resetten. Die Auswahl selbst wird durch eine Quittiertatste bestätigt, die Weichen werden anschließend zeitversetzt über den DCC-Ausgang der Zentrale und passende Weichendecoder geschaltet. Die Übertragung vom Stellpult zur Multibus-Zentrale (hier: Yamorc 9401) erfolgt über eine Arduino/Loconet-Schnittstelle. Das Loconet-Shield entstand aus einem Nachbau eines einfachen aber voll funktionstüchtigen Loconet-Interfaces, das ich auf der Internetseite von Philipp Gahto gefunden habe (https://pgahtow.de/w/Loconet#/media/Date...t_Interface.png).
Die Kommunikationssoftware zum Loconet nutzt die Loconet-Bibliotheken (Loconet.h) von Alex Shepherd und Damian Philipp, ebenfalls im Internet frei verfügbar. Außerdem diverse andere Programmteile zum Lesen und Schreiben der Loconet OP-Codes (z. B. auch bei Philipp Gahtho und anderen).

An dieser Stelle nochmal ausdrücklich mein Dank an all die, die diese Informationen zur freien, privaten Nutzung zur Verfügung stellen.

Neben der anfänglichen, doch sehr rudimentären Testphase, bei der es u. a. auch darum ging wie ich die Tastenbefehle in den Arduino bekomme (Test mit Encoder, Multiplexer oder I2C-Bus) sowie die Möglichkeit wichtige Daten auch nicht flüchtig in ein Fram zu speichern, habe ich mir mittlerweile für meine im Arbeitszimmer befindliche Testanlage ein passendes Stellpult aufgebaut und bin aktuell dabei die gesamte Software neu zu schreiben. Wozu auch die Implementierung der von der Zentrale über Loconet gesendeten Weichen- und Belegtmeldungen auf dem Stellpult gehört. Das funktioniert mittlerweile einwandfrei. An den Eingaben zur Eingabe Weichenstellungsänderungen bin ich momentan mit Unterbrechungen dran. Erste Überlegungen zur Fahrstraßeneingabe mittels Start- und Zieltaster habe ich auch schon gemacht, die entsprechenden Taster sind auf dem Stellpult bereits vorgesehen. Die Realisierung ist allerdings ergebnisoffen und zeitlich unbestimmt.

Mein Stellpultaufbau hat kein reales Vorbild, ich habe es halt so gebaut wie ich mir eine vernünftige Steuerung vorstelle, der Einfachheit halber mit je zwei Tastern je Weiche (gerade/abzweigend) und jeweils aktueller Anzeige der Stellungsänderung. In einer späteren Version vielleicht nur noch mit einer Taste für die Weichenauswahl allgemein und einer Taste je Weiche zum wechselseitigen Umschalten. Damit könnte ich in etwa die Hälfte an Weichentastern einsparen und damit letztlich auch Eingängen an den I2C-Bausteinen, die ich zur Eingabe verwende. Eine Erweiterung mit Signaltasten und -anzeigern ist ebenfalls möglich, derzeit von mir allerdings nicht vorgesehen.

Bild entfernt (keine Rechte)

Zusammenfassend läßt sich folgendes festhalten:

Aktuell: realisiert bzw. noch in der Softwareentwicklung

    - Arduino Uno mit Loconet-Shield und Loconet-Bibliothek
    - Ein- und Ausgabe über I2C-Schnittstelle (hier: Marke Horter)
    - Speicherung der Weichenstellungen und div. anderer wichtiger Daten auf 8 kByte Fram SPI
    - Lesen der Weichen-und Belegtmelderangaben von der Zentrale und Ausgabe auf dem Stellpult
    - je zwei Drucktasten für Weichen (gerade/abzweigend) mit LED-Ausleuchtung der aktuellen Stellung und der ausgewählten Stellung (blinkend)
    - UNDO-Taste bei Weicheneingabe am Stellpult
    - Resett-Taste für Gesamtresett der Eingabe
    - Quittiertaste zum Auslösen der Weichenstellbefehle, Wenn man die Taste gedrückt hält kann man die Weichen auch einzeln schalten
    - Modusschalter für Eingabe Weichenauswahl oder Fahrstraßenauswahl


Zukünftig oder optional:
    -Vorbereitung Start- und Zieltaste für Fahrstraßen mit Belegtmelderabfragen und vereinfachter Ausleuchtung des Fahrwegs
    Hierzu hatte ich schon Tests mit Graphentheorien zur automatischen Ermittlung der kürzesten Verbindung von Start nach Ziel
    durchgeführt.
    - Speziell bin ich hierbei auf ein Verfahren nach Dijkstra gestoßen, das ich auch programmtechnisch bereits umgesetzt
    habe und das, basierend auf der eigegebenen Gleistopologie und Gewichtung der Zweigelemente, auch wunderbar funktioniert, allerdings auch nicht praxistaugliche Lösungen liefert. in der Art, daß zum Erreichen eines Zielgleises auch schon mal eine in Rückwärtsrichtung liegende Weiche genutzt wird. Das ist ggf. halt der kürzeste Weg.
    Möglicherweise kann ich das damit umgehen, daß ich zwei richtungsabhängige Topologien erstelle. Die ersten Überlegungen hierzu liegen vor, vorab muß ich allerdings wieder die Grundfunktionalitäten zum Laufen bringen.
    - Nebenbei stellt sich dabei allerdings auch die Frage, ob ich die gesamte Funktionalität überhaupt im Arbeitsspeicher des Arduino unterbringe oder ob ich ggf. noch einen weiteren Arduino verwenden muß oder ggf. auch das Fram zur Speicherung größerer Laufzeitvariablen und Strukturen mit einbeziehe. Von der Laufzeit her sollte das kein Problem sein, eher vom direkten Zugriff auf die Datenfelder. Aber sicherlich machbar. Die Definition der Gleistopologie benötigt halt schon etwas Platz, auch bei meiner kleinen Testanlage und trotz spezieller Verfahren zur Kompression der Topologiematrizen.
    - Anzeige der Fahrzeug-IDs über Railcom und OLED-Display (als allerletztes in weiter Ferne)


Hier ein Video zur Demonstration der Rückmeldungen

https://youtu.be/CH62CX3IRik

Die Frage, die sich nebenbei stellt ist, ob dieser ganze "Quatsch" überhaupt Sinn ergibt, gibt es doch fertige Modellbahnsteuerungen, die das alles bereits drin haben und noch einiges mehr. Ein bißchen Interesse an der Materie und der Aha-Effekt wenn es denn funktioniert spielt bei mir halt auch eine wichtige Rolle. Eigentlich die wichtigste überhaupt, das berühmte Erfolgserlebnis. Und da ich fast lieber baue als zu fahren, paßt das auch.

Mit meiner kurzen Beschreibung wollte ich hier jetzt keine (1:1)-Bauanleitung liefern, Details kann man aber dennoch erfragen. Ich wollte nur zeigen, welche komplexe Funktionen mit relativ kleinem Geld und hardwaremäßig einfach zu realisieren sind. Auch für Anlagen, die größer als meine Testanlage sind und wo die analoge Realisierung mit Diodenmatrix und ggf. Relaistechnik doch erheblich mehr Verdrahtungsaufwand bedeuten. Von Weichen- und Belegtmelder-Rückmeldungen mal ganz zu schweigen, die bekomme ich als Abfallprodukt so nebenbei gratis mit dazu. Der wesentliche Aufwand steckt in der Entwicklung der Software. Zumindest für mich.

Wer Interesse hat kann mich gerne fragen. Aber bitte beachten, ich bin kein Informatiker und auch kein Computerfreak. Vieles was ich mache basiert auf dem Try- und Error-Prinzip. Einige Kenntnisse der Programmiersprache c (nicht C++) sind vorhanden. Für das was ich mache reichen die aus.

Wer Fragen oder noch weitere Ideen hat, nur zu. Aktuell kämpfe ich beispielsweise mit dem Problem bei der Weichenauswahl (Eingabe der umzusteuernden Weichen am Stellpult) die zugehörigen Weichenabgänge vor Quittierung blinken zu lassen, ohne durch hierzu oft verwendete "delays" den gesamten Programmablauf innerhalb der Schleife zu behindern. Ein programmtechnisches Problem für das ich sicherlich auch eine Lösung finden werde. Etwa durch zyklisches Schreiben und Löschen der Ausgabepuffer der I2C-Bausteine, wobei die betreffenden Bits der Weichen-LED in der Schleife gesetzt und anschließend wieder gelöscht werden. Verzögerung möglicherweise durch Abfragen der aktuellen Programmlaufzeit.

Grüße Thomas


Die Sucht nach Bahn/Modellbahn hat mich nie losgelassen, ich habe sie aber auch nie richtig ausgelebt. Nun erfülle ich mir all die Wünsche der letzten Jahrzehnte.


semisweet, JörgBehrens und Langsamfahrer haben sich bedankt!
Draisine  
Draisine
InterRegio (IR)
Beiträge: 208
Registriert am: 16.01.2019
Ort: Südhessen
Gleise Roco Line + geoLine + Piko + LGB, Fahrzeuge: alles mögliche
Spurweite H0, G
Steuerung Digikeijs DR5000 + Upgrade YD9401, MD-Zentrale, Bausteine Digikeijs + YAMORC, ESU
Stromart DC, Digital

zuletzt bearbeitet 18.04.2024 | Top

RE: Einfaches Drucktastenstellwerk auf Arduino-Basis mit Loconet-Schnittstelle - Entwicklungsstadium

#2 von madas , 18.04.2024 08:41

Schau Dir mal diese Decoder von Möllehem an. Damit lässt sich auf Loconet Basis ganz gut ein Stellpult bauen. :)
Fahrstraßenstellung über 2 Taster inklusive.

http://www.mollehem.se/index.php/en/cont...ldecoder-detail


JörgBehrens und Draisine haben sich bedankt!
madas  
madas
S-Bahn (S)
Beiträge: 19
Registriert am: 27.10.2022


RE: Einfaches Drucktastenstellwerk auf Arduino-Basis mit Loconet-Schnittstelle - Entwicklungsstadium

#3 von Draisine , 18.04.2024 09:12

Ja, wahrscheinlich geht das auch. Sollte, da kommerziell. Preislich mit ca. 31 Euro (360 schwedische kr) interessant, wenn man was schlüsselfertiges sucht. Die Parametrierung der Grundeinstellungen ist halt deutlich professioneller als bei mir. Bei mir wird das ganze in der Setup-Routine bzw. auch im Programmkopf "hart verdrahtet", da ich mir eine externe Parametrierfunktionalität erspart habe. Könnte ich aber auch noch ergänzen, etwa durch einen Parametriermodus und drücken der entsprechenden Tasten und anschließendem Zuordnen zu den Strukturen/Feldern und Abspeichern der Werte im Fram. Ist mir momentan aber zuviel Aufwand und sprengt vermutlich auch die Fähigkeiten meines Uno.
Ich hatte vor ca. 6 Jahren damit begonnen, als ich mich erstmalig mit dem Arduino und Loconet beschäftigt habe. Damals hatte ich nur I/O-Bausteine zum Selbstbau auf Loconet-Basis gefunden. Und natürlich die kommerziellen Produkte von Digitrax, Uhlenbrock und einige kleinere Anbieter. Das war mir alles zu teuer, außerdem bestand der Reiz sich mit dem Arduino und Loconet selbst zu beschäftigen. Der Weg zum Stellpult war das Ziel, nicht das Stellpult an sich. Der praktische Nutzen ergab sich später.

Mein Stellpult hat sich halt über die Jahre so entwickelt und funktioniert ja auch vom Prinzip her. Oder hat bislang funktioniert, was die Weichenauswahl anbelangt. Ich schreibe die Software halt mittlerweile komplett neu. Das wird aber wieder. Ich wollte auch nur zeigen was mit Arduino und Loconet geht. Gerade Loconet mit seiner weiten Verbreitung im Ami-Land und hießigen Modellbahn-Clubs bietet zahlreiche Möglichkeiten relativ einfach an Daten heranzukommen und sich bei Bedarf auch richtig auszutoben. Mein Stellpult ist nur ein kleines Beispiel.

Interessant ist bei den von Dir gelinkten Modulen wiederum die Begrenzung auf 64 Ein-/Ausgänge. Das sind Standardwerte von kaskadierten Encodern/Decodern, Multiplexern oder auch I2C-Modulen. Ich könnte meinen Aufbau theoretisch auf 4 x 64 Ein-/Ausgänge erweitern, wenn ich statt direkter Ansteuerung der LED über die Ausgänge der I2C-Module noch 3 x 8 oder 4 x 16 Decoder ansteuern würde. Dann halt nicht direkt, sondern über Binäradressen. Ob man das braucht? Ich momentan nicht.
Aber weiß ich das? Die Möglichkeit besteht jedenfalls.

Grüße Thomas


Die Sucht nach Bahn/Modellbahn hat mich nie losgelassen, ich habe sie aber auch nie richtig ausgelebt. Nun erfülle ich mir all die Wünsche der letzten Jahrzehnte.


semisweet und JörgBehrens haben sich bedankt!
Draisine  
Draisine
InterRegio (IR)
Beiträge: 208
Registriert am: 16.01.2019
Ort: Südhessen
Gleise Roco Line + geoLine + Piko + LGB, Fahrzeuge: alles mögliche
Spurweite H0, G
Steuerung Digikeijs DR5000 + Upgrade YD9401, MD-Zentrale, Bausteine Digikeijs + YAMORC, ESU
Stromart DC, Digital

zuletzt bearbeitet 18.04.2024 | Top

RE: Einfaches Drucktastenstellwerk auf Arduino-Basis mit Loconet-Schnittstelle - Entwicklungsstadium

#4 von semisweet , 18.04.2024 16:36

Hallo Thomas,

schönes Projekt, das Du erstellt hast (noch am Erstellen bist).
Ich werde hier Mal dran bleiben, da ich Ähnliches vorhabe.
Frage: Wenn Du auf dem Stellpult eine Weiche umlegst, wird das per Loconet "gemeldet", sodaß dann Deine Zentrale und
ggfs. Steuersotware (Rocrail z.B.) das mitbekommen?
Das ist nähmlich das, was mich interessiert.
Ich habe vor, 2 Anlagenteile vor Ort mit Drucktastenstellwerk zu bedienen (BW und Zeche) und möchte erreichen, das Rocrail weiss, was ich da an Weichen lege, da Teilbereiche BW / Zeche auch Bestandteil von Zugfahrten sind, die über Rocrail gesteuert werden sollen.


Glück auf & liebe Grüße
Klaus-Peter

Mutta, hol mich vonne Zeche, ich kann dat Schwatte nich mehr sehen ......
Anlage in Bau: Essen-Hanielsberg Zeche Zollverein Schacht XIV (14) das Ruhrgebiet um 1960


 
semisweet
InterRegioExpress (IRE)
Beiträge: 314
Registriert am: 28.06.2013
Ort: Schwelm, südliches Ruhrgebiet
Gleise Tillig Elite Code83
Spurweite H0
Steuerung IB2 Neo, ARLoCo-Rückmelder + Arduino (Servo und Signale)
Stromart Digital


RE: Einfaches Drucktastenstellwerk auf Arduino-Basis mit Loconet-Schnittstelle - Entwicklungsstadium

#5 von Draisine , 19.04.2024 08:30

Zitat von semisweet im Beitrag #4
Hallo Thomas,

schönes Projekt, das Du erstellt hast (noch am Erstellen bist).
Ich werde hier Mal dran bleiben, da ich Ähnliches vorhabe.
Frage: Wenn Du auf dem Stellpult eine Weiche umlegst, wird das per Loconet "gemeldet", sodaß dann Deine Zentrale und
ggfs. Steuersotware (Rocrail z.B.) das mitbekommen?
Das ist nähmlich das, was mich interessiert.
Ich habe vor, 2 Anlagenteile vor Ort mit Drucktastenstellwerk zu bedienen (BW und Zeche) und möchte erreichen, das Rocrail weiss, was ich da an Weichen lege, da Teilbereiche BW / Zeche auch Bestandteil von Zugfahrten sind, die über Rocrail gesteuert werden sollen.


Hallo Klaus-Peter,
ja, das wird gemeldet.

In der Schleife (loop) frage ich u. a. den aktuellen Loconet-Status ab:

// LocoNet prüfen, ob externe LocoNet-Pakete gesendet werden
LnPacket = LocoNet.receive() ;

// Wenn die Pakete Switch-Message oder Sensormeldung sind,
// dann Call-back-Routine und Meldungen auslesen
A: if (!LocoNet.processSwitchSensorMessage(LnPacket));[/big]


Desweiteren frage ich Tasteneingaben des Stellpults ab:

// nModule_in I2C-Eingabemodule mit PCF8574, 8 bit einlesen
// Nr. 1 - 8*nModule_in der gedrückten Taste des Stellpults
B: Tasten_Nr = I2C_Taster_abfragen(I2C_IN_ADDR, nModule_in);


Wird eine Taste gedrückt und entspricht die Tastennummer einer Taste für Weichen, dann Aufruf Funktion Weichenauswahl

// Betriebsmodus 1: Weichenauswahl mit weiteren Weichetasten einlesen
// sofern Modus = 0 und aktuelle Taste eine Weichentaste ist
// ---------------------------------------------------------
C: if (Modus == 0 && Tasten_Nr > 0 && Tasten_Nr <= nWeichtast)
{
nAusw = Weichenauswahl (Tasten_Nr);


In der Funktion Weichenauswahl hatte ich bislang eine while-Schleife über die Quittiertaste (solange die nicht gedrückt ist),
um weitere Weichen für meine Auswahl anzugeben. Die habe ich nun rausgenommen, da ich ansonsten keine LN-Meldungen der Schleife loop mehr mitbekomme.
Stattdessen erfolgt die Weichenauswahl nun grundsätzlich über die Abfrage nach Punkt B in der Schleife loop.

In der Funktion nach Punkt C: ordne ich nun ausschließlich die ausgewählten Weichen einer Struktur Weichen zu. Diese enthält die Adresse und Richtung der ausgewählten Weichen, sowie die Anzahl der aktuell ausgewählten Weichen.
Außerdem gibt es einen Ausgabepuffer (Feld 1 - n) für die LED-Ausgabe an den Modulen (0 - n), der je nach ausgewählter Weiche aktualisiert und zum I2C-Ausgabemodul gesendet wird. Nun auch blinkend ein/aus der gesetzten Weiche(n). Der Puffer beginnt bewußt ab Indes 1. Index 0 enthält die Adresse zur Speicherung auf dem Fram.
Zum Einsatz kommen drei I2C-Eingabemodeule und vier Ausgabemodule zu je 8 Bit.

Bit setzen: I2C_OUT_LED[StP.ixMod_out[ix_SP]+1] = LED_setzen(I2C_OUT_LED[StP.ixMod_out[ix_SP]+1],Tasten_Nr,0);
Bit löschen: bitClear (I2C_OUT_LED[StP.ixMod_out[ix_SP]+1], StP.ixPin_out[ix_SP]);

blinken über Abfrage der Laufzeit:
static uint8_t ein;
unsigned long curtime = millis(); // Aktuelle Zeit wird in currentMillis gespeichert
if (curtime - prevtime >= interv) // Falls mehr als interv in ms vergangen sind
{
if (ein) // LED ist gesetzt, dann aus
{
bitClear (I2C_OUT_LED[StP.ixMod_out[ix_SP]+1], StP.ixPin_out[ix_SP]);
ein = 0;
}
else if (!ein) // LED ist nicht gesetzt, dann aus
{
I2C_OUT_LED[StP.ixMod_out[ix_SP]+1] = LED_setzen(I2C_OUT_LED[StP.ixMod_out[ix_SP]+1],Tasten_Nr,0);
ein = 1;
}
LED_Ausgabe(I2C_OUT_ADDR[StP.ixMod_out[ix_SP]],I2C_OUT_LED[StP.ixMod_out[ix_SP]+1]);
prevtime = curtime;
}


Das funktioniert nun schon mal.

Desweiteren in der Entwicklung:
Bei der Weichenauswahl, eine oder mehrere Weichen, die neben dem aktuellen Weichenschaltzustand blinkend dargestellt werden, kann ich Eingaben zurücknehmen (rekursives UNDO) oder auch alles resetten.

Oder quittieren, dabei werden dann die LN-Schaltbefehle der im Struct Weichen gespeicherten Weichen indirekt über verschiedene selbst erstellte Funktion generiert. Letztlich werden die Schaltbefehle über Op-Codes generiert.

Funktion aus Bibliotheksfunktion Loconet.h
D: void sendOPC_SW_REQ(int address, byte dir, byte on)
{
lnMsg SendPacket ;
}


Anschließend die Abfrage der Schaltbefehle zur Aktualisierung der LED-Ausgaben und zur Speicherung des aktuellen Zustands des Stellpults im Fram.

E: // **************************************************
// This call-back function is called from LocoNet.processSwitchSensorMessage
// for all Switch Request messages
// -----------------------------------------------------------------------
void notifySwitchRequest( uint16_t Address, uint8_t Output, uint8_t Direction ) {


Mit dem sendOPC_SW_REQ werden die Weichenstellbefehle an die Zentrale gesendet. Damit wird der Zustand in der Zentrale und ggf. auch in der angeschlossenen Modellbahnsoftware aktualisiert. Die Zentrale sendet dann die Rückmeldung über notifySwitchRequest, die ich, wie bereits gesagt nutze, um meine Stellwerkanzeigen zu aktualisieren.

Das ganze funktioniert für meinen Testaufbau hervorragend. Also schalten über Zentrale oder vom Stellpult generiert immer LN-Meldungen, die bei allen LN-Bausteinen über die Zentrale zur Verfügung stehen. Ob es bei größeren Aufbauten evtl. zu Timing-Problemen auf den LN-Bus kommen kann, kann ich nicht sagen. Das ist dann aber grundsätzlich so und hängt nicht unmittelbar mit meiner Applikation zusammen.

In der gleichen Weise wie ich die Schaltermeldungen abfrage, erfolgt dies auch bei den Sensoren über notifySensor. Man kann auch die Railcom-Adresse abfragen, derzeit bei mir allerdings noch nicht umgesetzt.

Das ist das schöne oder auch geniale am direktional aufgebauten LN-Bus, daß sämtliche Informationen bei allen LN-fähigen Geräten verfügbar sind.

Man könnte das ganze System auch als Stand-Alone-Lösung ohne Zentrale aufbauen, wenn man 1. eine separate Stromeinspeisung für LN vorsieht und 2. auch die Schaltdecoder in LN ausgeführt sind. Oder man eine separate Schnittstelle LN --> DCC vorsieht. Da ich eine Multibuszentrale nutze, ist das bei mir nicht nötig. Um digital fahren zu können benötige ich eh eine Zentrale. Weil nur schalten ergibt ja auch keinen Sinn. Höchstens bei Analogbetrieb.

Wenn ich das Teil fertig habe und es fehlerfrei läuft, wann das sein wird kann ich derzeit noch nicht sagen, gibt es genauere Informationen zur Hardware und zum Sketch.
Eigentlich ist nur noch die Routine zur Weichenauswahl zu schreiben. Jemand der in c oder c++ fit ist, schafft das möglicherweise in zwei Stunden. Ich eher in zwei Wochen. Danach ist Programmaufräumen und optimieren dran. Und testen und Bugs beseitigen. Dann sollte das aber schon mal praxistauglich laufen. Anschließend
kommen die Fahrstraßen dran. Zwischendurch nochmal ein paar Fliesen verlegt und die Decke in meinem Modelbahnraum abgehängt und ein Trockenestrich verlegt.
Vielleicht implemetiere ich aber auch noch die Drehscheibe. Das sollte allerdings kein Problem sein, läuft wie beim Schalten von einzelnen Weichen. Wahrscheinlich sehe ich dafür eine eigenen Microcontroller mit separater LN-Schnittstelle vor. Vielleicht beschäftige ich mich auch mal mit den ganz kleinen Controllern vom Typ attyni. Mal sehen wie die funktionieren und für was man die noch gebrauchen kann. Vielleicht für die Torsteuerung und das Licht meiner Lokschuppen. Vielleicht geht da auch was mit Sound.

Falls Du noch fragen hast, dann einfach melden. Meine Antwort kann allerdings etwas dauern, da ich neben Stellwerk und Forum und anderen Dingen bis ca. Ende des Jahres am Hausumbauen bin. Zwischendrin gibt es aber immer wieder ein wenig Zeit für wesentlichere Dinge.

Eine Sache noch:
bislang hatte ich die Taster und LED-Ausgaben in einer passenden Reihenfolge an den I2C-Modulen angeschlossen, so daß ich aus der Tasternnummer mir rückwärts die Weichenadresse, die Weichenstellung und die LED-Ausgabe ermitteln konnte. Ich habe das zwischenzeitlich dahingehend geändert, daß ich nun eine Referenztabelle führe (Strukt mit Feldern der Structelemente) bei der ich über den ausgelesenen Index (aus Tastennummer oder Adresse mit Richtung als Suchkriterium) die Zuordnung der Modulnummer der I2C-Module (ein/aus) und des jeweiligen Eingabepins (Taster) und Ausgabepins (LED) bestimme. Das ist fehlertoleranter und flexibler was den Hardware-Aufbau anbelangt, macht die Sache durch die geschachtelten Indizes allerdings wieder etwas komplizierter. Was ich auch leidvoll erfahren durfte.

Diese Referenztabelle ist global definiert und mit Werten zugewiesen. Außerdem speichere ich die im Fram ab, auch wenn das momentan nicht erforderlich ist. Wie ich das endgültig mache, etwa die Liste nur lokal verwende, weiß ich noch nicht. Das wird späteres Feintuning sein, je nachdem wie ich mit den 2 kByte RAM des Arduino klar komme. Die Fahrstraßen werden noch einiges an Ressourcen fressen. Beim Mega mit seinen 8 kByte RAM hätte man die Probleme wohl nicht. Gut, ich hatte mich aus preislichen Gründen und weil ich hiervon mehrere bereits hatte für den Uno entschieden. Raspberry wäre von der Leistungsfähigkeit und Datenspeichern her unschlagbar, hier weiß ich nur nicht, ob es passende Bibliotheken für LN gibt. Ich hatte bislang halt nur nach Arduino geschaut und dabei bleibe ich nun auch.

Grüße Thomas


Die Sucht nach Bahn/Modellbahn hat mich nie losgelassen, ich habe sie aber auch nie richtig ausgelebt. Nun erfülle ich mir all die Wünsche der letzten Jahrzehnte.


fbstr hat sich bedankt!
Draisine  
Draisine
InterRegio (IR)
Beiträge: 208
Registriert am: 16.01.2019
Ort: Südhessen
Gleise Roco Line + geoLine + Piko + LGB, Fahrzeuge: alles mögliche
Spurweite H0, G
Steuerung Digikeijs DR5000 + Upgrade YD9401, MD-Zentrale, Bausteine Digikeijs + YAMORC, ESU
Stromart DC, Digital

zuletzt bearbeitet 19.04.2024 | Top

Drucktastenstellwerk funktioniert

#6 von Draisine , 22.04.2024 16:20

Nachdem die Übertragung der extern erzeugten Belegtmelder und Weichenstellungen zur Anzeige auf dem Stellpult schon beim letzten mal funktioniert hat, habe ich nun die Routinen zur Weichenauswahl per Stellpult programmiert. Ging einfacher als ich anfänglich dachte. Nachstehend ein kleines Video mit Auswahl der Weichenstellungen.
Im ersten Schritt mit UNDO-Funktion, im zweiten Schritt mit Reset der Gesamteingabe und im dritten Schritt mit Quittierung, d. h. absenden der Weichenstellbefehle und Aktualisierung der Anzeige auf dem Stellpult.

Demnächst werde ich die Hardware etwas näher erläutern. Für die gezeigten Funktionen und die Größe des Testaufbaus ist der UNO vollkommen ausreichend. Mit etwas Optimierung des Programmcodes läßt sich vielleicht der Bedarf an Hauptspeicher sogar noch etwas verringern.

Bei Gelegenheit werde ich die Fahrstraßen angehen.

https://youtu.be/f8iZ8llcTLI

Grüße Thomas


Die Sucht nach Bahn/Modellbahn hat mich nie losgelassen, ich habe sie aber auch nie richtig ausgelebt. Nun erfülle ich mir all die Wünsche der letzten Jahrzehnte.


Draisine  
Draisine
InterRegio (IR)
Beiträge: 208
Registriert am: 16.01.2019
Ort: Südhessen
Gleise Roco Line + geoLine + Piko + LGB, Fahrzeuge: alles mögliche
Spurweite H0, G
Steuerung Digikeijs DR5000 + Upgrade YD9401, MD-Zentrale, Bausteine Digikeijs + YAMORC, ESU
Stromart DC, Digital

zuletzt bearbeitet 22.04.2024 | Top

Loconet Bereitschaftsstaus abfragen

#7 von Draisine , 23.04.2024 08:43

Eine Frage an die Fachleute, die sich mit Loconet, speziell den Funktionalitäten der Bibliothek Loconet.h auskennen.

Gibt es eine Funktion, vergleichbar dem Wire.available beim I2C-Bus, mit dem der Bereitschaftsstatus von Loconet geprüft werden kann?

Mir geht es darum, daß ich während der Programmlaufzeit den Bereitschaftsstatus von Loconet zyklisch abfragen und auf dem Stellpult anzeigen möchte (rote LED falls nicht verfügbar), um zu prüfen, ob überhaupt eine Loconet-Verbindung besteht. Die Abfrage nach Daten LocoNet.receive() liefert mir nur dann Informationen, wenn auch gerade Nachrichten gesendet werden. In der Bibliothek habe ich leider nichts passendes gefunden. Was u. U. aber auch an meinem beschränkten Verständnis zum dort verwendeten C++ liegen kann.

Grüße Thomas

Nachtrag:
die Frage hat sich erledigt. Ich überwache einfach das RX-Signal des Loconet auf dem LN-Shield und lege dies über einen 10-kOhm-Widerstand an eine LED. Ist LN nicht verfügbar, leuchtet die LED. Bei Datentransfer flackert die LED, ansonsten aus.


Die Sucht nach Bahn/Modellbahn hat mich nie losgelassen, ich habe sie aber auch nie richtig ausgelebt. Nun erfülle ich mir all die Wünsche der letzten Jahrzehnte.


Draisine  
Draisine
InterRegio (IR)
Beiträge: 208
Registriert am: 16.01.2019
Ort: Südhessen
Gleise Roco Line + geoLine + Piko + LGB, Fahrzeuge: alles mögliche
Spurweite H0, G
Steuerung Digikeijs DR5000 + Upgrade YD9401, MD-Zentrale, Bausteine Digikeijs + YAMORC, ESU
Stromart DC, Digital

zuletzt bearbeitet 18.05.2024 | Top

aktueller Stand heute

#8 von Draisine , 30.05.2024 13:41

Ich wollte mal was zu meinen Experimenten mit dem Stellpult sagen.

Wie erwartet habe ich den Arduino Uno an seine Speichergrenzen gebracht. Also Uno gegen Mega getauscht, der 4 x soviel Ram hat und auch über deutlich mehr Programmspeicher verfügt. Das Anpassen ging von der Hardware auch relativ einfach. Bei der Zuordnung der Pins LN-Shield, I2C- und Fram-Schnittstelle ergaben sich Änderungen aufgrund teilweise unterschiedlicher Pin-Belegungen zwischen Uno und Mega. Aber machbar, man muß die passenden Informationen nur finden.

Ursprünglich wollte ich die Fahrstraßen automatisch über Graphentheorien ermitteln, was vom Prinzip her auch funktioniert hat. inkl. Berücksichtigung belegter Gleisabschnitte. Zumindest auf dem Monitor. Bei der weiteren Umsetzung der gefundenen Fahrstraßen, d. h. der Zuordnung der Weichen und Richtungen sowie der Fahrwegausleuchtung tauchten dann allerdings die Probleme auf. Der Datenverwaltungsaufwand über die Gleistoplogie (Graphentopologie) nun auf die im Fahrweg befindlichen Weichen und Fahrstraßenausleuchtungen zu kommen, überstiegen meine Fähigkeiten. Einfach zu kompliziert und nur noch schwer nachvollziehbar. Insbesondere wenn es nicht so funktioniert wie es soll.

Stattdessen arbeite ich nun konventionell mit einem Fahrstraßenspeicher, der alle möglichen Fahrstraßen in der Form Start- und Zieltaste und Streckentasten (soweit vorhanden) enthält. Desweiteren die Weichenadressen und Weichenstellungen im Fahrweg. Den Fahrstraßenspeicher erzeuge ich im Programmiermodus am Stellpult und speichere das ganze dann automatisch im Fram ab.
Im Betriebsmodus, bei der Fahrstraßenauswahl wird über die Eingabe von Start- und Zieltaste der entsprechende Eintrag im Fahrstraßenspeicher gesucht und nach Quittierung die zugehörigen Weichen geschaltet und der Fahrweg ausgeleuchtet. Belegte Gleisabschnitte im Fahrweg oder auf dem Zielgleis werden erkannt. Soweit vorhanden wird ein alternativer Fahrweg gesucht. Die Priorität der ausgewählten Fahrwege wird bei der Eingabe des Fahrstraßenspeichers festgelegt. Fahrwege mit höheren Prioritäten stehen vor solchen mit kleineren Prioritäten. Ist das Zielgleis belegt, gibt es natürlich keinen alternativen Fahrweg.

Die Gleise im Fahrweg werden ausgeleuchtet (konkret eine gelbe LED je Fahrweg/Gleisbesetztmelder,) die zugehörigen Weichenstellungen blinken. Nach Quittierung werden die Weichen umgeschaltet (LN-Schaltbefehle) und die LED-Anzeige über die Abfrage der LN-Rückmeldung aktualisiert. Der gewählte Fahrweg ist dabei immer noch ausgeleuchtet. Die Fahrstraße wird durch den fahrenden Zug, die Lok aufgelöst. Und zwar Stück für Stück durch Ansprechen der Belegtmelder, deren Meldungen ich abfrage und über deren Adressen und meine Stellpuldefinition ich Zugriff auf die I2C-Adressen und Pins der I2C-Module zur Gleisausleuchtung bekomme.

Soweit funktioniert das ganze schon mal mit meinem Testgleis und zugehörigem Phantasiestellpult. Die Software, na ja, klassisch C mit Strukturen, Feldern, verschachtelten Indizes und teilweise Zeigern ist verbesserungsfähig, funktioniert aber. Vielleicht sollte ich mich doch mal mit C++ beschäftigen. Mit Definition von Klassen ließe sich da sicherlich einiges übersichtlicher und einfacher gestalten.

Im nächsten Schritt mache ich mir Gedanken um den Flankenschutz und die Integration von Signalen und Bahnübergängen. Beim Flankenschutz stelle ich mir vor die Weichen der aktuell gewählten Fahrstraßen zu überprüfen. Finde ich mindestens eine identische Weiche in den bereits gesetzten und noch nicht aufgelösten Fahrstraßen , die mit einer Weiche des ausgewählten neuen Fahrwegs übereinstimmt, kann die neue Fahrstraße nicht erstellt werden. Hierzu ist es u. a. natürlich erforderlich die aktiven Fahrstraßen während des Programmablaufs als ausgewählt zu kennzeichnen. Um nicht in den bereits erstellten Fahrstraßenspeicher eingreifen zu müssen, werde ich das in einem separaten Array machen.

Bei den Signalen, die ich momentan nicht habe, werde ich das später ähnlich wie bei den Weichen machen. Also bei der Definition der Fahrstraßen auswählen mit Eingabe der je nach Fahrweg zugehörigen Signalbilder (HP1/HP2).

Also momentan funktioniert das ganze recht ordentlich, als besseres Weichenstellpult und als Stellpult zur Eingabe von Fahrstraßen. Wenn ich mal einen richtigen Bahnhof habe, vor nächstem Jahr wird das leider nix, werde ich das mit einem neuen, geändertem Stellpult testen. Mal sehen, ob die Umsetzung auf eine neue Hardware dann ohne Probleme klappt oder welche Bugs dann auftreten, die mir momentan nicht aufgefallen sind.

Meine bisherigen Kosten (für die, die das interessiert):

Arduino Mega: ca. 30 Euro (Original)
25 x Taster: ca. 25 Euro
5 x I2C-Bausteine (Horter): ca. 65 Euro
Fram Adafruit 8 kByte: ca. 10 Euro
Steckernetzteil 5 V/2 A ca. 10 Euro
insgesamt: ca. 140 Euro

gerundete Werte inkl. Versandkosten.
LED und Widerstände aus der Bastelkiste. Dto. Material Stellpult. Belegtmelder, DCC-Weichendecoder und Zentrale nach dem Ehda-Prinzip.

Holt man sich die Teile von Ali & Co. läßt sich der Preis mindestens um den Faktor 2 bis 3 verringern. I2C-Bausteine gibt es im 4er Pack schon deutlich unterhalb von 10 Euro. Ein Modul von Horter bei mir hat ca. 12 Euro als Bausatz gekostet. Dafür ist der sehr solide und sinnig aufgebaut, verfügt über Schraubanschlüsse, Optokopplereingänge und Ausgangstreiber bei den Ausgabemodulen. Solide und zuverlässig. Das Fram ist ein breakout-Board von Adafruit, der Rest ist von einem deutschen Elektronikhändler. Die Taster müssen entprellt werden, sonst gibt es unschöne und unerwartete Ergebnisse. Diesbezüglich hatte ich relativ lange mit gekämpft bis ich eine selbst entwickelte vernünftige Softwarelösung gefunden habe.

Mein Testgleis verfügt über 7 Weichen und 8 Belegtmelderabschnitte. Fahrstraßen in alle Richtungen und zwischen allen Gleistastern. Ich habe sie nicht gezählt, das dürften so um die 35 sein. Den Fahrstraßenspeicher habe ich zumindest für 40 Fahrstraßen dimensioniert, ergibt ca. 1400 Byte ohne Überlauf. Also schon deswegen wird es auf dem Uno knapp.

Falls mehr Informationen erwünscht sind, einfach fragen.

Das ganze kann man natürlich auch ohne Fram aufbauen. Dann müssen beim Starten die Weichen allerdings in eine Grundstellung gebracht werden, um einen definierten Zustand und eine Anzeige am Stellpult zu erhalten (mit angeschlossener Zentrale). Oder man nutzt zum Speichern das ROM. Dessen Lebensdauer ist allerdings endlich. Zumindest endlicher als das des Fram. Das sollte meine Restlebensdauer locker übersteigen.


Grüße Thomas


Die Sucht nach Bahn/Modellbahn hat mich nie losgelassen, ich habe sie aber auch nie richtig ausgelebt. Nun erfülle ich mir all die Wünsche der letzten Jahrzehnte.


Draisine  
Draisine
InterRegio (IR)
Beiträge: 208
Registriert am: 16.01.2019
Ort: Südhessen
Gleise Roco Line + geoLine + Piko + LGB, Fahrzeuge: alles mögliche
Spurweite H0, G
Steuerung Digikeijs DR5000 + Upgrade YD9401, MD-Zentrale, Bausteine Digikeijs + YAMORC, ESU
Stromart DC, Digital

zuletzt bearbeitet 31.05.2024 | Top

Mal eine grundsätzliche Frage zu Fahrstraßen und Start- und Zieltasten

#9 von Draisine , 01.06.2024 14:58

Änderung: ursprünglicher Beitrag gelöscht

Meine Frage hat sich erledig. Ich bin in meinem Fundus selbst fündig geworden. Alba, kleine Modellbahnreihe, Band 13 "Fahrstraßen - Schalten und Signale".

Start- und Zieltasten immer von Hs/Ls zu Hs/Ls.
Ok, wird im nächsten, aufwendigeren Stellpultbau für den Bahnhof berücksichtigt. Auch mit nur einer Taste je Weiche und Gruppenweichentaste. Für meine Testanlage bleibt mein Phantasiestellpult erst einmal so wie es ist. Oder ich ergänze es noch um nowendige Signalanzeigen und -taster. Was allerdings erhebliche Änderungen an der Hardware bedeutet.

Jetzt geht es erst einmal mit dem Umbau meiner Liliput BR95 weiter. Umbaubericht demnächst.

Grüße Thomas


Die Sucht nach Bahn/Modellbahn hat mich nie losgelassen, ich habe sie aber auch nie richtig ausgelebt. Nun erfülle ich mir all die Wünsche der letzten Jahrzehnte.


Draisine  
Draisine
InterRegio (IR)
Beiträge: 208
Registriert am: 16.01.2019
Ort: Südhessen
Gleise Roco Line + geoLine + Piko + LGB, Fahrzeuge: alles mögliche
Spurweite H0, G
Steuerung Digikeijs DR5000 + Upgrade YD9401, MD-Zentrale, Bausteine Digikeijs + YAMORC, ESU
Stromart DC, Digital

zuletzt bearbeitet 02.06.2024 | Top

   

Fleischmann 6152C fast Sorgenfrei
Märklin Decoder Firmware Version erkennen

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