Probleme mit 360 Grad Servo

Hallo Community,

für mein Projekt habe ich den 360-Grad Servo MG90D erworben. Leider verhält sich der Servo nicht wie erwartet. Ich habe folgenden Prototyp 1:1 umgesetzt: Glücksrad Das Video was man dort sehen kann sagt mehr als 1.000 Worte. Auch findet man unter dem Link das Coding.

Wenn sich dort das Glücksrad dreht - sagen wir um 75 Grad - bleibt es danach bei 75 Grad stehen. Bei mir dreht sich der Servo um 75 Grad aber dann wieder zurück auf 0 bzw. auf 360. Je nachdem um wie viel Grad sich der Servo gedreht hat wird der Kreis dann zu Ende gefahren. (entweder mit der Drehrichtung oder auch gegen die ursprüngliche Drehrichtung)...

Was kann ich tun? Muss ich andere Servos kaufen bzw. kann man den Servo irgendwie umbauen?

Danke für Eure Rückmeldung.

Viele Grüße

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

1 Like

Thank you for moving my post to the German part of the forum. It was a misstake. Sorry for that :frowning:

1 Like

wäre doch nett gewesen dein Code hier zu posten

Wie oben geschrieben ist es identisch zu dem Coding, welches man unter dem Link findet. Aber wegen mir gern...

// eingebaute Bibliothek einbinden
# include "Servo.h"

// Name des Motors
Servo Motor;

// Minimum und Maximum der "Laufzeit" des Motors
int Minimum = 300;
int Maximum = 1500;

// Pin des Tasters
int pinTaster = 7;
// Pin des Motors
int pinServo = 9;

// Variable für die Drehrichtung
int Drehrichtung;

void setup()
{
  // Motor an Pin 9
  Motor.attach(pinServo);

  // Motor anhalten
  Motor.write(90);

  // Zufallsgenerator starten
  randomSeed(analogRead(0));

  // INPUT_PULLUP: Taster als Eingang definieren, Eingang auf HIGH setzen
  pinMode(pinTaster, INPUT_PULLUP);
}

void loop()
{
  // Status des Tasters abfragen
  int TasterLesen = digitalRead(pinTaster);

  // Taster wurde gedrückt
  if (TasterLesen == LOW)
  {
    // Drehrichtung zufällig bestimmen
    Drehrichtung = random(0, 2);

    // Motor im Uhrzeigersinn drehen
    if (Drehrichtung == 0) Motor.write(80);

    // Motor gegen den Uhrzeigersinn drehen
    else Motor.write(100);

    // zufällige Anzahl von Millisekunden drehen
    delay(random(Minimum, Maximum));

    // Motor anhalten
    Motor.write(90);
  }
}
# include "Servo.h"
Servo Motor;
const int Minimum = 300;// Minimum und Maximum der "Laufzeit" des Motors
const int Maximum = 1500;
const int Taster = 7;// Pin des Tasters

void setup() {
  Motor.attach(9); // Motor an Pin 9
  randomSeed(analogRead(0));  // Zufallsgenerator am zufälligen Punkt starten
  pinMode(Taster, INPUT_PULLUP);  // INPUT_PULLUP: Taster als Eingang definieren, Eingang auf HIGH setzen
}

void loop() {
  if (digitalRead(Taster) == LOW)  {// Taster wurde gedrückt
    int Winkel = random(Minimum, Maximum);
    Motor.write(Winkel);
    delay(500);
  }
}

@kolaha Danke für deinen Rückmeldung (leider noch keine Lösung)

Mit deinem Vorschlag dreht sich der Servo ohne stehen zu bleiben. Wenn man den Taster drückt wird er manchmal langsamer und ändert manchmal die Richtung, hört aber nicht auf zu drehen.

Nachdem was ich im Internet recherchiert habe, stoppt man einen 360 Grad Servo, indem man Winkel 90 übergibt. Das passt auch zum Coding und zum Ergebnis mit meinem Servotester.

mal schauen wie sich Srvo jetzt verhält

# include "Servo.h"
Servo Motor;

void setup() {
  Motor.attach(9); // Motor an Pin 9
  Motor.write(90);
  delay(500);
  Motor.write(495);
  delay(5000);
  Motor.write(90);
}void loop() {}

Add more power to your robot with this metal-geared MG90D servo. The tiny
little servo can rotate approximately 90 degrees (45 in each direction), ...
...
... Position "0" (1.5ms pulse) is middle, "90" (~2ms pulse)
is all the way to the right, "-90" (~1ms pulse) is all the way to the left.
Note that the default servo pulse widths (usually 1ms to 2ms) may not give you
a full 180 degrees of motion.

@kolaha Danke für deine Ideen und Hilfsbereitschaft. Leider kommen wir nicht weiter.

Es gibt scheinbar mehrere Versionen dieses Servos. Ich habe die 360 Grad Variante. Die von dir genannten technischen Daten habe ich auch gegoogelt, diese beziehen sich aber auf den "normalen" 180 Grad Servo.

In deinem neuesten Sketch dreht sich der Servo für 5 Sekunden in eine Richtung und stoppt zufällig in seiner Neutralposition. Ich habe das Coding geändert (den delay verkürzt). Ich möchte, dass sich der Servo kurz in eine Richtung dreht (so wie im Glücksrad - siehe Link oben) und dann in dieser Position verharrt und sich nicht zurückdreht oder weiter, bis er in "Neutralposition" ist.

void setup() {
  Motor.attach(9); // Motor an Pin 9
  Motor.write(90);
  delay(500);
  Motor.write(495);
  delay(200);  //nur um ein paar Grad drehen
  Motor.write(90);
}void loop() {}

Ich wollte ein Video anhängen wo man das Problem sieht. Das scheint aber nicht zu gehen. Der Servo dreht sich kurz in eine Richtung. Dann kommt das Stopp-Signal (Motor.write(90)... der Servo dreht sich zurück. Das passiert im Glücksrad nicht und das ist genau das was ich will (das er sich nicht zurück oder weiter dreht).

# include "Servo.h"
Servo Motor;

void setup() {
  Motor.attach(9); // Motor an Pin 9
  Motor.write(90);
  delay(500);
  Motor.write(100);
  delay(500);
  Motor.write(100);
}void loop() {}

@kolaha

Jetzt dreht sich der Servo mit langsamer Geschwindigkeit unendlich.

Lass mal gut sein. Ich vermute, dass man das von mir gewünschte Verhalten nicht erzwingen kann.

Das Tutorial im Netz (Glücksrad) verwendet andere Servos. Ich werde die jetzt bestellen. Ich hatte sie mal, habe sie aber ohne zu testen gegen mein Modell mit Metallgetriebe getauscht. Ich bin eher für robuste dauerhafte Lösungen und kann mich mit Kunststoffgetriebe nicht anfreunden. Zumindest wird der Servo FS90R aber mit genau dem was ich will beworben.

  • Durchlaufend (kann auch als Getriebemotor verwendet werden)
  • Über die Signalleitung wird die Geschwindigkeit im Links- und Rechtslauf vorgegeben. Daher wird dieser Servo häufig als Antrieb für kleine Chassis und Roboterfahrzeuge verwendet.

Ich habe heute die bestellten FS90R bekommen. Diese funktionieren wie erwartet und haben nicht das Verhalten des MG90D. Mit meinem Servotester auf die Schnelle ausprobiert. Sie drehen sich wie erwartet kontinuierlich und verharren in der letzten durch die Rotation erreichten Position, wenn man das Stopp-Signal mit Winkel 90 Grad sendet.

Nun wäre es super, wenn mir jemand sagen kann, ob ich die MG90D (Metallgetriebe) umbauen kann. Dazu habe ich ein Beispiel im Internet gefunden, allerdings bezieht sich dies auf einen "normalen" 180 Grad Servo. Der MG90D 360 ist ja schon ein sich kontinuierlich drehender, allerdings mit der oben beschriebenen "Macke" die eine Verwendung als kleinen Motor unbrauchbar macht (O++O Ninja).

Hier die Umbauanleitung: Ein Servo dreht durch

Bei solchen Umbauten ist es wichtig, Widerstände mit möglichst identischen Werten zu finden, was aufgrund von Fertigungstoleranzen nicht ganz so einfach ist. Wenn diese nicht 100% identisch sind, liegt der „neutrale“ Punkt nicht bei 90, sondern kann auch bei 88 oder 91 liegen.

Das heißt, wenn man den „gepimpten“ Servo mit der Anweisung Motor.write(90); anhalten möchte, funktioniert das nicht. Er dreht sich langsam weiter. Hier muss man durch Ausprobieren den richtigen Wert finden.

Eine Anweisung wie Motor.write(495); funktioniert nicht. Die Werte müssen zwischen 0 und 180 liegen.

Sagen wir, du hast mit den verbauten Widerständen Glück gehabt und der „Stillstandwert“ des Servos ist 90, so dreht er sich bei kleineren Werten im Uhrzeigersinn (0-89) und bei größeren (91-180) entgegen gesetzt. Je größer die Differenz zwischen dem „Neutralwert“ 90 und dem angegebenen Wert ist, desto schneller dreht sich der Servomotor.

Was jetzt genau das Problem mit deinem MG90D ist weiß ich nicht. Meine Erklärung ist nur ergänzend zu der verlinkten Umbau Geschichte.

1 Like

Danke für Deine Rückmeldung und den Hinweis wirklich genau auf die 100% identischen Werte der Widerstände zu achten.

Ich habe das Problem mit den MG90D nun erst mal als Nebenbaustelle erklärt. Prinzipiell juckt es mir schon in den Fingern die mit dem Metallgetriebe brauchbar zu machen, aber das ist schon heikel. Ich habe gestern einen aufgeschraubt. Prinzipiell sieht der Aufbau so aus wie in der Anleitung, aber die dort sind doppelt so groß (haben vermutlich mehr Leistung und auch andere Spannungswerte). Ob dann für meine kleinen Microservos die im Tutorial angegebenen 2,2 kOhm geeignet sind, ist fraglich. Außerdem wird es nicht so einfach die zwei Widerstände (auch wenn die nur 2mm hoch sind) im Chassis unter zu bringen. Aber da müsste ich nochmal genauer hinschauen. War gestern schon spät...

Auf jeden Fall im Moment zu viele Unbekannte. Ich investiere die Zeit vorerst lieber in das eigentliche Projekt und nehme die Servos, die dem gewünschten Verhalten entsprechenden (FS90R).

Die 2k2 werden schon passen. Da diese am Controllerchip hängen (z.B. KC9102 o.ä.) müssen die auch nicht viel Leistung abkönnen. Ich habe bei meinem Umbau 805er 2K2 SMD Widerstände direkt auf die Platine gelötet. Das ist sehr platzsparend :slight_smile: .
Das passt nämlich recht gut auf das 2,54 mm Pinraster des Potentiometers, welches da vorher draufgelötet war.

In diesem Fall handelt es sich um ein MG995 Servo.

@Kai-R
Danke für die Idee bzgl. der SMD Widerstände. Ich habe mal geschaut. Dein Servo ist mit 4,8 bis 7,2 V angegeben. Meiner mit 4,8-6,6V. Das passt ja grob. Ich würde dem ganzen eine Chance geben (denn die Servos sind mit der Eigenheit für mich so oder so unbrauchbar).

Allerdings frage ich mich: bekomme ich das überhaupt noch gelötet (weil so winzig) oder macht man das mit so einer Paste die man erhitzt (Heißluftlötgerät)?

Ich muss dann die 0805 SMD Widerstände kaufen, oder? Die haben eine Länge von 2mm, was ja zum Rastermaß 2,54mm passen würde. Also zum Beispiel: SMD Widerstand 2201 (2.2kOhm) Die haben allerdings nur 1/8 Watt.

Ich habe die mit einem Lötkolben (2mm Lötspitze) + 0,5er Lötdraht aufgebracht. Was man braucht, ist eine gute Pinzette + Lupe...

Erst Lot auf die äußeren Punkte aufbringen, Widerstand für jede Seite mit der Pinzette von der Mitte nach außen in das verflüssigte Lot reinschieben (Lötkolbenspitze als "Anschlag" nehmen), Lot fest werden lassen und dann in der Mitte Lot aufbringen.

Zumindest bei den MG995 reichen 0,125W dicke aus....

Und ja... wenn Du keine SMD Widerstände hast, dann musst Du wohl welche kaufen ;-). Ob es gleich 100Stück von einem Wert sein müssen, weiß ich natürlich nicht. Ich nutze eigentlich nur SMD Widerstände, darum habe ich mir mal für verschiedene SMD Größen ein Samplebook (Beispiel) gekauft. Werte die oft gebraucht werden, kaufe ich mir dann "einzeln" nach. Wenn man selten etwas macht, reicht vielleicht so ein Set aus.

Ich danke Dir für Deine Tipps insbesondere zum Lötprozess. Meine Fähigkeiten sind zwar besser geworden (nach zahlreichen Videos, Tutorials und natürlich Übung / Praxis.) aber auf die Idee, dass so wie von dir beschrieben anzugehen, wäre ich vermutlich (noch) nicht gekommen.

Du hast natürlich recht. Was will ich mit so vielen Widerständen zu einem Wert. Ich habe mir gerade ein Set bestellt (anderer Anbieter wegen Verfügbarkeit).

Jetzt habe ich fast mehr Lust das auszuprobieren, als mein eigentliches Projekt voranzutreiben. Vor allem, weil ich mich ärgere. Ich hatte zwar die MG90D Servos gleich nach Erhalt getestet, aber deren seltsames Verhalten war mir leider nicht aufgefallen. Würde mich freuen, wenn sie durch den Umbau für mich brauchbar würden.

Hast Du mal mit dem Mittelwert ( Motor.write(90); ) etwas herumprobiert?
Und das "Motor.write(495)" auf einen Zulässigen Wert geändert?

Noch ein und: Wenn Du als letztes (wie in Deinen Sketchbeispiel oben) als letztes Motor.write(100) stehen hast, dann macht das Servo genau was es soll, - langsam drehen.