Servo Startgeschwindigkeit durch Transistor?

Hallo,

es gibt ja etliche Threads zum Thema Servozucken und Anfahren der Startposition eines Servos beim Einschalten. Gerne wollte ich mal fragen, ob sich jemand damit auskennt und schon ausprobiert hat, ob dieses Problem mittels Transistor oder Mosfet gelöst werden kann. Der Ablauf wäre in etwa so:

  1. Transistor / Mosfet unterbindet die Stromversorgung des Servos
  2. Arduino wird gestartet
  3. Arduino hängt den Servo ein
  4. Arduino sendet einen Winkel (z.B. 90)
  5. Der Transistor wird mittels einer Rampe von 0 auf 255 PWM langsam erhöht.

Dadurch würde doch der Servo auch erst langsam von seiner Position zu 90 Grad drehen, oder sehe ich das falsch? Hat das schon wer ausprobiert, oder kann definitiv sagen, dass das nicht geht? Sonst würde ich das mal versuchen.

Liebe Grüße,
Christoph

bAm2017:
… oder sehe ich das falsch?

Ja, Du siehst das falsch. Ein Servo fährt die durch das Tastverhältnis des Steuersignals festgelegte Position an. Statt zu zucken, würde sich Dein Servo zunächst an den Anfangs-Anschlag bewegen.

Gruß

Gregor

PS: Etwas so simples einfach mal auszuprobieren, ist grundsätzlich eine gute Idee. Dann siehst Du nämlich, dass „255 PWM“ keinesfalls 90 Grad bedeuten.

Das wird so nicht funktionieren. Die Stromversorgung des Servos betrifft ja nicht nur den Motor. Da ist auch eine Regelelektronik drin, die die Position des Servos aktiv regelt. Die wird ein PWM-Signal an der Stromversorgung nicht wirklich mögen.

Grundsätzlich lässt sich das Problem nur lösen, wenn Du weist wo dein Servo steht, und ihm beim Start des Arduino genau diese Position vorgibst. Da du die Position bei einem normalen Servo nicht auslesen kannst, ist eine Möglichkeit, sich die Positon bei der Ansteuerung jeweils im EEPROM zu merken, and dann nach Aus-Einschalten als erstes diese letzte Position wieder anzufahren. Wurde das Servo in der zwischenzeit nicht mechanisch bewegt, wird es dann auch nicht - oder nur kaum - zucken. Dabei sind aber die maximalen Schreibzyklen des EEPROM zu beachten.
Das Einschaltzucken eines Servos beim Einschalten der Stromversorgung ist eine andere Geschichte - da gibt es je nach Servo verschiedene Wege das mehr oder weniger gut zu unterdrücken.

Servus MicroBahner und gregorss,

vielen Dank für die schnelle Antwort!
Ja, dass klingt durchaus logisch.

Liebe Grüße,
Christoph

Wobei! Ein Punkt ist mir doch noch unklar:
Wenn ich jetzt den Transistor nicht mit PWM, sondern mittels DAC ansteuere.
Dann müsste doch der Servo bei weniger Volt langsamer drehen, oder nicht?
(Ich gehe jetzt mal davon aus, dass es Belastung am Motor gibt.)

Werde bei Gelegenheit mal an der Hardware testen. Das hilft immer für's Verständnis ...

bAm2017:
Wobei! Ein Punkt ist mir doch noch unklar:

Wenn Du einen Servo langsam fahren lassen möchtest, dann steuere ihn anders an. Das über analoge Änderungen der Betriebsspannung zu regeln, ist wahrscheinlich gar nicht möglich.

bAm2017:
Werde bei Gelegenheit mal an der Hardware testen. Das hilft immer für's Verständnis ...

Basteln ist immer gut :slight_smile:

Gruß

Gregor

PS: Vielleicht ist für Deine Anwendung ein DC-Getriebemotor die bessere Alternative.

bAm2017:
Wobei! Ein Punkt ist mir doch noch unklar:
Wenn ich jetzt den Transistor nicht mit PWM, sondern mittels DAC ansteuere.
Dann müsste doch der Servo bei weniger Volt langsamer drehen, oder nicht?
(Ich gehe jetzt mal davon aus, dass es Belastung am Motor gibt.)

Werde bei Gelegenheit mal an der Hardware testen. Das hilft immer für's Verständnis ...

Auch das wird sich nicht richtig funktionieren, da auch die interne Elektronik dann weniger Spannung bekommt und daher nicht mehr sicher arbeitet.

gregorss:
PS: Etwas so simples einfach mal auszuprobieren, ist grundsätzlich eine gute Idee. Dann siehst Du nämlich, dass „255 PWM“ keinesfalls 90 Grad bedeuten.

Er meint die Stromversorgung und nicht das Steuersignal. Er glaubt durch PWM einen "Sanftanlauf" der Servos zu erreichen

@bAm2017

Ein Servo braucht eine stabile Versorgungsspannung.
Die Signalauswertungselektronik und die Motoransteuerung funktionieren weder bei PWM noch bei kleinen Spannungen sicher.

Erzähl mal was Du da ganau machen möchtest.

Grüße Uwe

Servos haben im allgemeinen einen bertiebsspannungs-Bereich von 4,8V - 6V.
Es gibt auch spezielle, sogenannte HV (HochVolt) Servos die 7,2 oder gar 8,4 V abkönnen.

Um bei den normalen Servos zu bleiben: Die Geschwindigkeit des Servos ist bei 6V höher als bei 4,8V. Ebenso die Stellkraft , und natürlich auch die max. Stromaufnahme.

So ein Servo läuft auch mit weniger als 4,8 V, und ist da natürlich auch langsamer und hat auch einiges weniger Kraft, ABER: viel weniger als 4 V dürfen es nicht werden, weil sich der servo dann eben gar nicht mehr bewegt, denn die Elektronik da drin braucht nunmal eine gewisse minimale Spannung, um zu arbeiten. Und glaube mir, bei 4V geht da wirklich kaum mehr was.
Was auch zu beachten ist: Du solltest dem Servo nicht die Betriebsspannung nehmen, aber so locker flockig mit dem Arduino 5V als Signalspannung (Steuerspannung einspeisen, sowas mag die Elektronik im Servo nicht. Di Spannung am Signaleingang sollte (darf) nicht höher als die Betriebsspannung werden.

Dies nur so mal ein bisschen als Erklärung, wie so ein Servo tickt.

Nochwas: die Betriebsspannung mittels DAC zu steuern ist ebenfalls keine gute Idee , denn der DAC müsste dann auch den STROM, den der Servo zieht, wenn er sich Bewegen möchte, liefern können, sonnst kann Dir der DAC kapput gehen.

LG Stefan

Servos haben im allgemeinen einen bertiebsspannungs-Bereich von 4,8V - 6V.
Es gibt auch spezielle, sogenannte HV (HochVolt) Servos die 7,2 oder gar 8,4 V abkönnen.

Um bei den normalen Servos zu bleiben: Die Geschwindigkeit des Servos ist bei 6V höher als bei 4,8V. Ebenso die Stellkraft , und natürlich auch die max. Stromaufnahme.

So ein Servo läuft auch mit weniger als 4,8 V, und ist da natürlich auch langsamer und hat auch einiges weniger Kraft, ABER: viel weniger als 4 V dürfen es nicht werden, weil sich der servo dann eben gar nicht mehr bewegt, denn die Elektronik da drin braucht nunmal eine gewisse minimale Spannung, um zu arbeiten. Und glaube mir, bei 4V geht da wirklich kaum mehr was.
Was auch zu beachten ist: Du solltest dem Servo nicht die Betriebsspannung nehmen, aber so locker flockig mit dem Arduino 5V als Signalspannung (Steuerspannung einspeisen, sowas mag die Elektronik im Servo nicht. Di Spannung am Signaleingang sollte (darf) nicht höher als die Betriebsspannung werden.

Dies nur so mal ein bisschen als Erklärung, wie so ein Servo tickt.

Nochwas: die Betriebsspannung mittels DAC zu steuern ist ebenfalls keine gute Idee , denn der DAC müsste dann auch den STROM, den der Servo zieht, wenn er sich Bewegen möchte, liefern können, sonnst kann Dir der DAC kapput gehen.

LG Stefan

Ok, viel komplexer wie gedacht :slight_smile:

Sowas habe ich gefunden:

Die werde ich mal bestellen und testen.
Wie es aussieht, lässt sich hier die Geschwindigkeit vom Servo stufenlos regeln.

Weiß jemand, wie das technisch funktioniert?

Hallo,
hier werden jetzt aber mehrere Probleme in einen Topf geworfen, die ganz unterschiedliche Ursachen haben, und auch getrennt betrachtet werden müssen.

  • Das langsame Bewegen des Servo im normalen Betrieb (wie im Video).
    Das wird erreicht, indem das Steuersignal des Servos langsam an die Zielposition herangeführt wird. Sehr einfach geht das z.B. mit meinen MobaTools
  • Die Bewegung zum ersten Zielpunkt nach dem Einschalten des Arduino. Dazu habe ich oben etwas geschrieben
  • Das Zucken des Servos beim Einschalten der Betriebsspannung. Das hat zunächst mal mit der Ansteuerung noch gar nichts zu tun. Wie ausgeprägt das ist, hängt vom Servo ab. Bei digitalen ist es oft garnicht vorhanden, bei analogen kann es ziemlich heftig sein. Bei vielen analogen Servos hilft da ein Widerstand ( ca 4,7kOhm) vom Steuereingang zum Betriebsspannungsanschluß. Es gibt auch Servos, da lässt es sich garnicht komplett unterdrücken.

Ok, verstehe.

Ihre Bibliothek schaut sehr spannend aus!
Dabei wird wohl die Geschwindigkeit dann wohl durch Rampen gelöst.
Also die Servo Position alle x Millisekunden um 1 Grad gelöst, oder?

bAm2017:
Dabei wird wohl die Geschwindigkeit dann wohl durch Rampen gelöst.
Also die Servo Position alle x Millisekunden um 1 Grad gelöst, oder?

Ja, im Prinzip ist das so. Dazu muss man vielleicht erstmal verstehen, wie ein Servo angesteuert wird.
Die Position, die das Servo einnehmen soll, wird durch Pulse am Steuereingang vorgegeben. Nominal haben die Pulse eine Länge von 1...2ms und werden alle 20ms wiederholt. Wesentlich ist dabei die Länge des Pulses, denn die bestimmt die Position die das Servo anfahren soll. Die Regelung im Servo wird immer die Position entsprechend der Pulslänge so schnell wie möglich anfahren und dann auch gegen äußere Einflüsse aktiv halten ( solange die Impulse anstehen ). Das lässt sich ( ohne Eingriff in die Servo-Elektronik ) nicht beeinflussen.

Wenn nun das Servo langsam von Position A nach Position B fahren soll, darf man die Pulslänge nicht schagartig ändern, sondern muss sie alle 20ms um einen kleinen Betrag ändern, bis die Länge entsprechend der Zielposition erreicht ist. Der Wert, um den die Pulslänge alle 20ms geändert wird, bestimmt dabei letztendlich die Geschwindigkeit des Servos. Dieser Wert lässt sich bei den MobaTools einstellen, womit die Geschwindkeit beeinflusst werden kann.

Das Problem dabei: damit man die Pulslänge vom Startpunkt bis zum Zielpunkt langsam verändern kann, muss man die Pulslänge für den Startpunkt kennen. Und das ist halt direkt beim Einschalten des Arduino erstmal nicht der Fall. Deshalb lässt sich eine langsame Bewegung zum ersten Zielpunkt nach dem Einschalten nicht realisieren. Damit es hier nicht 'zuckt' muss der erste Zielpunkt deshalb der tatsächlcihen Position des Servos entsprechen.

Ne Idee: Lässt sich das Zucken vielleicht so vermeiden:

  • Der Servo ist mit einem Transistor von der Energiequelle getrennt.
  • in setup() wird das Servo-Objekt angelegt und das Servo-Objekt auf die von der letzten „Anfahrt“ im EEPROM gespeicherte Position gefahren (das Steuersignal wird auf den zuletzt angefahrenen Wert gestellt)
  • erst jetzt wird der Transistor, der den Servo von der Energiequelle trennt, geschaltet.

Der Servo bekommt also vom Start weg genau das Signal, das zuletzt eingestellt war.

Geht das? Man muss halt beim Verfahren des Servos an eine neue Position den Wert im EEPROM speichern, aber dank EEPROM.update() wird die Zelle ja nicht unbedingt jedesmal geschrieben.

Gruß

Gregor

Könnte bei manchen Servos evtl. auch funktionieren. Das Problem ist einfach wie die interne Elektronik beim 'Hochlaufen' der Spannungsversorgung reagiert. Das ist durchaus je nach Servo sehr unterschiedlich. Meiner Erfahrung nach funktioniert das mit dem Widerstand bei sehr vielen analogen Servos. Wobei es meistens nur eine Reduzierung des Zuckens ist. Vollständig unterdrücken lässt es sich oft nicht. Digitale Servos scheinen da wesentlich besser zu sein.

Hi

Dem könnte 'Signal-Spannung >>Vdd entgegen stehen, daß dort dann einfach die Schutzdioden im Servo-IC stirbt.
Wenn schon, dann richtig und das Servo zum Servo-Antrieb umbasteln - einen Encoder an die Welle und der Arduino weiß VOR dem Einschalten, wo das Servo steht (oder das Poti abgreifen - nur kA, ob Das ohne Vdd 'tut') - diese Stellung könnte der erste Befehl beim Einschalten des Servo sein.

Wenn man den Wert des internen Poti kennt, könnte man den Poti-GND-Widerstandswert versuchen auszulesen - scheint mir aber mit mit Autobussen nach Meerschweinchen geworfen ...

MfG

Danke :slight_smile:

postmaster-ino:
Dem könnte 'Signal-Spannung >>Vdd entgegen stehen, daß dort dann einfach die Schutzdioden im Servo-IC stirbt.

Ich hatte noch kein Servo, wo das ein Problem war. Die sind da offensichtlich etwas robuster gebaut.

postmaster-ino:
Wenn schon, dann richtig und das Servo zum Servo-Antrieb umbasteln - einen Encoder an die Welle und der Arduino weiß VOR dem Einschalten, wo das Servo steht

Gegen das Servozucken beim Einschalten der Versorgung dürfte das auch nicht unbedingt helfen, da das meistens unabhänig vom anliegenden Steuersignal ist. Mag sein, dass es Servos gibt, wo das hilft, mir sind soche noch nicht untergekommen. Aber ich habe ja auch noch nicht alle Typen in der Hand gehabt .. :wink: .

Hi

Wenn in den ersten 20ms, in Denen die Spannung am Servo anliegt, die erste Impuls-Länge rein kommt, sollte die Ziel-Position gesetzt sein - egal, wie und wohin das Servo anfänglich zucken wollte, nach den 20ms sollte das Servo wieder im Zaum sein.
... rein theoretisch :wink:

Sorry: Wenn mich das Zucken stört, muß ich was Anderes nehmen, als Spielzeug-Servos!
Es gibt in der Industrie Motoren, Die 'auf Punkt' ansteuerbar sind mit Geschwindigkeiten, wo Einem schwindelig wird (oder man nicht vor weglaufen müssen will - da kommt schon Mal eine Achse 'angehüpft' :slight_smile: ).

Und wenn ich das ganze Drumherum zusammen geschustert habe, werde ich feststellen, daß die industrielle Komponente, Die macht, was ich will, nur unwesentlich teurer ist, als ich bisher in das Projekt versenkt habe - und dazu noch 'steckerfertig'.

MfG

PS: Klar ist vieles möglich, aber man muß das Rad nicht jeden Monat neu erfinden - weil man 'es kann'