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
  Smart Home Webserver Basic Authentication Problem Osotastic 21 280 20.02.2017 18:00
Letzter Beitrag: Tommy56
  Servo-Ansteuerung über einen Push-Button Aubergine83 1 92 16.02.2017 19:49
Letzter Beitrag: georg01
  ESP8622 - 01 sendet UDP - Problem WLan Kriskind 33 1.281 11.02.2017 18:59
Letzter Beitrag: Tommy56
  Problem mit Sketch senden an Uno feuerwehr 5 305 31.01.2017 20:41
Letzter Beitrag: Tommy56
  Beim Hochladen USB Problem Nils 10 530 29.12.2016 21:05
Letzter Beitrag: renid55
Star ATtiny Servo SOS SOS hansanne1310 17 656 15.12.2016 05:11
Letzter Beitrag: hbulf
  Servo über Temperatur steuern querkopf71 3 260 07.12.2016 19:21
Letzter Beitrag: hotsystems
  ATtiny und Servo Bibliothek malsehen 9 663 15.10.2016 18:09
Letzter Beitrag: malsehen
  Problem mit SD Card Library BennIY 4 325 06.10.2016 18:38
Letzter Beitrag: Bitklopfer
  Problem mit SD.remove Eichner 6 283 22.08.2016 19:42
Letzter Beitrag: Eichner

Gehe zu:


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