Pages: [1]   Go Down
Author Topic: Servo defekt oder fehler im Code  (Read 1081 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
Der wechsel zwischen open und close im Serial Monitor klappt, nur die Servo macht keinen mucks!

Schonmal vielen Dank !
Gruß
Brainbug

Code:
/*
  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);
}
Logged

Austria
Offline Offline
Full Member
***
Karma: 2
Posts: 107
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 174
Posts: 3274
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vllt. kann ja mal jemand über den Code schauen und eventuelle Denkfehler meinerseits aufdecken smiley
---
  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.
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21936
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Erstmal vielen Dank an die vielen und schnellen antworten ! smiley-mr-green

Quote
Welches Arduino-Board verwendest Du?
Ich verwende eine Duemilanove - Clone - Iteaduino V2.2

Quote
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" ?

Code:
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
« Last Edit: January 16, 2013, 05:52:05 pm by brainbug85 » Logged

Austria
Offline Offline
Full Member
***
Karma: 2
Posts: 107
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?


Code:
// 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
  }
}
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21936
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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
Logged

Pages: [1]   Go Up
Jump to: