RE: Arduino: Weichenstellung mit Servos, Fahrstraße, Bitte um Hilfe

#1 von Trainworld , 28.10.2019 22:03

Hallo in die Runde,

vorab, ich bin noch relativer Neuling, was das Arduino-Thema betrifft; habe mich aber schon durch einige Seiten (auch hier Moba-Tools) und einige Lektüre "gekämpft". Und auch schon so die ersten Probeaufbauten auf dem Board hinter mir. Aber leider noch keine Lösung gefunden, die das "macht", was ich mir vorgestellt hatte...
Ich wollte bei der im Bau befindlichen Anlage im Bahnhofsbereich die Weichen mittels Servo über Taster stellen, allerdings jeweils als komplette Fahrstraße.



Fahrstraße Gleis 1 und 2 sollte also jeweils Servo 1 - 4 in die entsprechenden Stellungen bringen, W1 abzw., W2 abzw. W3 abzw., W4 abzw. für Fahrstraße Gl. 1, W1 - W4 gerade für Fahrstraße Gl. 2. Soweit, so gut... - oder aber eben auch nicht.
Zuerst folgte, quasi als Einarbeitung, ein Testaufbau mit einem Servo und den zwei Tastern, auch um Winkel und Stellgeschwindigkeit als groben Anhalt zu ermitteln. Mittels den Moba-Tools und entsprechendem Sketch kein so großes Problem. Nur den Sketch leicht angepasst, verschiedene Stellgeschwindigkeiten probiert und den ungefähren Stellwinkel ermittelt. Sieht dann so aus:

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
 
#include <MobaTools.h>
 

const int tasterPin1 = 2; //Taster1 Pin 2
const int tasterPin2 = 3; //Taster2 Pin 3
const int servoPin1 = 9; // Anschluß für den Servo 1
 

int tasterStatus1, tasterStatus2;
Servo8 ServoW1;
 
void setup() {
pinMode(tasterPin1);
pinMode(tasterPin2);

ServoW1.attach(servoPin1); //Servo an Pin 9
ServoW1.setSpeed( 5 ); // Verfahrgeschwindigkeit einstellen
 
}
 
void loop() {
tasterStatus1 = digitalRead(tasterPin1);
tasterStatus2 = digitalRead(tasterPin2);
 
if (tasterStatus1 == HIGH && ServoW1.moving() == 0 ) {
ServoW1.write(10); //wird langsam drehen
delay(100);
}
 
if (tasterStatus2 == HIGH && ServoW1.moving() == 0 ) {
ServoW1.write(70); //wird langsam drehen
delay(100);
}
 
delay(20);
 
}
 
 



Funktioniert alles einwandfrei; nun wollte ich aber alle vier Servos über den Sketch schalten mittels eben der zwei Taster Fahrstraße 1 und 2. Habe also versucht, den Sketch dahingehend zu erweitern, gelesen hatte ich ja mehrfach, daß man bis zu 16 Servos über den Arduino (in diesem Falle der Mega) schalten kann. Aber vier hätten schon mal gereicht, Vorab aber versuchte ich erst mal, einen zweiten Servo einzubinden mittels Codeerweiterung:

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
 
#include <MobaTools.h>
 

const int tasterPin1 = 2; //Taster1 Pin 2
const int tasterPin2 = 3; //Taster2 Pin 3
int servoPin1 = 9; // Anschluß für den Servo 1
int servoPin2 = 7; // Anschluß für den Servo 2
 

int tasterStatus1, tasterStatus2;
Servo8 ServoW1;
Servo8 ServoW2;
 
void setup() {
pinMode(tasterPin1, INPUT_PULLUP); // so ist kein externer pullup Widerstand am
pinMode(tasterPin2, INPUT_PULLUP); // Taster erforderlich

ServoW1.attach(servoPin1); //Servo an Pin 9
ServoW1.setSpeed( 5 ); // Verfahrgeschwindigkeit einstellen

ServoW2.attach(servoPin2); //Servo an Pin 7
ServoW2.setSpeed( 5 ); // Verfahrgeschwindigkeit einstellen
}
 
void loop() {
tasterStatus1 = digitalRead(tasterPin1);
tasterStatus2 = digitalRead(tasterPin2);
 
if (tasterStatus1 == HIGH && ServoW1.moving() == 0 ) {
ServoW1.write(10); //wird langsam drehen
delay(100);
}
 
if (tasterStatus2 == HIGH && ServoW1.moving() == 0 ) {
ServoW1.write(70); //wird langsam drehen
delay(100);
}
 
if (tasterStatus1 == HIGH && ServoW2.moving() == 0 ) {
ServoW2.write(10); //wird langsam drehen
delay(100);
}
 
if (tasterStatus2 == HIGH && ServoW2.moving() == 0 ) {
ServoW2.write(70); //wird langsam drehen
delay(100);
}
 
delay(20);

}
 
 



Beim Kombilieren meldet mir der Arduino zumindest keine Fehler; aber das war's aber auch schon. ServoW1 macht nach wie vor, das was er soll, verfahren über die Taster 1 und 2, aber ServoW2 gibt keinerlei Lebenszeichen von sich. Vielleicht habe ich ja einen generellen Denkfehler in meinen Überlegungen als Neuling in der Materie? Oder die Servos müssen in ganz anderer Reihenfolge angesprochen werden? Auch zum zeitlichen Versetzen habe ich noch keinen Lösungsansatz; mein Gedanke war, es sollte doch möglich sein, Servo W1-W4 nach der Reihe so anzusprechen, daß bei Betätigen des Tasters die Servos nicht gleichzeitig sondern hintereinander verfahren. Also, wenn W1 fertig ist und die Endlage erreicht hat, fährt W2, usw.. Die Überlegung dabei war eine gewisse Resourcenschonung, weil vier gleichzeitig fahrende Servos doch einiges mehr an Strom brauchen, als wenn jeder Servo nacheinander fährt. Aber das ist noch nicht die Hauptsorge, erst würde ich gerne mal erreichen, daß eben mehrere Servos miteinander über die zwei Taster verfahren können.
Einer meiner Gedanken war auch der Einsatz des PCA 9685 von Adafruit, besorgt hatte ich ihn mir schon. Aber bislang gelang es mir nicht, mit dem Shield Einfluß auf die Stellgeschwindigkeit zu nehmen. Es ist zwar möglich, die Servos mittels Adresse seperat anzusprechen, klar, aber Hinweise darauf, wie man mit dem PCA auch die Geschwindigkeit und den Winkel bestimmen kann, konnte ich bislang noch nicht finden, leider...

Vielleicht kann der eine oder andere "alte Hase" hier mir den Weg weisen, wo mein Denkfehler liegt, bzw. ob meine Überlegung(en) so überhaupt funktionieren könnte.

Grüßt mit schon mal vorauseilendem Dank
Roland


 
Trainworld
Beiträge: 7
Registriert am: 19.02.2008
Homepage: Link
Ort: Gelsenkirchen
Gleise verschiedene
Spurweite N
Steuerung Eigenbau
Stromart DC, Digital, Analog


RE: Arduino: Weichenstellung mit Servos, Fahrstraße, Bitte um Hilfe

#2 von hmarx , 30.10.2019 18:18

Hallo Roland,

ich habe nun erstmals die MobaTools ausprobiert und kann dir folgenden Code anbieten, um dich einzuarbeiten.
Die Tasten sind LOW-aktiv mit internem Pullup. Die Weichen werden nacheinander angesteuert.

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
 

#include <MobaTools.h>
// MobaTools 1.1.4
// _2019-10-29_MobaTools_2
 
const int tasterPin1 = 2; //Taster1 Pin 2
const int tasterPin2 = 3; //Taster2 Pin 3
int servoPin1 = 9; // Anschluss fuer den Servo 1
int servoPin2 = 7; // Anschluss fuer den Servo 2
int servoW1RechtsPos = 70;
int servoW1LinksPos = 10;
int servoW2RechtsPos = 70;
int servoW2LinksPos = 10;
int servoPos1 = 0;
int servoPos2 = 0;
byte FS1 = 0; // Fahrstrasse 1
byte FS2 = 0; // Fahrstrasse 2
int do_init = 1;
int tasterStatus1, tasterStatus2;
Servo8 ServoW1;
Servo8 ServoW2;
 
void setup() {
//Serial.begin(19200);
pinMode(tasterPin1, INPUT_PULLUP); // so ist kein externer pullup Widerstand am
pinMode(tasterPin2, INPUT_PULLUP); // Taster erforderlich

ServoW1.attach(servoPin1, true); //Servo an Pin 9, autoOff = true
ServoW1.setSpeed(8); // Verfahrgeschwindigkeit einstellen

ServoW2.attach(servoPin2, true); //Servo an Pin 7, autoOff = true
ServoW2.setSpeed(8); // Verfahrgeschwindigkeit einstellen
do_init = 1;
}
 
void loop() {
if (do_init == 1) {
ServoW1.write(servoW1LinksPos); // ServoW1 soll nach Linksposition drehen
ServoW2.write(servoW2LinksPos); // ServoW2 soll nach Linksposition drehen
do_init = 0;
}
tasterStatus1 = digitalRead(tasterPin1);
tasterStatus2 = digitalRead(tasterPin2);
 
if (tasterStatus1 == LOW) { // Taster 1
FS1 = 1; // Fahrstrasse 1
}
if (tasterStatus2 == LOW) { // Taster 2
FS2 = 1; // Fahrstrasse 2
}
servoPos1 = ServoW1.read();
servoPos2 = ServoW2.read();
//Serial.print("FS1: "); Serial.print(FS1); Serial.print(" FS2: "); Serial.print(FS2); Serial.print(" Pos1: "); Serial.print(servoPos1); Serial.print(" Pos2: "); Serial.println(servoPos2);
if (FS1 == 1 && servoPos1 != servoW1LinksPos ) { // falls FS1 und ServoW1 nicht in Linksposition
ServoW1.write(servoW1LinksPos); // ServoW1 soll nach Linksposition drehen
}
if (FS2 == 1 && servoPos1 != servoW1RechtsPos ) { // falls FS2 und ServoW1 nicht in Rechtsposition
ServoW1.write(servoW1RechtsPos); // ServoW1 soll nach Rechtsposition drehen
}
if (FS1 == 1 && servoPos1 == servoW1LinksPos && servoPos2 != servoW2LinksPos) { // falls FS1 und ServoW1 in Linksposition und ServoW2 nicht in Linksposition
ServoW2.write(servoW2LinksPos); // ServoW2 soll nach Linksposition drehen
}
if (FS2 == 1 && servoPos1 == servoW1RechtsPos && servoPos2 != servoW2RechtsPos) { // falls FS2 und ServoW1 in Rechtsposition und ServoW2 nicht in Rechtsposition
ServoW2.write(servoW2RechtsPos); // ServoW2 soll nach Rechtsposition drehen
}
if (servoPos1 == servoW1LinksPos && servoPos2 == servoW2LinksPos) { // falls ServoW1 in Linksposition und ServoW2 in Linksposition
FS1 = 0; // FS1 gestellt
}
if (servoPos1 == servoW1RechtsPos && servoPos2 == servoW2RechtsPos) { // falls ServoW1 in Rechtsposition und ServoW2 in Rechtsposition
FS2 = 0; // FS2 gestellt
}
}
 
 



Man kann es viel optimaler und professioneller programmieren und muß man auch für größere Anlagen.
Die MobaTools finde ich insbesondere für Anfänger sehr gut.

Ich setze auch den PCA 9685 ein. Das erfordert aber auch etwas mehr Aufwand. So speichere ich die Servostellungen in zusätzlichem RAM,
steuere auch über I2C Relais zur Herzstückpolarisierung an und melde über S88 die Weichenstellung an mein Steuerprogramm auf dem PC.
Außerdem habe ich keinerlei Servozucken.


klca hat sich bedankt!
hmarx  
hmarx
InterRegioExpress (IRE)
Beiträge: 264
Registriert am: 20.05.2016
Ort: Windeck
Gleise Roco Line o.B.
Spurweite H0
Steuerung Lenz LZV200, ModellStw, Arduino
Stromart DC, Digital


RE: Arduino: Weichenstellung mit Servos, Fahrstraße, Bitte um Hilfe

#3 von Trainworld , 31.10.2019 00:29

Hallo Heinz,

ich danke dir schon mal im Voraus, antesten werde ich den Aufbau wohl jetzt am langen Wochenende. Das wäre schon mal ein wenig "Licht am Horizont". Ich hatte mir so schön und einfach vorgestellt mit dem Arduino. Und in den letzten beiden Wochen, seit ich mich mit dem Teil beschäftige, bin ich ganz schön ins Grübeln gekommen...

Gottseidank ist es ja eine eher kleine Anlage, zudem wird die Herzstückpolarisierung wahrscheinlich mit Microschaltern am Servohalter "rein analog" gelöst werden.

Aber nochmals Dank und

viele Grüße
Roland


 
Trainworld
Beiträge: 7
Registriert am: 19.02.2008
Homepage: Link
Ort: Gelsenkirchen
Gleise verschiedene
Spurweite N
Steuerung Eigenbau
Stromart DC, Digital, Analog


RE: Arduino: Weichenstellung mit Servos, Fahrstraße, Bitte um Hilfe

#4 von MicroBahner , 31.10.2019 12:39

Hallo Roland,
bist Du sicher alles richtig angeschlossen zu haben? Ich habe deinen Sketch für die 2 Servos bei mir ausprobiert. Da laufen beide Servos.


viele Grüße
Franz-Peter
Ein 'elektromechanisches' Stellwerk
Der (ehemalige) 'Eisberg'


 
MicroBahner
Metropolitan (MET)
Beiträge: 2.833
Registriert am: 28.11.2012
Ort: Mittelfranken
Gleise Tillig Elite
Steuerung Eigenbau
Stromart Analog


RE: Arduino: Weichenstellung mit Servos, Fahrstraße, Bitte um Hilfe

#5 von Trainworld , 01.11.2019 16:05

Hallo Franz-Peter, hallo Stummis,

du hast recht, der Sketch war/ist in Ordnung, ich bin auf den Fehler gekommen, der mir bei so vielen Versuchen Kopfzerbrechen bereitet hat! Ein eigentlich dummer Fehler, wenn man im Nachhinein so drüber nachdenkt: "doppelte" Stromversorgung! Gewarnt vor der Stromhungrigkeit der Servos und daß man es tunlichst unterlassen sollte, mehr als einen Servo direkt über den Arduino zu betreiben, habe ich natürlich zu einer externen 5V-Einspeissung gegriffen. Und dabei nicht nachgedacht. Testschaltung aufgebaut, natürlich mit externer Einspeissung, USB dran, IDE aufgerufen, Sketch hochgespielt... - und die Servos fingen nach einmaligem Tastendruck an, hin und her zu winken. Waren auch gar nicht mehr "zu bremsen", zwar in der aufgerufenen Geschwindigkeit und im richtigen Winkel, aber eben ruhelos und jegliches erneutes Drücken des einen oder anderen Tasters bewirkte nix. Der LM 317 auf der externen Einspeissung wurde trotz Kühlkörper dabei auch "schön warm". Zurückgebaut auf einen Servo, "plötzlich" selber Effekt, obwohl ich den Aufbau gefühlte 100 mal überprüft hatte und der Aufbau mit dem einen Servo ja schon ein Dutzend mal funktioniert hatte. Dann kam mir der Gedanke, die externe Stromversorgung wieder abzutrennen, mit dem einen Servo hatte er ja auch über USB funkioniert. Und schon war der "Wurm" gefunden! Nun USB ab, externe Stromversorgung ran, zweiten Servo angesteckt... - und es funzt tatsächlich, beide fahren einträchtig im Takt und schön langsam nach Drücken eines der beiden Taster auf ihre Winkelpositionen...
Und, ja, ich weiß, es gibt keine "dummen Fehler" im Aufbau, der "Fehler" sitzt in der Regel davor *lach*...

Nun werde ich mir mal Gedanken darüber machen, wie ich den Sketch dazu bringen kann, die Servos nacheinander zu verfahren, nicht gleichzeitig...

Danke auch dir natürlich und Grüße
Roland


klca hat sich bedankt!
 
Trainworld
Beiträge: 7
Registriert am: 19.02.2008
Homepage: Link
Ort: Gelsenkirchen
Gleise verschiedene
Spurweite N
Steuerung Eigenbau
Stromart DC, Digital, Analog


RE: Arduino: Weichenstellung mit Servos, Fahrstraße, Bitte um Hilfe

#6 von schmiedi , 01.11.2019 17:44

Hallo Roland,

zu Deinem Problem mit der seqentiellen Ansteuerung der Servos möchte ich Dich auf ein sehr gutes Tutorial von Franz-Peter (zum Thema endliche Automaten) hinweisen: viewtopic.php?f=21&t=163493
Mit dem dort beschriebenen Rüstzeug sollte das Problem in den Griff zu bekommen sein...

Viele Grüße,
Dieter


Der Zug zur Besichtigungstour "Rund um Steinen":


 
schmiedi
InterRegioExpress (IRE)
Beiträge: 446
Registriert am: 07.07.2015
Homepage: Link
Spurweite H0
Steuerung Arduino, Eigenbau
Stromart DC, Analog


RE: Arduino: Weichenstellung mit Servos, Fahrstraße, Bitte um Hilfe

#7 von Trainworld , 01.11.2019 22:53

Hallo in die Runde,

Dieter, zuerst dir Dank für den Hinweis, mir qualmt gerade schon der Kopf...

Ampelsteuerung war vor vielen Jahren die Abschlußaufgabe für die SPS-Zertifizierung mit der Simatic S7. Wobei es dort eher eine Timer- und Abhängigkeitsaufgabe ist, die SPS ist ja rein serielles "Single-Tasking".

Ich habe jetzt den Sketch erweitert und getestet für die benötigten 4 Servos:

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
 

#include <MobaTools.h>
 

const int tasterPin1 = 2; //Taster1 Pin 2
const int tasterPin2 = 3; //Taster2 Pin 3
int servoPin1 = 4; // Anschluß für den Servo 1
int servoPin2 = 5; // Anschluß für den Servo 2
int servoPin3 = 6; // Anschluß für den Servo 3
int servoPin4 = 7; // Anschluß für den Servo 4
 
int tasterStatus1, tasterStatus2;
Servo8 ServoW1;
Servo8 ServoW2;
Servo8 ServoW3;
Servo8 ServoW4;
 
void setup() {
pinMode(tasterPin1, INPUT_PULLUP); // so ist kein externer pullup Widerstand am
pinMode(tasterPin2, INPUT_PULLUP); // Taster erforderlich

ServoW1.attach(servoPin1); //Servo an Pin 4
ServoW1.setSpeed( 5 ); // Verfahrgeschwindigkeit einstellen

ServoW2.attach(servoPin2); //Servo an Pin 5
ServoW2.setSpeed( 5 ); // Verfahrgeschwindigkeit einstellen

ServoW3.attach(servoPin3); //Servo an Pin 6
ServoW3.setSpeed( 5 ); // Verfahrgeschwindigkeit einstellen

ServoW4.attach(servoPin4); //Servo an Pin 7
ServoW4.setSpeed( 5 ); // Verfahrgeschwindigkeit einstellen
}
 
void loop() {
tasterStatus1 = digitalRead(tasterPin1);
tasterStatus2 = digitalRead(tasterPin2);
 
if (tasterStatus1 == HIGH && ServoW1.moving() == 0 ) {
ServoW1.write(10); //wird langsam drehen
delay(100);
}
 
if (tasterStatus2 == HIGH && ServoW1.moving() == 0 ) {
ServoW1.write(70); //wird langsam drehen
delay(100);
}
 
if (tasterStatus1 == HIGH && ServoW2.moving() == 0 ) {
delay(3000);
ServoW2.write(10); //wird langsam drehen
delay(100);
}
 
if (tasterStatus2 == HIGH && ServoW2.moving() == 0 ) {
delay(3000);
ServoW2.write(70); //wird langsam drehen
delay(100);
}
 
if (tasterStatus1 == HIGH && ServoW3.moving() == 0 ) {
delay(5000);
ServoW3.write(10); //wird langsam drehen
delay(100);
}
 
if (tasterStatus2 == HIGH && ServoW3.moving() == 0 ) {
delay(5000);
ServoW3.write(70); //wird langsam drehen
delay(100);
}
 
if (tasterStatus1 == HIGH && ServoW4.moving() == 0 ) {
delay(7500);
ServoW4.write(10); //wird langsam drehen
delay(100);
}
 
if (tasterStatus2 == HIGH && ServoW4.moving() == 0 ) {
delay(7500);
ServoW4.write(70); //wird langsam drehen
delay(100);
}
 
delay(20);

}
 
 



und dabei der Einfachheit halber mit "delay" gearbeitet. An den einzelnen Versatzzeiten werde ich dann noch ein wenig feilen, wenn die Servos erst mal fest unter der Anlage an den Weichen angebracht sind. Aber so "grob" sieht das Ganze schon mal gut aus. Wenn Servo eins fertig ist, fängt Servo 2 an, usw..
Zusätzlich werde ich den Sketch noch um zwei Ausgänge erweitern, die mit Taster 1 und 2 geschalten werden. Die werden dann ein bistabiles Printrelais schalten mit zwei Wechslern. Mit dem Relais wird dann die Rückmeldung und die Herzstückpolarisierung geschalten.

Ich hab' jetzt auch ein wenig "umgedacht" und mir einige Nanos bestellt. So bleibt der Mega der Anlage fern, um für weitere Schaltungen und Tests zur Verfügung zu stehen. Und ein Nano wird dann ausschließlich für die Fahrstraße im Pult eingesetzt werden. Geht es an die Formsignale (Zukunft...), so wird diese Aufgabe dann ein weiterer Nano übernehmen, ebenso wie die Lichtsteuerung, usw.. So halte ich mir die Sketches klein und übersichtlich, denke ich...

Grüße
Roland


klca hat sich bedankt!
 
Trainworld
Beiträge: 7
Registriert am: 19.02.2008
Homepage: Link
Ort: Gelsenkirchen
Gleise verschiedene
Spurweite N
Steuerung Eigenbau
Stromart DC, Digital, Analog


RE: Arduino: Weichenstellung mit Servos, Fahrstraße, Bitte um Hilfe

#8 von MicroBahner , 02.11.2019 17:32

Hallo Roland,
wenn Du es eh 'blockierend' machst, dann solltest Du die Verzögerungszeiten auch direkt über die Laufzeiten der Servos machen und nicht über delay-Zeiten. Das ist doch viel einfacher:

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
 
#include <MobaTools.h>
 

const int tasterPin1 = 2; //Taster1 Pin 2
const int tasterPin2 = 3; //Taster2 Pin 3
int servoPin1 = 4; // Anschluß für den Servo 1
int servoPin2 = 5; // Anschluß für den Servo 2
int servoPin3 = 6; // Anschluß für den Servo 3
int servoPin4 = 7; // Anschluß für den Servo 4
 
int tasterStatus1, tasterStatus2;
Servo8 ServoW1;
Servo8 ServoW2;
Servo8 ServoW3;
Servo8 ServoW4;
 
void setup() {
pinMode(tasterPin1, INPUT_PULLUP); // so ist kein externer pullup Widerstand am
pinMode(tasterPin2, INPUT_PULLUP); // Taster erforderlich

ServoW1.attach(servoPin1); //Servo an Pin 4
ServoW1.setSpeed( 5 ); // Verfahrgeschwindigkeit einstellen

ServoW2.attach(servoPin2); //Servo an Pin 5
ServoW2.setSpeed( 5 ); // Verfahrgeschwindigkeit einstellen

ServoW3.attach(servoPin3); //Servo an Pin 6
ServoW3.setSpeed( 5 ); // Verfahrgeschwindigkeit einstellen

ServoW4.attach(servoPin4); //Servo an Pin 7
ServoW4.setSpeed( 5 ); // Verfahrgeschwindigkeit einstellen
}
 
void loop() {
tasterStatus1 = digitalRead(tasterPin1);
tasterStatus2 = digitalRead(tasterPin2);
 
if (tasterStatus1 == HIGH ) {
ServoW1.write(10); //wird langsam drehen
while( ServoW1.moving() ); // Warte solange Servo 1 dreht (delay)
ServoW2.write(10); //wird langsam drehen
while( ServoW2.moving() );
ServoW3.write(10); //wird langsam drehen
while( ServoW3.moving() );
ServoW4.write(10); //wird langsam drehen
while( ServoW4.moving() );
}
 
if (tasterStatus2 == HIGH ) {
ServoW1.write(70); //wird langsam drehen
while ( ServoW1.moving() );
ServoW2.write(70); //wird langsam drehen
while ( ServoW2.moving() );
ServoW3.write(70); //wird langsam drehen
while ( ServoW3.moving() );
ServoW4.write(70); //wird langsam drehen
while ( ServoW4.moving() );
}
 

delay(20);

}
 
 


Besser wäre es natürlich, dem Ratschlag von Dieter zu folgen

Wie hast Du die Taster angeschlossen? Wenn Du INPUT_PULLUP verwendest, musst Du die Taster nach GND anschließen, dann aber im Sketch die Logik auch umdrehen. Du verwendest INPUT_PULLUP, fragst aber auf HIGH ab. Das passt nicht zusammen. Vielleicht zeigst Du mal die Beschaltung.


viele Grüße
Franz-Peter
Ein 'elektromechanisches' Stellwerk
Der (ehemalige) 'Eisberg'


 
MicroBahner
Metropolitan (MET)
Beiträge: 2.833
Registriert am: 28.11.2012
Ort: Mittelfranken
Gleise Tillig Elite
Steuerung Eigenbau
Stromart Analog


RE: Arduino: Weichenstellung mit Servos, Fahrstraße, Bitte um Hilfe

#9 von Trainworld , 11.11.2019 22:30

Hallo Franz-Peter,

sorry, wenn es etwas gedauert hat... - danke dir, der EInsatz von "if" und "while" kam mir auch schon in den Sinn, aber ich wußte noch nicht so recht, wie einbinden. Und es ist auf jeden Fall durch die direkte Abhängigkeit genauer, als mit den "delay"-Werten, weil die Servos nicht 100% gleich lange brauchen zum Verfahren. Zum Testen bin ich noch nicht gekommen, wird noch bis zum Wochenende werden. Aber nochmal Danke...

viele Grüße
Roland


 
Trainworld
Beiträge: 7
Registriert am: 19.02.2008
Homepage: Link
Ort: Gelsenkirchen
Gleise verschiedene
Spurweite N
Steuerung Eigenbau
Stromart DC, Digital, Analog


   


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