-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: RP6 Servo Ansteuerung

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    24.01.2009
    Beiträge
    76

    RP6 Servo Ansteuerung

    Anzeige

    Hey,
    ich habe den RP6 bekommen und habe so die grundsachen schon kapirt aber weil nur rumfahren nen bissel langweilig is will ich jetzt einen servo ansteuern. ich habe schon foren darüber gesehen aber habs Leider nicht hinbekommen da wollte ich mal fragen ob ihr mir das mal für dummies erklären können^^
    lg
    Christian

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Hallo Christian,

    das ist hier im Forum schon sooo oft und einfach erklärt worden, geh 'mal zuerst auf die Suche!

    Ergebnisse z.B.:

    Grundwissen zu Servos im Wiki:
    http://www.roboternetz.de/wissen/index.php/Servos

    Langer Thread zur Servoansteuerung mit dem RP6:
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=34407

    RP6Base: Library für 8 Servos:
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=45180

    RP6Control: Library für 8 Servos:
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=45223

    Gruß Dirk

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    26.12.2008
    Beiträge
    30
    hatte vor kurzem das gleiche problem... wenn du den Servo an ADC0 oder ADC1 anschließen willst dann mach es so:

    1 : Rotes Kabel (Spannungsversorgung+, VDD)

    2 : Schwarzes Kabel (Spannungsversorgung-, GND)

    3 : Weißes Kabel (Impuls)

    und jetzt kannste z.B. des als Code verwenden:

    is en leicht veränderter code von radbruch:

    Code:
     // Servoansteuerung mit sleep(), Servoimpuls an ADC0, 2 Positionen 10.1.09 mic
    
    #include "RP6RobotBaseLib.h"
    
    uint8_t i;
    
    int main(void)
    {
       initRobotBase();   // initialisieren
       DDRA |= 1;         // Datenrichtung Port A Bit 0 (das ist ADC0) auf Ausgang
    
       while(true)
       {
          for(i=0;i<100; i++) // 100 mal Impuls für Position 1 senden
          {
             PORTA |= 1;
             sleep(2);
             PORTA &= ~1;
             sleep(200-2);
          }
    	  for(i=0;i<100; i++) // 100 mal Impuls für Position 2 senden
          {
             PORTA |= 1;
             sleep(12);
             PORTA &= ~1;
             sleep(200-12);
          }
          for(i=0;i<100; i++) // 100 mal Impuls für Position 3 senden
          {
             PORTA |= 1;
             sleep(20);
             PORTA &= ~1;
             sleep(200-20);
          }
    	  for(i=0;i<100; i++) // 100 mal Impuls für Position 4 senden
          {
             PORTA |= 1;
             sleep(12);
             PORTA &= ~1;
             sleep(200-12);
          }
       }
       return(0);
    }

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    24.01.2009
    Beiträge
    76
    cool danke muss ich muss doch die "RP6RobotBaseLib.h" datei ändern oder ?

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Nein, die Library muss nicht geändert werden. Es wird (blockierend) die Sleep()-Funktion verwendet.

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

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    24.01.2009
    Beiträge
    76
    OK ich habs hinbekommen =D>
    wäre aber cool wenn er von limks nach rechts dreht und dan wieder zurück macht er aber ihrgent wie ned
    Code:
    #include "RP6RobotBaseLib.h" // The RP6 Robot Base Library.
    // Defines:
    #define SERVO_OUT SDA // PINC1 XBUS Pin 12
    
    
    // Servo movement limits (depending on servo type):
    #define LEFT_TOUCH 10//550 // Left servo touch
    #define RIGHT_TOUCH 10 // Right servo touch [max. 255]
    #define PULSE_ADJUST 10
    #define PULSE_REPETITION 18 // Pulse repetition frequency
    //Variablen
    int richtung=0; //0=rechts; 1=links
    int speed=10;
    /*****************************************************************************/
    // Functions:
    
    /**
    * INIT SERVO
    *
    * Call this once before using the servo task.
    *
    */
    void initSERVO(void)
    {
    DDRC |= SERVO_OUT; // SERVO_OUT -> OUTPUT
    PORTC &= ~SERVO_OUT; // SERVO_OUT -> LO
    startStopwatch1(); // Needed for 20ms pulse repetition
    }
    void pulseSERVO(uint8_t position)
    {
    cli();
    PORTC |= SERVO_OUT; // SERVO_OUT -> HI (pulse start)
    delayCycles(LEFT_TOUCH);
    while (position--) 
    {
    delayCycles(PULSE_ADJUST);
    }
    PORTC &= ~SERVO_OUT; // SERVO_OUT -> LO (pulse end)
    sei();
    }
    void task_SERVO(void)
    {static uint8_t pos;
    if (getStopwatch1() > PULSE_REPETITION) { // Pulse every ~20ms
    if(richtung==0) pos=pos+speed;
    else pos=pos-speed;
    if (pos > RIGHT_TOUCH) {richtung = 1;} //nach links drechen
    if (pos < LEFT_TOUCH) {richtung = 0;} //nach rechts drehen
    
    pulseSERVO(pos);
    setStopwatch1(0);
    }
    }
    
    /*****************************************************************************/
    // Main function - The program starts here:
    
    int main(void)
    {
    initRobotBase();
    powerON();//anschalten
    startStopwatch1();
    setLEDs(0b111111); // Turn all LEDs on
    mSleep(500); // delay 500ms
    setLEDs(0b000000); // All LEDs off
    
    initSERVO();
    
    while(true)
    {
    task_SERVO();
    task_RP6System();
    
    }
    return 0;
    }

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    24.01.2009
    Beiträge
    76
    schon gut fehler gerunden sry

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    24.01.2009
    Beiträge
    76
    Hey eine frage hätte ich noch wie kann ich den servo in eine bestimte position stehlen? also z.b das wen ich den rp6 starte des der servo automatich in die mittel stellung fährt?

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    ... wie kann ich den servo in eine bestimte position stehlen? also z.b das wen ich den rp6 starte des der servo automatich in die mittel stellung fährt?
    Du könntest z.B. in deiner Programmversion eine Konstante als Mittelposition definieren:
    MIDDLE_POSITION = RIGHT_TOUCH / 2

    ... und dann das Servo am Programmanfang in Mittelposition fahren:
    pos = MIDDLE_POSITION

    Gruß Dirk

    P.S.: In deinem Prog sind RIGHT_TOUCH und LEFT_TOUCH beide 10. Du testest die Grenzen von pos im Hauptprogramm auf < LEFT_TOUCH und auf > RIGHT_TOUCH. Das ist eigentlich so noch nicht ok:
    pos darf von 0 bis RIGHT_TOUCH gehen, wenn LEFT_TOUCH für dein Servo richtig eingestellt ist. Du bekommst auch höhere Werte für pos, wenn du PULSE_ADJUST kleiner machst (4..6). Probier das 'mal aus!

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    24.01.2009
    Beiträge
    76
    Hi,
    ich habe mir das CONTROL M32 Erweiterungsmodul gekauft habe jetzt einen servo angeschlossen und probiere ihn anzuseuert^^ aber jedes mal wenn der Servo an fängt sich zu drehen geht der RP6 kurtz aus und man muss neu starten habe gedacht mh.... vil. sind die akkus leer daran liegt es nich dann habe ich ne externe stromversorgung für den servo angebaut und jetzt gehts ?!

    Es ist kein anderer strom fresser an (wie z.b Der Antrieb) ist das nomal das die strom versorgung bei einen servo abstürtzt?
    es ist nur der RP6 und das Erweiterungsmodul an!

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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