Hallo zusammen,
ich möchte einen Servo auf Knopfdruck eine bestimmte Winkelbewegung
hin-, und auf einen erneuten Knopfdruck wieder zurückbewegen lassen. Die
Winkelbewegung soll dabei individuell im Code je nach Bedarf angepasst
werden. Folgenden Code habe ich bisher im Internet gefunden/angepasst
(siehe unten). Nun habe ich als Neuling mehrere Fragen und würde mich
freuen, wenn ihr mir diese beantworten würdet:
1) Die bewegung ist nicht konstant :-( ! D.h. es kann sein, dass der
Servo 20x an Position x stehen bleibt und beim nächsten Mal Buttonpush
plötzlich an einer leicht anderen Stelle. Woran kann das liegen? Wo ist
hier der logische Fehler? DAs ist ein Riesenproblem für mich. Ser Servo
muss immer an der exakt gleichen Stelle stehenbleiben. Die Stelle wo er
stehenbleibt möchte ich im Code, je nach Bedarf, ändern.
2)Um eine absolut reproduierbare Winkelbewegung zu erreichen würde ich
gerne bei Initialisierung (bzw sobald man das Arduino mit Strom
versorgt), den Servo einmalig an eine bestimmte Position x fahren
lassen. Damit soll eine Ausgangsstellung klar definiert werden. Von
dieser Ausgangsposition aus soll dann auf Buttonpush die oben
beschriebene Bewegung ausgeführt werden. Mein Ansatz wäre, meinen sketch
mit dem Knob Beispiel (http://arduino.cc/en/tutorial/knob) zu verbinden.
Ein Trimmpoti soll dabei die "Wunsch-Anfangsposition" einstellen. Könnte
das so klappen? Falls ja, wie kann ich die beiden sketches
zusammenführen?
3) Wo kann ich die Winkelbewegung eigentlich einstellen? Ich nehme an
indem ich den Wert pos = 0 bzw. für die Rückbewegung den Wert pos = 180
ändere; ist das richtig?
Siehe hier:
1 | for(pos = 0; pos < 180; pos=pos+10)
|
bzw. hier:
1 | for(pos = 180; pos>=1; pos=pos-10)
|
Im Anhang habe ich noch gezeichnet, wie ich das Ganze verkabelt habe.
Vielleicht liegt ja auch hier irgendwo ein Fehler.
Herzlichen Dank schonmal für die Hilfe!
Hier der verwendete Code:
1 | #include <Servo.h>
|
2 |
|
3 | const int servoPin = 8; // digital pin 8 connected to servo
|
4 | const int buttonPin = 9; // digital pin 9 connected to pushbutton
|
5 |
|
6 | int buttonState = 0; // variable to read the pushbutton status
|
7 | int directionState = 0; // variable to read the servo direction
|
8 |
|
9 | Servo myservo; // create servo object to control a servo
|
10 |
|
11 | int pos = 90; // variable to store the servo position
|
12 |
|
13 |
|
14 | void setup() {
|
15 | myservo.attach(8); // attaches the servo on digital pin 8 to the servo object
|
16 | pinMode(buttonPin, INPUT); // initialize the pushbutton pin as an input
|
17 | }
|
18 |
|
19 | void loop(){
|
20 | // read the state of the pushbutton value
|
21 | buttonState = digitalRead(buttonPin);
|
22 |
|
23 | if (directionState == 0){
|
24 | // the button is pushed
|
25 | if (buttonState == HIGH) {
|
26 | directionState = 1;// the direction for the servo is clockwise
|
27 |
|
28 | // goes from 0 degrees to 180 degrees in steps of 10 degree
|
29 | for(pos = 0; pos < 180; pos=pos+10)
|
30 | {
|
31 | myservo.write(pos); // tells servo to go to position in variable ‘pos’
|
32 | delay(15); // waits 15ms for the servo to reach the position
|
33 | }
|
34 | }
|
35 |
|
36 | } else if (directionState == 1) {
|
37 | // the button is pushed
|
38 | if (buttonState == HIGH) {
|
39 | directionState = 0; // the direction for the servo is counter-clockwise
|
40 |
|
41 | // goes from 180 degrees to 0 degrees in steps of 10 degree
|
42 | for(pos = 180; pos>=1; pos=pos-10)
|
43 | {
|
44 | myservo.write(pos); // tells servo to go to position in variable ‘pos’
|
45 | delay(15); // waits 15ms for the servo to reach the position
|
46 | }
|
47 | }
|
48 | }
|
49 | }
|