- LiFePO4 Speicher Test         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: frage zu servoprogramm

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.01.2008
    Ort
    Zürich
    Beiträge
    604
    Anzeige

    Powerstation Test
    Hallo,

    ich hab das mal schnell für radbruch gemacht (keine Angst, will keinen Code klauen)

    Code:
    /*RP6 steuert ein Servo an der SL1-LED mit Sleep()                    1.5.2008 mic */
    
    include "RP6RobotBaseLib.h"      // Denn vollen Funktionsumfang der Lib bezahlen 
                                     // wir mit den störenden Interrupts 
    
    uint8_t stellzeit, servopos=15;    // 15=Servomitte, Drehbereich ca. 5-25 
                                                   //d.h. du setzt "servopos" auf einen Wert 5-25 entsprechend der Position, die der Servo anfahren soll
    int main(void) 
    { 
       initRobotBase(); 
       setLEDs(0);                   // alle LEDs aus/kein Impuls, da da ja auch die Servos mit dranhängen--> Störsignale vermeiden
       while(1) 
       { 
          stellzeit=30;              // Wiederholungen für Stellzeit vorbelegen (zeit in [20ms], wie lange der Servo zum stellen der Postition braucht)
          while(stellzeit--)         // Wir geben dem Servo Zeit zum Positionieren 
          {                          // und senden solange das Steuersignal 
             setLEDs(1);             // Servo Impuls Anfang 
             sleep(servopos);        // Sleep() läuft mit 10kHz: 15 entspricht 1,5ms 
             setLEDs(0);             // Servo Impuls Ende 
             sleep(200-servopos);    // Das Signal soll alle 20ms gesendet werden 
          }                          // Am Ende der Schleife sollte das Servo im Ziel sein 
          servopos+=5;               // Nächste Position berechnen, kannst du natürlich auch anders, z.B. dass du Taster, Sensoren etc. einliest
          if(servopos > 25) servopos=5; // Ende Drehbereich, zurück auf andere Seite 
          mSleep(500);               // Platzhalter für andere Aufgaben 
       } 
       return(0); 
    }

    so, ich hoffe ich konnte dir nun etwas helfen, eventuell kann ich dir in ein bis zwei wochen eine noch genauere Lösung anbieten, meine Servolib

    damit ruft man nurnoch task_Servos(Parameter); auf und als Parameter gibt man lediglich ein, welche Stellung der Servo annehmen soll, dabei sind allerdings ein paar #define's nötig...


    MfG Pr0gm4n

    PS: radbruch, wie lange braucht so ein Servo für linker Anschlag bis rechter Anschlag? (deine Miniservos z.B.)

  2. #12
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    @radbruch: dein programm ist irgendwie fehlerhaft. gut du hast die # bei include vergessen aber auch mit der # lässt sich das programm nicht kompilieren....

    gruß

  3. #13
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Sorry, das passiert, wenn man nach dem Editieren nicht mehr kompiliert:

    Code:
    // RP6 steuert ein Servo an der SL1-LED mit Sleep()                 1.5.2008 mic
    
    #include "RP6RobotBaseLib.h"      // Denn vollen Funktionsumfang der Lib bezahlen
    											// wir mit den störenden Interrupts
    
    uint8_t stellzeit, servopos=15; 	// 15=Servomitte, Drehbereich ca. 5-25
    
    int main(void)
    {
       initRobotBase();
       setLEDs(0);                   // alle LEDs aus/kein Impuls
       while(1)
       {
          stellzeit=30;              // Wiederholungen für Stellzeit vorbelegen
          while(stellzeit--)         // Wir geben dem Servo Zeit zum Positionieren
          {                          // und senden solange das Steuersignal
             setLEDs(1);             // Servo Impuls Anfang
             sleep(servopos);        // Sleep() läuft mit 10kHz: 15 entspricht 1,5ms
             setLEDs(0);             // Servo Impuls Ende
             sleep(200-servopos);    // Das Signal soll alle 20ms gesendet werden
          }                          // Am Ende der Schleife sollte das Servo im Ziel sein
          servopos+=5;               // Nächste Position berechnen
          if(servopos > 25) servopos=5; // Ende Drehbereich, zurück auf andere Seite
          mSleep(500);               // Platzhalter für andere Aufgaben
       }
       return(0);
    }
    Aber es war schon spät und eigentlich nicht schwer zu finden: das # bei include und // bei der ersten Zeile...

    wie lange braucht so ein Servo für linker Anschlag bis rechter Anschlag?
    Mach hier den Wert schrittweise kleiner bis das Servo nicht mehr sauber alle Positionen anfährt:

    stellzeit=30;

    ..ich hab das mal schnell für radbruch gemacht (keine Angst, will keinen Code klauen)
    War das nötig? Ist es nun verständlicher? Und zum Code klauen: Selbstverständlich sind alle meine hier geposteten Codeschnippsel open-source.

    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!

  4. #14
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.01.2008
    Ort
    Zürich
    Beiträge
    604
    Hi radbruch,

    aus meiner Sicht waren deine Kommentierungen sehr gut ausreichend, ich möchte hier nur auf

    jetzt noch ne frage die hauptsächlich radbruch betrifft... und zwar, könntest du mir bitte speziell zu deinem geposteten servoprogramm noch mehr kommentare dazu schreiben?
    wär voll nett, dann könnt ich nämlich das programm besser verstehen....
    verweisen

    das mit dem codklauen etc. sagte ich, weil einige leute meinen, es wäre so wichtig, dass ihr name im code einkommentiert drinsteht, auch wenn ihn dann jemand anderer per copy & paste editiert, verwendet oder im Inet anbietet, ein Kumpel von mir iss da schonmal voll ausgerastet, dass ich seine dummen Kommentierungen gelöscht hab bzw. glaub sogar nur geändert hab


    ich hab jetzt mal mein Servo-Ansteuerungsprogramm fertig, in wiefern ich es Open-Source mache steht noch nicht fest, aber vermutlich poste ich es einfach irgendwo bzw. da es mehr ne art Lib ist biete ich es irgendwo zum Download

    es geht für alle Atmels mit maximal 266 MHz


    @radbruch: Ich schick dir das Servoteil dann mal irgendwie, kann ich dir 1716 Codezeilen per PN schicken? Wäre nett wenn du dir das mal anschaust

    Wenn du dich wunderst warum ich da einige Funktionen mit gleichem Namen drinnen habe, das sind sog. Überladene Funktionen, ich denke zwar, dass die nur der Compiler kann, aber die Herren im Unterforum AVR-C-Programmierung meinten, das ginge auch so, könnte aber auch sein, ich werds sehen...


    MfG Pr0gm4n

  5. #15
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    danke. jetzt läuft des programm. wolltest du aber nicht in programm schreiben, wo den servo ständig von linken zu rechten schwenken lässt? jetzt schwenkt der motor mit 3 mal anhalten nach rechts und dann durchgehend nach links.

    gruß

  6. #16
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo Pr0gm4n

    aus meiner Sicht waren deine Kommentierungen sehr gut ausreichend
    ...weil du den Beitrag und die Kommentare erst nach meinem Edit (Zuletzt bearbeitet von radbruch am 01.05.2008, 00:21, insgesamt ein Mal bearbeitet) gelesen hast. Die erste Version war völlig ohne Kommentare...

    Ich schick dir das Servoteil dann mal irgendwie...
    Danke für's Angebot, aber das ist wirklich nicht nötig. Du kannst deinen Entwurf auch in einem Thread zur Disskusion stellen. Ich hätte aber keinen Bedarf an einer Servo-Lib. Meiner Meinung nach sind Servoanwendungen meist Speziallösungen die man mit einer Lib nicht vereinfachen kann. Ich lasse mich aber gerne vom Gegenteil überzeugen.

    @proevofreak: Mehr kann das Programm nicht:

    Code:
          servopos+=5;               // Nächste Position berechnen 
          if(servopos > 25) servopos=5; // Ende Drehbereich, zurück auf andere Seite
    Es ging ja nur um die Theorie. Wie man das anwenden kann ist eure Aufgabe.

    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!

  7. #17
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.01.2008
    Ort
    Zürich
    Beiträge
    604
    Hi,

    ich versteh zwar nicht, warum der Servo am linken Anschlag bleibt, aber versuch doch mal das: (nichtmehr nur 3 mal Anhalten)

    Code:
    // RP6 steuert ein Servo an der SL1-LED mit Sleep()                 1.5.2008 mic 
    
    #include "RP6RobotBaseLib.h"      // Denn vollen Funktionsumfang der Lib bezahlen 
                                     // wir mit den störenden Interrupts 
    
    uint8_t stellzeit, servopos=15;    // 15=Servomitte, Drehbereich ca. 5-25 
    
    int main(void) 
    { 
       initRobotBase(); 
       setLEDs(0);                   // alle LEDs aus/kein Impuls 
       stellzeit=30;              // Wiederholungen für Stellzeit vorbelegen 
       while(1) 
       { 
          
          while(stellzeit--)         // Wir geben dem Servo Zeit zum Positionieren 
          {                          // und senden solange das Steuersignal 
             setLEDs(1);             // Servo Impuls Anfang 
             sleep(servopos);        // Sleep() läuft mit 10kHz: 15 entspricht 1,5ms 
             setLEDs(0);             // Servo Impuls Ende 
             sleep(200-servopos);    // Das Signal soll alle 20ms gesendet werden 
          }                          // Am Ende der Schleife sollte das Servo im Ziel sein 
          servopos+=1;               // Nächste Position berechnen 
          if(servopos > 25) servopos=5; // Ende Drehbereich, zurück auf andere Seite 
          mSleep(500);               // Platzhalter für andere Aufgaben 
       } 
       return(0); 
    }
    Ich hab auch das Stellzeit=30; vor die while-schleife um es nicht ständig neu definieren zu müssen, das spart rechenzeit -->ruckeln

    ist zwar nur ein Takt, aber wenn man das immer macht kommt doch manchmal was mit 0.05 ms oder so zusammen, was das ruckeln erheblich verbessert


    MfG Pr0gm4n

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

    Ich hab auch das Stellzeit=30; vor die while-schleife um es nicht ständig neu definieren zu müssen, das spart rechenzeit -->ruckeln
    Das ist völliger Quatsch! Mit dieser Änderung wird stellzeit nur einmalig mit 30 geladen, alle weiteren Schleifendurchgänge starten dann mit 255, weil stellzeit vom Anfahren der letzten Position mit 0 belegt war. Das wird nur nicht offensichtlich weil anschliesend immer ein mSleep(500); folgt. Wenn man das auskommentiert wird man sehen, dass die Wartezeit ab der zweiten Position deutlich größer ist. Zudem werden wohl einige Positionen übersprungen.

    ist zwar nur ein Takt, aber wenn man das immer macht kommt doch manchmal was mit 0.05 ms oder so zusammen, was das ruckeln erheblich verbessert
    Auch das ist Unsinn. Die Impulslänge wird hier gebildet:
    Code:
             setLEDs(1);             // Servo Impuls Anfang 
             sleep(servopos);        // Sleep() läuft mit 10kHz: 15 entspricht 1,5ms 
             setLEDs(0);             // Servo Impuls Ende
    Einzig ein Interrupt kann die Ausführungsdauer von Sleep() beeinflussen. Ein Ausschalten der Interrupts mit cli()/sei() führt hier aber nicht zum Ziel...

    Und schlieslich:
    ich versteh zwar nicht, warum der Servo am linken Anschlag bleibt
    Das Servo bleibt nicht am linken Anschlag sondern startet dort einen neuen Demozyklus. Genau das macht "if(servopos > 25) servopos=5;" Wenn Position größer rechts dann Position=links.

    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!

  9. #19
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.01.2008
    Ort
    Zürich
    Beiträge
    604
    Hi,

    erstmal sorry für all den mist den ich da geschrieben hab, frag mich grad, wie ich darauf gekommen bin...

    trotzdem eine Beanstandung:

    Und schlieslich:Zitat:
    ich versteh zwar nicht, warum der Servo am linken Anschlag bleibt
    Das Servo bleibt nicht am linken Anschlag sondern startet dort einen neuen Demozyklus. Genau das macht "if(servopos > 25) servopos=5;" Wenn Position größer rechts dann Position=links.
    Ich habe dabei darauf geantwortet:

    jetzt schwenkt der motor mit 3 mal anhalten nach rechts und dann durchgehend nach links.
    er hat gesagt, dass bei deinem Programm der Servo erst an einen Anschlag fährt und dann bleibt er stehen und dass er das nicht versteht warum...

    dann habe ich gemeint, das könnte ich ihm auch nicht sagen, denn eigentlich müsste der Servo ja dauernd hin- und herfahren...


    MfG Pr0gm4n

    PS: ich mach nen Thread auf in AVR-C-Programmierung, die sollen sich den doch ma anschauen, ob alles passt

  10. #20
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    erstmal sorry für all den mist den ich da geschrieben hab, frag mich grad, wie ich darauf gekommen bin...
    Sorry für meinen pampigen Ton...

    ich mach nen Thread auf in AVR-C-Programmierung
    Gute Idee :)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen