- 12V Akku mit 280 Ah bauen         
Seite 7 von 11 ErsteErste ... 56789 ... LetzteLetzte
Ergebnis 61 bis 70 von 110

Thema: RP6 Servo Ansteuerung

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

    E-Bike
    Zitat Zitat von radbruch
    Hallo

    Das "der servo ist also ok" interpretiere ich jetzt mal als "die Ansteuerung mit sleep() funktioniert".
    ja, die servoansteuerung1 vehält sich wie Du es beschreibst...
    Dann wäre jetzt Schritt zwei an der Reihe:
    Code:
    // Servoansteuerung2: Wir erzeugen zwei Impulse im Wechsel            10.1.2010 mic
    // sleep(1) verzögert ca. 0,1ms, 50 Impulse dauern ca. 1 Sekunde
    // Servo an SDA (PC1) (XBUS Pin 12)
    
    #include "RP6RobotBaseLib.h"
    
    uint8_t c; // allgemeine 8-Bit-Variable (ein Char)
    
    int main(void)
    {
    	initRobotBase();
    
    	DDRC |= SDA;
    	PORTC &= ~SDA;
    	
    	while(1)
    	{
    	   for(c=0; c<50; c++)  // 50 Impulse senden, das dauert ca. 1 Sekunde
    		{
    			PORTC |= SDA;		// Impulsstart
    	   	sleep(12);			// 1,2ms warten = Servoposition 1
    	   	PORTC &= ~SDA; 	// Impulsende
    	   	sleep(190);			// 19ms warten
    		}
    
    	   for(c=0; c<50; c++)
    		{
    			PORTC |= SDA;
    	   	sleep(18);			// 1,8ms warten = Servoposition 2
    	   	PORTC &= ~SDA;
    	   	sleep(190);
    		}
    
    	}
    	return(0); // wird nie erreicht
    }
    Das Servo sollte damit im Wechsel zwei Positonen anfahren, dazu hat es jeweils eine Sekunde Zeit. Wenn du die Werte für die jeweiligen Positionen änderst um den maximalen Drehbereich auszutesten sollte das Servo in der jeweiligen Position kurz verweilen. Wenn es dies nicht macht, muss die Zeit (=maxwert für c in der Schleife) solange erhöht werden, bis die kurze Pause erkennbar ist.

    Wie gehts nun weiter? Entweder erhöhen wir die Auflösung der Positionen (und trennen uns damit von der sleep()-Ansteuerung) oder wir fahren die Positionen langsamer an oder wir steuern gleichzeitig ein zweites Servo an. Sag was du willst/brauchst.

    Gruß

    mic
    und hier passiert wieder das schon mal beschriebene:
    der servo fährt die mittenposition an (egal ob vorher rechts oder links am mechanischen anschlag) und bleibt stehen. Jeder weiterer versuch mit dem taster neu zu starten wird nur mit einem zucken nach links quitiert...
    gruß inka

  2. #62
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2009
    Alter
    31
    Beiträge
    188
    okay thx dann werde ich das heute mal versuchen

  3. #63
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2009
    Alter
    31
    Beiträge
    188
    ich habs jetzt zum laufen gebracht

    Code:
    #include "RP6ControlLib.h" 
    
    
    void servo_io5 (uint8_t imp)
    	{
        DDRC |= IO_PC5;
        PORTC |= IO_PC5;   
        sleep(imp);         
        PORTC &= ~IO_PC5;
        sleep(200-imp);       
    	} 
    
    
    
    
    int main(void)
    {
    	initRP6Control();
    	initLCD(); 
    	
    	
    	uint8_t i=0, x;
    	
    	i=0;
    	x=10;
    	
    	while(true)
    	{
    		while(i<10) //200ms
    		{
    		servo_io5(x);
    		i=i+1;
    		}
    	x=x+1;
    		if (x>=20)
    		{
    		x=10;
    		}
    		i=0;
    	}
    
    
    	
    	
    	
    	while(true) 
    	{
    		showScreenLCD("Endlosschleife", "");
    	}
    	return 0;
    }
    Mit dem Code funktionierts.

    ... ein Wunder ist geschehen.

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

    war jetzt bei C, habe das servo umgetauscht, eine gute und eine schlechte nachricht:
    - das kleine billigservo (4,95€) geht auf XBUS1 & 2 (1,3,12) schön im takt hin und her - damit kann ich jetzt erstmal experimentieren...
    - das große geht nicht, nur so, wie bereits beschrieben, auch mit einer externen 6V versorgung und dem steueranschluss an XB1-12 nicht. Wenn das jetzt gegangen wäre (ext power) hätte ich gesat es zieht zuviel strom, aber so?
    gruß inka

  5. #65
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2009
    Alter
    31
    Beiträge
    188
    Wenn das jetzt gegangen wäre (ext power) hätte ich gesat es zieht zuviel strom, aber so?
    Eigentlich brauchen auch große Servos nicht wirklich viel Strom ...

    Würde es zu viel Strom brauchen, würde man es bemerken, da der Spannungsregler dann warm werden würde.

    Bzw. der RP6 würde sich einfach abschalten (er wäre damit nicht kaputt).

    Hast du schon mal versucht den Servo an einer normalen Fernsteuerungsanlage (falls du eine hast) zu betreiben?

  6. #66
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    sowas habe ich leider nicht, sind meine ersten gehversuche mit servos...

    was mich stutzig macht ist, dass das kleine servo geht, das große nicht (wie auch das andere große, was ich schon hatte). Ist doch nicht normal...
    gruß inka

  7. #67
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2009
    Alter
    31
    Beiträge
    188
    Vl kennst du jemanden der nen Empfänger und nen Sender hat ...

    Das Servos kaputt bzw. nicht od. nicht richtig funktionieren ist eigentlich wirklich sehr selten der Fall.


    edit:
    jemanden in deiner nähe

  8. #68
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hi mic,

    habe nun mit der servoansteuerung2 experimentiert, habe jetzt glaube ich verstanden wie die einzelnen positionen am servo mittels sleep bestimmt werden, was mir noch fehlt ist die antwort auf´s warum (siehe fragen im code):
    Code:
    // Servoansteuerung2: Wir erzeugen zwei Impulse im Wechsel            10.1.2010 mic 
    // sleep(1) verzögert ca. 0,1ms, 50 Impulse dauern ca. 1 Sekunde 
    // Servo an SDA (PC1) (XBUS Pin 12) 
    
    #include "RP6RobotBaseLib.h" 
    
    uint8_t c; // allgemeine 8-Bit-Variable (ein Char) 
    
    int main(void) 
    { 
       initRobotBase(); 
    
       DDRC |= SDA; 
       PORTC &= ~SDA; 
        
       while(1) 
       { 
          for(c=0; c<50; c++)  //50 = 50 Impulse senden, das dauert ca. 1 Sekunde 
          { 
             PORTC |= SDA;      // Impulsstart 
             sleep(1);         // 1 = 0.1ms warten = Servoposition 1 
             PORTC &= ~SDA;    // Impulsende 
             sleep(150);         //150ms warten 
          } 
          /* die for/++ schleife wird 50* durchlaufen, d.h. das signal wird 50* in längen von 0,1sec und zwischenpausen von 150ms abgegeben
          sleep(1) bestimmt die äußerste linke position am servo - warum eigentlich? ist das so irgendwo festgelegt? die äußerste linke position am servo müsste dem potiwert=0 entsprechen, oder? gibt es einen zusammenhang mit sleep(1)?*/
          .
          .
          .
          .
          .
          
          for(c=0; c<50; c++) 
          { 
             PORTC |= SDA; 
             sleep(30);         //30 = 3ms warten = Servoposition 2 
             PORTC &= ~SDA; 
             sleep(150);    
          }
          /* die for/++ schleife wird 50* durchlaufen, d.h. das signal wird 50* in längen von 0,1sec und zwischenpausen von 150ms abgegeben,
          sleep(30) bestimmt die äußerste rechte position am servo......*/
          .
          .
          .
          .
          .
          
       } 
       return(0); // wird nie erreicht 
    }
    gruß inka

  9. #69
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Bild hier  
    Quelle: http://wiki.rc-network.de/Servo

    Das ist eine (nicht masstäbliche!) Darstellung der Servoimpulse. Die Impulslänge für Servomitte dauert ca. 1ms, der Drehbereich geht von 0,5ms bis 1,5ms (Manche Dokus sprechen auch von Mitte=1,5ms und Drehbereich 1-2ms) Die Impulse sollten alle 20ms wiederholt werden, das ist der Abstand zwischen zwei ansteigenden Flanken des Signals, in einer Sekunde werden so ca. 50 Impulse-Pausen gesendet (50Hz). Solange das Servo diese Impulse empfängt, versucht es, auf den entsprechenden Drehwinkel zu fahren bzw. diese Position zu halten. Für eine vernünftige Ansteuerung muss das Signal mindestens solange gesendet werden bis das Servo die entsprechende Position erreicht hat (zeitgesteuert weil keine Lagerückmeldung des Servos zur Verfügung steht).

    Ein Sleep(1) dauert beim RP6 ca. 0,1ms weil die Zeit mit dem 10kHz-Timer0 erzeugt wird. Deshalb entsprechen Sleep(10) ca. 1ms und Sleep(200) ca. 20ms. Weil die 20ms-Pause jeweils zwischen den Impulsstarts liegen soll, ist eine Pause von Sleep(190) grundsätzlich nicht schlecht.

    Meine Vorgehensweise: Ich markiere ein Servohorn (der Hebelarm auf dem Servo) an einer Stelle und drehe das Servo mit der Hand von Anschlag zu Anschlag. Dabei versetze ich das Servohorn solange in der Vielverzahnung der Antriebswelle bis der Drehbereich symetrisch in Bezug auf das Servogehäuse ist. Dann merke ich mir (oder markiere) die Mitte dieses Drehbereichs und sichere das Horn mit der Befestigungsschraube.

    Nun schliese ich das Servo an den RP6 an und starte das Servoprogramm1 für eine Position. Ich beginne mit einer Impulslänge die etwa in der Mittelstellung des Servos liegt (z.B. mit 12 für 1,2ms) und ändere dann diesen Wert solange bis sich die Markierungen für Servomitte decken. (Ja, ich flashe dabei jedesmal neu ;) Anschliessend ermittle ich in gleicher weise die Werte für die Anschläge. Das sind dann die Min- und Maxwerte des Drehbereichs, diese sollten dann aber im Betrieb nicht angefahren werden!

    Wenn das erledigt ist, wird man feststellen, dass die Werte für diese besonderen Positionen nicht exakt mit den Dokuwerten übereinstimmen. Das ist eben der Unterschied zwischen Theorie und Praxis :) Außerdem ist der Bereich meist nicht linear aufgeteilt und auch noch abhängig von der Betriebstemperatur.

    Noch eine Info zur 20ms-Pause: Sie kann auch länger sein, das Servo wird dann träger und beginnt zu zuckeln. Kleinere Werte machen die Servos aggressiver und erhöhen die Stromaufnahme.

    Der Wert des Potis ist für die Ansteuerung ohne Bedeutung. Er dient dem Servo zur Lagerückmeldung der Abtriebswelle. Der Sollwert wird von der Servoelektronik aus der Impulslänge berechnet.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #70
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2009
    Alter
    31
    Beiträge
    188
    Kleinere Werte machen die Servos aggressiver und erhöhen die Stromaufnahme.
    Wenn man im Programm bei der Pause statt 200 20 eingibt, was dann einer Pause von 2ms entspricht, beginnt das übrigens zu Rauchen

    PS:
    Das war nicht ich und auch nicht meiner Servo bzw. mein Roboter ... zum Glück

Seite 7 von 11 ErsteErste ... 56789 ... LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress