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:
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:
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