Schattenbahnhofsteuerung

Hallo noiasca,
nachdem die hardwareseitigen Fragen prinzipiell geklärt sind, kann ich zum Programm (und meinen Schwierigkeiten) kommen.
Natürlich habe ich die Hardware schon mal auf einem Testboard einfachst mit digitalwrite getestet und eine Weiche hin und hergeschaltet.
Die Platine laut obigem Schaltplan ist, mangels Software, noch nicht getestet.
Das nachfolgende, garantiert nicht funktionierende Programm habe ich als Anfangspunkt von ChatGPT übernommen und rudimentär adaptiert.
Es ist erst einmal für einen Schattenbahnhof mit 9 Weichen vorgesehen. Die Erweiterung sollte dann leicht fallen.

Das die Programmierung mit "Klasse" funktionieren könnte, habe ich mir schon gedacht, aber an der Umsetzung in ein Programm bin ich gescheitert.

#include <Wire.h>
#include <Adafruit_MCP23017.h>

// Initialisierung der Portexpander für die Weichensteuerung
Adafruit_MCP23017 mcp1, mcp2, mcp3;

// Pindefinitionen für Gleise und LEDs
const int gleisPins[10] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
const int ledPins[10] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31};

// Pindefinition für Portexpander, wie mach ich das, ist das hier nötig?

void setup() {
  Serial.begin(9600);

  // Initialisierung der Portexpander (nachdem nur 9 weichen, 18 Spulen zu stellen sind, werden beim mcp3  4 Ports umsonst initialisiert.)
  mcp1.begin(0);
  mcp2.begin(1);
  mcp3.begin(2);
{
    for (int i = 0; i < 3; i++)
  mcp.begin(i); // Init MCP23017 at address 0x20;0x21;0x22
    for (byte i=0; i<8; i++) {
        mcp.pinMode(i, OUTPUT);
    mcp.pinMode(i+8, inPUT pullup)
    }
  // Initialisierung der Gleise, LEDs und Weichen
  for (int i = 0; i < 10; i++) {
    pinMode(gleisPins[i], INPUT_PULLUP);
    pinMode(ledPins[i], OUTPUT);
  }

  }

  // Initialisierung der Weichenstellung
  abfrageWeichenStellung();
}

void abfrageWeichenStellung() {
  // Hier sollte Code für die Initialisierung der Weichenstellung über I²C hinzugefügt werden
  // Die Implementierung hängt von den spezifischen Details deiner Hardware und Bibliotheken ab
  // Das Ergebnis der Abfrage sollte in den binären Variablen für die Weichenstellung gespeichert werden
}

void weicheSchalten(int weichenPin) {
  // Vor der Schaltung Stellung der Weiche kontrollieren
  if (digitalRead(weichenPin) == LOW) {
    // Weiche ist bereits richtig gestellt
    return;
  }

  // Weiche schalten
  digitalWrite(weichenPin, HIGH);
  delay(200);
  digitalWrite(weichenPin, LOW);
  delay(100);

  // Kontrolle, ob Weiche jetzt richtig gestellt ist
  for (int i = 0; i < 3; i++) {
    if (digitalRead(weichenPin) == LOW) {
      // Weiche ist jetzt richtig gestellt
      return;
    }
    delay(200);
  }

  
}

void loop() {
  // Abfrage der Gleistaster
  for (int i = 0; i < 10; i++) {
    if (digitalRead(gleisPins[i]) == LOW) {
      // Gleis-Taster gedrückt, Weichen entsprechend schalten
      int weichenIndex = i;
      for (int j = 0; j <= weichenIndex; j++) {
        weicheSchalten(weichenPins[j]);
        digitalWrite(ledPins[j], HIGH);
      }
      break;
    }
  }

  // Hier können weitere Funktionen oder Überwachungen eingefügt werden
}

hast du I2C Port Expander oder SPI Port expander?
geht da schon irgendwas?

Ich sag ja, ich mach das mit Logikdenken. Da klappt das dann schon :wink:

Ansonsten sehe ich nicht allzu grosse Probleme, das irgendwie umzusetzen.
Da die Dinger HIGH sind, wenn die nicht geschalten sind, muss man evtl. um die Ecke denken. Um z.B. Kabelbruch oder dergleichen zu erkennen wird es dann schwieriger.

Auf den Code schau ich mal.

Da zeigt sich meine Unkenntnis, ich hab den MCP23S17, also SPI Bus.
Gehen tut noch nix, mangels Programm.

Es wäre sicher gut, schrittweise das Programm mit meinemTestboard (s.o., der unleserliche Schaltplan 2 MCP für max. 8 Weichen mit über Kontaktbrücke wählbarer Adresse) auszuprobieren. Ich würde da Arnold Weichen zum Testen anschließen (ich bin in 1. Linie analoger N-Bahner, hab von meinen Söhnen noch HO Roco DCC fürs Teppichbahnen, aber da sind die Weichen manuell oder digital angesteuert).

Ich habe mehrere Mega2560 (nicht original), die mit einem shield mit der Peripherie verbunden werden, damit man bei einem eventuellen Tausch des Arduinos nicht alle IOs umstecken muss.

Danke für die Zuversicht und die Bereitschaft, mich bei den mich zur Verzweiflung treibenden Programmierversuchen zu unterstützen!

Dann will ich mal nen Anfang machen. Ausgehend von Deiner Zeichnung in #15

Du kommst da mit +24V an die Endschalter.
Könntest Du da auch mit GND ran gehen und die Schaltung mit +24V auslösen?

Ich hab noch nicht ganz verstanden, wie das technisch funktioniert.
Aus der Logik heraus ist keine Spule aktiv, wenn der Endschalter sich gelöst hat.
Wie kommt die Weiche dann an den anderen Endpunkt?

ich komm erst morgen weiter.

so hätte ich begonnen:
POC Weiche Fahrstraße Zieltaste - Wokwi ESP32, STM32, Arduino Simulator

Leider geht das nicht anders herum, weil ein ULN2803 nur gegen GND schaltet, d.h. der Common Anschluss der Weiche muss auf 24V liegen.

Der Endschalter ist eine Sicherung, damit die Spule bei zu langem Einschalten nicht durchbrennen kann, wie z.B. bei Märklin M-Gleis von 1970.
Er sorgt dafür, dass der Stromfluss für die Spule in die geschaltete Richtung unterbrochen wird und gleichzeitig die Spule für die andere Richtung aktiviert oder "scharf gemacht" wird.

Der Endschalter ist dadurch als Rückmeldung nutzbar, wie z.B. bei den Weichentastern von Arnold, wie in der Skizze bei Post 14 zu finden, allerdings hat Arnold andere Farbcodierung der Leitungen. Ich habe einen Thread im Forum gefunden, bei dem ein Modellbahnkollege diesbezügl. angefragt hat, der aber schon lange geschlossen ist.

Ich habe lange in den verschiedenen Foren nach Lösungen gesucht. Der ULN 2803 wurde dazu empfohlen. Meinst Du, dass die Gleichspannung den Schaltkontakt im Endschalter (mit der Zeit) überlastet? Soll eine zusätzliche Freilaufdiode vorgesehen werden? Wie muss ich die einbauen (löten)?

Vielen Dank, für mich ist der Code allerdings (noch) völlig unverständlich.
Ich habe ihn schon mal als Programm ins Arduino geladen, habe allerdings voraussichtlich erst übermorgen Zeit, ihn auszuprobieren.

Der Endschalter schaltet zwischen den beiden Spulen um. Sobald eine Spule ausglöst hat, schaltet der Endschalter die 24V dann an die andere Spule. Da die aber über den ULN noch nicht aktiviert ist, bleibt die Weiche in der entsprechenden Stellung stehen. Wenn dann der andere Ausgang des ULN aktiviert wird, schaltet sie wieder zurück. Es kann also immer eine - und nur eine - Spule aktivert werden.

Ich befürchte, dass die Kontakte durch den Abreißfunken mit der Zeit verschmoren. Hängt natürlich auch davon ab, welche Ströme da fließen. Da gibt es bei diesen Weichenspulen ziemlich große Unterschiede - je nach Fabrikat. Für Dauerbetrieb sind die ja alle nicht gemacht. Wobei im Datenblatt des ULN auch nur der maximale Dauerstrom von 500mA angegebenen ist - über einen Impulsstrom finde ich da nichts.
Die im ULN eingebaute Freilaufdiode schützt nur wenn die Spule direkt mit 24V verbunden ist. Das ist aber hier nicht der Fall. Letztendlich dürfte immer der Endschalter als erstes den Strom unterbrechen und unterbricht damit auch den Stromfluß durch die Freilaufdiode des ULN. Normalerweise liegte die Freilaufdiode direkt fest parallel zu Spule, und dass ist eben jetzt nicht mehr der Fall - da bräuchte es vermutlich eine eigene für jede Spule.

Mal eine ganz andere Frage: Wird eigentlich verhindert, dass ein Zug in ein schon besetztes Gleis fährt? Oder ist das komplett der Aufmerksamkeit des Bedieners überlassen? Für meine Begriffe gehört zu einer Schattenbahnhofsteuerung auch, dass die Steuerung selbst ein freies Gleis sucht - sonst sind Unfälle doch vorprogrammiert.
Fahren die Züge eigentlich digital oder analg?

Ich versuchs mal...
Die Spule wird erregt und die Weiche schaltet um.
Der (end)Umschalter bleibt solange in seiner Ausgangsstellung aktiv, bis die Weichenzunge auf der anderen Seite angeschlagen ist.
Ich glaub sowas schon mal gesehen zu haben - aber in einem anderen Zusammenhang.
Hat gedauert... :man_facepalming: Aber es wird :slight_smile:

Es ist eine analoge Anlage mit Blockstellensteuerung mit SRK und bistabilen Relais (der letzte Wagon jedes Zuges ist mit Magnet ausgestattet.) die Belegtmeldung erfolgt im Schattenbahnhof mit roten LEDs im Gleisbildstelllpult. Als Besonderheit hat jedes Gleis 2 Abschnitte für 2 Züge hintereinander. Die Ausfahrt erfolgt per „Zufallsgenerator“, einem Schaltwerk aus alter Telefontechnik. Die Ausfahrweichen werden aufgeschnitten und sind ohne Antriebe.
Sicherlich hatte ich mit Arduino gesteuerte Schattenbahnhöfe geplant, aber die Software…
Deshalb jetzt die Minimallösung.

Wie soll man die anschließen? Der Endschalter ist in der Weiche zwischen Spule und gemeinsamen Anschluss. Da kommt man nicht dran und müsste jeden Antrieb auseinandernehmen. Könnte ein Kondensator zum Funken löschen helfen?

[OT]

Wie stellst Du das an, dass der erste Zug ausfährt und nicht der dahinter stehende; rückt der dann nach und macht Platz?

Nostalgie pur :sunglasses: - sowas ähnliches hatte ich vor 50 Jahren auch mal geplant. Ist dann etwas später aber doch reine elektronisch ( aber nur HW! ) realisert worden. Da aber schon mit Belegtmelder über die Stromaufnahme der Achsen. 2 Züge hintereinander im Gleis hatte der auch schon. Und automatische Erkennung eines freien Gleises mit entsprechender Weichenstellung.

Wie ist das da mit den Herzstücken? Oder ist das Märklin-System?

Kann man alles lernen. Mit Software geht das alles schon wesentlich eleganter. Mein letzter SbF konnte 50 Züge verwalten und wusste auch immer welcher Zug gerade wo war :wink:

Ja, das könnte ein Problem sein ... :thinking:

Wie stellst Du das an, dass der erste Zug ausfährt und nicht der dahinter stehende; rückt der dann nach und macht Platz?

Die Gleise im Schattenbahnhof sind enenfalls Blöcke. Es fährt nur der 1. aus und schaltet danach den 2. frei.

Wie schon erwähnt, es ist nicht meine Anlage sondern die von einem Freund.

fleischmann hat auch Weichen ohne gepoltes Herzstück. Der Strom kommt dann über die anliegende Zunge.

Vielleicht reduzier ich die Spannung zum Weichenstellen sicherheitshalber auf 19V.