RE: ARDUINO steuert einen Bahnübergang 1

#1 von alter Raucher , 07.10.2017 08:36

Moin zusammen,
ich habe auf meinem Rechner noch ein Sketch gefunden womit man einen Arduino z.B. Nano einen Bahnhübergang sicher lassen kann.

Hier sind die Einzelteile der Nano zwei Servos und zwei Relais zu sehen.

Der BÜ wird mit 4 LEDs ausgerüstet und mit einer Faller Klingel oder Türklingel wenn man einen DDR BÜ nachbauen möchte!
Das zweite Relais ist nach dem Einschalten der Sicherung dauerhaft geschaltet und fällt beim Ausschalten ab!

Die LEDs fehlen hier noch und die zwei Reedkontakte die im Gleis angebracht werden müssen sind auch noch nicht angeschlossen.
Dafür hatte ich bisher keine Zeit, da meiner Modelleisenbahn noch lange nicht soweit ist.
Aus diesem Grund liegt das ganze Projekt noch in der Stapelbox mit einer kleinen Anschlußzeichnung.

Hier ist der Sketch damit das ganze auch bei anderen Anlagen zum Einsatz kommen kann!!

---------------------------------------------------------------------------------------------------------------------------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
 
#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;
}
 
 



--------------------------------------------------------------------------------------------------------

Vielleicht kann das ja einer von Euch brauchen?
Dann viel Spass bei der BÜ-Sicherung

Gruß
Karsten


Für Klugscheißerei und Neid nehme ich mir KEINE Zeit!
www.rafeba.de.tl
nicht jeder PC mag das .de.tl !!!
Das Maß ist VOLL und ich brauche eine neue Homepage!
www.rafeba02.de.tl


 
alter Raucher
InterCity (IC)
Beiträge: 659
Registriert am: 16.07.2017
Spurweite H0, H0e, G
Steuerung RC Steuerung für livesteam Loks


RE: ARDUINO steuert einen Bahnübergang 1

#2 von alter Raucher , 21.01.2018 10:02

Moin zusammen,
gestern habe ich diesen Sketch testen können auf einer N-Anlage ist mein erster Bü in Betrieb gegangen.
Leider konnten wir keine Reedkontakte verbauen und mussten zwangsläufig auf LDR-Module zurück greifen.
Diese LDR-Module geben aber einen Dauerimpuls raus/die ganze Zuglänge.
Jetzt habe ich einen weiteren Nano programmiert mit einem Wandlersketch und mit diesem neuen Sketch wird der Dauerimpuls zu einem Kurzimpuls gewandelt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
/*Taster drücken LED blinkt kurz und stopt!  DER  WANDLER  SKETCH
es werden vier LDR-Module angeschlossen, je zwei LDR-Module schalten einen Ausgang.
Das ist eine Verriegelung und soll einen Dauerimpuls am Schrankensketch Nano verhindern!
*/
int pinREED = 14;
int pinLED1 = 3;
int pinREED1 = 15;
int pinREED2 = 16;
int pinLED2 = 4;
int pinREED3 = 17;
 
void setup() {
pinMode(pinREED, INPUT_PULLUP); // 10Kohm Wiederstand ist gesetzt
pinMode(pinLED1, OUTPUT); // Schaltausgang zum EINSCHALT-Relais BUE-Sicherung
pinMode(pinREED1, INPUT_PULLUP); // 10Kohm Wiederstand ist gesetzt
pinMode(pinREED2, INPUT_PULLUP); // 10Kohm Wiederstand ist gesetzt
pinMode(pinLED2, OUTPUT); // Schaltausgang zum EINSCHALT-Relais BUE-Sicherung
pinMode(pinREED3, INPUT_PULLUP); // 10Kohm Wiederstand ist gesetzt
}
 
void loop() {
int zustand = digitalRead(pinREED); // Nun LDR tu was...
if (zustand == HIGH){ //zustand ist aus!!
digitalWrite(pinLED1, LOW);}
else { //zustand ein!!
digitalWrite(pinLED1, HIGH); // Aus einem Dauerimpuls vom LDR wird jetzt ein Kurzerimpuls
delay(100);// an dieser Stelle kann man die Schaltimpulslänge einstellen!
digitalWrite(pinLED1,LOW);// anstelle einer LED kann man auch ein Realis ansteuern!
delay(2000);// das ist die Pufferzeit bis der Arduino wieder bei Tastendruck losläuft!
}
int zustand1 = digitalRead(pinREED1); // Nun LDR tu was...
if (zustand1 == HIGH){ //zustand ist aus!!
digitalWrite(pinLED1, LOW);}
else { //zustand ein!!
digitalWrite(pinLED1, HIGH); // Aus einem Dauerimpuls vom LDR wird jetzt ein Kurzerimpuls
delay(100);// an dieser Stelle kann man die Schaltimpulslänge einstellen!
digitalWrite(pinLED1,LOW);// anstelle einer LED kann man auch ein Realis ansteuern!
delay(2000);// das ist die Pufferzeit bis der Arduino wieder bei Tastendruck losläuft!
}
 
int zustand2 = digitalRead(pinREED2); // Nun LDR tu was...
if (zustand2 == HIGH){ //zustand ist aus!!
digitalWrite(pinLED2, LOW);}
else { //zustand ein!!
digitalWrite(pinLED2, HIGH); // Aus einem Dauerimpuls vom LDR wird jetzt ein Kurzerimpuls
delay(100);// an dieser Stelle kann man die Schaltimpulslänge einstellen!
digitalWrite(pinLED2,LOW);// anstelle einer LED kann man auch ein Realis ansteuern!
delay(2000);// das ist die Pufferzeit bis der Arduino wieder bei Tastendruck losläuft!
}
int zustand3 = digitalRead(pinREED3); // Nun LDR tu was...
if (zustand3 == HIGH){ //zustand ist aus!!
digitalWrite(pinLED2, LOW);}
else { //zustand ein!!
digitalWrite(pinLED2, HIGH); // Aus einem Dauerimpuls vom LDR wird jetzt ein Kurzerimpuls
delay(100);// an dieser Stelle kann man die Schaltimpulslänge einstellen!
digitalWrite(pinLED2,LOW);// anstelle einer LED kann man auch ein Realis ansteuern!
delay(2000);// das ist die Pufferzeit bis der Arduino wieder bei Tastendruck losläuft!
}
} // nun wartet die Steuerung bis der nächste mal der Taster gedrückt wird!
 
 



Dann geht es bald wieder an die N-Anlage zum testen.

Bis bald Gruß
Karsten


Für Klugscheißerei und Neid nehme ich mir KEINE Zeit!
www.rafeba.de.tl
nicht jeder PC mag das .de.tl !!!
Das Maß ist VOLL und ich brauche eine neue Homepage!
www.rafeba02.de.tl


 
alter Raucher
InterCity (IC)
Beiträge: 659
Registriert am: 16.07.2017
Spurweite H0, H0e, G
Steuerung RC Steuerung für livesteam Loks


   


  • Ähnliche Themen
    Antworten
    Zugriffe
    Letzter Beitrag
Xobor Einfach ein eigenes Forum erstellen
Datenschutz