Forum: Mikrocontroller und Digitale Elektronik Arduino - Servo auf Knopfdruck hin- und herbewegen


von Jens B. (bulp)


Angehängte Dateien:

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
 }

: Bearbeitet durch User
von Wolfgang A. (Gast)


Lesenswert?

Bu Lp schrieb:
> 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?

Du kannst die Werte für die Endpunkte auch einfach beim attach() als 
Parameter mit angeben.

von Jens B. (bulp)


Lesenswert?

Wolfgang A. schrieb:
> Du kannst die Werte für die Endpunkte auch einfach beim attach() als
> Parameter mit angeben.

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! Was wäre der Vorteil? Bekomme 
ich so eine konstantere Bewegung? Danke

von Wolfgang A. (Gast)


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.

von Jens B. (bulp)


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.

von Jojo S. (Gast)


Lesenswert?

die schrittweise Positionierung ist für deine Anwendung ja gar nicht 
nötig, also die for Schleife kann komplett weg. Die Schritte werden nur 
gebraucht wenn die Bewegung langsam erfolgen soll.

von Jens B. (bulp)


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?

von Wolfgang A. (Gast)


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.

von Wolfgang A. (Gast)


Lesenswert?

Jens B. schrieb:
> Was ich auch nicht verstehe ist diese Zeile hier:int pos = 90;  --> wenn
> ich den Wert verändere tut sich einfach gar nix?

Wie auch. Guck mal in dein Programm, welche Funktion pos hat und wie die 
im Programm benutzt wird.

von Jens B. (bulp)


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

von Wolfgang (Gast)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.