Bahnübergang-Steuerung mit Arduino

  • Hallo zäme


    Ich habe auf Anregung eines bekannten begonnen, mit Hilfe eines Arduino Uno eine Steuerung für Bahnübergänge zu programmieren. Zwar geht es in meinem Fall erstmal um ein H0-Projekt mit Thema NSB, das ganze ist aber für alle Masstäbe und diverse Länder verwendbar.


    Im Fall NSB gibt es folgendes Szenario:


    - BUe deaktiviert, gelbe Lampe blinkt.
    - BUe wird aktiviert, rote Lampe blinkt, Glocke ertönt.
    - BUe wird gesenkt, rote Lampe blinkt weiter.
    - Zugdurchfahrt.
    - BUe wird geöffnet, rote Lampe blinkt bis Schranke oben.
    - BUe-Geschlossen überwacht mit einer zusätzlichen LED auf dem Stellpult.


    Das ganze kann einfach mit weglassen der gelben Lampe und hinzufügen eines Wechselblinkers für die Schweiz umgemünzt werden.


    Ich habe im Netz einen fertig programmierten Sketch gefunden, allerdings musste ich ihn teilweise anpassen. Nun bin ich soweit das es klappt, allerdings jeweils nur einmal nach dem aufspielen des Sketch auf den Arduino. Angesteuert durch einen Kippschalter läuft alles, aber ab dem zweiten Ansteuern bewegt sich der Servo nicht mehr.


    Hat von euch jemand Erfahrung mit Arduino?

  • Hier mal der Sketch für die Version mit Wechselblinker:




    Wie gesagt es läuft alles, ausser das beim zweiten mal aktivieren der Servo nicht mehr dreht.

  • Ich habe kurz den Code überflogen. Dabei sind mir einige Dinge aufgefallen.


    1. myState


    In welchem Zustand sich der BUe befindet. Ich würde prüfen und setzen der Variable ausserhalb des switch/case Statement machen. Das switch/case soll nur die Anweisungen enthalten, die für die Schranken notwendig sind.


    Für die Zustände würde ich hier mit Konstanten arbeiten. z. B. oder so ähnlich
    #define BUE_OFFEN 0
    #define BUE_SCHLIESSEN 1
    #define BUE_GESCHLOSSEN 2
    #define BUE_OEFFNEN 3
    ...


    Die kannst du dann auch für die switch/case verwenden.



    2. Potentielle Code Stolpersteine


    Code
    servoPosition = servoPosition += 1;


    entweder
    servoPosition = servoPosition + 1
    oder
    servoPosition += servoPosition


    Das gleiche ist auch beim myState 3 der Fall. Nur dort mit -=


    Im Case 2 hast du ein if (servoPosition == servoPositionGeschlossen) jedoch hast du das Gegenteil im Case 3 nicht.


    3. Fehler im Code


    Dein Fehler ist hier zu suchen.

    Code
    else servoPosition = servoPositionGeschlossen -= 1;


    servoPositionGeschlossen sollte wohl servoPosition heissen. Im Prinzip würde der Servo immer in der geschlossen Position bleiben, weil du immer 140 - 1 zuweisen tust.

  • Noch etwas. Definiere die Variablen, die wirklich nicht überschrieben werden sollen, als sogenannten "Konstanten". Durch die Anweisung servoPositionGeschlosse -= 1 überschreibst du die Variable servoPositionGeschlossen mit einem neuen Wert, was aber nicht passieren dürfte.


    Eine Konstante kannst du in C mit dem Schlüsselwort const definieren oder ansonsten verwende #define. Wie bei meinen Beispiel oben.


    Folgende Variablen sehen für mich nach Konstanten aus.
    int ledPin = 13;
    int ledPin2 = 12;
    int ledPin3 = 7;
    int servoPin = 9;
    int magnetSensor1Pin = 8;
    int magnetSensor2Pin = 10;


    int speakerPin = 4;


    int servoPositionOffen = 60;
    int servoPositionGeschlossen = 140;


    int servoGeschwindigkeit = 1;


    int blinkZeit = 5000;

  • Danke für die vielen Inputs. Muss ehrlich zugeben das mir das gerade ein bisschen zu viele sind. :rolleyes


    Eigentlich möchte ich wie gesagt nur das Problem lösen, das der Servo beim zweiten Aktivieren nicht dreht. Der Rest läuft einwandfrei und lässt sich auch den diversen BUe anpassen.


    Möglicherweise liegt es an dem von dir erwähnten Fehler "servoPosition" anstatt "servoPositionGeschlossen"...

  • Cool, wenn du den Fehler gefunden hast. Daher auch mein Tipp, Variablen, die nicht veränderbar sind, als Konstanten definieren. Dann hätte es einen Compile Fehler gegeben. ;) Einfach für die nächste Version des Programms.

  • Naja ich habe erst angefangen mit dem Arduino zu arbeiten. Den Sketch habe ich wi gesagt mehr oder weniger von dieser Seite übernommen. Nur das dort der Servo schlagartig umschaltete, daher habe ich dann von den Beispielen den "Sweep" eingepflanzt damit man die Servogeschwindigkeit anpassen kann.


    Nun läuft es ja. Man kann auch relativ einfach z.B. den Wechselblinker beim öffnen der Schranken deaktivieren, andere Blinksequenzen für andere Bahnübergänge erstellen, und auch wie meine Überwachungs-LED beispielsweise Deckungssignale oder Blinklicht für Bahnübergangs-Überwachung dazu fügen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!