Kreis mit 2 Weichen mit L298N

Hier möchte nich ein scheinbar simples Projekt vorstellen und Hilfe dazu suchen und finden.

Idee: Ein Kreis mit 2 Weichen (Ausweichgleis), Motorsteuerung mit L298N, Auslöser sind Hallsensoren, Anfahr-/Bremsverhalten über Nano steuern, Loks fahren gegenläufig.

Gleisplan:

Schaltplan mit 2 Motoren als "Gleisersatz" zum Testen der Funktionen

Der Sketch

[code]
/*
  DC-Motorsteuerung mit L298N zum Regeln
  von Anfahr- und Bremsverhalten für 2 Motoren mit 2 Hallsensoren,
  Schalten von 2 Weichen und 2 Kontroll-LEDs
  von Schorsch von ZFI
  10.05.25
*/

// Definition Hallpins und Hallstatus
const int hallSensorPin = 2;
const int hallSensorPin2 = 3;
#define PIN_RELAY1 11                                                              
#define PIN_RELAY2 12
int hallStatus = LOW;     // 1. Hall aktiv
int hallStatus2 = HIGH; // 2. Hall passiv
int LED1 = A0;          //Kontroll_Leds für Richtungsanzeige
int LED2 = A2;
unsigned long anfang = 0;                  
const unsigned long warte = 3000; // Dauer des haltens vor Wechsel in andere Richtung
int v = 80; //max. Geschwindigkeit
int z = 2;  //Zähler für Beschleunigen/Bremsen, je kleiner, umso langsamer
int i = 0;
// Gleichstrommotor 1
int GSM1 = 10;
int in1 = 9;
int in2 = 8;

// Gleichstrommotor 2
int GSM2 = 5; //IN B
int in3 = 7; // IN 3
int in4 = 6;  // IN 4

void setup()
{
  Serial.begin(9600);
  pinMode(GSM1, OUTPUT);    //Definition der Pins als Aus-/eingabe
  pinMode(GSM2, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(PIN_RELAY1, OUTPUT);
  pinMode(PIN_RELAY2, OUTPUT);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(hallSensorPin, INPUT);
  pinMode(hallSensorPin2, INPUT);
    if (hallStatus == LOW) {
    // Beschleunigen
    digitalWrite(LED1, HIGH);
    for (int i = 0; i <= v; i += z)
    { //in z-iger Schritten bis Maximalgeschwindigkeit
      digitalWrite(in1, HIGH);  // Umpolen von in1, in2 bei in3,in4 sorgt für Richtungswechsel
      digitalWrite(in2, LOW);   // Motor 1 beginnt zu rotieren
      analogWrite(GSM1, i); // Motor 1 beschleunigt
      delay(50);
    }
  }
}

void HALL1A()
{
  if (hallStatus == LOW) {
    digitalWrite(LED2, LOW);
    // Bremsen M2
    for (int i = v; i >= 0; i -= z) { //in 40-iger Schritten bis Maximalgeschwindigkeit
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);   // Motor 2 beginnt zu rotieren
      analogWrite(GSM2, i); // Motor 2 bremst
      delay(100);
    }
  }
  if (hallStatus == LOW) { //wenn 1. Hallsensor deaktiviert
    digitalWrite(PIN_RELAY1, LOW); // Relaiskontakt 1 schließen, nur kurzer
  }//else {                           // Schließvorgang
    delay(100);
    digitalWrite(PIN_RELAY1, HIGH); // sonst öffnen
  //}
  if (hallStatus == LOW) {
     digitalWrite(LED1, HIGH);
    // Beschleunigen M1
    anfang = millis();    //Pause zwischen Richtungswechsel
    while (millis() - anfang < warte);
    for (int i = 0; i <= v; i += z) { //in z-iger Schritten bis Maximalgeschwindigkeit
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);   // Motor 1 beginnt zu rotieren
      analogWrite(GSM1, i); // Motor 1 beschleunigt
      delay(100);
    }
    }
  }
void HALL1B()
{
  if (hallStatus2 == LOW) {
    digitalWrite(LED1, LOW);
    // Bremsen M1
    for (int i = v; i >= 0; i -= z) { //in z-iger Schritten bis Maximalgeschwindigkeit
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);   // Motor 1 beginnt zu rotieren
      analogWrite(GSM1, i); // Motor 1 bremst
      delay(50);
    }
  }
  if (hallStatus2 == LOW) { //wenn 1. Hallsensor deaktiviert
    digitalWrite(PIN_RELAY2, LOW); // Relaiskontakt 1 schließen
  } //else {
    delay(100);
    digitalWrite(PIN_RELAY2, HIGH); // sonst öffnen
  //}
  if (hallStatus2 == LOW) {
    digitalWrite(LED2, HIGH);
    anfang = millis();  // Pause zwischen Richtungswechsel
    while (millis() - anfang < warte);
    // Beschleunigen M2
    for (int i = 0; i <= v; i += z) { //in z-iger Schritten bis Maximalgeschwindigkeit
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);   // Motor 2 beginnt zu rotieren
      analogWrite(GSM2, i); // Motor 2 beschleunigt
      delay(50);
    }
  }

}
//=============================
void loop() {
  hallStatus = digitalRead(hallSensorPin);
  hallStatus2 = digitalRead(hallSensorPin2);
  HALL1A();
  HALL1B();
}
[/code]
Soweit, so gut. Mit 2 einfachen Motoren funktioniert das einwandfrei. Kompliziert wird es, wenn ich versuche statt der Testmotoren die Gleise die Gleise real anzuschließen.
Diese Idee ist offensichtlicher Mist:

Damit werden die Gleisabschnitte zwischen den Weichen ausgehebelt.

Meine Idee: noch 2 Relais, die die Gleisleitungen (gelb und grün) im Bedarsfall zuschalten, quasi mit dem Auslösen der Halls.

Hat jemand eine andere Idee?

Schon mal danke.

du hast den Ablauf nicht bzw. nicht ausreichend beschrieben und ich sehe im Bild nicht, wo die Hallsensoren wären.

Aber ich würde das etwa so machen:
technisch:

  • Ein Hallsensor vor der linken Weiche innen
  • Ein Hallsensor vor der rechten Weiche außen.
  • Ein weiteres relais das zwischen dem Abstellgleis innen oder dem Abstellgleis außen umschaltet

Ablauf:

  • innen Zug losfahren lassen bis er wieder an seinem Hallsensor ankommt
  • Zug abbremsen
  • Gleisstromrelais umschalten
  • Weichen umschalten
  • Kurz warten "Fahrgäste umsteigen lassen"
  • außen Zug losfahren lassen bis er wieder an seinem Hallsensor ankommt
  • Zug abbremsen
  • Gleisstromrelais umschalten
  • Weichen umschalten
  • mit oben fortsetzen

Hallo Werner,

die Hallsensoren sind bei mir kurz hinter den Weichen. Das garantiert eindeutige die Aktivtäten für das betreffende Gleis. In meinem Ablauf wird beim Einschalten erst alles in "Ruhezustand" versetzt und die Weichen auf Abzweig( lange Schenkel) gestellt. Dann fährt erste Lok nach links los. Überfahren des 1. Halls löst Bremsvorgang aus, bei Stillstand umschalten beider Weichen auf kurzen Schenkel, Beschleunigen, Ausfahrt nach rechts. Über 2. Hall, Bremsen, bei Halt wieder Umschalten auf lange Schenkel...Der Ablauf ist also wie von dir beschrieben. Dein Vorschlag mit dem Schalten der Zuleitungen (in dem Fall die inneren Schienen) entspricht im Prinzip meinem Gedankengang. Ich werde es mit einem 4-fach Relaismodul versuchen umzusetzen. Sollte dann gleichzeitig, oder besser vor dem Schalten der Weichenpassieren, oder?

hier der korrigierte Gleisplan mit Halls.

Danke für den Tipp

wenn du die Stromkreise mit zwei getrennten Relais schaltest, dann wäre es für mich eher so

  • Strom Gleis A abschalten
  • Weichen auf B stellen
  • Strom Gleis B einschalten

sind in deinem Bild jetzt die Hallsensoren "bei der Einfahrt" oder knapp vor der Ausfahrt aus dem Gleis?

Hallo Werner,

Die Halls befinden sich hinter den Weichen, soll heißen, dieLok überfahren erst die Weichen und lösen danach den jeweiligen Hall aus.

Wenn ich das richtig verstehe, löst der Hall aus, wenn der Zug in das Gleis einfährt. Woran erkennst Du, dass er vollständig eingefahren ist ( und damit nicht die Ausfahrt des anderen Zuges behindert )? Oder das er zu weit fährt?
Nur über die Länge des Bremsvorgangs wäre mir das wesentlich zu unsicher.

Das ist richtig. Das Bremsen soll so geschehen, dass der Zug (eigentlich sollen dort kurze Straßenbahnen, 1 nur als Einzelwaggon und eine mit Hänger fahren) . Ich würde das Bremsverhalten durch "Versuch macht kluch :wink:" im Sketch steuern. Ich denke, ich weiß worauf du hinaus willst - 2 zusätzliche Stopp-Halls um einen definierten Stopp zu erzwingen, richtig? Da gehen mir langsam die Pins am Nano aus. Aber ich könnte ja die analogen Ein/Ausgänge für die Relais nutzen, dann hätte ich noch Kapazitäten an den PWM Eingängen. Ich stricke mal den Schaltplan um und würde ihn gern von dir begutachten lassen, bevor ich den Sketch "verhuntze".

Nö, da sich immer nur genau ein Zug bewegt, kannst Du Hall1 und Hall2 an einen gemeinsamen Pin anschließen. Das gilt dann auch für Hall3 und Hall4 :wink:

Alle analogen Pins ( ausser A6/A7 am Nano) lassen sich auch als vollwertige digitale I/O Pins nutzen.
P.S. analoge Ausgänge hat der Nano keine

Hallo,

ich habe meine Modelleisenbahn auch mit Hallsensoren ausgestattet. Sind doppelte wegen Richtungserkennung. Egal, du brauchst im Bahnhofsgleis mindestens am Anfang und Ende einen Sensor. Sonst fährst du über den Haltsensor und machst einen brutalen Stopp. Kommt auf die Geschwindigkeit und Bahnhofslänge an, nur kannst du ab Einfahrt in den Bahnhof bewusst ab da den Bremsvorgang beginnen lassen und das auf die sanfte Art. Klar kann man das auch über Rundenzeiten steuern, aber du wirst merken das ist viel zu ungenau und schwankend, die Modellspielzeuge sind Tagesformabhängig. Kalt, warm gefahren, frisch geölt oder nicht usw.

Einfach einmal ermitteln welchen Weg du brauchst für einen schönen Bremsvorgang, dann kennste den Mindestabstand des Einfahrsensors zum Haltsensor.

Wegen Pins ausgehen. Früher oder später wirst du erweitern und nachrüsten. Wie ist erstmal egal, du wirst es sicherlich tun müssen. Kannst dann einen Mega2560 nehmen oder per Bus die I/Os erweitern.

Wieder dazugelernt, eigentlich logisch, man muss nur draufkommen.

Hallo Franz-Peter,
Es werden nur kurze Straßenbahnen fahren, da ist die Länge nicht wirklich wichtig. Ich denke, dass sich das über den Bremsvorgang steuern lässt. Ähnliches habe ich mit einer einfachen Pendelzugsteuerung praktiziert. Außerdem werde ich sicherheitshalber am Ende vom jeweiligen Gleis "Notstopp-Halls" einbauen.

Das verstehe ich nicht. Der 1. Hall löst den "sanften" Bremsvorgang aus, kein brutaler Halt. Der 2. am Ende des Gleises soll eigentlich nur als "Notstopp" dienen, falls beim Einstellen des Bremslänge was schief geht.

Hallo Schorsch,
Wenn die Gleislänge im Verhältnis zur Zug/Straßenbahnlänge genügend Reserven bietet dürfte das schon funktionieren.
Ich habe das in solchen Fällen immer so gemacht, dass der erste (Hall-)Sensor bis auf eine geringe Geschwindigkeit abbremst, und erst der 2. dann kompeltt zum Stillstand abbremst (Was aufgrund der dann bereits geringen Geschwindigkeit nur noch sehr wenig Strecke braucht). Damit kann man die Haltposition genauer festlegen.

Genauso habe ich das geplant, deshalb auch der Begriff "Notstopp-Hall" :wink:

Muss ja weitergehen, trotz Hitze.
Der Prinzipgleisplan mit Lage der 4 Halls und Stromkabel am Gleis.

Und dann der Versuch das Ganze einigermaßen verständlich im Fritzing darzustellen. :face_with_raised_eyebrow:


Ich hoffe, man kann etwas erkennen. Trotz aller Fummelei lassen sich gekreuzte Verbindungen nicht vermeiden. Bitte mal drübergucken, wer Lust hat, wegen dem Fehlerteufel :angry_face_with_horns:

Hallo,

was haben die Motoren OUT Anschlüsse mit dem Relaisboard zu tun?
Weil der L298 hoffnungslos veraltet ist und eine hohe Verlustleistung hat, nimm besser ein "Arduino BTS7960 Modul". 2x-bts7960-h-brücke

Wollte ich auch gerade schreiben.

Grüße Uwe

Moin,
die Out-Anschlüsse über das Relais schalten soll ein einzelnes Zuschalten der Blockabschnitte realisieren, so mein Gedankengang.
Habe mir die vorgeschlagene Brücke angesehen, wo liegt da der Vorteil. Ich brauche davon ja gleich 2 und die Verkabelung ist auch nicht wesentlich einfacher. Ich sehe in den Beispielcodes auch nichts wesentlich anderes. Erleuchtet mich bitte, ich bin mit 70 wahrscheinlich auch "hoffnungslos veraltet" :laughing:

Plakativ erklärt:

  • L298N: bipolare Technik, die in Flußrichtung eine Spannung hat, die multipliziert mit dem Strom die Verlustleistung ergibt, also die Leistung, die in Wärme umgesetzt wird und daher Deiner Eisenbahn verloren geht. Der Kühlkörper führt die Wärme in die Umgebung.
  • BTS7960: Feldeffekttransistoren haben eine viel kleine Spannung in Flußrichtung, weshalb viel größere Ströme mit viel kleinerer Verlustleistung, häufig ohne Kühlkörper, geschaltet werden können.

Meine Meinung: Für eine Straßenbahn auf einer Z-Anlage völlig irrelevant.

@Doc_Arduino und @uwefed schaut Euch mal seine Homepage Kartonmodellbau in Spur Z an.

Du hast zwei Straßenbahnen, von der immer nur eine fährt, da reicht eine H-Brücke mit einem Umschaltrelais. Der einspurige Teil ist immer unter Strom, im Bahnhof ist es Gleis 1 oder 2.

Oder?

In H0 würde ich den Hall vor die Weiche setzen, um den Zug nicht volle Kanne über die Weiche rauschen zu lassen. Bei Z bist Du vermutlich froh, wenn der Zug mit Schwung über die Weiche saust.

Oder?