My Servo won't stop spinning

Hello, I have the MicroServo SG90 and I use this code:

#include <Servo.h>

Servo myservo;

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

void loop() {
}

I tried nearly every number, for loops, while commands etc and I don't find a solution.
Please help :frowning:

-Lotuts

It seems you have forgotten #include <Servo.h> at first line.

This is the German part of the forum, so language should be German.

Good luck :slight_smile:

It seems you have forgotten #include <Servo.h> at first line.

This is the German part of the forum, so language should be German.

Good luck :slight_smile:

Ehm ja... da alle Websiten/Tutorials auf englisch sind, hat mein Gehirn wohl nicht zurück auf Deutsch geschaltet.

#include <Servo.h>

Da muss ich anscheinend wohl doch nochmal ins Windows Bootcampt STRG + C und STRG + V üben :slight_smile:
Der fehler lag nicht an dem einbinden, das wäre auch peinlich.

-Lorus

Hi

Erste Annahme: Der Fehler besteht weiter? (Du schreibst, es 'lag' nicht an der fehlenden Servo.h)
Ganz weit ausgeholt:
Dein Servo kann die Position '1' nicht erreichen und fährt voll auf Bock/auf das mechanische Ende

Würde ich dann aber trotzdem nicht als "won't stop spinning" umschrieben.

MfG

Wenn ich ihn auf einen Wert zwischen ca. 10 und 170 setze, dreht er sich auf die entsprechende Gradzahl
90 = ausgangsposition,
0 = quer mit der Spitzle nach links und
180 = quer mit der Spitzle nach rechts.

Aber ich komme nicht an die Werte 0 bzw 180 ran da der Servo ab 10/170 nicht mehr aufhört sich zu drehen.

-Lorus

Lorus:
Wenn ich ihn auf einen Wert zwischen ca. 10 und 170 setze, dreht er sich auf die entsprechende Gradzahl
90 = ausgangsposition,
0 = quer mit der Spitzle nach links und
180 = quer mit der Spitzle nach rechts.

Aber ich komme nicht an die Werte 0 bzw 180 ran da der Servo ab 10/170 nicht mehr aufhört sich zu drehen.

-Lorus

Bei dem Modell gar nicht. Dieser Servo kann sich nicht weiter Drehen als zwischen 10 und 170.
Grüße Uwe

Servo kann sich nicht weiter Drehen als zwischen 10 und 170.

Das schon, aber ich kann die Gradzahl nicht wie davor genau festsetzen sondern der Servo dreht sich fröhlich weiter.

-Lorus

Lorus:
Das schon, aber ich kann die Gradzahl nicht wie davor genau festsetzen sondern der Servo dreht sich fröhlich weiter.

-Lorus

Das ist bei diesen billigen Typen wohl normal.
Ich kenne das Problem auch und drehe nie bis ans Ende/Anfang.

Verwende bessere/teurere Servos, die machen dies Problem nicht.

Lorus:
Das schon, aber ich kann die Gradzahl nicht wie davor genau festsetzen sondern der Servo dreht sich fröhlich weiter.

-Lorus

Das mit der Gradzahl solltest Du eh nicht so ernst nehmen. Die servo-lib setzt die Werte 0-180 für die Ansteuerung des Servos in Pulsbreiten von 544µs - 2400µs um. Was dein Servo dann daraus macht ist eine ganz andere Sache. 'Offiziell' geht der Bereich bei Servos eh nur von 1-2ms. Sehr viele Servos machen aber auch mehr mit. Aber der Bereich den die servo-Lib da standardmässig nutzt ist für die meisten dann doch zuviel.
Ein analoges Servo fährt dann hart an den Anschlag und versucht weiter zu drehen. Das ist aber nicht sehr gesund für das Servo. Digitale Servos ignorieren Pulsbreiten ausserhalb ihres Bewegungsbereiches einfach.
Die Grenzwerte für die Pulsbreiten kann man bei der servo-lib übrigens einschränken ( bei attach als zusätzliche Parameter ) Damit kannst Du erreichen, dass der Bereich von 0-180 dann auch komplett für dein Servo passt ( aber 0-180 Grad sind das dann immer noch nicht - es gibt nur wenige Servos die das wirklich können )

( bei attach als zusätzliche Parameter )

Zwei Fragen,

  1. Wie würden solche Paramenter aussehen?
  2. Gibt es sonst noch eine einfache Möglichkeit den Servo 90° zu drehen?

-Lorus

Lorus:
Zwei Fragen,

  1. Wie würden solche Paramenter aussehen?
  2. Gibt es sonst noch eine einfache Möglichkeit den Servo 90° zu drehen?

-Lorus

z.B.myServo.attach( 9, 800, 2200 );beschränkt den Bereich auf 0,8-2,2ms

Wieweit dein Servo drehen kann bestimmt die Mechanik, da kann die Ansteuerung nichts dran ändern. Wie gesagt, +/- 90Grad können die meisten nicht.

Edit: Du kannst beim myServo.write() auch direkt die Pulsbreite in µs angeben anstatt den 'Pseudo-Grad'. So kannst Du z.B. feststellen, was dein Servo noch ordentlich mitmacht.

0,8-2,2ms

Pulsbreite in µs

2 neue Fragen :slight_smile:
Wofür stehen ms und µs und
warum 0,8 - 2,2 bzw welche Werte sind möglich für ms/µs

-Lorus

Hi

ms = Millisekunden, oder tausendstel Sekunden
Eine Sekunde hat 1000 ms

µs = Mikro-Sekunden, oder millionstel Sekunde
Eine ms hat 1000 µs, eine Sekunde hat 1000000 µs

0,8ms = 800µs
2,2ms = 2200µs

Ein normales Servo hat den Einstellbereich 1ms ... 2ms, also eine Mindestlänge des Impuls von 1000µs und eine maximale Länge von 2000µs.
Ob und wie viel Dein Servo mehr kann, oder ob die Grenzen Deines Servo sogar noch innerhalb der normalen Werte liegen, kannst nur Du ausmessen.

Eine Schleife, lasse von 1500 (µs = Mittelstellung) runterzählen, bis Du auf Block gefahren bist (immer Anzeige des Wert im Terminal), nach Tastendruck Sprung auf 1500 und in die andere Richtung, bis Du wieder eine Taste betätigst.
Die so gefundenen End-Werte kannst Du dann in Dein Programm einarbeiten.
Was dabei wie viele Grad entspricht ... wird sich so nicht direkt umrechnen lassen - auch hier wirst Du um eine Messung, blöd gesprochen: Geodreieck, nicht herum kommen.

Wie genau müssen die 90° sein?

MfG

MicroBahner:
... +/- 90Grad können die meisten nicht.

Was einen wie mich wundert, weil ich dachte, dass (Modellbau-) Servos, die nicht gerade billig sind, wenigstens das können, was man als Hobby-Ingenieur erwarten darf.

Was soll's. Früher hieß es wohl mal „Hauptsache, das hält ewig“, heute ist es wohl eher „Hauptsache, es passt nicht“ (gerne aus Fernost). Da können die noch so lange in D studiert und hunderte von Doktortiteln gekauft und Baupläne kopiert haben.

Oder ist es technisch unmöglich etwas zu bauen, das sich über einen Bereich von 180° bewegt, wenn man eine passende Rechteckspannung anlegt?! In diesem Fall bitte ich um Entschuldigung. Vielleicht sind 180° ja auch zu viel verlangt.

Gruß

Gregor

Hi

Jetzt suche ich mir keines der Servos mehr raus - aber über 180° sollten Die können, da der 'Sperr-Knubbel' mechanisch an ein und dem selben Gehäuse-Teil anstößt.
Ok, man könnte den 'Knubbel' auch so groß machen, daß keine 10° mehr gehen ...

Vll. nach dem Aufstehen Mehr dazu

MfG

gregorss:
Was einen wie mich wundert, weil ich dachte, dass (Modellbau-) Servos, die nicht gerade billig sind, wenigstens das können, was man als Hobby-Ingenieur erwarten darf.

Hallo Gregor,
wieso meinst Du, dass man das erwarten darf? Weil die Entwickler der Servo-Lib diesen Bereich von 0..180 eingeführt haben? Servos wurden nicht für den Arduino entwickelt.
Modellbauservos sind für die Ansteuerung von Rudern, Lenkungen, Drosselklappen oder ähnlichem entwickelt worden. Die werden über eine in den Servoarm eingehängte Stellstange betätigt. Durch den Hebelarm wird die Drehbewegung des Servo in Zug und Druckkräfte an der Stellstange umgesetzt. Dabei sind Drehbewegungen von +/- 90° um die Mittelstellung kontraproduktiv, denn in den Endbereichen würde die Stellstange nur seitlich bewegt, ohne dass nennenswert Zug- oder Druckkräfte umgewandelt werden können. Befinden sich noch weitere Umlenkhebel im Stellweg, so könnten die sogar verkanten.
Deshalb sind die Standard-Servos für einen Drehbereich von +/-60Grad spezifiziert, denn in dem Bereich funktioniert die Umsetzung Drehbewegung->Linearbewegung noch effektiv.
Natürlich ist der tatsächliche Bewegungsbereich etwas größer, denn man braucht ja noch etwas 'Luft' und ein Servo sollte auch nicht gegen seine Anschläge laufen, das tut der Mechanik nicht gut. +/-90Grad macht aber für einen Standard-Servo keinen Sinn, und die kann man deshalb auch nicht erwarten ( auch wenn es welche gibt, die da rankommen ).

Klar gibt es auch Spezialservos für alle möglichen Sonderfälle, die haben dann gegebenenfalls einen größeren Stellbereich, oder sogar gar keine Anschläge ( z.B. Ankerwindenservos ).

Hi

Meine Servos mit der

  • Bezeichnung 'SG90'
  • Farbe Gelb...Orange
  • Spannung 4,8---6,0V
  • Kraft 1,5...1,8kg/cm
  • Speed 0,12...0,10s/60°

gelabelt von 'MR.RC'
sollte Denen entsprechen:
eBay: 182477701782 /eBay-Link

Mein Servo hat über 180° Stellbereich, nicht gemessen, nur durch händisches Verdrehen 'ermittelt'.

Dann habe ich noch Servos in Blau, Die bei eBay sowohl mit SG90 wie mit 9G bezeichnet sind.
Hier sind keine Daten auf dem Servo, bei eBay steht Da etwas mehr:
Material: Plastic
Operating Speed (4.8V no load): 0.12sec / 60 degrees
Operating Speed (6.0V no load): 0.10sec / 60 degrees
Torque (4.8V): 1.6 kg/cm
Temperature Range: - 30 to + 60℃
Dead Band Width: 5us
Operation Voltage: 4.8 - 6.0 Volts
Dimension: approx. 2.3cm×1.22cm×2.9cm/0.91×0.48×1.14in
Cable length: approx. 25cm/9.84in
Weight: approx. 12g (include accessories)

Mein Servo davon hat ebenfalls mehr als 180° Verstellbereich, wenngleich hier der Bereich kleiner aussieht, aber definitiv über 180°.

Vll. hilft's ja

MfG

Und in welchen Bereichen kannst du diese Servos mit dem Arduino verstellen? Weil ausser der mechanischen Begrenzung, die durchaus auch bei 270° liegen kann, gibt es vielleicht auch noch eine elektronische, wie bereits weiter oben schon erwähnt

Hallo,
das mit dem mechanischen Verdrehen ist eigentlich keine gute Idee, wenn überhaupt sollte man sehr behutsam vorgehen - das Kunststoffgetriebe eines billg-Servos ist da schnell hinüber.
Der mechanische Stellbereich sagt aber noch nicht wirklich was über den elektrisch nutzbaren Bereich.
Ich habe das jetzt auch mal 'gaaanz vorsichtig :wink: ' bei 3 verschiedenen Servos ermittelt. Elektrisch mit der Servo-Demo aus der IDE, die den Servo einfach zwischen 0 und 180 hin- und herfährt.

  1. billig-Servo, analog (Y-3009)
    mechanischer Stellbereich etwas über 180Grad
    elektrisch: ca 170Grad

2)einfacher digital-Servo ( blueBird BMS-371DD ):
mechanisch: ca 160 Grad,
elektrisch ca 150Grad

2)ein etwas besserer DigitalServo ( EMAX ES09MD) , schon mit Metallgetriebe und Kugellager:
mechanisch: KEIN Anschlag ( lässt sich komplett durchdrehen )
elektrisch: etwas mehr als 120Grad ( ziemlich genau die oben erwähnten +/- 60 Grad )

Bei den beiden Digital-Servos werden die extremen Pulsbreiten ( kurz und lang) die die Servo-Lib erzeugt, bereits ignoriert, da bleibt das Servo einfach an seiner eigenen elektrischen Endstellung stehen.

MicroBahner:
wieso meinst Du, dass man das erwarten darf? ...

Weil man als guter Ingenieur das Maximum anstreben sollte und ich als Hobby-Mechatroniker eher an +/- 90° als an +/- 60° denke.

Was Du schreibst, sind aber Argumente, die einleuchten und meine Denke korrigiert haben. Danke!

Gruß

Gregor