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 »

Hab noch was gefunden.


Prinzipiell gilt:
Der Motor wird mit dem Befehl servo.write(); gesteuert. Der Wert, der
innerhalb der Klammer steht, kann zwischen 0 und 180 liegen. Unterhalb
eines Wertes von 90 dreht der Servo in die eine Richtung, überhalb von 90
in die andere Richtung. Je höher (bzw. niederiger) der Wert von 90 entfernt
ist, bestimmt die Geschwindigkeit, mit der sich der Servo dreht.
Wird ein Wert von genau 90 eingestellt, so stoppt der Motor.
Selbstverständlich können Sie den Beispielcode nach Ihren Wünschen
modifizieren und bearbeiten.

Wolfgang
Benutzeravatar
Admin
Administrator
Beiträge: 1197
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 dir.
Ich schaue mir das morgen an. Heute ist mir mal wieder die Zeit ausgegangen :O:
Benutzeravatar
Admin
Administrator
Beiträge: 1197
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 habe noch was festgestellt, was nicht gut war.
In den Abfragen:
if ((servos.moving() == 1) && (weicheToPos1 == HIGH))
if ((servos.moving() == 1) && (weicheToPos1 == LOW))
habe ich auf " if ((servos.moving() == 1)&&..." abgefragt.
Jetzt hatte ich mal das Servo Tempo verändert. Und siehe einer an, die LED´s haben nicht mehr eingeschalten.
Deshalb habe ich die zwei "if...." Zeilen entsprechend verändert. Ich frage nicht mehr auf ==1 ab sondern auf ==0
Dann passt das wieder.

Code: Alles auswählen

    //--------------------------------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
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 »

Servus Franz,

muss noch unter die Anlage kriechen und ein paar Strippen ziehen, dann werde ich die Änderung aufspielen.

Schönes Wochenende - Wolfgang
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Modellbahn_Weichenschaltung mit Taster, PolRelais und Anzeige der Endlagen

Beitrag von Admin »

Dann krabbel mal schön. :(oo): Das ist meine Lieblingshaltung. Auf die Knie unterm Tisch. Da habe ich danach einige Wochen trotz Kortison viel Freude mit meinen Knie´n. :) :eek: :???:

Also ich bräuchte eine Eisenbahn Anlage, die man unter die Decke hochziehen kann. Z.B bei uns in der Garage. D ist richtig viel Platz. So um die 30qm. Wenn man damit spielen will, die Autos raus, Anlage runter und los geht´s :(oo):

Aber das wäre einwandfrei ein teures Hobby, das ist mir nicht leisten kann.

Schönen Tag
Franz :(V):
Benutzeravatar
Admin
Administrator
Beiträge: 1197
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 habe mal eines meiner 08/15 Display´s angeschalten und die EndlagenAnzeige anstelle LED´s ersatzweise am Display angezeigt. Aber ich denke mal, das wir keine Alternative sein, weil die Anzeigen mit den LED´s am Gleißbild direkt bei den Weichen die Lage der jeweiligen Weiche anzeigt. Mit dem Display könnte man die Endlage von bis zu 12 Weichen je Display anzeigen. Das spart nazürlich PIN´s. Jedes Display ersatzweise für 12 Weichen, also 24 LED Pin´s.

Code: Alles auswählen

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

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

//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
  }
  lcd.begin(20, 4);
  lcd.backlight();
  lcd.clear();
  lcd.setCursor (0, 0);
  lcd.print ("W1");
  lcd.setCursor (0, 1);
  lcd.print ("W2");
  lcd.setCursor (0, 2);
  lcd.print ("W3");
  lcd.setCursor (0, 3);
  lcd.print ("W4");
  lcd.setCursor (7, 0);
  lcd.print ("W5");
  lcd.setCursor (7, 1);
  lcd.print ("W6");
  lcd.setCursor (7, 2);
  lcd.print ("W7");
  lcd.setCursor (7, 3);
  lcd.print ("W8");
  lcd.setCursor (14, 0);
  lcd.print ("W09");
  lcd.setCursor (14, 1);
  lcd.print ("W10");
  lcd.setCursor (14, 2);
  lcd.print ("W11");
  lcd.setCursor (14, 3);
  lcd.print ("W12");
}//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() < 2) && (weicheToPos1[i] == HIGH))
    {
      digitalWrite(ledGeradePin[i], HIGH );
      digitalWrite(ledAbzweigPin[i], LOW );
      //----------Display------------------------
      if (i == 0)
      {
        lcd.setCursor (3, 0);
        lcd.print (F("< "));
      }
      if (i == 1)
      {
        lcd.setCursor (3, 1);
        lcd.print (F("< "));
      }
      if (i == 2)
      {
        lcd.setCursor (3, 2);
        lcd.print (F("< "));
      }
      //---------Display Ende--------------------
    }
    if ((servos[i].moving() < 2) && (weicheToPos1[i] == LOW))
    {
      digitalWrite(ledGeradePin[i], LOW );
      digitalWrite(ledAbzweigPin[i], HIGH);
      //----------Display-----------------------
      if (i == 0)
      {
        lcd.setCursor (3, 0);
        lcd.print (F(" >"));
      }
      if (i == 1)
      {
        lcd.setCursor (3, 1);
        lcd.print (F(" >"));
      }
      if (i == 2)
      {
        lcd.setCursor (3, 2);
        lcd.print (F(" >"));
      }
      //---------Display Ende--------------------
    }
    if (servos[i].moving() > weichenPos1[i] - 1)
    {
      digitalWrite(ledGeradePin[i], LOW );
      digitalWrite(ledAbzweigPin[i], LOW );
    }

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

}     // Ende void loop
Hier sieht man wie das dann ausschaut:
http://bilder.franz-koehler.de/DSC01303.JPG
http://bilder.franz-koehler.de/DSC01304.JPG
http://bilder.franz-koehler.de/DSC01305.JPG
http://bilder.franz-koehler.de/DSC01306.JPG
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

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