INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Problem mit Servo Lib
04.07.2014, 07:19 (Dieser Beitrag wurde zuletzt bearbeitet: 04.07.2014 07:23 von mws.)
Beitrag #1
Problem mit Servo Lib
Hallo,

ich hab mich mal ein wenig in den Arduino eingelesen und als erstes Projekt einen Servo Controller gebaut. Das funktioniert soweit sehr gut. Aber mir ist aufgefallen, dass die Servos - wenn sie an einer festen Position stehen - alle in regelmäßigen Abständen kleine Bewegungen machen und zwar alle zusammen, nicht jeder einzeln. Das sieht so aus als würde das Timing der PWM der Servo Lib nicht immer ganz passen. So als würde ein anderer Interrupt dazwischen funken.

Ich hab auch mal einen Minimal Test gemacht. Servo in eine Position fahren und stehen lassen.

Code:
#include <Servo.h>
Servo myservo;  

char var;
char buffer[4];
int pos = 0;

void setup()
{
  myservo.attach(9);  
}

void loop() {
  
    myservo.write(90);
    while(1){
    };

  }
}

Kann das jemand bestätigen oder hat vielleicht sogar eine Lösung für das Problem?

Ach ja und es ist mit Sicherheit nicht die Stromversorgung. Der Arduino wird über USB versorgt, die Servos über ein Labornetzteil mit 5A und die Masse ist natürlich verbunden.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.07.2014, 15:24 (Dieser Beitrag wurde zuletzt bearbeitet: 05.07.2014 10:09 von rkuehle.)
Beitrag #2
RE: Problem mit Servo Lib
Hallo mws,

ich kannes zwar nicht bestätigen (habe keinen Servo), escheint aber ein generelles Problem zu sein. ursache sind wohl Konflikte zwischen der Servo-Lib und TimerInterrupts. Es gibt mehrere Lösungsansätze:
- vor / nach jeder Bewegung ein atach / detach des Servos - ist aber nicht schön
- wenn du noch die IDE version <= 0016 hast, aktualisiere auf eine höhere Version.
- hier noch ein Code-Snippet welches ohne Lib arbeitet und die TimmerInterrupts korrekt verarbeitet:
Code:
/**
* Precision servo positioning.
*
* Uses timer1 in phase and frequency correct PWM mode
* Doesn't use interrupts, so should be immune to interrupt issues.
*
* Chris Parish 2010
*
*/
//The standard timings for servos are 1.5ms for center, 1ms and 2ms for the full extents of travel
//however, most modern servos can operate an extended range, this can be as wide as 0.5ms to 2.5ms
//Consult the documentation for your servo for further details
#define SERVO_LOWER_LIMIT  1000
#define SERVO_UPPER_LIMIT  2000
#define SERVO_CENTER       1500
//Set your servo travel here. In standard mode most servos travel approx 90 degrees (45 either side of center)
#define SERVO_ANGLE_LOWER  0    
#define SERVO_ANGLE_UPPER  90
const int servo = 9;
int angle;
void setup()
{
  //Set up the timer------------------------
  //TCCR1A register
  TCCR1A = 0; //clear the register completly
  TCCR1A |= _BV(COM1A1) | _BV(COM1B1);  //set the required bits
  //TCCR1B register
  TCCR1B = 0; //clear the register completley  
  TCCR1B |= _BV(WGM13) | _BV(CS11);  //set the required bits
  //TCCR1C register
  TCCR1C = 0; //clear the register completley
  //Set the top limit - Complete frame length
  ICR1 = 20000;  //In this mode (assuming that you are running at 16mhz) The values are set in microseconds.
  //Set the output compare registers which dictate the servo position
  OCR1A = SERVO_CENTER; //1.5ms pulse, center the servo
  OCR1B = SERVO_CENTER; //1.5ms pulse, center the servo
  //Set pins 9 and 10 to output the waveform to the servos
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  Serial.begin(9600);
}
void loop(){}
void setServoAngle(int servo, int angle)
{
  //constrain the angle measurement
  angle = constrain(angle, SERVO_ANGLE_LOWER, SERVO_ANGLE_UPPER);
  //convert the angle measurement into a pulse length
  angle = map(angle, SERVO_ANGLE_LOWER, SERVO_ANGLE_UPPER, SERVO_LOWER_LIMIT, SERVO_UPPER_LIMIT);
  //write the angle to the appropreate servo output (1 or 2  -aka- 9 or 10)
  if (servo == 1 || servo == 9)
  {
    OCR1A = angle;
  }
  else if (servo == 2 || servo == 10)
  {
    OCR1B = angle;
  }
}
int getServoAngle(int servo)
{
  int pulse;
  int angle;
    if (servo == 1 || servo == 9)
  {
    pulse = OCR1A;
  }
  else if (servo == 2 || servo == 10)
  {
    pulse = OCR1B;
  }
  return map(pulse, SERVO_LOWER_LIMIT, SERVO_UPPER_LIMIT, SERVO_ANGLE_LOWER, SERVO_ANGLE_UPPER);
}
Hope it helps!

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.07.2014, 15:31
Beitrag #3
RE: Problem mit Servo Lib
Super, danke für den Tipp das werde ich mir mal ansehen und testen. Ich komme aber erst nächste Woche wieder dazu und werde berichten.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.07.2014, 16:51
Beitrag #4
RE: Problem mit Servo Lib
So ich bin doch schon früher zu Hause angekommen und hab das mal ausprobiert. Grundsätzlich funktioniert das super und ohne Ruckler! Aber ich hab noch nicht so ganz begriffen wie ich das für meine 6 Servos umsetzen kann.

Dass die Timer mit den entsprechenden Werten geladen werden und wie das PWM erzeugt wird ist klar aber den Teil
Code:
if (servo == 1 || servo == 9)
  {
    OCR1A = angle;
  }
  else if (servo == 2 || servo == 10)
  {
    OCR1B = angle;
  }
hab ich noch nicht ganz verstanden. Und wie ich das wie gesagt für 6 Servos umsetzen kann.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.07.2014, 19:47
Beitrag #5
RE: Problem mit Servo Lib
Hallo mws,

ich will jetzt mies erscheinen, aber es ist ein sehr langer Weg/Text das zu erklären.
Eine wirklich detailierte Erklärung zum Thema Timer und Interrupts gibt es hier:
http://blog.oscarliang.net/arduino-timer...-tutorial/
Sehr sehr zu empfehlen.
Wenn du dir dann noch die im Text erwähnten Dateien in der IDE anguckst gehen dir mit Sicherheit die Lichter auf!

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.07.2014, 19:50
Beitrag #6
RE: Problem mit Servo Lib
Danke ich schaue es mir gerne an. Man lernt ja auch nie aus.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.07.2014, 18:10
Beitrag #7
RE: Problem mit Servo Lib
So nachdem ich das mit den Timern zwar verstanden habe (glaube ich jedenfalls) und ich das so nicht verwenden kann, weil Timer0 ja schon intern benötigt wird habe ich mir das Adafruit Servo Shield zugelegt und mein Programm umgeschrieben. Jetzt ist alles so wie ich es haben wollte und ich kann noch ein paar Servos mehr ansprechen.

Trotzdem danke für die guten Tipps!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.07.2014, 17:06
Beitrag #8
RE: Problem mit Servo Lib
Moin Arduiner,
die oben beschriebenen Probleme mit Der Servo.h habe ich auch. In dem Projekt meines Modellbootes. Bisher wusste ich allerdings nicht wo dieses Zucken her kam. Nun würde ich oben beschriebene Funktion gerne auch in meinem Sketch nutzen. Da ich erlich gesagt nich genug Englisch kann um den Link zu dem Timer tut. zu verstehen möchte ich hier einen Hilferuf starten. In meinem Projekt ist der pin 9 und 10 zwingend anders belegt (Empfänger). Meine Servos sind an den Pin 6,7 und 8 angeschlossen. Ach ja, es handelt sich um einen Mega 2569 von Sainsmart.
Wenn ich das verstanden habe brauche ich dazu den Timer 4. Nun zu meiner Frage: wie stelle ich die Funktion für den Timer 4 um?

Gruß Sven.

Nichts auf der Welt ist unnütz, es kann im schlimmsten Fall immer noch als schlechtes Beispiel dienen.
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Star ATtiny Servo SOS SOS hansanne1310 16 268 Gestern 15:46
Letzter Beitrag: hansanne1310
  Servo über Temperatur steuern querkopf71 3 83 07.12.2016 19:21
Letzter Beitrag: hotsystems
  ATtiny und Servo Bibliothek malsehen 9 315 15.10.2016 18:09
Letzter Beitrag: malsehen
  Problem mit SD Card Library BennIY 4 197 06.10.2016 18:38
Letzter Beitrag: Bitklopfer
  Problem mit SD.remove Eichner 6 212 22.08.2016 19:42
Letzter Beitrag: Eichner
  Servo soll nur in Ruhelage stoppen Sven1996 1 243 19.08.2016 14:37
Letzter Beitrag: StephanBuerger
  Steuern von 4 Servo mittels eines Taster und eines Potis Jackie09 17 766 16.07.2016 11:43
Letzter Beitrag: Binatone
  4x16 Tastermatrix Problem Michel 16 862 14.07.2016 10:02
Letzter Beitrag: StephanBuerger
  Problem mit Delay und Millis funnyzocker 1 463 26.06.2016 09:54
Letzter Beitrag: hotsystems
  Servo und PWM Ausgabe F2Ingo 4 497 17.06.2016 14:53
Letzter Beitrag: F2Ingo

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste