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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.