Forum: Mikrocontroller und Digitale Elektronik Arduino - Verhalten bei Servoansteuerung


von Peter B. (Gast)


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!

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

: Bearbeitet durch User
von Peter B. (Gast)


Lesenswert?

Ah, danke!
Das 'break' sollte natürlich außerhalb der for-Schleife stehen und sich 
auf die switch-case-Anweisung beziehen.

Ich teste es gleich mal..

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.