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

Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von e69-fan »

Hallo Franz,

ich habe da mal einen Sketch mit den MobaTools erweitert.
Das Relais funktioniert wunderbar, aber ich bekomme die beiden LED ( ledGeradePin und ledAbzweigPin) nicht angesteuert.

Je nach Position ( weichenPos1 und weichenPos2 ) sollen die LED leuchten - also

Weiche gerade / grüne LED an - Servo bewegt sich / beide LED aus - Weiche steht auf Abzweig / rote LED an.




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[ANZAHL];

void setup() {
  for (byte i = 0; i < ANZAHL; i++) {
    servos[i].attach(weichenPin[i], true );
    servos[i].setSpeed(speed[i]);
    pinMode(relaisPin[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]);
      }
    }

    if ( servos[i].moving() ) {
                                                    // Umstellvorgang läuft, Relais umschalten
      if ( servos[i].moving() < 50 ) {
        digitalWrite(relaisPin[i], weicheToPos1[i] );
      }
    }
  }   // Ende for - schleife

}     // Ende void loop

Der MicroBahner hatte noch einen anderen Sketch veröffentlicht, den bekomme ich aber nicht abgeändert ( Relais soll nach dem halben Verfahrweg umschalten.

Code: Alles auswählen

/*  Demo zum Anschluß mehrerer Weichen, realisiert mit objektorientierter Programmierung (OOP)
     Anstelle von Funktionen und Feldern werden Methoden und Strukturen verwendet.
     Die Methoden sehen so aus, als seien sie für eine Weiche geschrieben,
     tatsächlich können aber bis zu 16 Weichen, begrenzt durch die Bibliothek, verwendet werden,
     wenn die Pins wie beim Mega2560 ausreichen.
     Beim Drücken des Tasters geht die LED aus, der Servo bewegt die Zunge mit eingestellter Geschwindigkeit
     in die andere Position, die LED für die neue Position geht an, der Servo wird nach einer Sekunde ausgeschaltet.

     Ausgaben auf den seriellen Monitor dienen nur der Veranschaulichung und können entfernt werden.
*/
#include <MobaTools.h>
const byte ZUNGENGESCHWINDIGKEIT = 10;  // entspricht 1,7 Sekunden

class Weiche {
    const byte tasterPin;       // Pin für den Taster
    const byte ledGeradePin;    // Pin für die LED Zustand gerade
    const byte ledAbzweigPin;   // Pin für die LED Zustand Anzweig
    const byte servoPin;        // Pin für den Weichenservo
    const byte winkelG;         // Winkel für die Geradenstellung
    const byte winkelA;         // Winkel für die Abzweigtellung
    const bool grundStellung;   // Grundstellung beim Einschalten: 0=gerade, 1=Abzweig
    bool tasterAlt, tasterAkt;  // Tasterzustände alt und aktuell
    MoToServo weichenServo;     // Objekt der Bibliothek
    
  public:
    Weiche (const byte tasterPin,  const byte ledGeradePin,  const byte ledAbzweigPin,  const byte servoPin, const byte winkelG, const byte winkelA, const bool grundStellung)
      : tasterPin(tasterPin),  ledGeradePin(ledGeradePin),  ledAbzweigPin(ledAbzweigPin),  servoPin(servoPin), winkelG(winkelG), winkelA(winkelA), grundStellung(grundStellung), tasterAlt(0), tasterAkt(0), weichenServo() {}
      
    void init() {
      pinMode(tasterPin, INPUT_PULLUP);               // Taster schaltet nach GND
      
      pinMode(ledGeradePin, OUTPUT);
      pinMode(ledAbzweigPin, OUTPUT);
      
      weichenServo.attach(servoPin, true);            // Pin für den Weichenservo und Abschalten nach einer Sekunde
      weichenServo.setSpeed(ZUNGENGESCHWINDIGKEIT);   // Weichenzungengeschwindigkeit
      
      if (grundStellung) {
        weichenServo.write(winkelA);                  // definierten Anfangswinkel anfahren
        
      } else {
        
        weichenServo.write(winkelG);                  // definierten Anfangswinkel anfahren
      }
    }
    
    void stellen() {
      tasterAlt = tasterAkt;
      tasterAkt = digitalRead(tasterPin);
      
      if (weichenServo.moving() == 0) {
        byte winkel = weichenServo.read();
        if (winkel == winkelG) digitalWrite(ledGeradePin, HIGH);
        if (winkel == winkelA) digitalWrite(ledAbzweigPin, HIGH);
        
        if (tasterAlt && !tasterAkt) {
          Serial.print(F("Tastendruck Pin ")); Serial.print(tasterPin);
          
          if (winkel == winkelG) {
            Serial.print(F("\tWeiche Pin ")); Serial.print(servoPin); Serial.println(F(" abbiegen"));
            digitalWrite(ledGeradePin, LOW);
            weichenServo.write(winkelA);
            
          } else {
            
            Serial.print(F("\tWeiche Pin ")); Serial.print(servoPin); Serial.println(F(" gerade"));
            digitalWrite(ledAbzweigPin, LOW);
            weichenServo.write(winkelG);
          }
        }
      }
    }
};

Weiche weichen[] = {
  // tasterPin,  ledGeradePin,  ledAbzweigPin,  servoPin, winkelG, winkelA, Grundstellung     //
        {A1,             6,            5,            9,        36,     85,       0},          // jede Zeile entspricht einer Weiche
        {A2,             7,            4,            10,       30,     80,       1},          // jede Zeile entspricht einer Weiche
        {A3,             2,            3,            4 ,       30,     80,       0}           // jede Zeile entspricht einer Weiche
};

void setup() {
  Serial.begin(9600);
  Serial.println(F("Gleisschaltplan"));
  for (Weiche &w : weichen) w.init();
}

void loop() {
  for (Weiche &w : weichen) w.stellen();
}
Also, wie bei der alten Fernsehsendung: TorA oder TorB oder TorC - im TorC ist der Zonk

Vielleicht kannst Du mir mal wieder weiterhelfen - Danke im vorraus
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von Admin »

Das schaue ich mir morgen Nachmittag mal in Ruhe an. Heute ist es mir zu spät. Ich muss morgen bischen was in München arbeiten. Aber am Nachmittag werde ich wieder da sein.

Wünsche gut zu schlafen :(V):
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von Admin »

Also die LED´s leuchten bei mir nicht. Diese Anzeigen der Endlagen. :sad:

Ist das Programm "// Weichenschaltung mit TasterPolRelais und Anzeige der Endlagen" das du hier eingestellt hast noch das Grundprogramm, das du irgendwo runtergeladen hast?
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,

das war das Grundprogramm. Ich habe da nur das Relais eingepflegt. Die beiden LED sind nur definiert, nicht programmiert und können deshalb nicht leuchten. Ich weiß nicht, wie sie im loop oa. einpflegen muss.

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

Re: Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von Admin »

Ach sooo, ich dachte die LED´s werden in der Lib. eingeschalten. OK, dann schaue ich mal wie man die LED´s anhand der Relaissteuerung mit steuern kann. Das dürfte nicht so schwer sein.

Mache ich vielleicht heute Abend mal.

Bis später
Franz :(V):
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
nicht mit dem Relais koppeln sondern mit den Endlagen des Servos. Relais ist abhängig vom Servoweg.

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

Re: Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von Admin »

OK, anhand der Relaisstellung weiß ich wo die Reise hingeht. Also geradeaus oder abzweigen, und anhand von myServo.moving() erfahre ich wann der Servo am Ziel ist, also die Weichenumstellung abgeschlossen ist. Und dann ist der Zeitpunkt die entsprechende Richtungs-LED einzuschalten. Und natürlich die andere aus. Wäre das in Ordnung?

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 »

:(V): hört sich gut an - ich baue mir Morgen einen kleinen Versuchsaufbau und könnte Dir dann Feedback geben

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

Re: Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von Admin »

Schönen guten Abend.
Ich bin noch nicht wieder dran gewesen, an dem Problem.
Wir hatten heute mehrfach Besuch, teilweise auch welcher auf den ich gerne hätte verzichten könnte :O:

Und 1-2-3 war der Tag zuende. :eek:
Hast du auch das Problem, dass im Alter die Wochen verfliegen wie im Schlaf. Kaum wach, ist der Tag schon wieder fast weg :O:

Servus
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 Leidensgenosse,

ich hatte gestern ein ähnliches Erlebnis.
Nach dem Fräsen der Frontplatte für die Drehscheibe, hatte ich über die X-Achse wellenförmige Gerade bekommen. :agt:
Fehlersuche - zu viel Spiel in der Führung. Mist !!!
Alles zerlegen und überlegen wie das in Zukunft verhindert werden kann. Sch....ß Konstruktion. Lösung gefunden.
Alles wieder zusammenbauen und dabei justieren -


Also Frästständer " ins Eck geworfen" und Drehscheibe gebastelt. Upps es ist schon 23:00 Uhr.

Wie die Zeit vergeht und es ist nichts großartiges passiert. Rate Mal was heute auf dem Plan steht.?

Bis bald - Wolfgang

Post am 24.07.2021 abgeändert
Zuletzt geändert von e69-fan am Sa 24. Jul 2021, 08:20, insgesamt 1-mal geändert.
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste