Servo defekt oder fehler im Code

Hallo erstmal,

ich bin im Bereich Arduino noch relativ neu. Aber bisher hab ich alles hinbekommen was ich versucht habe, nun hänge ich aber seit mehreren Tagen an einer Servo Steuerung und weiß nicht mehr weiter bzw. vermute das die Servo defekt ist.
Vllt. kann ja mal jemand über den Code schauen und eventuelle Denkfehler meinerseits aufdecken :slight_smile:
Der wechsel zwischen open und close im Serial Monitor klappt, nur die Servo macht keinen mucks!

Schonmal vielen Dank !
Gruß
Brainbug

/*
  Servo
*/
// Servo Library hinzufügen
#include <Servo.h>

//Erzeugen von Servo
Servo myservo;
// digital pin 3 als Input
int pushButton3 = 3;
int pos = 0;

// These constants angle won't change:
const int open = 180;
const int close = 0;

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  // Initialisierung der Servo Pins
  myservo.attach(9);

  
  // Initialisierung Pin 3 als Input:
  pinMode(pushButton3, INPUT);
  digitalWrite(pushButton3, HIGH); // Pull Up Widerstand aktivieren 
  
}

void loop() {
  
   if (digitalRead(pushButton3) == HIGH){
    if (pos == close){
    Serial.println("Button gedrueckt und es wird geöffnet");
    myservo.write(open);
    delay(600);
    pos = open;
    }else{
    Serial.println("Button gedrueckt und es wird geschlossen");
    myservo.write(close);
    delay(600);
    pos = close;
    }
   }
  delay(500);
}

Der Code scheint richtig zu sein und wenn im Serial Monitor alles klappt, kann der Fehler eigentlich nur beim Servo liegen.
Wie hast du den Servo denn angeschlossen?

Grüße,
J3RE

brainbug85:
Vllt. kann ja mal jemand über den Code schauen und eventuelle Denkfehler meinerseits aufdecken :slight_smile:

myservo.attach(9);

Welches Arduino-Board verwendest Du?

Es gibt mindestens eine handvoll unterschiedlicher Boards, und Du kannst nicht voraussetzen, dass die mit einem UNO und der Servo-Library funktionierenden Pins auch mit anderen Boards funktionieren.

Hast Du das Beispielprogramm das mit der Bibliothek mitgeliefert wird probiert?
Grüße Uwe

Erstmal vielen Dank an die vielen und schnellen antworten ! :grin:

Welches Arduino-Board verwendest Du?

Ich verwende eine Duemilanove - Clone - Iteaduino V2.2

Hast Du das Beispielprogramm das mit der Bibliothek mitgeliefert wird probiert?

Ja hab ich probiert und da funktioniert es. Ich habe nur das gefühl das er nicht von 0° auf 180° fährt sondern ca nur bis 120°. Im Beispiel Sweep wird mit einem for statement gearbeitet, kann ich das vllt. einfach ersetzen nach dem ersten "if" ?

Wie hast du den Servo denn angeschlossen?

Der Iteaduino hat 13 "Servo interface break outs" da hab ich schon verschieden probiert 3,9 und 13

Das Problem bei deinem Code ist das „myservo.write()“ nur einmal pro Tastendruck ausgeführt wird.
Die for-Schleife aus dem Sweep-Beispiel könntest du verwenden und in dein Programm integrieren. Dann kannst du das „delay(600)“ auch wecklassen.

J3RE:
Das Problem bei deinem Code ist das „myservo.write()“ nur einmal pro Tastendruck ausgeführt wird.
Die for-Schleife aus dem Sweep-Beispiel könntest du verwenden und in dein Programm integrieren. Dann kannst du das „delay(600)“ auch wecklassen.

Ist das generell ein Problem ? Ich dachte ich muss die Sache nicht unnötig verkomplizieren bzw mit der "for schleife" bekomm ich es irgendwie nicht hin :slight_smile:

nach vielen Tagen rum probieren hab ich nun den Fehler gefunden, und zwar liegt es doch an den Servos.
mit dem "Test-Programm" unten hab ich raus gefunden das meine Servos nur im Winkel von 20 bis 164 funktionieren, wieso weiß ich nicht !
Sollte jemand vllt. ähnliche Probleme haben , füge ich unten eine Test sketch an mit dem man per PC jeden einzelnen Winkel bzw micro sec. am Servo testen kann.

Jetzt hab ich aber ein neues Problem, und zwar fahren die servo am Anfang bis eine Taste gedrückt wird wild umher. Kann ich das lösen in dem ich einen write befehl in "setup" schreibe ?
Oder gibt es eine andere Möglichkeit ?

// zoomkat 10-22-11 serial servo test
// type servo position 0 to 180 in serial monitor
// or for writeMicroseconds, use a value like 1500
// for IDE 0022 and later
// Powering a servo from the arduino usually *DOES NOT WORK*.

String readString;
#include <Servo.h> 
Servo myservo;  // create servo object to control a servo 

void setup() {
  Serial.begin(9600);
  myservo.writeMicroseconds(1500); //set initial servo position if desired
  myservo.attach(7);  //the pin for the servo control 
  Serial.println("servo-test-22-dual-input"); // so I can keep track of what is loaded
}

void loop() {
  while (Serial.available()) {
    char c = Serial.read();  //gets one byte from serial buffer
    readString += c; //makes the string readString
    delay(2);  //slow looping to allow buffer to fill with next character
  }

  if (readString.length() >0) {
    Serial.println(readString);  //so you can see the captured string 
    int n = readString.toInt();  //convert readString into a number

    // auto select appropriate value, copied from someone elses code.
    if(n >= 500)
    {
      Serial.print("writing Microseconds: ");
      Serial.println(n);
      myservo.writeMicroseconds(n);
    }
    else
    {   
      Serial.print("writing Angle: ");
      Serial.println(n);
      myservo.write(n);
    }

    readString=""; //empty for next input
  } 
}

bevor man etwas auf den Servo ausgibt sollte schon der Pin an dem der Servo hängt definiert sein:

void setup() {
  Serial.begin(9600);
  myservo.writeMicroseconds(1500); //set initial servo position if desired
  myservo.attach(7);  //the pin for the servo control 
  Serial.println("servo-test-22-dual-input"); // so I can keep track of what is loaded
}

Uwe