Servosteuerung am Turtleroboter

  • Hallo Tom,


    meine letzte Antwort war unpräzis und vermutlich etwas verwirrend. Ich habe sie deshalb gelöscht. Die Ansteuerung eines Servos ohne die Servo-Library ist gar nicht so einfach. Hier sind etwas detailliertere Angaben.


    Standardmässig wird ein Servo über einen Impuls von 1000 bis 2000 Mikrosekunden Breite angesteuert. Der Winkelbereich erstreckt sich dabei auf 180 Grad. Leider ist das oft nicht der Fall.


    Doch beginnen wir mit der Frage: wie lange soll der Impuls gesendet werden?

    In der Servo-Library genügt ein einzelner write() - Befehl um eine Position anzufahren. Beim manuellen Timing genügt das nicht. Wir müssen den Impuls mindestens senden, bis die Position erreicht ist. Wenn wir dann ausschalten, bleibt der Servo einfach auf dieser Position stehen. Das hat den Vorteil, dass der Servo vollständig ruhig ist und keine Geräusche mehr von sich gibt. Aber es hat auch einen Nachteil: wenn von aussen eine mechanische Kraft versucht die Servoposition zu ändern, wird der Servo nachgeben. Nur wenn wir die Impulse weiter senden, kann der Servo dagegen halten.


    Sind diese 1000 bis 2000 Mikrosekunden in jedem Fall korrekt?

    Nein, sie sind es nicht. Es kann je nach Servo-Modell beträchtliche Abweichungen geben. Bei billigen China - Servos steht normalerweise auch kein zuverlässiges Datenblatt zur Verfügung. Die korrekten Werte müssen also experimentell ermittelt werden. Es könnten auch Werte zwischen 500 und 2500 Mikrosekunden auftreten.


    Ist der Bereich von 180 Grad in jedem Fall gegeben?

    Auch davon kann man nicht ausgehen. Die korrekten Werte (sie liegen normalerweise im Bereich von etwa 170 bis 210 Grad) müssen ebenfalls experimentell ermittelt werden. Daraus sieht man, dass die Angabe 90 Grad für gerade aus nicht sinnvoll ist. Sinnvoller wäre eine Angabe von -90 Grad bis +90 Grad. So könnte 0 Grad immer gerade aus sein, auch wenn die Maximalwerte nicht 90 Grad sind.


    Gibt es noch andere Probleme?

    Ja, selbstverständlich. Diese liegen dann aber nicht direkt beim Servo. Der Servo soll ja etwas bewegen. Dort ist es natürlich möglich, dass andere mechanische Begrenzungen vorhanden sind. Ausserdem kann es sein, dass der Servo zwar exakt auf 0 Grad steht, deine mechanische Konstruktion aber dafür sorgt, dass die Augen dennoch nicht exakt nach vorne schauen.


    Das alles kann per Software auskorrigiert werden. Doch das Programm kann dann schon recht komplex werden. Die Servo-Library ist davon selbstverständlich auch betroffen. Auch hier erfordert die präzise Ansteuerung einigen Zusatzaufwand.


    Eigentlich müsste ich die Servo-Ansteuerung im Turtle-Roboter völlig neu schreiben. Da liesse sich doch noch etwas mehr Präzision herausholen.


    Gruss

    René

  • Hallo Community,

    ich weiß nicht, ob es eine elegantere Lösung gäbe, aber ich habe mir jetzt einmal so beholfen:

    void Augen::schaugerade(){

    int i;

    for (i=0;i<15;i++){

    setRichtung(0);

    }

    }

    Ich habe Augen.cpp mit dieser Funktion erweitert. 15 Zyklen reichen um den Kopf von ganz rechts bzw. ganz links wieder mittig auszurichten. Überall wo zuvor "setRichtung(0) stand steht also nun "schaugerade". Funktionieren tut's.

  • Hallo Community,

    ich verstehe einen Teil der Funktionalität nich so ganz. Könnte sein, dass es auch an meiner Hardware liegt, da ich ein etwas anderes Fahrzeug habe. Ich habe das Programm "Hindernis7" soweit angepasst, dass es bei meinem Roboter funktioniert. Waren nur ein paar Pins. Doch dann fiel mir auf, dass das Fahrzeug nach einem Ausweichmanöver den Kopf immer noch schräg zur rechten Seite ausgerichtet hatte. Also hab ich mit die drei User-cmd's angepasst und die Loop folgendermaßen erweitert:

    switch (cmd) {

    case cmd_vor: vorwaerts(); // Taste nach oben

    break;

    case cmd_stopp: stopp(); // Taste 2

    break;

    case cmd_user1: augen.setRichtung(-90);

    break;

    case cmd_user2: augen.setRichtung(0);

    break;

    case cmd_user3: augen.setRichtung(90);

    break;

    Ich hatte also vor mit den drei Tasten die richtigen Servoparameter zu ermitteln, was auch relativ gut funktioniert. Das eigenartige ist nur, dass die Positionen schrittweise angefahren werden. D.h. ich muss die Taste "Stern" so oft drücken bis der "Kopf" auf - 90° steht. Genauso verhält es sich mit der Mittelposition und mit der +90° - Position. Kann das evtl. an meinem verwendetem Servo liegen. Komischerweise habe ich heute einen kurzen Testsketch geschrieben, bei dem der Servo ebenfalls durch Erzeugen eines 20ms-Zyklus angesteuert werden. Das funktionierte einwandfrei. Ich verwende ein kleines SG90-Servo - kann es evtl. an diesem liegen ? < hab hier mal zwischenzeitlich einen kurzen Test durchgeführt > Ok - einen Teil hab ich grad selber entdeckt, da mir eingefallen ist, da ich ja diesen Zyklus dauernd loopen ließ. Ich habe nun ein delay von 1000 eingefügt und nun gesehen warum die Position schrittweise angefahren wird. Ich war bisher der Meinung, dass ein Zyklus reichen würde, obwohl mir eigentlich klar gewesen sein sollte, dass 20ms dafür etwas knapp wären. ^^

    Bleibt noch das Problem warum mein Servo nach der Messung nicht gerade ausgerichtet wird. Vielleicht hat jemand eine Idee.

    Vielen Dank