Modellbahnübergang mit schranken
Hallo ich bin neu hier und habe mir vor einigen Tagen einen Arduino gekauft.
Jetzt bin ich auf der Suche nach den richtigen Sketch.
Das Programm sollte so anfangen das ich mit einem Tastschalter/später Reedkontakt den ganzen Ablauf einschalten kann.
Dann sollten vier LED´s anfangen zu blinken und zwar abwechselnd immer 2LED´s ein und die anderen beiden LED´s aus schalten bis eine Zeit abgelaufen ist.
In der gleichen Zeit sollen dann die zwei Servos einmal von 0°auf 150° und nach dem eine Zeit abgelaufen ist wieder von 150° auf 0° zurückfahren und dann warten bis der Tastschalter erneut betätigt wird.
Also ich habe da einmal etwas kopiert und verändert leider gibt der Servo nicht auf und fährt immer wieder diesen loop. Was kann ich ändern.
Wer von Euch könnte mir weiter helfen.
hier einmal meinen x then Fehlversuch:
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
int pinEingang = 2;
int pinAusgang = 9;
void setup() {
pinMode(pinEingang, INPUT_PULLUP);
pinMode(pinAusgang, OUTPUT);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
int zustand = digitalRead(pinEingang);
if (zustand == HIGH) {
digitalWrite(pinAusgang, LOW);
} else { //zustand == LOW
}
for (pos = 50; pos <= 150; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(50); // waits 15ms for the servo to reach the position
}
delay(20000);
for (pos = 150; pos >= 50; pos -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(50); // waits 15ms for the servo to reach the position
}
delay(pinEingang);
}
Gruß
Karsten
Liste der Anhänge anzeigen (Anzahl: 1)
So, kann das nicht funktionieren:
Mit copy & paste ohne nachzudenken und die absoluten Grundlagen zu verstehen kann man kein Programm schreiben.
Anhang 32173
Zitat:
Zitat von
i_make_it
Der Prinzipielle Aufbau eines Arduino Sketchs:
void setup() //wird genau einmal ausgeführt.
void loop() // wird als Endlosschleife (loop) immer wieder ausgeführt.
Zitat:
Zitat von
i_make_it
Es darf in einem Arduino Sketch nur genau einen
void setup () {
}
Block und nur genau einen
void loop () {
}
Block geben.
Geschweifte Klammern markieren immer Anfang und Ende von Funktionen und Anweisungsblöcken.
Es muß also zu jeder "{" auch eine "}" geben.
Dein erster Fehler: das erste "void etup()" wird nirgendwo beendet.
Zweiter Fehler es gibt mehr als ein "void setup()".
Unschön sind die fehlenden Einrückungen, denn diese hätten Dir sofort das fehlen einer "}" gezeigt und erhöhen die Lesbarkeit ungemein.
Unnütz und der Übersichtlichkeit abträglich, Remark (Kommentar) Zeichen "//" am Ende vieler Zeilen ohne das dort überhaupt ein Kommentar steht.
Das zur allgemeinen Programmstruktur.
Sinnhaftigkeit / Sinnlosigkeit des Code
Die DO-WHILE Schleife wird solange durchlaufen, solange sie Abbruchbedingung nicht wahr ist.
Nicht wahr ist sie solange "curmicros - prevmicros <= 5000", also das Ergebniss der Berechnung kleiner oder gleich 5000 ist.
Da das nur ein Codebeispiel ist, habe ich sinnigerweise "prevmicros = curmicros" direkt in die Zeile davor gesetzt.
Das Ergebniss der Berechnung wird also meist 0 oder 1 sein und so nie die 5000 übersteigen kann, was zu einer Endlosschleife führt (Für die ist aber ja schon "void loop()" zuständig).
Versteht man das Konstrukt, fällt einem das auf und man weiß das diese Zeile vor die DO Zeile muß.
Ich erkenne also das Du den Code nur kopiert hast ohne darüber nachzudenken.
Aber selbst wenn das korrekt implementiert wäre, ist die Do Schleife immer noch sinnlos.
Da "unsigned long curmicros = millis()" die Variable curmicros mit dem aktuellen Wert der Funktion "millis()" füttert.
Sprich das Konstrukt prüft in diesem Fall ob mehr als 5 Sekunden vergangen sind.
in der Gesamten DO-WHILE Schleife, sind aber:
delay(50)
delay(20000)
delay(50)
delay(10000)
-------------
= 30100
Delays für 30,1 Sekunden drin.
Das heist beim einmaligen Durchlaufen der DO-WHILE Schleife vergeht schon mehr als die achtfache Zeit der Abbruchbedingung. Damit würde die Schleife immer nach einem Durchlauf beendet.
Womit eine Schleife an dieser Stelle keinen Sinn macht.
Vor allem da das Konstrukt ja die Delays ersetzen soll (diese aber immer noch vorhanden sind.)
Also noch mal, fang mit ganz kleinen Schritten bei Null an.
Zitat:
Zitat von
i_make_it
Erster Sketch, alternierendes Blinken von zwei LEDs mit Delay.
Zweiter Sketch, alternierendes Blinken von zwei LEDs mit Timer bzw. millis() (siehe Beispiel).
Dritter Sketch, alternierendes Blinken von zwei LEDs, über eine bestimmte Dauer, gestartet durch Taster.
Vierter Sketch, alternierendes Blinken von zwei LEDs, gestartet durch Interrupteingang.
Fünfter Sketch, Schalter entprellen.
Sechster Sketch, Servo bewegen.
Du willst einen Sprintwettkampfe gewinnen, must aber erst mal Laufen lernen.
Genaugenommen sehe ich Dich momentan noch nicht einmal krabbeln.
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
nun gibt es auch einmal ein kleines Bild von meiner Baustelle Die einzelnen Komponeten zum testen verdrahtet.
Anhang 32413
Der Sketch wird dann beim nächsten Mal folgen.
Gruß alterraucher
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn ich mir den Code ansehe, fällt mir auf, das es 5 Ausgänge gibt , die vom Prinzip her zeitgleich das selbe machen (zwei sind invertiert zu den anderen drei)
In dem Fall würde ein Ausgang reichen und man nimmt einen Inverter und zwei Transistoren als Treiber, die auch die Ausgänge schützen falls mal eine Diode durchbrennt und einen Kurzschluß verursacht. (dann wäre nur die Diode und höchstens noch der Transistor hinüber und nicht gleich der ganze Arduino).
Wenn man sich mal die verschiedenen Ausführungen von Andreaskreuzen an Bahnübergängen ansieht, würden trotzdem 3 Ausgänge reichen.
V1 - eine Rote Lampe pro Andreaskreuz.
V2 - eine Ampel Rot und Gelb pro Andreaskreuz (Gelb = Übergang Räumen, Rot = Halt)
V3 - zwei rote Lampen pro Andreaskreuz. (Wechselseitiges Blinken = Übergang Räumen , Rot = Halt, bei besonders gefährlichen Übergängen Wecheslblinken bis die Schranken wieder öffnen)
Da an allen Andreaskreuzen Zeitgleich das selbe zu sehen ist, reicht also ein Ausgang für Lampe eins an allen vier Kreuzen und ein Ausgang für Lampe zwei an allen vier Kreuzen.
Ein akustischer Signalgeber muß einzeln angesteuert werden, da er vom Beginn der Vorwarnung bis zum schließen der Schranken an ist und dann nicht mehr benötigt wird. (ob bei mir im Ort der auch beim Öffnen wieder an ging weiß ich gar nicht mehr, Mit Auto und Umgehungsstraße viel für mich das Warten am Übergang weg. ist also weit über 30 Jahre her das ich den überhaupt auch nur aus der Nähe gesehen habe).
Die Anzshl der benötigten IOs ist bei einem einzelnen Bahnübergang noch zweitrangig, aber wenn man auf einer Anlage mehrere betreiben will, kann man damit mehr als einen Übergang pro Arduino betreiben und somit Geld und "Strom" sparen.
Letzteres wird bei einer privat, nur ein Paar Stunden pro Woche betriebenen kleinen Anlage nicht so ins Gewicht fallen, Bei einer Großanlage mit zig oder über Hundert Übergängen und evenutell 60 und mehr Betriebsstunden pro Woche (es wurde Museum erwähnt) sieht das schnell anders aus, siehe dazu die Youtube Clips vom Miniaturwunderland, wo die Weichen- und Lichtsteuerungen alle ausgetauscht werden, da die neue Version unter anderem deutlich weniger Strom braucht. Gerrit Braun erklärt das dort.
Anhang 32416
Hier mal ein Übergang wie ich von den Sensoren und Aktoren für eine H0 Anlage kenne. (Halt mit Servos gezeichnet)
Unten links mal beide Varianten LEDs zu treiben. Die Widerstandswerte wären noch an die konkreten Spannungen und eingesetzten LEDs anzupassen.