Arduino - Verhalten bei Servoansteuerung

Gast #5193797
Lesenswert?

Hallo zusammen.

ich beschäftige mich seit ein paar Tagen mit einem kleinen Roboter, der 
aus vier Modellbauservos zusammengebaut wurde.
Die einzelnen "Gelenke" (Servos) habe ich entsprechend der menschlichen 
Anatomie bezeichnet (siehe Code).
Da die mitgelieferte Lib des Arduino Uno keine Möglichkeit bietet, die 
Servos langsamer/schneller an die gewünschte Position zu fahren, habe 
ich eine Routine "moveServo" geschrieben.
Diese Routine verhält sich aber nicht so, wie sie soll.

Ersetze ich z.B. alle Routinenaufrufe mit dem von Arduino 
bereitgestellten "SERVO.write(x)", funktioniert alles bestens. Ersetze 
ich es durch meine Routine, reagiert nach dem Flashen kein einziges 
Servo.

Wo liegt bei mir das Problem im Code?

Wiegesagt, mit  .write() funktioniert alles.

Hier der Code:
1
#include <Servo.h>
2

3
Servo Drehservo, Hauptarm, Ellenbogen, Hand;
4

5

6
void setup() 
7
{
8
    Drehservo.attach(8);
9
    Hauptarm.attach(9);
10
    Ellenbogen.attach(10);
11
    Hand.attach(11);
12
}
13

14

15
void moveServo(int number, int degrees, int speed)
16
{
17
    switch (number)
18
    {
19
      case 0:
20
              for(int i = 0; i <= degrees; i++)
21
              {
22
                 Drehservo.write(i);
23
                 delay(speed);
24
                 break;
25
              }
26

27
      case 1:
28
              for(int i = 0; i <= degrees; i++)
29
              {
30
                 Hauptarm.write(i);
31
                 delay(speed);
32
                 break;
33
              }
34

35
      case 2:
36
              for(int i = 0; i <= degrees; i++)
37
              {
38
                 Ellenbogen.write(i);
39
                 delay(speed);
40
                 break;
41
              }
42

43
      case 3:
44
              for(int i = 0; i <= degrees; i++)
45
              {
46
                 Hand.write(i);
47
                 delay(speed);
48
                 break;
49
              }
50
       
51
    }
52
    delay(20);
53
}
54

55
void loop() 
56
{   
57
     moveServo(2,100,50);
58
     moveServo(3,25,20);
59
     delay(4000);
60
}

Vielen Dank!
(Firma: matzetronics) #5193802
Lesenswert?

Peter B. schrieb:
> for(int i = 0; i <= degrees; i++)
>               {
>                  Drehservo.write(i);
>                  delay(speed);
>                  break;
>               }

Und nu? Das break; sorgt dafür, das du nach dem Schreiben von i=0 die 
Schleife verlässt. Lass das also mal weg.

Übrigens startet dein Servo so immer von 0. Besser wäre es vermutlich, 
einmal alle Servos definiert auf einen Wert zu fahren, und sich den 
letzten Wert zu merken. Deine 'for' Schleife startet dann mit diesem 
Wert und fährt vor oder zurück, je nachdem, ob der neue Wert grösser 
oder kleiner ist als die letzte Position.
Ist die Position erreicht, Wert merken und als Startpunkt für die 
nächste Bewegung benutzen.
Gleichzeitig können so allerdings die Servos nicht bedient werden, da 
immer nur eins in der for Schleife hängt.

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