Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von e69-fan »

Bild

Servus Franz,

Teil 1 geschafft - jetzt geht es zum Essen - dannn ein kleines Mittagsschläfchen, dann spazieren gehen oder B A S T E L N .

Schönes Wochenende
Wolfgang
Dateianhänge
Frästisch.jpg
Frästisch.jpg (20.84 KiB) 843 mal betrachtet
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von Admin »

Ist das so ein xy - Frästisch mit Handbetrieb? Sowas steht bei mir fürs erste auf dem Wunschzettel. Ich muss immer drauf achten dass immer wieder auch etwas Geld reinkommt, bevor ich wieder was kaufe. Bei uns sitzt das Geld Dank meiner Krankheit nicht mehr locker. :???: Aber ich kann immer mal wieder Kleinigkeiten umsetzen. Der Wunschzettel wächst leider scneller als die erfüllten Positionen :)

Schönen Tag
Franz

PS: Weil du gerade vom Essen schreibst. Ich habe mich heute Morgen entschlossen, wieder mal mit Heilfasten zu beginnen. Also nix essen :hng: ....nur flüssige Nahrung :) Wie lange weiß ich nicht, einfach so lange wie es sich gut anfühlt. Das letzte mal waren es 4 Wochen.
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von e69-fan »

Hallo Franz,

der ist handbetrieben und reicht für mich vollkommen, da ich viele Teile auf Sicht fahre - oldschool.
https://www.wabeco-remscheid.de/bohrsta ... -1314.html

Ist halt eine alte deutsche Firma bei deren Produkte man noch was einstellen kann.

Ich kann zum Glück einen Teil meiner Unfallrente für das Hobby verbraten und die beiden digitalen Meßschieber hat das Christkind gebracht.

PS. Hast Du eine gute Quelle für Schrittmotoren - Format NEMA 14 oder NEMA 17 ?

Schönen Abend
Wolfgang
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von Admin »

Ich komme gerade nicht so recht weiter. Aber habe gesehen dass diese Abfrage "if ( servos.moving() < 50 )" ja im Programm benutzt wird, um das Relais zu schalten.
Da braucht man ja eigentlich nur erweitern um "if ( servos.moving() == 40 )" und "if ( servos.moving() == 120 )". Dann kann man bei 40 die Abzweig LED einschalten und die Gerade LED aus. Und bei 120 die Abzweig LED ausschalten und die Gerade LED ein.
Franz

Ich habe es jetzt mal angepasst:

Code: Alles auswählen

//  Weichenschaltung mit TasterPolRelais und Anzeige der Endlagen
//  e69-fan
#define MAX8BUTTONS
#include <MobaTools.h>

//Variablendeklaration
const byte weichenPin[]                   = {2,   3,    4};        // Pins für die Weichenantriebe
// ------------------------------------------------------------------------------------------------------------------------  //
const byte ANZAHL = sizeof(weichenPin);
// ------------------------------------------------------------------------------------------------------------------------  //
const byte buttonPin[ANZAHL]              = {A1,  A2,   A3};      // Pins für die Taster
// ------------------------------------------------------------------------------------------------------------------------  //
const byte relaisPin[ANZAHL]              = {5,   6,    7};       // Pins für die Relais
// ------------------------------------------------------------------------------------------------------------------------  //
const int weichenPos1[ANZAHL]             = {40,  40,   40};      // linke Position der Servos
const int weichenPos2[ANZAHL]             = {120, 120,  120};     // rechte Position der Servos
// ------------------------------------------------------------------------------------------------------------------------  //
const byte ledGeradePin[ANZAHL]           = {8,   9,    10};      // Pin für die LED Zustand gerade
const byte ledAbzweigPin[ANZAHL]          = {11,  12,   13};      // Pin für die LED Zustand Anzweig
// ------------------------------------------------------------------------------------------------------------------------  //
const int speed[ANZAHL]                   = {8,   8,    8};       // festlegen der Verfahrgeschwindigkeit der Servos
// ------------------------------------------------------------------------------------------------------------------------  //
boolean weicheToPos1[ANZAHL];               // Sollposition des Servo ( true = Pos1 )
// ------------------------------------------------------------------------------------------------------------------------

MoToButtons taster( buttonPin, ANZAHL, 20, 300 ); // Weichentaster einrichten
MoToServo servos[3];

void setup() {
  for (byte i = 0; i < ANZAHL; i++) {
    servos[i].attach(weichenPin[i], true );
    servos[i].setSpeed(speed[i]);
    pinMode(relaisPin[i], OUTPUT);
    pinMode(ledGeradePin[i], OUTPUT);
    pinMode(ledAbzweigPin[i], OUTPUT);
    weicheToPos1[i] = true;
    servos[i].write(weichenPos1[i]);                // Startstellung Servo
    digitalWrite(relaisPin[i], weicheToPos1[i] );   // Startstellung Relais
  }
}//Ende void setup

void loop() {
  taster.processButtons();

  for ( byte i = 0; i < ANZAHL; i++ ) {
    if ( taster.pressed(i) ) {
      weicheToPos1[i] = !weicheToPos1[i];           // Weichenstellung umschalten
      if ( weicheToPos1[i] ) {
        servos[i].write(weichenPos1[i]);
      } else {
        servos[i].write(weichenPos2[i]);
      }
    }
    // Umstellvorgang läuft, Relais umschalten
    if ( servos[i].moving() < 50 ) {
      digitalWrite(relaisPin[i], weicheToPos1[i] );
    }
    //--------------------------------LED Steuerung-----
    if (servos[i].moving() == 0)
    {
      digitalWrite(ledGeradePin[i], HIGH );
      digitalWrite(ledAbzweigPin[i], LOW );
    }
    if (servos[i].moving() == 120)
    {
      digitalWrite(ledGeradePin[i], LOW );
      digitalWrite(ledAbzweigPin[i], HIGH );
    }
    //--------------------------------------------------
  }   // Ende for - schleife

}     // Ende void loop
Aber da stimmt was nicht. In der Zeile " if (servos.moving() == 120)" müßte das Programm festellen, dass der Servo auf 120 steht und die LED´s umschalten. Tut er aber nicht :O:
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von Admin »

Jetzt klappt es wohl. Hier mal zum Testen:

Code: Alles auswählen

//  Weichenschaltung mit TasterPolRelais und Anzeige der Endlagen
//  e69-fan
#define MAX8BUTTONS
#include <MobaTools.h>

//Variablendeklaration
const byte weichenPin[]                   = {2,   3,    4};        // Pins für die Weichenantriebe
// ------------------------------------------------------------------------------------------------------------------------  //
const byte ANZAHL = sizeof(weichenPin);
// ------------------------------------------------------------------------------------------------------------------------  //
const byte buttonPin[ANZAHL]              = {A1,  A2,   A3};      // Pins für die Taster
// ------------------------------------------------------------------------------------------------------------------------  //
const byte relaisPin[ANZAHL]              = {5,   6,    7};       // Pins für die Relais
// ------------------------------------------------------------------------------------------------------------------------  //
const int weichenPos1[ANZAHL]             = {40,  40,   40};      // linke Position der Servos
const int weichenPos2[ANZAHL]             = {120, 120,  120};     // rechte Position der Servos
// ------------------------------------------------------------------------------------------------------------------------  //
const byte ledGeradePin[ANZAHL]           = {8,   9,    10};      // Pin für die LED Zustand gerade
const byte ledAbzweigPin[ANZAHL]          = {11,  12,   13};      // Pin für die LED Zustand Anzweig
// ------------------------------------------------------------------------------------------------------------------------  //
const int speed[ANZAHL]                   = {8,   8,    8};       // festlegen der Verfahrgeschwindigkeit der Servos
// ------------------------------------------------------------------------------------------------------------------------  //
boolean weicheToPos1[ANZAHL];               // Sollposition des Servo ( true = Pos1 )
// ------------------------------------------------------------------------------------------------------------------------

MoToButtons taster( buttonPin, ANZAHL, 20, 300 ); // Weichentaster einrichten
MoToServo servos[3];

void setup() {
  for (byte i = 0; i < ANZAHL; i++) {
    servos[i].attach(weichenPin[i], true );
    servos[i].setSpeed(speed[i]);
    pinMode(relaisPin[i], OUTPUT);
    pinMode(ledGeradePin[i], OUTPUT);
    pinMode(ledAbzweigPin[i], OUTPUT);
    weicheToPos1[i] = true;
    servos[i].write(weichenPos1[i]);                // Startstellung Servo
    digitalWrite(relaisPin[i], weicheToPos1[i] );   // Startstellung Relais
  }
}//Ende void setup

void loop() {
  taster.processButtons();

  for ( byte i = 0; i < ANZAHL; i++ ) {
    if ( taster.pressed(i) ) {
      weicheToPos1[i] = !weicheToPos1[i];           // Weichenstellung umschalten
      if ( weicheToPos1[i] ) {
        servos[i].write(weichenPos1[i]);
      } else {
        servos[i].write(weichenPos2[i]);
      }
    }
    // Umstellvorgang läuft, Relais umschalten
    if ( servos[i].moving() < 50 ) {
      digitalWrite(relaisPin[i], weicheToPos1[i] );
    }
    //--------------------------------LED Steuerung-----
    if ((servos[i].moving() == 1) && (weicheToPos1[i] == HIGH))
    {
      digitalWrite(ledGeradePin[i], HIGH );
      digitalWrite(ledAbzweigPin[i], LOW );
    }
    if ((servos[i].moving() == 1) && (weicheToPos1[i] == LOW))
    {
      digitalWrite(ledGeradePin[i], LOW );
      digitalWrite(ledAbzweigPin[i], HIGH);
    }
    //--------------------------------------------------
  }   // Ende for - schleife

}     // Ende void loop
Franz
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von e69-fan »

Hallo und Danke Franz,

ich bin am testen, läuft gut mit mehreren Servos.

Könnte man noch so erweitern:

Erklärung:

Die LED stellen den jeweiligen Zustand / Lage der Weiche dar.
Sobald die Weiche sich bewegt, ist der letzte Zustand == falsch und keine der beiden LED leuchten.
Hat die Weiche den neuen Zustand erreicht und moving ist Null, dann soll die zugehörige LED zu leuchten beginnen.

mfg Wolfgang
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von Admin »

Guten Tag.

Das wäre dann sowas:

Code: Alles auswählen

//  Weichenschaltung mit TasterPolRelais und Anzeige der Endlagen
//  e69-fan
#define MAX8BUTTONS
#include <MobaTools.h>

//Variablendeklaration
const byte weichenPin[]                   = {2,   3,    4};        // Pins für die Weichenantriebe
// ------------------------------------------------------------------------------------------------------------  //
const byte ANZAHL = sizeof(weichenPin);
// ------------------------------------------------------------------------------------------------------------  //
const byte buttonPin[ANZAHL]              = {A1,  A2,   A3};      // Pins für die Taster
// ------------------------------------------------------------------------------------------------------------  //
const byte relaisPin[ANZAHL]              = {5,   6,    7};       // Pins für die Relais
// ------------------------------------------------------------------------------------------------------------  //
const int weichenPos1[ANZAHL]             = {40,  40,   40};      // linke Position der Servos
const int weichenPos2[ANZAHL]             = {120, 120,  120};     // rechte Position der Servos
// ------------------------------------------------------------------------------------------------------------  //
const byte ledGeradePin[ANZAHL]           = {8,   9,    10};      // Pin für die LED Zustand gerade
const byte ledAbzweigPin[ANZAHL]          = {11,  12,   13};      // Pin für die LED Zustand Anzweig
// ------------------------------------------------------------------------------------------------------------  //
const int speed[ANZAHL]                   = {8,   8,    8};       // festlegen der Verfahrgeschwindigkeit der Servos
// ------------------------------------------------------------------------------------------------------------  //
boolean weicheToPos1[ANZAHL];               // Sollposition des Servo ( true = Pos1 )
// ------------------------------------------------------------------------------------------------------------  //
MoToButtons taster( buttonPin, ANZAHL, 20, 300 ); // Weichentaster einrichten
MoToServo servos[3];

void setup() {
  for (byte i = 0; i < ANZAHL; i++) {
    servos[i].attach(weichenPin[i], true );
    servos[i].setSpeed(speed[i]);
    pinMode(relaisPin[i], OUTPUT);
    pinMode(ledGeradePin[i], OUTPUT);
    pinMode(ledAbzweigPin[i], OUTPUT);
    weicheToPos1[i] = true;
    servos[i].write(weichenPos1[i]);                // Startstellung Servo
    digitalWrite(relaisPin[i], weicheToPos1[i] );   // Startstellung Relais
  }
}//Ende void setup

void loop() {
  taster.processButtons();

  for ( byte i = 0; i < ANZAHL; i++ ) {
    if ( taster.pressed(i) ) {
      weicheToPos1[i] = !weicheToPos1[i];           // Weichenstellung umschalten
      if ( weicheToPos1[i] ) {
        servos[i].write(weichenPos1[i]);
      } else {
        servos[i].write(weichenPos2[i]);
      }
    }
    // Umstellvorgang läuft, Relais umschalten
    if ( servos[i].moving() < 50 ) {
      digitalWrite(relaisPin[i], weicheToPos1[i] );
    }
    //--------------------------------LED Steuerung-----
    if ((servos[i].moving() == 1) && (weicheToPos1[i] == HIGH))
    {
      digitalWrite(ledGeradePin[i], HIGH );
      digitalWrite(ledAbzweigPin[i], LOW );
    }
    if ((servos[i].moving() == 1) && (weicheToPos1[i] == LOW))
    {
      digitalWrite(ledGeradePin[i], LOW );
      digitalWrite(ledAbzweigPin[i], HIGH);
    }
    if (servos[i].moving() > 39)
    {
      digitalWrite(ledGeradePin[i], LOW );
      digitalWrite(ledAbzweigPin[i], LOW );
    }

    //--------------------------------------------------
  }   // Ende for - schleife

}     // Ende void loop
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von Admin »

Du ich habe auch mal eine Frage.

Hast du einen guten Servo der bei dir sauber läuft, den ich hier mal testen könnte? Meiner ist warscheinlich defekt. Der zapelt beim Lauf immer hin und her. Wenn ich weiß dass es wirklich der Servo ist, besorge ich mir einen Neuen. Aber wenn der Grund wo anders liegt, dann kaufe ich mir einen Neuen, und habe keine Besserung :sad: Deshalb wäre es schön wenn ich für den Ausschluss anderer Fehler mal einen Servo leihweise anschließen könnte.

Schönen Tag
Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von Admin »

Danke nochmal für den Servo.
Und den MG996R habe ich mir noch bestellt.


Hier ist noch die Änderung, über die wir gerade gesprochen haben:

Code: Alles auswählen

//  Weichenschaltung mit TasterPolRelais und Anzeige der Endlagen
//  e69-fan
#define MAX8BUTTONS
#include <MobaTools.h>

//Variablendeklaration
const byte weichenPin[]                   = {2,   3,    4};        // Pins für die Weichenantriebe
// ------------------------------------------------------------------------------------------------------------  //
const byte ANZAHL = sizeof(weichenPin);
// ------------------------------------------------------------------------------------------------------------  //
const byte buttonPin[ANZAHL]              = {A1,  A2,   A3};      // Pins für die Taster
// ------------------------------------------------------------------------------------------------------------  //
const byte relaisPin[ANZAHL]              = {5,   6,    7};       // Pins für die Relais
// ------------------------------------------------------------------------------------------------------------  //
const int weichenPos1[ANZAHL]             = {40,  40,   40};      // linke Position der Servos
const int weichenPos2[ANZAHL]             = {120, 120,  120};     // rechte Position der Servos
// ------------------------------------------------------------------------------------------------------------  //
const byte ledGeradePin[ANZAHL]           = {8,   9,    10};      // Pin für die LED Zustand gerade
const byte ledAbzweigPin[ANZAHL]          = {11,  12,   13};      // Pin für die LED Zustand Anzweig
// ------------------------------------------------------------------------------------------------------------  //
const int speed[ANZAHL]                   = {8,   8,    8};       // festlegen der Verfahrgeschwindigkeit der Servos
// ------------------------------------------------------------------------------------------------------------  //
boolean weicheToPos1[ANZAHL];               // Sollposition des Servo ( true = Pos1 )
// ------------------------------------------------------------------------------------------------------------  //
MoToButtons taster( buttonPin, ANZAHL, 20, 300 ); // Weichentaster einrichten
MoToServo servos[3];

void setup() {
  for (byte i = 0; i < ANZAHL; i++) {
    servos[i].attach(weichenPin[i], true );
    servos[i].setSpeed(speed[i]);
    pinMode(relaisPin[i], OUTPUT);
    pinMode(ledGeradePin[i], OUTPUT);
    pinMode(ledAbzweigPin[i], OUTPUT);
    weicheToPos1[i] = true;
    servos[i].write(weichenPos1[i]);                // Startstellung Servo
    digitalWrite(relaisPin[i], weicheToPos1[i] );   // Startstellung Relais
  }
}//Ende void setup

void loop() {
  taster.processButtons();

  for ( byte i = 0; i < ANZAHL; i++ ) {
    if ( taster.pressed(i) ) {
      weicheToPos1[i] = !weicheToPos1[i];           // Weichenstellung umschalten
      if ( weicheToPos1[i] ) {
        servos[i].write(weichenPos1[i]);
      } else {
        servos[i].write(weichenPos2[i]);
      }
    }
    // Umstellvorgang läuft, Relais umschalten
    if ( servos[i].moving() < 50 ) {
      digitalWrite(relaisPin[i], weicheToPos1[i] );
    }
    //--------------------------------LED Steuerung-----
    if ((servos[i].moving() == 0) && (weicheToPos1[i] == HIGH))
    {
      digitalWrite(ledGeradePin[i], HIGH );
      digitalWrite(ledAbzweigPin[i], LOW );
    }
    if ((servos[i].moving() == 0) && (weicheToPos1[i] == LOW))
    {
      digitalWrite(ledGeradePin[i], LOW );
      digitalWrite(ledAbzweigPin[i], HIGH);
    }
    if (servos[i].moving() > weichenPos1[i]-1)
    {
      digitalWrite(ledGeradePin[i], LOW );
      digitalWrite(ledAbzweigPin[i], LOW );
    }

    //--------------------------------------------------
  }   // Ende for - schleife

}     // Ende void loop
Zu dem Endlos Servo.
Kann es sein dass man dem wenn er rückwärts laufen soll, minus Werte mitgeben muss? Vielleicht kann ich den morgen mal schnell testen. Ich habe noch nicht wirklich eine Idee wie man den richtig ansteuert :???: Aber schaun wa mal, dann sehn wirs schon :)

Gute Nacht
Franz
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von e69-fan »

Hallo Franz,
die Daten stammen zwar von einem anderen Servo


Bild


mfg wolfgang
Dateianhänge
Data.png
Data.png (116.38 KiB) 798 mal betrachtet
Grüße aus der Heimat der E69
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot] und 6 Gäste