Ich möchte das Demo "Wechselblinker" von den MobaTools verwenden. Der Schalter "const int SchalterP = 7;" soll durch zwei Hallsensonren ersetzt werden. Magnet unter der Lok startet die Schaltung und der Magnet unter dem letzten Wagon schaltet ab. Der feste Zugverband ist gewollt, da die Schaltung auch für mein CAR-System verwendet werden soll.
Wie würdet Ihr das umsetzen? (Relais mit Selbsthaltung, Flip-Flop etc. - der einfachste Weg ist mein Ziel)
mir ist nicht ganz klar, was Du mit Relais oder Flip-Flop erreichen möchtest. Kannst Du das bitte erklären?
Meine grobe Idee wäre, die Abfrage des Tasters so zu modifizieren, dass beim Einschalten des ersten Sensors der Ablauf gestartet und beim Schalten des 2. Sensors beendet wird. Du müsstest also wohl beide Sensoren separat im Sketch abfragen und entsprechend der Fahrtrichtung behandeln. Dabei wäre zu beachten, dass jeder Sensor zweimal beim Überfahren ausgelöst wird. Das genaue Verhalten richtet sich danach, welchen Hall-Sensor Du einsetzen möchtest - und hier steige ich aus, da mir die praktischen Erfahrungen fehlen...
alle Zusatzkomponenten machen die Sache im Prinzip nur komplizierter, wenn Du eh´ den Arduino programmierst.
Leider fehlt eine konkrete Darstellung Deiner Situation. Eine Fahrtrichtung oder Fahrt des Zuges in beide Richtungen ? Sind die Positionen der Magnete und Hall-Sensoren für Lok und Schlusswagen unterschiedlich, oder hast Du immer vier Auslösungen (2x Lok, 2x Wagen).
In eine Richtung dürfte es über eine Zustandsvariable relativ leicht gehen, in beide Richtungen wird es komplizierter, da beide Sensoren sowohl Einschalter als auch Ausschalter sein können.
Viele Grüße, Bodo
PS: Ich würde es über einen Belegtmelder realisieren, aber das war nur teilweise die Frage .
Die Freiheit des Menschen liegt nicht darin, dass er tun kann, was er will, sondern dass er nicht tun muss, was er nicht will. (Jean-Jacques Rousseau)
Der Bahnübergang befindet sich auf einer zweigleisigen Strecke. Jedes Gleis erhält zwei Hallsensoren. Die Lok schaltet mit Nordpol und der letzte Wagen mit Südpol.
Mein erster Gedanke waren Relais - Corona-Denkfehler, diese fallen jedoch ab, da die HALL nur Taster sind.
/* Demo: Wechselblinker Dieses Demo ist etwas komplexer und zeigt die Realisierung eines Wechselblinker, der per Schalter ein- und ausgeschaltet wird. Wie bei Wechselblinkern an einem BÜ üblich, starten die beiden Lampen gleichzeitig, um dann im Wechseltakt zu blinken Dieses Demo verwendet auch die 'Eieruhr' um Zeitverzögerungen zu realisieren Die 'Eieruhr' ist ein Zeitzähler, der aufgezogen werden kann und im loop kann abgefragt werden, ob er abgelaufen ist. */
// Festlegen der Ports const int Blinker1P = 13 ; // Die beiden Led's des const int Blinker2P = 11 ; // Wechselblinkers.
const int hallSensorPin2 = 2; // Gleis A - AN const int hallSensorPin3 = 3; // Gleis A - AUS const int hallSensorPin4 = 4; // Gleis B - AN const int hallSensorPin5 = 5; // Gleis B - AUS
int hallSensorPIN2Status = 0; int hallSensorPIN3Status = 0; int hallSensorPIN4Status = 0; int hallSensorPIN5Status = 0;
const int Relais_IN1 = 6; // Gleis A const int Relais_IN2 = 7; // Gleis B
const int SchalterP = 8; // Schalter, der den Wechselblinker ein und ausschaltet
// Weitere Konstante const int wbZykl = 1100; // Zykluszeit des Wechselblinkers const int wbSoft = 400; // Auf/Abblendzeit der Lampen
// Zustand des Wechselblinker byte wblZustand = 0; // In dieser Variable wird hinterlegt, in welchem Zustand // sich der Wechselblinker gerade befindet #define WBL_AUS 0 // beide Lampen sind aus #define WBL_START 1 // Startphase: beide Lampen sind an #define WBL_BLINKT 2 // Die Lampen blinken normal im Wechsel byte ledState; // HIGH : Blinker1 ist an, LOW Blinker2 ist an
MoToSoftLed Blinker1; MoToSoftLed Blinker2;
MoToTimer BlinkUhr;
void setup() { pinMode(SchalterP, INPUT_PULLUP); Blinker1.attach(Blinker1P); // die Ausgänge werden automatisch auf OUTPUT gesetzt Blinker2.attach(Blinker2P); Blinker1.riseTime( wbSoft ); // Aufblendzeit in ms Blinker2.riseTime( wbSoft ); // Aufblendzeit in ms pinMode(hallSensorPin2, INPUT_PULLUP); pinMode(hallSensorPin3, INPUT_PULLUP); pinMode(hallSensorPin4, INPUT_PULLUP); pinMode(hallSensorPin5, INPUT_PULLUP); pinMode(Relais_IN1, OUTPUT); pinMode(Relais_IN2, OUTPUT); }
so richtig in Ruhe drüber nachdenken kann ich erst ab morgen Abend ... aber ich glaube, die Logik hat noch mindestens einen Fehler. Wenn sich zwei Züge begegnen, darf der erste den BÜ nämlich nicht abschalten, solange der andere Zug ihn noch belegt. Ich denke, man muss beiden Gleisen eine Status-Variable spendieren und per ODER-Logik verknüpfen.
Ich werde das am WE mal gedanklich durchspielen, ist ja durchaus eine interessante Aufgabenstellung .
Viele Grüße, Bodo
Die Freiheit des Menschen liegt nicht darin, dass er tun kann, was er will, sondern dass er nicht tun muss, was er nicht will. (Jean-Jacques Rousseau)
if ( digitalRead(Gleis1onP) == LOW ) { Gleis1 = true; } if ( digitalRead(Gleis1offP) == LOW ) { Gleis1 = false; } if ( digitalRead(Gleis2onP) == LOW ) { Gleis2 = true; } if ( digitalRead(Gleis2offP) == LOW ) { Gleis2 = false; } SchalterP = Gleis1 || Gleis2; // Blinken, wenn Gleis 1 oder Gleis 2 belegt
// Wechselblinker switch (wblZustand) { case WBL_AUS: // Beide Lampen sind aus, warten auf einschalten if ( SchalterP == true && BlinkUhr.running() == false ) { ... } if ( SchalterP == false ) { // Wechselblinker abschalten Blinker1.off(); Blinker2.off(); wblZustand = WBL_AUS; BlinkUhr.setTime(wbZykl); // minimale 'Aus' zeit des Blinkers //( schützt vor Schalterprellen ) } break;
} // Ende switch Wechselblinker }
Ob man die Hall-Sensoren wie Taster gegen Masse schalten kann, weiß ich nicht - aber die Programmlogik funktioniert zumindest auf meinem Steckbrett so. Ist auch ein super Beispiel, warum "delay" nicht verwendet werden sollte - dann werden nämlich ziemlich sicher die Schaltmomente verpasst .
Viele Grüße, Bodo
Die Freiheit des Menschen liegt nicht darin, dass er tun kann, was er will, sondern dass er nicht tun muss, was er nicht will. (Jean-Jacques Rousseau)