Go Down

Topic: Servo Digital vs. Analog - Unterschiede in der Programmierung (Read 249 times) previous topic - next topic

shane54

Hallo zusammen,

nachdem ich bereits seit längerem passiver Teilnehmer dieses Forums bin, möchte ich heute die Gelegenheit nutzen etwas zurückzugeben und meine neueste Erkenntnis zu teilen.

Ich habe einen Arduino Nano der mit einem Endschalter einen Digital-Servo in zwei unterschiedliche Positionen fahren soll.
Servo ist mit externen 6V verbunden.


Der erste Versuch war die Einbindung der Servo.h und die direkte Ansteuerung mit Angabe der Winkel.

Code: [Select]
#include <Servo.h>
 
Servo servoblau;

void setup()
{
servoblau.attach(8);
pinMode(4,INPUT);
pinMode(5,OUTPUT);
}

void loop()

{
if (digitalRead(4) == 1){
servoblau.write(90);
}
else
{
servoblau.write(0);
}

}


Daraufhin hat mein digitales Servo nur geruckelt und sich nicht bewegt. Da es sich um ein günstiges Produkt aus Fernost handelt bin ich davon ausgegangen dass das gute Teil Schrott ist. Ein Test in einer RC-Steuerung hat das Gegenteil bewiesen.
Also musste das Problem irgendwo an der Programmierung liegen.
Ein altes analoges Servo hat auf Anhieb funktioniert und ist die Positionen angefahren.

Nach weiterer Recherche habe ich dann herausgefunden dass mein digitales Servo nicht ganz den Standardspezifikationen entspricht. Somit habe ich auf die Servo.h verzichtet und die PWM manuell programmiert.

Code: [Select]

void setup() {
  pinMode(2,OUTPUT);
pinMode(4,INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (digitalRead(4) == 1){
        aa(0);       
  }
  else
  {
        aa(90);
  }
}
void aa(int i)
{int m=map(i,0,180,500,2500);
 digitalWrite(2,HIGH);
 delayMicroseconds(m);
 digitalWrite(2,LOW);
delayMicroseconds(20000-m);


}


Der Servo hat sich jetzt zwar an die gewünschte Position bewegt, aber nur sehr ruckelig und extrem langsam (90° in ca.10s). (Auch hier wieder: Analoges Servo kein Problem)

Durch Zufall bin ich darauf gestoßen dass jemand die gewünschte Position nicht als Endwert übergibt, sondern diese "langsam" inkrementiert - und siehe da: ES TUT!

Code: [Select]
int pos=0;
void setup() {
  // put your setup code here, to run once:
  pinMode(2,OUTPUT);
pinMode(4,INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (digitalRead(4) == 1){
    if (pos == 0){
      for(int l=0;l<=90;l++)
      {
        aa(l);
        delay(5);
      }
    pos = 90;
    }
  }
  else
  {
    if (pos == 90){
      for(int l=90;l>=0;l--)
      {
        aa(l);
        delay(5);
      }
    pos=0;
    }
  }
}
void aa(int i)
{int m=map(i,0,180,500,2500);
 digitalWrite(2,HIGH);
 delayMicroseconds(m);
 digitalWrite(2,LOW);
delayMicroseconds(20000-m);


}


Der Code ist auf die schnelle aus mehreren Quellen zusammenkopiert und noch nicht bereinigt - sorry.

Eine genaue Erklärung dafür habe ich leider nicht, aber vielleicht hilft es ja trotzdem jemandem weiter.

Falls jemand das Verhalten erklären kann würde ich mich freuen.

Viele Grüße
Shane54

uwefed

Ich hab zwar keine praktische Erfahrung aber ein Analoges und Digitales Servo müten sich gleich Ansteuern lassen.
Ich tippe mal auf ein Problem der Spannungsversorgung. Hat das Netzteil genug Strom für den Servo?

Grüße Uwe

shane54

Hallo Uwe,

danke für die Antwort. Das hatte ich ursprünglich auch gedacht, mein aktuelles Projekt hat mich eines besseren belehrt  :)

An der Spannung liegt es nicht. Habe zwischen 5V und 7,5V beliebige Zwischenwerte getestet, immer mit dem selben Ergebnis.
Strom sollte mit 1,5A ausreichend zur Verfügung stehen. Vor allem funktioniert es ja wenn ich die Programmierung ändere...

Wie gesagt, für mich funktioniert es so - es ist nur die Neugier die mich umtreibt :-)

Gruß Sven

uwefed

Schreib mal welches digitale Servo Du hast. Vieleicht kennt es jemand.
Grüße Uwe

MicroBahner

Halle Sven,
Nach weiterer Recherche habe ich dann herausgefunden dass mein digitales Servo nicht ganz den Standardspezifikationen entspricht.
Das halte ich zumindest für recht unwahrscheinlich. ( Wie Uwe schon vorgeschlagen hat, solltest Du auf jeden Fall mal einen Link zu deinem Servo posten). Meist ist es so, dass sich die digitalens Servos mehr an den Standard halten, als die analogen.

Standard für Servos sind Impulslängen von 1ms...2ms. Die Servolib, und auch dein eigener Code, erzeugt auch Impulse, die deutlich ausserhalb dieses Spektrums liegen. Analoge Servos machen das mit und fahren da u.U. einfach an den mech. Anschlag ( was auch nicht so gut ist ). Digitale Servos reagieren oft auf Impulse die deutlich ausserhalb des Standardspektrums liegen gar nicht. Das kann dann durchaus zu vermeintlich sehr seltsamem Verhalten des Servos führen.

Gruß, Franz-Peter

shane54

Es geht um diesen Servo:
https://www.amazon.de/dp/B07K69LQFN/ref=cm_sw_em_r_mt_dp_U_EvmWCbX5VS35C

Da steht dann auch in den Kommentaren dass die PWM wie folgt zugeordnet wird: PWM 500-2500 entsprechend 0-180 °

Nach meinem Kenntnisstand ist das abweichend vom Standard...

uwefed

laut https://www.thanksbuyer.com/2pcs-lewansoul-ld-20mg-metal-gear-standard-digital-servo-with-20kg-high-torque-for-robot-rc-car-56181
ist die Ansteuerung:
Quote
Control Specifications:
- Control Method: PWM
- Pulse Width: 500~2500
- Duty Ratio: 0.5ms~2.5ms
- Pulse Period: 20ms
also die Standart- Ansteuerung.
Andererseits steht da auch:
Quote
- Working Voltage: 6-7.4V
- Min Working Current: 1A
- No-Load Current: 100mA
...
2.It's recommended that use lithium polymer battery with high rate discharge(min 5C),please don't use dry battery.
Also würd ich sagen 1,5A könnte das Problem sein. Versuch es mal mit einem stärkeren Netzteil.
Grüße Uwe

MicroBahner

Hallo Sven,
Da steht dann auch in den Kommentaren dass die PWM wie folgt zugeordnet wird: PWM 500-2500 entsprechend 0-180 °

Nach meinem Kenntnisstand ist das abweichend vom Standard...
ja, das geht in der Tat über den Standard hinaus. Übliche Servos können keine kompletten 180° und reagieren auch nicht auf so einen großen Impulsbereich.
Wie Uwe festgestellt hat, ist das Servo aber schon recht stromhungrig.
Gruß, Franz-Peter

uwefed

OK, dieses Servo kann einen größeren Bereich der Ansteuerung sinnvoll in einen Winkel umsetzen als ein Standartservo..
Wenn ich jetzt nur einen kleineren Bereich dieser Ansteuerung verwendest muß das aber funktionieren. Das Servo kann nicht den ganzen Winkelbereich ausgelenkt werden aber es muß sich in diesem Bereich normal drehen.
Grüße Uwe


MicroBahner

Das sehe ich auch so. Das Servo geht zwar über den Standard hinaus, deckt ihn aber trotzdem komplett ab. Es ist nicht so , dass es vom Standard abweicht, und deshalb anders angesteuert werden muss. Nur wenn man den vollen Bewegungsbereich ausnutzen will, braucht man einen gegenüber dem Standard erweiterten Breitenbereich für den Ansteuerimpuls.
Die Probleme können daher eigentlich nicht an der Ansteuerung liegen - wohl doch eher am Stromhunger.
Gruß, Franz-Peter

Go Up