Arduino - Servo auf Knopfdruck hin- und herbewegen

#3971596
Lesenswert?

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
 }
Angehängte Dateien:
Gast #3971746
Lesenswert?

Jens B. schrieb:
> Hi - und wie würde der code dann aussehen? Also für zB 180° und 0°? Wäre
> nett wenn du das mal schreiben könntest!

Das ist alles direkt bei der Funktionsbeschreibung nachzulesen.
http://arduino.cc/en/reference/servo

> Was wäre der Vorteil?
Dass du nur an einer Stelle ändern mußt.

> Bekomme ich so eine konstantere Bewegung?
Das Problem hat mit der Definition der Endposition nichts zu tun. 
Vielleicht läuft dein Servo zu langsam und erreicht in der Schleife gar 
nicht die mit deiner Treppenfunktion gesteuerten Positionen. Dagegen 
würde es helfen, wenn du die Treppe deutlich langsamer laufen läßt.
#3971872
Lesenswert?

Danke soweit aber das hilft mir leider nicht groß. Es ist ausserdem 
komischerweise auch so, dass sich der Servo gar nicht mehr bewegt wenn 
ich die Werte in den im Eingangspost zitierten Codeabschnitt ändere.

Ahh eine Sache hat mir doch geholfen. Wenn ich die Positionierung in 1 
Grad Schritten (also pos=pos+1 bzw. pos=pos-1 ) vornehme habe ich 
zumindest das Gefühl, dass die Positionierung genauer ist.

Hmm aber das ist alles leider nicht so wie ich mir es wünsche - evtl 
muss ich nochmal ganz anders anfangen. Ich kann auch kaum glauben, dass 
es kaum Beispiele für Servos, die von einem Button kontrolliert werden, 
im Internet gibt.
#3972093
Lesenswert?

Jojo S. schrieb:
> die schrittweise Positionierung ist für deine Anwendung ja gar nicht
> nötig, also die for Schleife kann komplett weg.

also diese Zeile:
1
 for(pos = 0; pos < 180; pos=pos+1)
und diese Zeile:
1
 for(pos = 180; pos>=1; pos=pos-1)
einfach rauslöschen? Dann tut sich auf Knopfdruck gar nichts mehr :-(

Ausserdem: Wo würde ich dann die Winkelbewegung definieren? Also wie 
weit sich der Servo drehen soll?

Was ich auch nicht verstehe ist diese Zeile hier:
1
int pos = 90;
 --> wenn ich den Wert verändere tut sich einfach gar nix?
Gast #3972114
Lesenswert?

Jens B. schrieb:
> Ausserdem: Wo würde ich dann die Winkelbewegung definieren? Also wie
> weit sich der Servo drehen soll?

Bevor du wild am Programm änderst, solltest du dir vielleicht erstmal 
ein paar Grundlagen über Servos anlesen, dir die Funktion der Servo 
Library klar machen und den Ablauf in deinem Programm verstehen. Sonst 
ist das alles Stochern im Nebel.
#3972309
Lesenswert?

Hallo Wolfgang - da hast du natürlich recht.

Also die Servo library implementiert einige Spezialfkt zur Servo 
Kontrolle. Mein Programm nutzt hieraus aus der library die "attach" und 
die "write" Funktion.

Und die Funktion von "pos". Hmm also eigentlich handelt es sich ja um 
eine Variable zum Abspeichern der Servo Winkelstellung. Als "int" 
angelegt also von der Wertemenge her auf jeden Fall groß genug.

Aber so wirklich weiter bringt mich das natürlich jetzt auch nicht :-D
Gast #3972450
Lesenswert?

Jens B. schrieb:
> Aber so wirklich weiter bringt mich das natürlich jetzt auch nicht :-D

Dann guck mal, welchen Einfluss der bei der Initialisierung von pos 
angegebene Wert 90 in deinem Programm hat, d.h. wo der verwendet wird 
;-)

> Mein Programm nutzt hieraus aus der library die "attach" und
> die "write" Funktion.

Das ist schon klar.
Und was macht servo.attach() mit dem zweiten und dritten Parameter?
Was passiert genau, wenn servo.write() aufgerufen wird?
Wann werden was für Impulse an der Servo geschickt?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren