- Labornetzteil AliExpress         
Seite 2 von 6 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 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 Fleißiges Mitglied Avatar von Filou89
    Registriert seit
    24.12.2010
    Ort
    Thun, Switzerland
    Alter
    35
    Beiträge
    116
    Hallo Dirk,
    erstmal: dein Beitrag ist einfach toll!
    Mal eine kleine Frage zu Zeile 68 der Datei RP6ControlServoLib.h.
    Nach meinem Verständnis müsste das doch so sein:

    #define MIDDLE_POSITION ((RIGHT_TOUCH + LEFT_TOUCH) / 2) // Middle position (~1.5ms)

    denn left Touch ist ja nicht gleich null.

    grüsse,
    Patrick

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @Patrick,

    sorry, hatte erst jetzt deinen Beitrag gelesen.

    Nein, die Definition in der Lib ist ok, weil ich die Servos von 0 bis RIGHT_TOUCH ansteuere.
    LEFT_TOUCH wird nur in der Lib für das einmalige Einstellen des linken Anschlags benötigt.
    Im Programm braucht man dann LEFT_TOUCH nicht mehr, weil der linke Anschlag 0 ist.
    MIDDLE_POSITION ist dann tatsächlich RIGHT_TOUCH / 2.
    Gruß
    Dirk

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.12.2010
    Ort
    Dörpen
    Alter
    27
    Beiträge
    120
    hey,
    ich wollte die library für 8 Servos heute ausprobieren und wollte dann einfach zunächst das demo-programm ausprobieren, da ich nach einer vernünftigen servo-ansteuerung suche!
    als ich das demo-programm dann erfolgreich kompilert habe, und es dann mit nem servo ausprobieren sollte, hab ich es einfach, wie in der lib beschrieben in pin 7 gesteckt (also eig sollte es ja mit 2 Servos angesteuert werden, aber ich hatte gerade nur einen parat.) als ich das programm dann gestartet hab, ist weiter nichts passiert.
    als ich dann mal die anderen io-s ausprobiert habe, habe ich dann einen io gefunden, wo sich am servo überhaupt was getan hat. nämlich pc7, also pin 1!
    allerdings hat sich der servo auch nicht in irgendeiner art bewegt, sondern hat einfach einen lauten ton, von sich gegeben, und der servo vibrierte einwenig.
    weiter ist allerdings nix passiert -.-
    Bitte helft mir! würde mich über schnelle antworten freuen!
    Lieben Gruß Marcel

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2009
    Ort
    Berlin
    Beiträge
    450
    wenn Du den Servo in pin1 steckst hast du PC7 und das ist Servo 1 laut der LIB, also auch
    initSERVO(SERVO1); und servo1_position = pos; benutzen.
    Nun es gibt viele Töne. Ein kratzendes schnarren hatte ich bei neuen Servos auch mal, nach dem Aufschrauben fand ich dann ein Zahnrad mit abgefrästen Zähnen.
    Was sagt denn das Display über die Position ? Hast Du noch andere Servos zum testen ? Hast Du eine eigene Stromversorgung für die Servos ?
    MfG TrainMen

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    also, das mit dem initSERVO() hatte ich schon mal im main teil. allerdings hatte ich da das problem, dass bei allen Servos wo über das programm gerade keine servox_psition = ... zugewiesen wurde wegen dem initSERVO() auf den linken anschlag getaktet haben.

    manche Servos in meinem arm habe ich aber leider so verbaut, dass sie in der grundposition im rechten anschlag sind, d.h. sich (unerwünscht) bewegt haben, sobald ich sie in der main mit initSERVO(...) initialisiert habe.

    darum wollte ich diesem problem aus dem weg gehen, in dem ich sie erst dann initialisiere, wenn sie auch gebraucht werden.

    bist du dir sicher, dass man die servoinitialisierung nicht auch so machen kann, wie bei mir?

    mfg

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    ... bist du dir sicher, dass man die servoinitialisierung nicht auch so machen kann, wie bei mir?
    Ja, da bin ich 100% sicher.

    Wenn du einige Servos am Anfang schon an den rechten Anschlag bringen willst, kannst du ja in Main (vor der while(1)-Schleife) diese Servos mit servoX_position = RIGHT_TOUCH auf den rechten Anschlag stellen.
    Da bleiben sie dann, bis du einen anderen Wert einstellst.

    Gruß Dirk

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    danke dirk, ja stimmt, das ist ne gute idee. warum bin ich da bisher noch nicht selber darauf gekommen... wenn mein arm komplett läuft stell ich ein video für dich online. bist ja dann daran nicht ganz unbeteiligt^^.

    danke nochmal

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    15.11.2009
    Ort
    In der Knüste zwischen PS und KL
    Alter
    52
    Beiträge
    13
    Hallo Dirk,

    mein erster Post hier, daher erstmal Hallo und Danke ans Roboternetz
    viele Super Ideen und Tipps hier.

    Nun zu meinem Problem: Ich probiere gerade meinem brand neuen RP6 mit M32 Modul das bewegen eines Servos beizubringen.

    Der Servo (Conrad Modelcraft ES-05) ist wie im Quellcode der Lib vorgeschlagen am korrekten Port auf dem M32 board angeschlossen und hat ein eigenes Akku Pack für die 4,6V Versorgungs Spannung.

    Das Demo Programm von Dirk fährt den Servo aber leider nur zum Anschlag und "zuckt" dann da.
    Wenn ich den Servo vorher manuell zum anderen Anschlag drehe, dann seh ich den auch tatsächlich sauber rüber takten da bleibt er dann aber wieder zuckend stehen.

    Ich habe schon versucht die Timings für LEFT und RIGHT Touch zu modifizieren, leider erfolglos, als letztes habe ich noch eine ultra light Version der Demo erzeugt:
    Code:
    // Uncommented Version of RP6ControlServo.c
    // written by Dirk
    // ------------------------------------------------------------------------------------------
    
    #include "RP6ControlServoLib.h"
    
    int main(void)
    { 
       initRP6Control();
    
       setLEDs(0b111111);
       mSleep(500);
       setLEDs(0b000000);
       
       /* Servo1 in die Mittlere Stellung vordefiniert */
       servo1_position = RIGHT_TOUCH; 
       
       initSERVO(SERVO1);
     
       while(true) 
       {
         writeString("Servopos: MIDDLE \n");
    	  
    	  servo1_position = MIDDLE_POSITION;
    	  
          task_SERVO();
    	  
          mSleep(500);
    	  
    	  writeString("Servopos: LEFT \n");
    	  
    	  servo1_position = LEFT_TOUCH;
    	  
    	  task_SERVO();
    	  
    	  mSleep(500);
    	  
    	  writeString("Servopos: RIGHT \n");	  
    	  
    	  servo1_position = RIGHT_TOUCH;
    	  
    	  task_SERVO();
    	  
    	  mSleep(500);
       }
       return 0;
    }
    Aber bei der passiert leider genau das selbe. Ich hab schon die Forum Suche beschäftigt, aber leider keinen Ansatz gefunden, warum der Servo nur in eine Richtung dreht.
    Könnt Ihr mir eventuell sagen was ich da falsch mache?
    Danke schon mal für die Mühe!

    Uwe

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    hallo Tzimovo,
    glückwunsch zum RP6 erst mal. ich habe mich mittlerweile schon öfter mit Dirks Servo Lib beschäftigt und mit hilfe ihr auch schon meinen Roboterarm angesteuert. darum hoffe ich dir helfen zu können.

    bei deinem programm fallen mir einige offensichtliche fehler ein (die bei einem anfänger auch recht normal sind):

    1. mSleep(500); in deiner while(true) schleife: mSleep ist eine voll blockierende zeitfunktion. d.h. dein roboter macht während der 500 ms von mSleep(500) nichts anderes mehr als zu warten. das ist besonders dann extrem nachteilig, wenn du zusätzlich zur servobewegung noch andere funktionen wie Z.b. fahren willst.
    darum immer eine der Stopwatches nehmen (siehe anleitung), diese sind nämlich nicht blockierende funktionen.

    2. das task_SERVO() reicht, wenn es nur einmal in der while- schleife aufgerufen wird.


    damit es für dich leichter wird hier ein kurzes beispielprogramm:



    Code:
    #include "RP6ControlServoLib.h"
    
    
    
     
    
    int main(void)
    {
       initRP6Control();
       
       
       
       /* Servo1 in die Mittlere Stellung vordefiniert */
       
       
       initSERVO(SERVO1);
     servo1_position = RIGHT_TOUCH;
    startStopwatch1();
    
       while(true)
       {
         
    	 
        if (getStopwatch1() >100 && getStopwatch1() <1000)
        {servo1_position = MIDDLE_POSITION;
         writeString("Servopos: MIDDLE \n");}
    
     if (getStopwatch1() > 1000 && getStopwatch1() <2000)
    	{servo1_position = LEFT_TOUCH;
    	writeString("Servopos: LEFT \n");}
    
    if (getStopwatch1() >2000 && getStopwatch1() <3000)
    	{servo1_position = RIGHT_TOUCH;
    	writeString("Servopos: RIGHT \n");
    	}
    
    if (getStopwatch1() > 3000)
    		{setStopwatch1(0);}
         
        task_SERVO();
         mSleep(3);
       }
       return 0;
    }
    hab das programm jetzt nicht getestet. aber so auf die art sollte es funktioneren.

    mfg andi

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    15.11.2009
    Ort
    In der Knüste zwischen PS und KL
    Alter
    52
    Beiträge
    13
    Danke für den Versuch, leider passiert mit deinem Programm exact das gleiche.
    Servo zittert am Anschlag bzw. dreht vom anderen Anschlag da hin und zittert dann weiter, als ob er den Anschlag durchbrechen will. .
    Ich habs auch mit einem zweiten baugleichen Servo probiert, leider genauso erfolglos.
    Ein RS-2 Servo bewegt sich gar nicht, Ich vermute jedoch dass der mehr als die 4.8Volt des Akku Packs braucht.
    Cheers,

    Uwe

Seite 2 von 6 ErsteErste 1234 ... LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests