Servo - Position direkt anfahren (Problem mit 270° Servo)

Hallo,

habe ein kl. Problem / Frage.

Ich besitzt einen Servo DS3218MG. Ein richtiges Datenblatt habe ich nicht.
EDIT (Könnte das richtige sein): https://www.dsservo.com/en/d_file/DS3218%20datasheet.pdf

https://www.amazon.de/gp/product/B07R4CPNR3/

Mit diesem Versuchsskript dreht der Motor auch schön hin und her:
SKETCH #1

#include <Servo.h>

Servo myservo;
int pos = 0;

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

void loop() {
  for (pos = 550; pos <= 2400; pos += 1) {
    myservo.writeMicroseconds(pos);
    delay(5);                      
  }
  for (pos = 2400; pos >= 550; pos -= 1) { 
    myservo.writeMicroseconds(pos);  
    delay(5);                       
  }
}

Aber, wieso kann ich den Motor nicht direkt positionieren?
Versuche ich zb das
SKETCH #2

#include <Servo.h>

Servo myservo;


int pos = 0;

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

void loop() {

    myservo.writeMicroseconds(1000);
    delay(5000);                      

}

passiert nichts (auch bei anderen Werte ausser 1000, zb 600, 1200, 1800, 2000…)

Liegt das am Servo oder Script?

Was erwartest Du was da passiert? Das Servo steht einfach fest an einer Position. Wenn das eh schon da steht passiert garnichts. Wenn man versucht, das Servo aus seiner Position zu bewegen, merkt man, dass es sich dagegen wehrt.
Bei mir funktioniert jedenfalls genau das.

N.B. es macht keinen Sinn, das writeMicroseconds öfter als alle 20ms aufzurufen. Wenn Du das alle 5ms machst, werden 3 Aufrufe ignoriert.

Hallo, sollte er sich nicht mit
myservo.writeMicroseconds(1000)
Bewegen?
Ich schalte den Arduino aus, bewege den Motor
von Hand irgendwo hin, schalte den Arduino
an und nichts passiert. Auch bei anderen Werten nicht.

O

noxx2:
Ich schalte den Arduino aus, bewege den Motor
von Hand irgendwo hin, schalte den Arduino
an und nichts passiert.

Ok, da sollte er sich schon einmal bewegen. Macht er bei mir auch. Am Sketch kann das nicht liegen.

P.S. Wenn ich das richtig sehe, ist das ein digitales Servo. Das reagiert auf Impulslängen außerhalb seines Arbeitsbereich garnicht. Aber bei Pulslängen von 1000...2000µs sollte es auf jeden Fall reagieren.

Macht er aber nicht, habe 2 Stück davon gekauft
https://www.amazon.de/gp/product/B07R4CPNR3/
bei beiden das gleiche Problem.

Dachte evtl. das es bei den Servos von Prinzip auch
noch Unterschiede gibt, weil er nicht auf
myservo.writeMicroseconds(x) anspringt.

Oder liegt es evtl an den 270°, die diese kann.
Brauche nämlich einen, mit mehr als 250°.

Hallo,

versuch noch mal den ersten Sketch, wie bewegt sich denn da der Motor, ich denke sollte etwa eine halbe Umdrehung sein.

Dann mach aus dem delay(5) mal ein delay(500) dann sollte sich der Motor sehr langsam zu den gleichen Positionen bewegen.

Warum arbeitest Du überhaupt mit myservo.writeMicroseconds(), was passiert bei myservo.write(pos) da wird dann normal die Position 0-180 angegeben.

Benutze mal das Beispiel sweep aus der lib

Heinz

Rentner:
Warum arbeitest Du überhaupt mit myservo.writeMicroseconds(), was passiert bei myservo.write(pos) da wird dann normal die Position 0-180 angegeben.

Normal sind die writeMicroseconds, denn die Impulsbreiten sind das, was das Servo haben will. Mit write() wird nur libintern umgerechnet, bevor dann libintern doch wieder writeMicroseconds aufgerufen wird.
Zum Testen daher auf jeden Fall writeMicroseconds nehmen. Die Umrechnung Winkel->Pulslänge bringt nur einen zusätzlichen Unsicherheitsfaktor ins Spiel. Mit den echten Winkeln am Servo hat das meist eh wenig zu tun.
Was passiert, wenn Du im 2. Sketch zwischen 2 Pulsbreiten hin- und herschaltest, die sich nur wenig unterscheiden?

Hallo,

@Franz-Peter, ja stimmt du hast recht, mich wundert immer nur warum die Leute nicht mit einem Beispiel aus der lib anfangen und damit was rumspielen bis es verstanden ist.

Gruß Heinz

Mit diesem Script reagiert er, springt hin und her

ich muss den Motor aber einmal per Hand anschupsen, dann fährt er ein Stück und
wackelt hin und her.

SKETCH #3

#include <Servo.h>

Servo myservo;


int pos = 0;

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

void loop() {

    myservo.writeMicroseconds(1000);
    delay(100);                      
    myservo.writeMicroseconds(1050);
    delay(100); 
}

EDIT:
Hier noch ein 2ter Test:

Hier dreht der Motor hin und her
SKETCH #4

#include <Servo.h>

Servo myservo;

int zeit = 100;
int pos = 0;

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

void loop() {

    myservo.writeMicroseconds(1000);
    delay(zeit); 
    myservo.writeMicroseconds(1050);
    delay(zeit);                      
    myservo.writeMicroseconds(1100);
    delay(zeit); 
    myservo.writeMicroseconds(1150);
    delay(zeit);  
    myservo.writeMicroseconds(1100);
    delay(zeit);
    myservo.writeMicroseconds(1050);
    delay(zeit);
}

Aber, ich muss auch hier den Motor per Hand 1x anschupsen :confused:

ändere ich die Sprünge/Abstände, passiert nichts

SKETCH #5

#include <Servo.h>

Servo myservo;

int zeit = 100;
int pos = 0;

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

void loop() {

    myservo.writeMicroseconds(1000);
    delay(zeit); 
    myservo.writeMicroseconds(1100);
    delay(zeit);                      
    myservo.writeMicroseconds(1200);
    delay(zeit); 
    myservo.writeMicroseconds(1350);
    delay(zeit);  
    myservo.writeMicroseconds(1200);
    delay(zeit);
    myservo.writeMicroseconds(1100);
    delay(zeit);
}

Hallo,

ist das ein UNO ?

dann nim doch mal den Ausgang 9 wie in den Beispielen oder 3 der 2 ist nicht pwm fähig konnte das sein ?

Heinz

Zum Einen: Die Servo-Lib erzeugt die Impulse per Timerinterrupt. Deshalb muss das kein PWM fähiger Ausgang sein, das funktioniert mit jedem Digitalpin.

Zum Anderen: Ich habe das ja mit meinen Servos auch probiert, da funktioniert das problemlos. Grundsätzlich könntest Du es mit meinen MobaTools probieren. Aber im Prinzip ist das auch nicht viel anders. Nur wann der erste Impuls erzeugt wird ist anders gelöst.

Ich tippe daher eher auf irgendwelche Besonderheiten bei den Servos. Wie versorgst Du die denn mit Strom? Gerade beim Anlaufen könnten die schon einiges brauchen

Hast Du :

  1. die Masse des Arduino mit dem Minuspol der Stromversorgung Servo verbunden?
  2. Ist die Stromversorgung der Servo stark genug?

Grüße Uwe

Die hängen an einem schaltnetzteil, da sollte es keine Problem sein. Mit SKETCH #1, der For Schleife, gibt’s es kein Problem. Auch SKETCH #4 läuft, wenn er am Anfang in der Nähe ist (1100)…

Ist der Abstand von der aktueller Position zur Soll-Position zu groß (>50) macht der Motor nichts…

Habe hier ein schönes Testscript gefunden, Zielposition werden per SerialMonitor übergeben

SKETCH #6

/*
 Try this test sketch with the Servo library to see how your
 servo responds to different settings, type a position
 (0 to 180) or if you type a number greater than 200 it will be
 interpreted as microseconds(544 to 2400), in the top of serial
 monitor and hit [ENTER], start at 90 (or 1472) and work your
 way toward zero (544) 5 degrees (or 50 micros) at a time, then
 toward 180 (2400).
*/
#include <Servo.h>
Servo servo;

void setup() {
  // initialize serial:
  Serial.begin(9600); //set serial monitor baud rate to match
  servo.write(90);
  servo.attach(2);
  prntIt();
}

void loop() {
  // if there's any serial available, read it:
  while (Serial.available() > 0) {

    // look for the next valid integer in the incoming serial stream:
    int pos = Serial.parseInt();
    pos = constrain(pos, 0, 2400);
    servo.write(pos);
    prntIt();
  }
}
void prntIt()
{
  Serial.print("  degrees = ");
  Serial.print(servo.read());
  Serial.print("\t");
  Serial.print("microseconds =  ");
  Serial.println(servo.readMicroseconds());
}
  • Motor steht irgendwo Mittig (ca 100°)
  • Gebe Zieölposition in 5er Schritten ein: 0, 5, 15, 20, 25
  • Erst passiert nichts, dann bei 90° reagiert er, bei allen weiteren
    5er Schritten auch. 90, 95, 100, 105,…

Machen ich dann einen 10er Schritt, ist aus. 110, 120…

a) Beantworte beide Fragen von Uwe
b) Mach ein Schaltbild auf Papier was du wie angeschlossen hast und stell es hier ein
c) Mach ein Echtbild dessen was du verkabelt hast in einer Form, dass wir wirklich jedes einzelne Kabel identifizieren können was wo angeschlossen ist und stelle es hier ein

die Masse des Arduino mit dem Minuspol der Stromversorgung Servo verbunden?
→ JA
ist die Stromversorgung der Servo stark genug?
→ JA, Schaltnetzteil 5V 20A

Funktioniert das Beispiel Knob?

Funktionieren andere Servos?

Habe nur einen Servo, 180 grad. Der geht.

noxx2:
Der geht.

Na dann ist ja alles gut.

Nee, muss meinen 270° Servo ja auch irgendwie zum laufen bringen. Möchte den ja nicht nur durch irgendwelche Schleifen jagen.

Kann man ggf einen 180° Servo umbauen, das er 270° macht?

Gruß

noxx2:
Kann man ggf einen 180° Servo umbauen, das er 270° macht?

Gruß

Das kommt auf den Servo an, genauer auf das darin verbaute Poti. Ich hatte da schon öfters Servos, deren Potti nur für gut 180° gebaut war, da liessen sich die Pottis gar nicht mehr als 180° drehen.
Geht also nur, wenn sich das darin verbaute Potti einen Weg von 270° hat, und zwar sowol elektrisch als auch mechanisch.
Dann musst Du noch die Mechanische begrenzung am Abtriebs-Zahnrad und im Gehäuse so bearbeiten, das 270° drehwinkel möglich werden. Eine Garantie, dass der Servo das auch wirklich mitmacht, hast Du aber nicht.
Bei manchen geh es , bei andern geht es nicht. Ich habe auch keine Liste darüber geführt, welche Servos man umbauen kann, und welche nicht. Habe das auch seit gut 32 Jahren nicht mehr gemacht, und inzwischen brauche ich das auch nicht mehr, da es ja 270° Servos gibt, die auch erschwinglich sind. (sah damals preislich noch ganz anders aus).

LG Stefan