- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 8 von 11 ErsteErste ... 678910 ... LetzteLetzte
Ergebnis 71 bis 80 von 110

Thema: RP6 Servo Ansteuerung

  1. #71
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.03.2010
    Beiträge
    205
    Anzeige

    Praxistest und DIY Projekte
    Warm verwendet ihr eigentlich alle Servos und keine Motoren?
    Nichts existiert durch sich allein!
    Bild hier  

  2. #72
    Erfahrener Benutzer Begeisterter Techniker Avatar von RobbyMartin
    Registriert seit
    31.12.2009
    Ort
    Leverkusen
    Alter
    31
    Beiträge
    206
    servos sind viel einfacher und preziser anzusteuern als normale motoren

  3. #73
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.11.2009
    Alter
    31
    Beiträge
    188
    servos kann man vorallem auch sehr leicht (ohne viel verkabelung, etc) in alle 2 richtungen bewegen lassen

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

    ich habe mit folgendem programm (stammt glaube ich sogar aus diesem thread)

    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 servo I
             sleep(25);         // 1 = 0.1ms warten = Servoposition 1 
             PORTC &= ~SDA;    // Impulsende 
             sleep(150);         //50ms warten 
    
    		 PORTC |= SL1;      // Impulsstart servo II
             sleep(10);         // 1 = 0.1ms warten = Servoposition 1 
             PORTC &= ~SL1;    // Impulsende 
             sleep(150);         //50ms warten 
    
          } 
          for(c=0; c<50; c++) 
          { 
             PORTC |= SDA; 		// Impulsstart servo I
             sleep(5);         //30 = 3ms warten = Servoposition 2 
             PORTC &= ~SDA; 
             sleep(150);
    		 
    		 PORTC |= SL1;      // Impulsstart servo II
             sleep(25);         // 1 = 0.1ms warten = Servoposition 2 
             PORTC &= ~SL1;    // Impulsende 
             sleep(150);         //50ms warten  
          } 
    	  for(c=0; c<50; c++) 
          { 
             PORTC |= SDA; 		// Impulsstart servo I
             sleep(20);         //10 = 1ms warten = Servoposition 3 
             PORTC &= ~SDA; 
             sleep(150); 
    
    		 PORTC |= SL1;      // Impulsstart servo II
             sleep(15);         // 1 = 0.1ms warten = Servoposition 3
             PORTC &= ~SL1;    // Impulsende 
             sleep(100);         //50ms warten 
    	  }
    		 for(c=0; c<50; c++) 
          { 
             PORTC |= SDA; 		// Impulsstart servo I
             sleep(10);         //20 = 2ms warten = Servoposition 4 
             PORTC &= ~SDA; 
             sleep(150);
    
    /*		 PORTC |= SL1;      // Impulsstart servo II
             sleep(30);         // 1 = 0.1ms warten = Servoposition 4
             PORTC &= ~SL1;    // Impulsende 
             sleep(100);         //50ms warten */
          }
    		 for(c=0; c<50; c++) 
          { 
             PORTC |= SDA; 		// Impulsstart servo I
             sleep(20);         //5 = 0.5ms warten = Servoposition 5 
             PORTC &= ~SDA; 
             sleep(150); 
    
    /*		 PORTC |= SL1;      // Impulsstart servo II
             sleep(10);         // 1 = 0.1ms warten = Servoposition 5 
             PORTC &= ~SL1;    // Impulsende 
             sleep(100);         //50ms warten */
          }
       } 
       return(0); // wird nie erreicht 
    }
    /* 
    zweites servo an sl1
    
    
       PORTC |= SL1)
       PORTC &= ~SL1
       
       */
    beide Servos am rp6 zum laufen bekommen....

    jetzt habe ich einen greifarm für den asuro gebaut, der auf der kleinen platine befestigt ist und die drei Servos über die pins INT0, PD3 und PD6 gesteuert werden sollen. Wenn ich das programm auf den asuro umstricke, sieht es im ersten ansatz so aus (viel ist noch auskomentiert)

    Code:
    #include "asuro.h"
    
    
    uint8_t c; // allgemeine 8-Bit-Variable (ein Char)
    
    int main(void)
    {
    	  DDRC |= (1<<PD3);
    	  PORTC &= ~(1<<PD3);
    
    	while(1)
       {
    	     for(c=0; c<50; c++)  //50 = 50 Impulse senden, das dauert ca. 1 Sekunde
    	      {
    	         PORTC |= (1<<PD3);      // Impulsstart servo I
    	         Msleep (25);         // 1 = 0.1ms warten = Servoposition 1
    	         PORTC &= ~(1<<PD3);    // Impulsende
    	         Msleep (150);         //50ms warten
    	         
    	      }
    
    /*	     for(c=0; c<50; c++)  //50 = 50 Impulse senden, das dauert ca. 1 Sekunde
    	      {
    	         PORTC |= (1<<PD3);      // Impulsstart servo I
    	         Msleep (20);         // 1 = 0.1ms warten = Servoposition 1
    	         PORTC &= ~(1<<PD3);    // Impulsende
    	         Msleep (150);         //50ms warten
    	         
    	      }*/
    
    /*		 for(c=0; c<50; c++)  //50 = 50 Impulse senden, das dauert ca. 1 Sekunde
              {
    		 PORTC |= (1<<PD6);      // Impulsstart servo II
    	         Msleep(10);         // 1 = 0.1ms warten = Servoposition 1
    	         PORTC &= ~(1<<PD6);    // Impulsende
    	         Msleep(150);         //50ms warten*/
    
    
    /*			 PORTC |= (1<<INT0);      // Impulsstart servo III
    	         Msleep(17);         // 1 = 0.1ms warten = Servoposition 1
    	         PORTC &= ~(1<<INT0);    // Impulsende
    	         Msleep(150);         //50ms warten        */
    
    /*	         PORTC |= (1<<PD3);      // Impulsstart servo I
    	         Msleep (5);         // 1 = 0.1ms warten = Servoposition 2
    	         PORTC &= ~(1<<PD3);    // Impulsende
    	         Msleep (170);         //50ms warten
    
    	      }*/
    
       }
       return(0); // wird nie erreicht
    }
    zuckt der erste servo (hängt am PD3) nur unkontrolliert in der gegend herum und auch der dritte macht so komische zuckungen, auch wenn er an keinem signal hängt, bzw. die software noch gar nicht in funktion ist.

    habe ich was falsch gemacht, oder bestimmte asuro-eigenheiten vergessen zu berücksichtigen?

    die Servos liefen bereits einzeln (über kabel mit dem rp6 verbunden) und mit der rp6 software...die hardware scheint also ok zu sein ( die platine mit den servos)...

    danke für euere hinfe
    gruß inka

  5. #75
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.03.2010
    Beiträge
    205
    Hast du schon mal geschaut ob mit der Spannungsversorgung alles in Ordnung ist?
    Nichts existiert durch sich allein!
    Bild hier  

  6. #76
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    M__sleep != sleep

    Die eine Funktion in Millisekunden die andere in 100 µs Schritten...

  7. #77
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    DDRC |= (1<<PD3);
    PORTC &= ~(1<<PD3);


    Wenn du Pins von Port D verwenden willst, dann musst du auch das Datenrichtungsregister und den Port von D verwenden.

    Bei mehreren Servos werden die Impulse nacheinander erzeugt und dann wird eine gemeinsame Restpause lang gewartet:

    Code:
            for(c=0; c<50; c++)  //50 = 50 Impulse senden, das dauert ca. 1 Sekunde
             {
                PORTD |= (1<<PD3);      // Impulsstart servo I
                Sleep (servo1);   
                PORTD &= ~(1<<PD3);    // Impulsende
                PORTD |= (1<<PD6);      // Impulsstart servo 2
                Sleep (servo2);         
                PORTD &= ~(1<<PD6);    // Impulsende
                Sleep (255);       // Pause
                Sleep (255);       
                Sleep (255);       
             }
    Beim asuro wird Sleep() mit dem 36kHz-Timer2 erzeugt, eine Millisekunde ist dann Sleep(36). Mehr Infos zum Servotiming beim asuro findest du z.B. hier:

    https://www.roboternetz.de/phpBB2/ze...=500813#500813

    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!

  8. #78
    Benutzer Stammmitglied
    Registriert seit
    03.08.2010
    Beiträge
    33
    hallo zusammen

    habe ein m32 erweiterungssatz gekauft. würde gerne ein servo über adc2 ansteuern. wie kann ich den im programmcode aufrufen?

    kann man den folgenden code umschreiben?

    Code:
    	
    
    #include "RP6ControlLib.h"
    
        uint8_t i;
       {
          for(i=0;i<100; i++) // 100 mal Impuls 
          {
             PORTA |= 1;
             sleep(8);
             PORTA &= ~1;
             sleep(200-10);
          }
          for(i=0;i<100; i++) // 100 mal Impuls 
          {
             PORTA |= 1;
             sleep(20);
             PORTA &= ~1;
             sleep(200-20);
          }
         
           for(i=0;i<100; i++) // 100 mal Impuls 
           {
              PORTA |= 1;
    		  sleep(14); 
    		  PORTA &= ~1;
    		  sleep(200-10);
    		  
    	       }
       }

    den code habe ich auf dem mainboard-adc0 angewendet.

    thx

  9. #79
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    ADC2 ist ebenfalls am Port A und hat die Wertigkeit 4 (2^2)

    Datenrichtung: DDRA |= 4;
    Einschalten: PORTA |= 4;
    Ausschalten: PORTA &= ~4;
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #80
    Benutzer Stammmitglied
    Registriert seit
    03.08.2010
    Beiträge
    33
    danke für deine antwort. habe es mal ausprobiert.

    der code sieht so aus:

    Code:
    #include "RP6ControlLib.h"
    
        uint8_t i;
       {
          for(i=0;i<100; i++) // 100 mal Impuls
          {
             PORTA |= 4;
             sleep(8);
             PORTA &= ~4;
             sleep(200-10);
          }
          for(i=0;i<100; i++) // 100 mal Impuls
          {
             PORTA |= 4;
             sleep(20);
             PORTA &= ~4;
             sleep(200-20);
          }
         
           for(i=0;i<100; i++) // 100 mal Impuls
           {
              PORTA |= 4;
            sleep(14);
            PORTA &= ~4;
            sleep(200-10);
           
              }
       }
    das übersetzen funktioniert. leider bewegt sich mein servo nicht. kann das sein das ich auf dem mainboard ein code laden muss damit es korrekt funktioniert? habe m32 eingesteckt und den code draufgeladen.

    noch eine kleine frage: wo kann ich nachschauen wenn ich ein adc port ermitteln will d.h wo finde ich die oben genannten daten (4)?

Seite 8 von 11 ErsteErste ... 678910 ... LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress