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!
Geändert von alterraucher (13.02.2017 um 06:09 Uhr)
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![]()
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
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;
}
Geändert von alterraucher (14.02.2017 um 06:50 Uhr)
Lesezeichen