-         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 27

Thema: Adafruit_PWMServoDriver

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    1.251
    Blog-Einträge
    7

    Adafruit_PWMServoDriver

    Anzeige

    Hallo zusammen,

    ich verstehe was nicht, mit dem Adafruit-PWM-Servo-Driver.
    Es gibt dazu den Beispielcode "servo.ino", im Unterverzeichnis "examples".

    Hier ein Auszug, wo ich noch keine Erklärung habe:

    Code:
    
    
    #include "Adafruit_PWMServoDriver.h"
    
    
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();   // called this way, it uses the default address 0x40
    
    
    #define SERVOMIN  150 // this is the 'minimum' pulse length count (out of 4096)
    #define SERVOMAX  600 // this is the 'maximum' pulse length count (out of 4096)
    
    
    SERVOMIN und SERVOMAX bilden die minimale und maximale Pulslänge, im weiteren Programmcode.
    Nun könnte ich sagen, dass mein Servo andere Pulslängengrenzen benötigt, um den maximalen Stellwinkel zu erreichen.

    Nun steht dort aber: out of 4096 - Das verstehe ich noch nicht, was bedeutet das genau?
    Die PCA9685-Boards haben eine Auflösung von 4096 Schritten, also 12Bit.
    Wie würde sich das auswirken, wenn ich einen Wert größer 600 bspw. an den PCA9685 schicke oder kleiner 150?



    MfG

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    999
    4096 repräsentiert 100% PWM duty cycle.
    Für die Servopulse werden aber nur etwa 5% duty cycle benötigt, AFAIR 1,5ms innerhalb des 20ms-Zyklus als Neutralwert und davon ausgehend 0,5ms nach unten oder nach oben als Steuerwert für den Stellwinkel.
    Die 150 bzw 600 darf man vermutlich nicht als Gesetz zur Umrechnung verstehen sondern als Orientierung zur Dimensionierung.

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.044
    .. Nun steht dort aber: out of 4096 - Das verstehe ich noch nicht, was bedeutet das genau? ..
    Vielleicht hilft dies zur besseren Klarheit des Ganzen? Da sieht man den Unterschied zwischen Periode (in der Darstellung 20 ms) und Pulslänge (in der Darstellung variabel). Beachte in der Skizze den Hinweis ".. NUR dieser Bereich (ca. 1 ms!) ist für den gesamten Ausschlag .."

    Anm.: "out of" heißt ja üblicherweise "von" - und damit suggeriert mir der Text (hatte Kollege RoboHolIC ja schon schön erläutert), dass die 12 Bit eben die gesamte Periode ist.

    Anm. muss wirklich nicht gelesen werden: bei meinen Servoroutinen kann ich die PULSE von 0 bis etwa 6000 ticks (sind ca. 2,4 ms) aufteilen. Da ein Minimalpuls - !je nach Servo! - von ner knappen Millisekunde (entsprechend rund 2000 ticks) einen Anschlag bedeutet, kann ich also zwischen rund 2000=min und 6000=max ticks zum Pulserzeugen nehmen.
    Ciao sagt der JoeamBerg

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    1.251
    Blog-Einträge
    7
    So in etwa habe ich das auch irgendwie gedacht. Aber wurde trotzdem nicht schlau.

    Ich habe jetzt in einer Adafruit-Erklärung gelesen, dass man dieses Servomin und Servomax auf den jeweiligen Servo anpassen soll. So dass Servomax die maximale Stellposition des Servos ergibt und Servomin also die Null-Grad-Position. Danach soll man sich orientieren um den Servo zu kalibrieren.

    @oberallgeier
    Ich hatte das schon gelesen.


    Interessant finde ich, dass man bei diesem "Treiber" zwei Werte hat, bei diesem Beispiel: pwm.setPWM(servonum, 0, pulselen);

    setPWM(channel, on, off)
    Description


    This function sets the start (on) and end (off) of the high segment of the PWM pulse on a specific channel. You specify
    the 'tick' value between 0..4095 when the signal will turn on, and when it will turn off. Channel indicates which of the
    16 PWM outputs should be updated with the new values.


    Arguments
    channel: The channel that should be updated with the new values (0..15)
    on: The tick (between 0..4095) when the signal should transition from low to high
    off:the tick (between 0..4095) when the signal should transition from high to low
    Normal nimmt man den Off-Wert als Pulslänge, für die Positin des Servos und den On-Wert setzt man auf 0.
    Wenn ich aber als Servomin = 150 habe und Servomax = 600 und der Servo nicht den vollen Bereich 0 bis 180° damit abdeckt (sondern meinetwegen von 15° bis 140°), dann kann man den On-Wert verändern und damit ändert sich dann der Winkelbereich des Servos. Weiß nicht, ob das jemand versteht. Kann es nicht besser erklären Ist auch eine merkwürdige Sache. Wenn der Servo mit einem Wert bei Servomin = 150 beispw. bei 15° seine Ausgangsposition erreicht, kann ich Servomin verringern auf z.B. 130, so dass die Ausgangsposition genau auf 0° ist. Ich kann aber auch den On-Wert auf bspw. 18 setzen. Nur dass ich damit dann auch den Max-Stellwinkel und nat. alle Winkel dazwischen ändere (verkleinere), wenn der On-Wert = 18 unverändert bleibt und also eine feste Größe ist.

    Wenn minimale Pulslänge = Null-Grad-Position und wenn maximale Pulslänge = 180-Grad-Position, könnte man die Winkel dazwischen theor. ausrechnen. Bei den meisten Servos klappt das ganz gut, bei manchen, derselben Sorte, haut das nicht hin.

    Sonst so weit erst mal Danke!


    MfG
    Geändert von Moppi (02.05.2019 um 08:06 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.044
    .. Interessant finde ich, dass man bei diesem "Treiber" zwei Werte hat, bei diesem Beispiel: pwm.setPWM(servonum, 0, pulselen) ..
    Zwei Werte brauche ich bei meiner Servosteuerung auch: einer ist die "Hausnummer" des Servos - damit der Controller weiß welchen Ausgangspinn er bedienen muss - und der andere eben die Pulslänge.

    .. Normal nimmt man den Off-Wert als Pulslänge, für die Positin des Servos und den On-Wert setzt man auf 0 ..
    Bei meiner Servosteuerung fahre ich Periodenzeiten von 20± ms bis gute 25 ms; den längeren Wert dann, wenn ich alle zehn Servos bedienen will. Ich fahre nämlich die Pulsansteuerung eines Servos in der Pausenzeit aller anderen. Und die Pulse sind auf die individuelle Steuerungscharakteristik des jeweiligen Servos abgestimmt.
    Was "Normal" ist, weiß ich nicht; vermutlich gibts irgendwo im Modellbaubereich ne Definition des Standards - sicher wissen das auch etliche Forumskollegen. Erfahrungsgemäß ist die Pulsdauer (siehe *) unter diesem Absatz; ne kurze Vereinbarung über Ausdrücke) zuständig für die Sevostellung. Nach einigen Versuchen meinerseits (und Informationen von andern) ist die Servostellung maßgeblich von der Pulszeit abhängig und weitgehend unabhängig von der Pausenzeit. So sind bei manchen Servos Periodenzeiten von 10 ms bis weit über 20 ms möglich - bei gleicher Pulslänge - bei weitgehend gleichem Positionierverhalten des Servos.
    Das wird auch dort ausgenutzt wo nur die Pulslänge variiert wird bei ansonsten konstanter Pausenzeit.

    *) Pulslänge = Zeit welche der Steuerungspin auf high steht, zugehörig dann On-Wert, Puls etc.
    Pause = Zeit welche der Steuerungspin auf low ist, zugehörig dann Off-Wert, Pause etc.
    Periode oder Periodendauer = Zeit von Pulslänge UND Pause.
    Die werden ja ziemlich ausführlich im ganzen RN-Wissen-Beitrag behandelt. Siehe auch z.B. hier (klick) mit den da folgenden drei, vier Beiträgen.

    .. Bei den meisten Servos klappt das ganz gut, bei manchen, derselben Sorte, haut das nicht hin ..
    Hier gilt, wie so oft, Versuch macht kluch.
    Geändert von oberallgeier (02.05.2019 um 09:42 Uhr)
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    1.251
    Blog-Einträge
    7
    Danke, für Deine Ausführungen!

    Hier gilt, wie so oft, Versuch macht kluch.
    Das ist das, was ich seit schon 2 Tagen mache. Deshalb frage ich ja so bisschen komisch (vielleicht)
    Muss mich mit dem Thema auch erst mal auseinander setzen.

    Ich weiß nicht, ob das bei allen Servos so ist, aber bei denen, die ich jetzt hier habe, ist der Stellwinkel insgesamt größer als 180°, somit lassen die sich auch gut in der Software kalibrieren. Wenngleich viele Parameter ermittelt werden müssen, damit die einzelnen Winkelstellungen nachher auch halbwegs bis ziemlich genau stimmen (jedenfalls so nach Augenmaß mit mehrmaligen Wiederholungen).



    MfG

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.044
    .. weiß nicht, ob das bei allen Servos .. die ich jetzt hier habe, ist der Stellwinkel insgesamt größer als 180° ..
    Ich kenne nicht viele Servos, aber ich kenne keinen der eindeutig weniger als 180° macht. Allerdings zeigt SvenB in seiner kleinen Servoübersicht etliche die offensichtlich weniger machen :-?

    .. damit die einzelnen Winkelstellungen .. halbwegs bis ziemlich genau stimmen (jedenfalls so nach Augenmaß mit mehrmaligen Wiederholungen) ..
    Ich weiß nicht wie gut Dein Augenmaß ist. Mir hilft dazu ne ziemlich einfache Vorrichtung. Manchmal klebe ich gleich ne Kopie von nem Geodreieck drüber. In dem Bild ist unter der Schablone ein MG-Servo der 40mmx20mmx40mm-Klasse (NEIN - kein RS-2! - ist ja MG *gg*).

    Ansonsten hatte ich gerne meinen eher aufwendigen Servomesstester bemüht. Damit messe ich dann tatsächliches Dreh- resp. Haltemoment, Stromaufnahme, Regelabweichung in Abhängigkeit der Regelabweichung - und zugehörigen Strombedarf (*gg*!!), auch Geschwindigkeitskonstanz usf.
    Ciao sagt der JoeamBerg

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    1.251
    Blog-Einträge
    7
    Ich weiß nicht wie gut Dein Augenmaß ist. Mir hilft dazu ne ziemlich einfache Vorrichtung. Manchmal klebe ich gleich ne Kopie von nem Geodreieck drüber.

    Ich verwende zunächst mal so was hier, da sieht man auch schon, wieviel ich probiert habe

    .....
    Klicke auf die Grafik für eine größere Ansicht

Name:	Img_1170.jpg
Hits:	13
Größe:	19,8 KB
ID:	34147

    Jetzt muss man trotzdem noch ein gutes Augenmaß anlegen. Seitdem ich Brille brauche, ist es manchmal etwas verzerrt
    Ich habe aber schon den Anspruch, dass der Servo die einzelnen 10°-Striche sauber erreicht, beim Durchprobieren. Also wenn ich dann im Programm meine Funktion/Methode mit 10, 20 30, 40 .... 80,90, .... 120,130, ....160,170,180° aufrufe.
    Unten im Halbkreis der Schablone sieht man Werte, die ich einsetzen musste, um in der Software die Stellwinkel zu erreichen. Zum Beispiel einen Wert von 170 für einen Winkel von 165°. Wenn man die Abstände der Werte untereinander vergleicht, sieht man, dass die unterschiedlich sind.

    MfG
    Geändert von Moppi (03.05.2019 um 10:12 Uhr)

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    937
    Hallo Moppi,
    ich sitze auch grad am PCA9685.
    Vorab: Ich benutze keine Bibliotheken sondern wühle mich grad selbst durch die Programmierung des Chips, daher kann ich natürlich nicht sagen wie deine Bibliotheken funktionieren,
    aber ich habe einige Erfahrungen gesammelt und es werden stündlich mehr.

    Das lohnt eventuell sogar einen eigenen Thread dafür aufzumachen, aber vorab kann ich folgende Information liefern,
    die Dich evtl. weiterbringen:

    Ganz entscheidend bei diesem Chip ist der eingestellte PreScale.
    Der steht nach einem Reset auf dem Wert 30 dezimal.
    Vermutlich wird der in der Bibliothek umgestelt ??? kein Ahnung

    Im Chip selbst befindet sich ein Oszillator, der schwingt mit 25 MHz. (wie genau der ist, konnte ich dem Datenblatt NOCH nicht entlocken)
    Der gemeinsame Clock für die 16 Zähler ist also 25.000.000 / 30 = 833333,33 Hz.
    damit beträgt die Zeit für einen Zählerschritt 1,2 Mikrosekunden.
    Das ist, wie gesagt die Standardeinstellung nach eine Power On.

    Da die Zähler 12 Bit sind, haben wir eine Wiederholrate von 4096 * 1,2µs = 0,0049152 Sekunden = 202,45 Hz.

    Es gibt Servos die können damit arbeiten, modernere Servos werden sogar bis 333 Hz Wiederholrate angegeben.
    Der Standardservo (ehemals Analog) wird mit 50 Hz (20ms) angegeben.

    Wiederholrate:
    Der Chip lässt es zu die Wiederholrate zwischen 24 Hz to 1526 einzustellen.
    Ob Du das in der Bibliothek einstellen kann weis ich nicht.
    Ich vermute aber, dass der Prescale Wert auf 121 eingestellt wird, dann hat man eine Widerholrate von rund 50 Hz (20ms)
    rechnerisch 50,0288166 also 19,98848ms
    diesen Wert teilen wir durch 4096 (12 Bit) und haben den Zeitwert für einen Schritt: 4,88µs
    Für einen 1500µs (mitte) Impuls benötigen wir demnach 307 Schritte
    für 900µs 184 Schritte Servo links
    für 2100µs 430 Schritte Servo rechts

    Code:
               25.000.000
    Prescale = --------------------- -1
               4096 * Wiederholrate
    
    
                    25.000.000  
    Wiederholrate = -------------------
                    4096 * (prescale+1)
    Das habe ich auch so ausprobiert und das stimmt ganz exakt.
    Natürlich kannst Du auch kleinere oder auch größere Werte angeben,
    aber irgendwann läuft dein Servo entweder intern oder extern gegen einen Anschlag und im schlimmsten Falle blockert er, zieht Strom und raucht ab.
    Die meisten Servos die ich kenne können auch unterhalb oder oberhalb der angegebenen Pulsbreiten gefahren werden,
    das muss man dann ermitteln was er zulässt ohne zu blockieren. Immer Strommessung im Auge behalten

    Die ermittelten Werte werden, wie Du schon erwähnt hast, werden in das 2te Register geschrieben,
    im ersten Register kann man eine 0 schreiben.

    !! Achtung: wenn man die Wiederholrate ändern will (Prescale Wert)
    Wenn man es direkt über die Register machen möchte, muss man einiges beachten,
    das funktionierte bei mir nämlich nicht auf Anhieb.

    Der Prescale(Vorteiler) befindet sich an der Aderesse 0xFE im Chip.
    Man kann aber nicht so ohne weiteres darauf zugreifen, dazu muss der Chip erst in den Sleep Mode versetzt werden.
    Dazu muss das Bit 4 im Mode 1 Register, welches sich an Adresse 0 im Chip befindet, auf "1" gesetzt werden. (Low power mode. Oscillator off)

    Nun kann man auf das Prescale Register zugreifen.
    !!! der kleinste Wert ist wohl 3 laut Datenblatt.
    Ich habe es ausprobiert mit 0 1 2 3 da ändert sich dann nichts mehr.

    PreScale: 121
    Zählwerte: 184 für 900µs und 430 für 2100µs

    Klicke auf die Grafik für eine größere Ansicht

Name:	900us.jpg
Hits:	3
Größe:	68,5 KB
ID:	34148 Klicke auf die Grafik für eine größere Ansicht

Name:	2100us.jpg
Hits:	2
Größe:	68,1 KB
ID:	34149

    Siro

    PS: wie ich sehe bist Du aber schon weiter gekommen
    Theoretisch müsste der Winkel ja proportional zur Schrittweite sein...
    Unterschiede bekommst Du wenn Du von links oder rechts deine Position anfährst, durch das Getriebespiel
    Das habe ich bemerkt bei einer Blende für eine Beleuchtung.
    Ich bin dann in der einen Richtung immer etwas weiter gefahren und dann wieder zurück, damit die Position immer von gleicher Richtung angefahren wird.
    Geändert von Siro (03.05.2019 um 11:45 Uhr)

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    1.251
    Blog-Einträge
    7
    Hallo Siro!


    Na, ich benutze die Adafruit_PWMServoDriver.h und Adafruit_PWMServoDriver.cpp.
    Die bietet eine gute Grundlage, finde ich.


    Darüber hinaus habe ich aber zwei Boards so dass ich bis 32 Servos ansteuere.
    Also schreibe ich noch mal meine "Unterprogramme" / Bibliothek, um die Funktion der Servoansteuerung vom übrigen Programmcode abzukoppeln.
    So kann ich dann z.B. meinen Aufruf tätigen mit: xxx(Servonummer,Gradzahl,Verzögerung);




    PreScale wird eingestellt, ja. Habe ich schon gesehen.
    Das wird in der Adafruit_PWMServoDriver.cpp gemacht. Dort wird der Prescaler nach der gewählten PWM-Frequenz eingestellt.




    "Der Standardservo (ehemals Analog) wird mit 50 Hz (20ms) angegeben."


    Na ja, mit 50Hz arbeiten meine nicht mehr. Und Adafruit schreibt, Analogservos werden normal mit 60Hz angesteuert. Das trifft bei meinen Servos zu.




    "Theoretisch müsste der Winkel ja proportional zur Schrittweite sein..."


    Theoretisch trifft das bei den meisten Servos gut zu. Aber ich habe mind. Einen, der sich nicht ännähernd daran hält.
    Und 90° sind für mich eben 90 und nicht 85° und nicht 92°.
    Ich muss irgendwie eine Ausgangssituation schaffen, auf die man sich verlassen und auf der man weiter aufbauen kann.


    Aber ich bin da auch noch am rumprobieren.
    Eigentlich möchte ich doch den Servostellwinkel kontinuierlich verändern.
    Da ist irgendwo ein Beispielcode dabei, wo das gemacht wird, allein über die Pulslänge (ohne irgendwelche genauen Winkel) und das hat mir sehr gut gefallen.
    Weil sonst setzt man einen Winkel und der Servo fährt mit voller Geschwindigkeit und Wucht den Winkel an.






    MfG

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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