PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Modellbahnübergang mit schranken



alterraucher
30.10.2016, 20:47
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

i_make_it
31.10.2016, 06:11
Hallo,

Das Typische Problem.
Der Computer macht nicht das was man von ihm will sondern das was man ihm sagt.

Der Prinzipielle Aufbau eines Arduino Sketchs:
void setup() //wird genau einmal ausgeführt.
void loop() // wird als Endlosschleife (loop) immer wieder ausgeführt.

Am Beginn der Schleife fragst Du den Eingang ab.
Dann kommt eine IF Verzweigung in der Du bei gesetztem Eingang einen Ausgang Low setzt.
Und die bedingte Verzweigung ist zuende.
Ab hier wird der Code bei jedem Schleifendurchlauf einmal ausgeführt. (Das ist daß was du dem Computer sagst)
Dann kommt FOR eine Schleife in der der RC-Servo in 1° Schritten mit einem Delay von 50ms je Durchlauf verfährt.
Dann 20 Sekunden warten und noch eine FOR Schleife die den RC-Servo wieder in Ausgangsposition bringt.

Dann ein Delay von 2ms (der Zahlenwert der Variable pinEingang ist 2)


int pinEingang = 2;

Und die Schleife beginnt von vorne.

Delay ist ein recht unpraktischer Befehl wenn man mehr als eine Sache parallel machen will (Taster abfragen, LED blinken und Servo verfahren)

Als erstes lege mal den Schankenablauf in die bedingte Verzweigung, so daß dieser nur ausgeführt wird, wenn der Taster betätigt wurde.
Damit ist das Loop Verhalten des Servos weg und wird zu einem Eventgesteuerten Verhalten.
Danach sollten die Delays raus und dafür alle Wartezeiten per IRQ oder Timervergleich ausgeführt werden. So kann die CPU auch was machen wärend eine Sache auf das Verstreichen einer bestimmten Zeit wartet.

alterraucher
31.10.2016, 08:16
Hallo i_make_it

danke für Deine Antwort.
Ich habe es jetzt versucht an Stelle vom delay das irq/IRQ ein zusetzten leider gab das wieder eine Fehlermeldung.
Das mit dem Sketch schreiben ist für mich alles andere als einfach. Bin schon am überlegen ob ich den Bahnübergang ohne bewegliche Teile bauen sollte.
Und den Arduino nur per Hand ein und aus schalte, wenn ein Zug sich ankündigt.

Aber es muss doch eine Möglichkeit geben das auch ich das hin bekommen.

Ich habe auch keine Ahnung wie ich jetzt den Tastenbefehl und den Servobefehl in das setup setzten soll und mit dem loop stoppen habe ich auch nicht wirklich verstanden.
Immer diese ANFÄNGER

Gruß
Karsten

i_make_it
31.10.2016, 09:46
Das Programmieren muß man halt erst mal lernen.
Wobei jede Sprache wie bei einer menschlichen Sprache auch eine eigene Syntax und Gramattik hat.
Der Vorteil ist halt, das der Wortschatz und die Regen deutlich weniger sind wie bei menschlichen Sprachen.



den Arduino nur per Hand ein und aus schalte, wenn ein Zug sich ankündigt.

Das wäre noch schlechter wie Suboptimal und da braucht es dann auch keinen Arduino.
Da würde eine Verbindungsorientierte Steuerung aus einem Wechselblinker für die LEDs und einer Schrittschaltkette mit Timern für die Schranke gehen.
Das wiederum ist dann was für Elektroniker.

Fang mal klein an.

Da ich nicht weiß welches Board Du hast, kann ich keine konkreten konkreten Angaben machen.

Erster Sketch, alternierendes Blinken von zwei LEDs mit Delay.

Zweiter Sketch, alternierendes Blinken von zwei LEDs mit Timer bzw. millis() (siehe Beispiel).



//Variablen Deklaration
unsigned long prevmicros = 0;

void setup() {
// Was halt beim Initialisieren so alles einmalig laufen soll
}

void loop() {
// hier kann Code hin
do {
// hier kann Code hin
unsigned long curmicros = millis();
prevmicros = curmicros;
} while (curmicros - prevmicros <= 5000);
// hier kann Code hin
}


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.

........

Sich also Teilproblem für Teilproblem an die Gesammtlösung rantasten.

Klebwax
31.10.2016, 10:43
Eigentlich sollte man ein vernünftiges Buch über C und viele Übungen, am besten am PC mit all seinen Tools, empfehlen. Nun sind aber die Arduinios billiger als ein gutes Buch. Da brauchts dann einen Vorleser ...

MfG Klebwax

cdk
31.10.2016, 13:33
Eigentlich sollte man ein vernünftiges Buch über C und viele Übungen, am besten am PC mit all seinen Tools, empfehlen. Nun sind aber die Arduinios billiger als ein gutes Buch. Da brauchts dann einen Vorleser ...

MfG Klebwax

Im Prinzip hast Du völlig Recht - aber ein Búch über C wird vermutlich mehr Verwirrung stiften als es hilft. Ich würde schon eher eine Lektüre speziell zum Arduino empfehlen. Gerade als Anfänger wird man sonst über die Unterschiede stolpern.

Ich bin für meinen kleinen Horizont ganz gut mit im Internet lesen, ausprobieren und Arduino Kochbuch (https://www.amazon.de/Arduino-Kochbuch-Michael-Margolis/dp/3868993533) hingekommen. Das kann man bis ins 2. Kapitel hinein lesen/überfliegen um eine Grundstruktur zu bekommen und der Rest des dicken Wälzers ist ein wirklich gutes Nachschlagewerk zu allen denkbaren Aspekten rund um dieses Controllerchen.

Genauer gesagt hatte ich mir seinerzeit versehentlich (LOL) die englische Ausgabe Arduino Cookbook (https://www.amazon.de/Arduino-Cookbook-Michael-Margolis/dp/1449313876) gekauft, aber wenn ich mir die deutschen Amazonbewertungen so anschaue ist das wohl eher als Glücksfall zu bezeichnen. Neben einigen Übersetzungsproblemchen hat man bei der deutschen Ausgabe einfach die letzten beiden Kapitel weggelassen und gerade das letzte beschäftigt sich mit der speziellen Arduino-Hardware - das ist für meinen Geschmack wirklich ein tragischer Verlust!

Gruß, Dieter

i_make_it
31.10.2016, 15:08
Ein C Buch lesen wäre eine Möglichkeit, dann kann man die Grundsprache.
Wenn man dann auf C++ umsteigt komm aber noch was Dazu und falls man am PC mit C# anfängt muß man bei Arduino dann wieder einen Schritt zurück machen.

Man kann auch die Arduino Tutorials die es im Internet gibt runterladen und durcharbeiten.
Dann lernt man halt spezifisch für das Zielsystem.

Weil Arduino Buch und vernünftig oder gar Gut und eventuell auf deutsch, weis ich nicht ob es da was gibt.
Ich hatte mir letzten Dezember das "Roboterbauen mit Arduino" geholt.
Nehme ich meine anderen Bücher über den Selbsbau von mobilen Robotern als Referenz, Sage ich mal "wäre schön wenn es das Buch in GUT gäbe".
Momentan steht es im Regal in der Hoffnung das mein Großneffe doch mal wieder weiter machen will.

Dank Internet, findet man da aber zu allem und jedem rund um Arduino auch online was.

Aber egal wie man es macht, die Lernkurve muß halt den eigenen Möglichkeiten angpasst sein, sonst funktioniert weder das eine noch das andere.
Je nach Vorwissen kann man entweder einiges überspringen (Hello world/Blink), oder man muß halt z.B. zu einem Bereich verschiedene Quellen studieren und Übungen durchführen bis der Groschen fällt.

piggituX
31.10.2016, 20:10
es gibt auch diese Sunfounder Kits als Einstieg, da ist die erste Übung schon mal ein blinkende LED meist ;-)

Klebwax
31.10.2016, 22:20
Im Prinzip hast Du völlig Recht - aber ein Búch über C wird vermutlich mehr Verwirrung stiften als es hilft. Ich würde schon eher eine Lektüre speziell zum Arduino empfehlen. Gerade als Anfänger wird man sonst über die Unterschiede stolpern.

Das seh ich anders. Um das grundsätzliche Verständniss von C bzw. C++ kommt man nicht herum. Und das kann man aus der speziellen Arduino Literatur sicher nicht lernen. Beispiele findet man hier im Forum. Da wird schon mal ein Stück Code, das nicht übersetzt, kräftig mit "Semikolons", "geschweiften Klammern" und "Sternchen" nachgewürzt bis der Compiler zufrieden ist. Zielfördernd ist das natürlich nicht. Und der Versuch, den Sourcecode eines fremden Programms (um mal den Begriff "Sketch" zu vermeiden) zu verstehen, wird dann auch scheitern.

Mal etwas ketzerisch formuliert: Eigentlich Ist das Arduino System nicht eines für Anfänger, sondern eher eins für erfahrene Programmierer. Es macht sie schneller, es erspart ihnen das erneute Schreiben von Treibern oder Algorithmen, die sie schon oft geschrieben haben. Die erkennen auch schneller, wie man mit Defiziten von von vorhandenen Libraries/Sketchen umgehen muß. Der Anfänger, der möglicherweise noch nicht mal rudimentär C kann, ist da schnell zweiter Sieger.

MfG Klebwax

i_make_it
01.11.2016, 06:47
Ich denke schon das auch viele C Anfänger mit der Arduino Sprachreferenz und Einsteiger Tutorials
http://www.netzmafia.de/skripten/hardware/Arduino/Arduino_Programmierhandbuch.pdf
C lernen könnten, was ich allerdings zunehmend feststelle ist unabhängig von C, da generell der Trend da ist, weg vom "selbst Denken" und strukturierten, systematischen Vorgehen, hin zu "einfach ein paar Komponenten zusammenstecken". Sei es Hardware oder Software.

Ich merke das heutzutage schon bei vielen Kindern. Ich sehe 10-12 Jährige die mit Lego Mauern ohne Verbund der Steine zusammenstecken (Minecraft lässt grüßen) und das Spielzeug ist scheiße weil das gebaute nicht hällt. Zu meiner Zeit war diese planlose Art zu Bauen üblicherweise bis 6 weg und ab 7-8 wurde mit Fischertechnik komplexe Maschinen gebaut (Grundschule 2-3 Klasse, Werkunterricht).

Die jenigen die das selber denken nicht anfangern und nur planlos copy & paste ausführen, sind dann immer "zweiter Sieger" unabhängig worum es geht.

Bei diesem Tread fand ich es schon gut, das der TE bereits eigenen Code hat und man davon ausgehen kann das der Prozess des Nachdenkens eingesetzt hat. Sprich man kann Denkanstöße geben und auf Fehler in bereits entwickeltem aufmerksam machen.

alterraucher
01.11.2016, 18:43
Hallo 1_make_it,
ich habe zur Zeit einen Arduino uno und wenn meine Lieferung aus China kommt gibt es einen Aruino Nano.
Also etwas habe ich schon ausprobiert und die Servosteuerung finde ich auch echt super.
Leider bringt es mir halt nicht sehr viel wenn ich den Arduino immer wieder wenn er etwas machen soll ein Netzteil ind die Steckdose stecken muss und wenn der Sketch am ende ist und wieder in diesen blöden loop hinein geht den Stecker zu ziehen.

Zu meiner Schulzeit habe ich mit meiner alten Modelleisenbahn herum gebastelt und ganz wilde Relaisstuerungen dafür gebaut.
Also wenn ich das mit dem Bahnübergang so nicht mehr hin bekommen sollte dann bleibt mir nur das mit der Sromversorgnung und einer kleinen Relaissteuerung die halt ein Anfangs und Endpunkt mechanisch steuert.

Jetzt noch einmal einen Versuch...heißt der Schuß ging wieder einmal wie erwartet nach hinten los.
//Variablen Deklaration
unsigned long prevmicros = 0;

void setup() {
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); // Was halt beim Initialisieren so alles einmalig laufen soll
}

void loop() {
// hier kann Code hin
do {
int zustand = digitalRead(pinEingang);
if (zustand == HIGH) {
digitalWrite(pinAusgang, LOW);
} else { //zustand == LOW
}
for (pos = 50; pos <= 150; pos += 1) { //
//
myservo.write(pos); //
delay(50); //
}
delay(20000);
for (pos = 150; pos >= 50; pos -= 1) { //
myservo.write(pos); //
delay(50); // n
}
delay(10000); // hier kann Code hin
unsigned long curmicros = millis();
prevmicros = curmicros;
} while (curmicros - prevmicros <= 5000);
????? // hier kann Code hin
}

Bei den ganzen Fragezeichen da passt ein Code hinein 123 hat er leider auch nicht verstanden!!!

021aet04
01.11.2016, 21:06
Mit Arduino kenne ich mich zwar nicht aus, aber der Code ist extrem unleserlich, da es keine Formatierung gibt. Poste den Code mit den Code Tags (#-Button) und passender Formatierung.

MfG Hannes

i_make_it
02.11.2016, 05:55
So, kann das nicht funktionieren:
Mit copy & paste ohne nachzudenken und die absoluten Grundlagen zu verstehen kann man kein Programm schreiben.
32173


Der Prinzipielle Aufbau eines Arduino Sketchs:
void setup() //wird genau einmal ausgeführt.
void loop() // wird als Endlosschleife (loop) immer wieder ausgeführt.



Ich denke schon das auch viele C Anfänger mit der Arduino Sprachreferenz und Einsteiger Tutorials
http://www.netzmafia.de/skripten/hardware/Arduino/Arduino_Programmierhandbuch.pdf
C lernen könnten,

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.


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.

alterraucher
02.11.2016, 17:13
Hallo,
ich wollte nur das ich einen BÜ zum laufen bringe mit so einem Arduino uno und nicht an weinem Wettbewerb teilnehmen bin unsportlich ; )

Es gibt einfach keinen Sketch mit dem ich mein Servo so ansteuern kann wie ich es brauche.


#include <Servo.h>

Servo myservo;

int pos = 0;

void setup() {
myservo.attach(9);
}

void loop() {
for (pos = 0; pos <= 150; pos += 1) { // Servo fährt von 0° bis 150°
// in steps of 1 degree
myservo.write(pos); // Servo soll zu der variabelen POS fahren
delay(15); // in diesem Zeitraum soll der Servo den Weg von 0-150 fahren
delay(5000); // Servo soll in dieser POS variabel warten
}
for (pos = 150; pos >= 0; pos -= 1) { // Servo soll von 150° auf 0° fahren
myservo.write(pos); // Servo soll zu der variabelen POS fahren
delay(15); // in diesem Zeitraum soll der Servonn den Weg von 150-0 fahren
delay(5000); // Servo soll in dieser POS variabel warten
}
}


So und mit diesem Sketch werde ich nun meine ganzen Sorgen mit den blöden Tastern einprogrammieren los.
Da ich ja sowieso einige Reedkontakte verarbeiten muss kann ich auch gleich mit einem Bistabilenrelais die Stromversorgung ein und aus schalten dann komme ich auch zurecht.
Das blinken werde ich dann mit einem zweiten Arduino und einem Blinksketch paralell betreiben.
Es hat funktioniert.
Danke für Euer Bemühen und weiter hin alles Gute.
Hochachtungsvoll ;-)

i_make_it
02.11.2016, 19:27
Wenn man gar nichts selbst machen will, kann man auch einfach das freundliche Modellbahn Forum nebenan, anstelle des Roboter Forums, fragen.
Google ist Dein Freund!

https://www.google.de/?gws_rd=ssl#q=modellbahn+arduino+bahnschranke


http://www.stummiforum.de/viewtopic.php?t=123040

alterraucher
02.11.2016, 19:52
ja das ist ja schon einmal gut aber es kann keine Servos steuern, da die Produkte die der Modellbauer verarbeitet hat keine Servos direkt am Arduino betreiben.

Aus diesem Grund habe ich mir hier etwas mehr erhofft!

Danje noch einmal für die LINKS gehe gleich noch einmal etwas stöbern!

alterraucher
24.11.2016, 22:29
Hallo,
nun habe ich diesen alten Sketch erst einmal endsorgt.
Ich muss ganz anders an diese Sache heran gehen.
Ein Kollege hat mich beim Schreiben super unterstützt, da ich mich bisher nur an der Oberfläche befinde und es noch nicht geschafft habe mich in der kurzen Zeit soweit einzulesen.
Der neue Sketch ist so ganz ohne ein DELAY ausgekommen und durch Timer ersetzt worden.
Ich kann den Sketch nun noch weiter ausbauen und dann werde ich das geschriebene einmal hier mit hinein stellen.
Auch die Gundeinstellungen beim ARDUINO 1.6.12 ide habe ich jetzt ordentlich eingerichtet bekommen.

Etwas Zeit brauche ich aber noch bis die ersten Bilder hier hochgeladen werden.

Bis dem nächst!

alterraucher
13.02.2017, 06:14
Hallo,
nun gibt es auch einmal ein kleines Bild von meiner Baustelle Die einzelnen Komponeten zum testen verdrahtet.
32413

Der Sketch wird dann beim nächsten Mal folgen.

Gruß alterraucher

Ceos
13.02.2017, 07:24
Okay ich steig hier etwas Spät ein, wollte aber meine Erfahrung mit Modellbau und der Funktionsweise von Schranken ergänzen.

Üblicherweise arbeiten Schranken mit einem Gegengewicht, welches die Schranken immer in die offene Position zieht. Das ist relativ delikat ausbalanciert. Gesenkt werden die Schranken dann üblicherweise mit einem Seilzug (aus der Vergangenheit her) ... modernere Schranken werden teilweise mit einem Zahnradsystem betrieben haben aber ebenfalls ein Gegengewicht und eine Art Durchrutschsystem, wenn ein Hindernis die Schranke blockiert.

Im Modell verwendet man sehr häufig das gleiche Prinzip (Ausblanaciertes Gewicht + Zugkraft zu schließen) und zieht die Schranken dann einfach mit einem kleinen Gestänge einem Magneten und einer Spule nach unten. Vorteil ist das authentische wippen wenn die Schranke auf den Stützbock aufschlägt bzw. wenn sie öffnet. Und man braucht nur Strom auf die Spule geben, ohne irgendwelche Servos. Auch wenn die Digitalisierung höchst Lobenswert ist :)

alterraucher
13.02.2017, 11:44
Hallo Ceos,
ja soweit habe ich das auch verstanden. Da ich etwas mehr als nur eine H0 H0e Anlage habe...bei der Selfkantbahn angefangen und immer noch dabei und zum guten Schluß auch noch bei der DB aushelfe im Museum Koblenz!
Die Schrankenanlage die ich als Bausatz mir gekauft habe Auhagen Halbschranken.
Eine einfache Funktion einen dünnen Draht am Servoarm befestigen das andere Ende wird durch die kleine Öse am Schrankenbau gefädelt und fertig ist das ganze.
Auch Faller Bausätze haben solche Ösen am Schranckenbaum wo man einen Draht zum ansteuern einfädeln kann.
Das Wippen der Schrankenbäume an den Endlagen kann man ohne weiteres durch programmieren hin bekommen, nur bei einer Halbschrankenanlage ist das meiner Meinung nach zuviel des guten;)

- - - Aktualisiert - - -

Hallo und nun der Sketch:


#include <Servo.h> // Variablen-Deklaration und Definition

// das ist für die Servoantriebe und muss überall wo es um die Schranke geht mit hinter die laufzahl geschrieben werden!
int Kreuz1 = 13; // BITTE NICHT IN KREUZ1 UMSCHREIBEN das geht NICHT!!!!
int Kreuz2 = 12;
int Kreuz3 = 11;
int Kreuz4 = 8;
int Kreuz5 = 5;
int Reed1 = 6;
int Reed2 = 7;

int buttonState = 0;

int Schranke1 = 9;
int Schranke2 = 10;

unsigned int TimerSchrankeZu = 0;

Servo Schranke1a; // das a hinter der Zahl ist wichtig und darf nicht vergessen werden!
Servo Schranke2a;

unsigned long aktMillis, vorMillis; // aktuelle Millisekunden und vorherige

byte b = 0;


boolean KreuzAnAus = LOW; // boolean Kreuz1-x an low werden über internenwiederstand angeschlossen auch ein relais an kreuz3 wird zum läutwerk geschaltet
boolean Kreuz2AnAus = LOW;
boolean Kreuz3AnAus = LOW;
boolean Kreuz4AnAus = LOW;
boolean Kreuz5AnAus = LOW; // hier wird das alte spulenläutwerk über ein relais mit optokoppler angesteuert!!!
boolean blink100ms = LOW;
boolean blink500ms = LOW;
boolean blink1000ms = LOW;

//boolean Schranke1u2SollZu = LOW;

// Funktionsdeklaration
void Funktion100ms();




void setup() // put your setup code here, to run once:
{

aktMillis = vorMillis = 0;

pinMode(Kreuz1, OUTPUT);
pinMode(Kreuz2, OUTPUT);
pinMode(Kreuz3, OUTPUT);
pinMode(Kreuz4, OUTPUT);
pinMode(Kreuz5, OUTPUT);
pinMode(Reed1, INPUT);
pinMode(Reed2, INPUT);
digitalWrite(Reed1, HIGH);
digitalWrite(Reed2, HIGH);
Schranke1a.attach(Schranke1);
Schranke2a.attach(Schranke2);
Schranke1a.write(10);
Schranke2a.write(7);


}




void loop() // put your main code here, to run repeatedly:
{

aktMillis = millis();

if( aktMillis < vorMillis ) // Wird Bei Variablenüberlauf zurücgesetzt
aktMillis = vorMillis = 0;



if( aktMillis - vorMillis >= 100)
{
Funktion100ms();
}

buttonState = digitalRead(Reed1);

if(buttonState == LOW)
{ // Schranken ZU
KreuzAnAus = HIGH;
TimerSchrankeZu = 30; // Timer auf Wunschzeit setzen auf 3 Sekunden

}
else
{
buttonState = digitalRead(Reed2);


if(buttonState == LOW)
{ // Schranken AUF
KreuzAnAus = LOW;
Schranke1a.write(10);
Schranke2a.write(7);
TimerSchrankeZu = 0; // Timer Reset nicht zwingend erforderlich
}
}


digitalWrite(Kreuz1, KreuzAnAus && blink500ms);
digitalWrite(Kreuz2, KreuzAnAus && !blink500ms); // ausrufezeichen kehr die funktion um!!!
digitalWrite(Kreuz3, KreuzAnAus && blink500ms);
digitalWrite(Kreuz4, KreuzAnAus && !blink500ms);
digitalWrite(Kreuz5, KreuzAnAus && !blink500ms); //ist der anschlußpin für das läutwerk-relais!!
}

// Die Funktion 100ms wird alle 100 ms aufgerufen
void Funktion100ms()
{
b++;

if(b == 0)
b = 1;

blink100ms = !blink100ms;

if((b % 5) == 0 )
blink500ms ^= 1;

if((b % 10) == 0 )
blink1000ms ^= 1;


if(TimerSchrankeZu > 0) // Ist Timer/Zähler > 0 ?
{//ja
TimerSchrankeZu--;

if((TimerSchrankeZu == 0) && KreuzAnAus)
{
Schranke1a.write(100);
Schranke2a.write(95);
}


}

vorMillis = aktMillis;
}

inka
13.02.2017, 16:58
also was vor allem fehlt sind die code tags

für die bearbeitung des posts:


text markieren, codebutton # anklicken, fertig

i_make_it
14.02.2017, 07:40
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.
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.

alterraucher
14.02.2017, 11:39
ach nu guck!
Ich habe mir da so einiges überlegt und dann habe ich mich an die Sache heran gewagt.
Warum machen so viele PINs invetiert die gleiche Sache...4x Wechselblinker und dazu passend meine alte Faller Klingel die leider mit Wechselstrom funzonürt.
Dann die Zwei Servos für je einen Schrankenbaum und halt die zwei PINs für die Gleis/REED Kontakte zum ein und aus schalten.
Und somit sind 3,5eus gut angelegt und diese kleinen I/O Terminals finde ich für eine saubere Montage genau richtig. Wenn man unter der Anlage liegt und das ganze verdrahten darf, wird die sache recht einfach.
Ich helfe in zwei Eisenbahnmuseen aus das ist richtig, aber da arbeite ich mit den größeren Spurweiten!
Das kleine Gerassel ist mein privates Vergnügen, da gibt es für die zwei Stichstrecken je einen beschrankten BÜ und das in verschiedenen Anlagenteilen.
Aus diesem Grund macht ein Arduino Nano auch nur einenn BÜ und nicht mehr!

Bis den...