- 12V Akku mit 280 Ah bauen         
Seite 5 von 6 ErsteErste ... 3456 LetzteLetzte
Ergebnis 41 bis 50 von 85

Thema: RP6Control M32: Library für 8 Servos

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hi allerseits,

    ich versuche mit den drei Servos ein paar positionen nacheinander anzufahren, zunächst mal zwei. mit dem code (in Dirks democode eingesetzt)

    Code:
       while(true) 
       {
           servo2_position = 30;
           servo4_position = 50;
           servo6_position = 120;
    
          task_SERVO();
          mSleep(3);
      
    	    servo2_position = 80;
           servo4_position = 100;
           servo6_position = 20;
    
    	  task_SERVO();
    	  mSleep(3);
    
       }
    geht es nicht. Muss ich in die while-true schleibe noch einmal zwei zählschleifen einbauen, oder wird das nacheinander abarbeiten der zwei positionen auf eine andere art erreicht?


    danke...
    gruß inka

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    30.12.2009
    Ort
    Koblenz
    Alter
    45
    Beiträge
    78
    Die Positionsveränderungen der jeweiligen Servos erfolgt sehr schnell hintereinader. Versuch es mal mit einem Timer, der die jeweiligen Positione alle 2 Sek. oder so Ändert. Sollte dann funktionieren. Ist Ähnlich, als wenn Du versuchen würdest Deinen Arm alle 10 Millisekunden zu strecken, zu beugen und wieder zu strecken. Das geht einfach nicht,
    Ich habe bereits bis Unendlich gezählt. Zweimal, und zurück

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @inka:
    Da gibt es einige Möglichkeiten.

    Am Einfachsten:
    In der while(1)-Schleife gibt es eine Stopwatch-Abfrage (a-la: if (getStopwatch2() > nnn) ...). Darin änderst du dann die 3 Servopositionen.
    Das kann man z.B. so machen, dass man die Positionen in einem Array ablegt. In deinem Fall wäre das z.B. ein Array mit 3 Werten je Position. Die Größe (Zahl der Positionen) hängt von der Länge der Bewegung ab, die du machen willst.
    Jedesmal, wenn die Stopwatch-Abfrage aufgerufen wird (also alle nnn ms) übergibst du die Werte aus dem Array an die Variablen servoX_position. Dann zählst du noch den Index des Array um 1 hoch.
    Dadurch kannst du jede komplexe Bewegung der 3 Servos abspulen.

    Wenn das alles in deinem Programm noch besser wird, gibt es mehrere Bewegungsabläufe als Funktionen in der while(1)-Schleife:
    Code:
    while(true)  
    {
    	task_SERVO();	// The main servo task
    	Bewegung1();
    	Bewegung2();
    }
    Jede Bewegung sieht so ähnlich aus:
    Code:
    void BewegungX(void)
    {
    	if (getStopwatchY() > nnn) {	// Change position every nnn ms
    		// Hole 3 Servopositionen aus dem Array
    		// Lege sie in 3 servoX_position ab
    		// Inkrementiere den Array-Index
    		setStopwatchY(0);
    	}
    }
    Gruß Dirk

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180

    servo II zittert

    hi allerseits,

    ich habe ein bischen mit dem beispielprogramm von proevofreak experimentiert und habe eine frage:

    Code:
    #include "RP6BaseServoLib.h"
    
    
    
    
    
    int main(void)
    {
       initRobotBase();
    
    
    
       /* Servo1 in die linke Stellung vordefiniert */
    
    
       initSERVO(SERVO1/* | SERVO2*/ );
    
    
    startStopwatch2();
    
    if (getStopwatch2() < 100)
        {servo1_position = 55;
    //     servo2_position = 180;
         writeString("Servopos: 55 \n");}
    
    
       while(true)
       {
    
    
     if (getStopwatch2() > 1000 && getStopwatch2() < 2000)
        {servo1_position = 0;
         writeString("Servopos: left \n");}
    
     if (getStopwatch2() > 3000 && getStopwatch2() < 4000)
       {servo1_position = RIGHT_TOUCH;
       writeString("Servopos: right \n");}
    
     if (getStopwatch2() > 5000 && getStopwatch2() < 6000)
       {servo1_position = MIDDLE_POSITION;
       writeString("Servopos: middl_pos \n");}
    
     if (getStopwatch2() > 7000)
          {setStopwatch2(0);}
    
        task_SERVO();
         mSleep(3);
       }
       return 0;
    }
    so, wie es ist, funktioniert es für sevo I. Wenn ich servo 2 initialisiere und in position "180" fahren lasse (ist noch for der whileschleife) tut servo 2 das, die ganze mimik fängt aber bei weiteren bewegungen von servo 1 zu zittern und wackeln. servo 2 verharrt in der zugewiesenen position...

    die Servos werden extern versorgt, die massen sind verbunden...

    wieso das so ist - ich komme einfach nicht drauf...
    gruß inka

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2009
    Ort
    Berlin
    Beiträge
    450
    Hallo,
    also ich hab nun auch mal die 8 ServoLib von Dirk ausprobiert und bin auf einige Probleme gestossen.
    1. Wie kann ich denn den Servo anpassen ? . Ich habe den Servo am linken Anschlag. Wenn ich das Demo starte, springt das Horn ein Stück nach vorn und dann lüft es ruhig zum rechten Anschlag (162) =180 Grad. Die Position 0 sind aber bei mir 20-30 Grad und nicht 0 Grad
    In der Header Datei habe ich schon alles möglich versucht (wenig davon verstanden) aber ich komme nicht auf 0 Grad. Mit der Hand ist das kein Problem.
    2. Ich lasse beim Start meines Programm die Servos einmalig ausrichten, um sie dann später neu zu positionieren. Die Servos summen dann die ganze Zeit leise vor sich hin und bei den Versuch mal mit der Hand zu Drehen merkt man das da ein Wiederstand ist. Wie kann ich das denn abschalten ? Also so das nach einer Neupositionierung die Servos "lose" sind.

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @TrainMen:
    Die Position 0 sind aber bei mir 20-30 Grad und nicht 0 Grad
    Den linken Anschlag kann man mit LEFT_TOUCH einstellen. Je kleiner man die Konstante macht, umso weiter geht der Servoarm zum linken Anschlag. Ich würde mal die Werte 65, 60, 55 ... probieren.

    Wie kann ich das denn abschalten ? Also so das nach einer Neupositionierung die Servos "lose" sind.
    Die Servoansteuerung kann man mit stopSERVO() anhalten.

    Gruß Dirk

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2009
    Ort
    Berlin
    Beiträge
    450
    @Dirk:
    LEFT_TOUCH einstellen. ......die Werte 65, 60, 55 ... probieren.
    ja genau, so dachte ich es mir auch, ich war bis auf 10 runter, da passiert nichts. Wenn ich an RIGHT_TOUCH spiele merke ich das sofort, und nun ?
    mit stopSERVO() anhalten.
    ja hatte ich auch probiert, sie sind dann zwar "lose" aber ich kann sie dann nicht mehr aktivieren. initSERVO habe ich dann erneut versucht aber da passiert dann nichts.
    mfg TrainMen

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @TrainMen:
    ...da passiert nichts. ..., und nun ?
    Wenn du LEFT_TOUCH in der RP6ControlServoLib.h geändert hast, kompilierst du ja alles neu. Nach meiner Erfahrung wird dabei manchmal die Lib nicht neu kompiliert. Ich lösche dann immer im Projekt den Unterordner .dep und alle Dateien mit .elf, .lss, .lst, .map, .o, .sym vor dem nächsten Kompilieren der Demo. Zur Sicherheit lösche ich auch .lst und .o im RP6Lib\RP6control Verzeichnis.
    Wenn es das bei dir nicht ist, dann hier noch 2 geänderte Demos. Bei Version 1 fährt das Servo umgekehrt, d.h. langsam an den linken Anschlag. Dadurch kann man es besser einstellen. In Version 2 werden die beiden Endpositionen und die Mittelstellung nacheinander angefahren. Das hilft auch etwas bei der Einstellung:
    Code:
    VERSION 1:
    ==========
    
    /*****************************************************************************/
    // Variables:
    
    uint16_t pos = RIGHT_TOUCH;
    
    
    
    // ............
    
    
    
    // ---------------------------------------------------------------------
    // The demo code for positioning Servos 1 and 2:
    		if (getStopwatch2() > 48) {	// Change position every ~50ms
    			servo1_position = pos;		// Position of servo 1
    			servo2_position = pos;		// Position of servo 2
    			setCursorPosLCD(0, 0);
    			writeStringLCD_P("Servopos.: ");
    			writeIntegerLCD(pos, DEC);
    			writeStringLCD_P("   ");
    
    			pos--;						// Next position to the left
    			if (pos > RIGHT_TOUCH) {pos = RIGHT_TOUCH;} // pos: RIGHT_TOUCH..0
    			setStopwatch2(0);
    		}
    // ---------------------------------------------------------------------
    
    
    
    
    
    VERSION 2:
    ==========
    
    // ---------------------------------------------------------------------
    // The demo code for positioning Servos 1 and 2:
    		if (getStopwatch2() > 5000) {	// Change position every ~5s
    			if (pos == 0) {
    			servo1_position = 0;		// Position of servo 1
    			servo2_position = 0;}		// Position of servo 2
    			if (pos == 1) {
    			servo1_position = MIDDLE_POSITION;
    			servo2_position = MIDDLE_POSITION;}
    			if (pos == 2) {
    			servo1_position = RIGHT_TOUCH;
    			servo2_position = RIGHT_TOUCH;}
    			if (pos == 3) {
    			servo1_position = MIDDLE_POSITION;
    			servo2_position = MIDDLE_POSITION;}
    			setCursorPosLCD(0, 0);
    			writeStringLCD_P("Servopos.: ");
    			writeIntegerLCD(servo1_position, DEC);
    			writeStringLCD_P("  ");
    			
    			pos++;
    			if (pos > 3) {pos = 0;}
    			setStopwatch2(0);
    		}
    // ---------------------------------------------------------------------
    ich kann sie dann nicht mehr aktivieren. initSERVO habe ich dann erneut versucht aber da passiert dann nichts.
    Die Servos starten wieder mit startSERVO().

    Gruß Dirk

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180

    left_touch und right_touch

    hi Dirk,

    wahrscheinlich steht es schon irgendwo: ist der linker anschlag (LEFT_TOUCH) auf der linken seite, wenn ich auf den servo von vorne schaue (auf die achse) oder bezieht sich das auf die sicht von hinten (auf den gehäusedeckel?

    gruß & dank
    gruß inka

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @inka:
    Linker Anschlag wäre auf die Achse (auf den Hebel) geschaut der Anschlag, an den der Hebel bei Linksdrehung (Drehung gegen den Uhrzeigersinn) stößt.

    Gruß Dirk

Seite 5 von 6 ErsteErste ... 3456 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test