PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Adafruit_PWMServoDriver



Moppi
01.05.2019, 10:36
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:




#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

RoboHolIC
01.05.2019, 22:22
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.

oberallgeier
02.05.2019, 00:01
.. Nun steht dort aber: out of 4096 - Das verstehe ich noch nicht, was bedeutet das genau? ..Vielleicht hilft dies zur (https://rn-wissen.de/wiki/index.php?title=Servos#Ansteuerung:_Signalform_und _Schaltung) 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.

Moppi
02.05.2019, 01:12
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

oberallgeier
02.05.2019, 09:35
.. 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) (https://www.roboternetz.de/community/threads/52460-Servo-Geschwindigkeitsregelung?p=506821&viewfull=1#post506821) 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.

Moppi
02.05.2019, 12:13
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

oberallgeier
03.05.2019, 09:51
.. 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 (https://www.digital-bahn.de/bau_servo/servo.htm) 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 (https://dl.dropbox.com/s/j8b4913jd587woi/Stellungsanzeige_971kl.jpg?dl=0). 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 (https://www.roboternetz.de/community/threads/62904-Servomesstester-%28Servotester-und-%C2%96messaufbau%29) 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 (https://www.roboternetz.de/community/threads/62904-Servomesstester-%28Servotester-und-%C2%96messaufbau%29?p=585556&viewfull=1#post585556) usf.

Moppi
03.05.2019, 09:59
Ich weiß nicht wie gut Dein Augenmaß ist. Mir hilft dazu ne ziemlich einfache Vorrichtung (https://dl.dropbox.com/s/j8b4913jd587woi/Stellungsanzeige_971kl.jpg?dl=0). 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 :)

.....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

Siro
03.05.2019, 11:25
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




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

34148 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.

Moppi
03.05.2019, 11:55
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

Siro
03.05.2019, 12:57
Das die Servos sich je nach Preis auch qualitativ unterscheiden ist hier zu sehen.
Ich hab mal 2 Servos extrem langsam laufen lassen.
Hier sieht man deutlich das Stottern, des günstigeren rechten Servos

https://www.dropbox.com/s/1m83yx3a4xwzghw/Servo_TGY-S306G.mp4?dl=0

Ebenso werden sich die Servos auch verhalten beim direkten Anfahren einer festgelegten Position.
Sie "treffen" dann nicht immer richtig- Je länger dein Hebelarm umso problematischer wird das ganze dann...

den .ccp Code habe ich mir grad angesehen. Hätt ich mal vorher reingucken sollen, dann hätte ich mir viel Kopfzerbrechen erspart,
ich musste ja mal wieder das Rad neu erfinden....:)

Siro

oberallgeier
03.05.2019, 13:26
.. hab mal 2 Servos extrem langsam laufen lassen. Hier sieht man deutlich das Stottern, des günstigeren rechten Servos
.. den .ccp Code habe ich mir grad angesehen. Hätt ich mal vorher reingucken sollen, dann hätte ich mir viel Kopfzerbrechen erspart ..Grübel - und was bedeutet das jetzt für uns? Ist der Servo am Stottern schuld oder der .ccp Code (bzw. der Mensch an der Tastatur) ?

Bei meinem Code (ok, in "C" - das bei mir immer noch eher C-äh ist) hab ich kein Problem Servo, auch sehr billige, mit rund 2 sec von Anschlag zu Anschlag laufen zu lassen (zB hier (https://www.youtube.com/watch?v=Kt4UiEaTicc)).

Siro
03.05.2019, 13:40
@oberallgeier:
Das sieht bei deinem Video optisch sehr sauber aus.

Das Stottern bei mir (bzw. beim Servo :)) kommt tatsächlich vom Servo-
Die PWM wurde nicht per Hand, sondern automatisiert per Software durchgefahren.
Getestet hatte ich es mit einem PIC Controller auf dem nichts anderes lief,
die PWM hatte eine zigmal feinere Auflösung als ein Servo es verarbeiten könnte.
Also ein absolut gleichförmiges PWM Signal ohne Ausreißer.
Nicht alle Billigservos sind schlecht, dieser war es aber...
Nun haben alle Servos auch eine gewisse Hystere, sonst würden sie nie ruhig stehen sondern ständig nachlaufen.
Das ist natürchlich auch abhängig von der gesamten Mechanik / Übersetzung / Poti usw.
Es kommt vor, dass ein Servo kontinuierlich Geräusche von sich gibt weil er ständig nachregelt.
Ungünstige Position, Schleiferkontakt....

Bei den Billigstservos in meine Minihubschraubern (wobei die im Verhältnis Schweineteuer sind...) werden die Bewegungen im Laufe der Zeit immer schlechter.
Die fangen immer mehr an zu stottern...
Da hilft dann sie zu zerlegen und die Kohleschicht und Schleifer zu säubern und dann sind sie quasi wie neu.

Moppi
03.05.2019, 21:47
Habe jetzt festgestellt, das die Servos nur auf alle 3 bis 4 Schritte, in der Pulslängenänderung, reagieren. Also bis sie die nächste Position anfahren. Das ist dann nat. schon ein ordentlicher Schritt.
Jetzt ist es ja aber so, dass das der PCA9685 das Steuersignal dauernd weiter an den Servo sendet.
Kann es möglich sein, dass das daran liegt?
Anders herum muss ein Servo die Position halten, da kann man das Steuersignal wohl nicht einfach abschalten?

Habe mir heute einen Servotester gebastelt:

.....34150


MfG

Siro
04.05.2019, 07:46
Moin Moppi,

Servos haben eine "endliche" Auflösung und ja, es ist so, dass bei kleinsten Änderungen er irgendwann nicht mehr darauf reagiert
bzw. mal mehr oder mal weniger Schritte benötigt bis er sich wieder bewegt.
Das hängt jetzt aber vom Servo selbst ab wie fein er auflösen kann.

Der Motor bewegt ja über die Zahnräder ein Poti und das Getriebe zieht sich sozusagen auf.
So ist es möglich dass z.B. die ersten 5 Schritte nichts passiert und dann gehts aber bei jedem 2 Schritt weiter.
Dreht man die Richtung um, kann es gut sein, dass wieder 5 oder sogar noch mehr Schritte nicht ausgeführt werden,
die Getriebe muss nun das Zahnflankenspiel in die andere Richtung ausrichten.
Auch die Qualität/Linearität des verwendeten Potentiometers spielt hier sicherlich eine Rolle.

Wenn die Signale ausbleiben ist das theoretisch nicht schlimm, dann bleibt der Servo ja stehen wo er ist, aber
wenn er nun mechanisch bewegt wird oder eine Kraft ihn aus der Position ziehen/drehen will, kann er das nicht mehr ausgleichen
So gesehen ist es also Anwendungsspezifisch ob man die Impulse abschalten darf. Die Haltekraft ist dann weg.

Siro

oberallgeier
04.05.2019, 10:01
.. Servos haben eine "endliche" Auflösung .. dass bei kleinsten Änderungen er irgendwann nicht mehr darauf reagiert ..Da ist ja einmal die zeitliche Auflösung des eingegebenen Stellsignals (der SignalPULS). Es ist unwahrscheinlich, dass die Servoelektronik bis herunter zu Femtosekunden und kürzer auflösen kann (kann!). Dazu sollte ne gute Stellungsregelung noch ein klitzekleines Toleranzband um den Sollwert haben in dem nicht geregelt wird - sonst schwingt der vom Regler beeinflusste Stellwert bei minimalsten Abweichungen um den "Nullpunkt" (den genauen Wert den er einhalten soll) rum. Und dabei schwingt der aus Trägheitsgründen theoretisch dauernd. Ein schmales Toleranzband verhindert dies.


.. Servos haben eine "endliche" Auflösung .. Das hängt jetzt aber vom Servo selbst ab wie fein er auflösen kann ..Das sehen wir in einem zufällig herausgepickten Beispiel hier (https://www.pololu.com/product/207) - unter "Device spezifications" .. resolution: 0.5 µs (about 0.05°). Diesen Wert um etwa 0,4 µs hatte ich selbst festgestellt. Für mich gilt daher, dass viele Servos theoretisch den Stellwert von 1 ms (also den "Standardwert", der auswertbare Unterschied von 1ms Puls bis 2 ms Puls) allenfalls in 1000µs/0,4µs = 2500 Schritten auflösen können - das ergibt knapp 11½ Bit Auflösung. Wenn ich in meiner Servoroutine den Stellwert in bis zu sechstausend Schritten auflöse (oder käufliche Servocontroller 12 Bit Auflösung nennen) dann kann der Servo erst nach ein paar Schritten reagieren. Aber erst damit kann ich die mit dem Servo erzielbare Auflösung voll ausnutzen.


.. Wenn die Signale ausbleiben ist das theoretisch nicht schlimm, dann bleibt der Servo ja stehen wo er ist, aber ..Hier ist der Nachsatz extrem wichtig. Ein Servo mit Spannungsversorgung ohne Signal kann da kraftlos bis unangenehm unvorhersehbar reagieren. Ausnahmen gibts aber. So ist der Deckelantrieb meines MiniD0 (https://www.youtube.com/watch?v=99G7wRI5nf8&list=UUm7F31vxwrXCjAoB3TW4tpA&index=15)´s in aufgefahrener Stellung so fixiert, dass ich Signal und Spannung bei längeren Fahrten (mitunter) abschalte - der Servo hält dann trotzdem die Position.

Moppi
04.05.2019, 11:20
Gut, Danke!

Dann weiß ich jetzt, dass es nicht am PCA9685 liegt, sondern tatsächlich am Servo.


MfG

oberallgeier
05.05.2019, 10:01
.. Dann weiß ich jetzt, dass es nicht am PCA9685 liegt, sondern tatsächlich am Servo ..Du sprichst ein großes Wort gelassen aus ..

Im Prinzip hast Du wohl Recht und kannst beruhigt sein. Aber solange nicht geklärt/gesichert ist, wie viele Interrupts im code herumwerkeln oder ob noch andere Störmöglichkeiten vorhanden sind hatte ich mir in ähnlichen Fällen kein abschließendes Urteil erlaubt.

Eigentlich ist ja offen wozu Du eine ?absolute?, möglichst genaue Positionierung haben möchtest. Nur zum Erkenntnisgewinn solltestkönntest Du bei den eher bescheidenen Servoqualitäten mit dem Ruckeln leben. Bei real begründeten Anforderungen dürften "bessere" Servos helfen. Möglicherweise umsteigen auf Digitalservos und für die Servo-Periode und -Puls entsprechend anpassen. Und vielleicht auch mit nem guten Oszi mal die Steuerpulse genau ansehen (ich hab seit ner Weile ein tolles Ding (https://www.digikey.de/de/product-highlight/d/digilent/analog-discovery-2-pro-bundle?utm_adgroup=General&mkwid=sUtCVlJEC&pcrid=267228484473&pkw=&pmt=b&pdv=c&productid=&slid=&gclid=EAIaIQobChMIpsbp9fWD4gIV2ON3Ch0_XwdwEAAYASAA EgK1C_D_BwE) - das kann sehr viel anzeigen und messen - und ich vertrödel damit sooo viel Zeit :-/ :-/ ).

Moppi
05.05.2019, 12:04
Die üblichen Unterbrechungen, der der 328P so zwischendurch einschiebt. Da gibt es wohl so Kleinigkeiten.
Aber das Ergebnis ist reproduzierbar und es handelt sich immer um 3 bis 5 Werte für die Pulslänge.

Wozu genaue Positionierung:

Ich gehe zunächst von der Theorie aus. Servos sollen eine Position anfahren, eigentlich eine genaue Position und diese halten.
Also wäre es auch schön, wenn das möglichst genau funktioniert. Zumindest so gut, wie es - mit einem nicht zu großen Aufwand - möglich ist.
Nicht zu vergessen, dass ich mich das erste Mal intensiv damit auseinandersetze, worauf man so achten muss und was es zu bedenken gibt, wenn man damit hantiert.

Im nächsten Schritt habe ich schon gesehen, dass mir genaue Winkel so viel nicht bringen werden, für das was ich damit versuchen will. Genaue Winkelpositionen wären wichtig, wenn ganze Bewegungsabläufe, innerhalb eines Pfades, berechnet werden sollen. Aber das würde mit so Ungenauigkeiten am Ende unbefriedigende Ergebnisse liefern. Zumal äußere Einflüsse stören. Daher werde ich mich damit auseinandersetzen, Bewegungsabläufe zu erstellen und auf äußere Ereignisse mit Gegenbewegungen zu reagieren. Mal sehen ...

Ein weiteres Problem, mit diesen kleinen Servos, ist das Aufschwingen (wenn der Servo versucht die Position zu finden), wenn sich ein längerer Hebel mit Gewicht (ein paar Gramm genügen) daran befindet.



|----------| |----------|
|servo#1 O#|##########|servo#2 O#|###############
|----------| |----------|



Servo#1 würde evtl. die Position nie finden, sondern in gewissen Grenzen um die Sollposition schnell hin- und herschwingen.
Auch hier müssen die Bewegungsabläufe entsprechend gestaltet sein, damit das dann weitgehend verhindert wird.


MfG

oberallgeier
05.05.2019, 17:58
.. Ich gehe zunächst von der Theorie aus. Servos sollen eine Position anfahren, eigentlich eine genaue Position und diese halten ..Da bin ich nicht der gleichen Meinung. Was ich benutze sind Modellbauservos (allerdings gibts ja welche die speziell für Roboter sind - die hatte ich aus Preisgründen nie verwendet). Die sind ja dafür gebaut um z.B. Modellflieger über Funk zu steuern. Ohne es zu sehr auszubreiten und nur beispielhaft: wenn der Flieger dann statt auf Kurs 70° auf Kurs 68° ist, dann schwenkt der Pilot den Steuerhebel an der Fernsteuerung etwas zur Seite und alles ist ok. Positionen sehr genau und sehr gut reproduzierbar anzufahren ist ja eher nicht die Aufgabe.


.. Ein weiteres Problem .. ist das Aufschwingen .. wenn sich ein längerer Hebel mit Gewicht (ein paar Gramm genügen) daran befindet ..Da bist Du jetzt bei der Theorie an der richtigen Stelle. Der Servo hat intern einen Stellungsregler. Der stellt mit einer begrenzten Kraft eine durch den Puls vorgegebene Position ein - mit einer bestimmten Geschwindigkeit. Die Variierbarkeit der Lastparameter hält sich in Grenzen. Und wenn Du eben einen längeren Hebel mit einem Gewicht hast, dann ist das Trägheitsmoment - auch bei kleinen Gewichten - teils weit über dem, was bei der Auslegung des Reglers zugrundegelegt wird. Fazit: die Regelung ist dann so verstimmt, dass Schwingen auftritt.

Wenn Dich die Theorie "hinter" den Servos interessiert, könntest Du da sicher gut verschiedene Effekte sehen, wenn Du mal einen eigenen Servo baust: Motor mit Encoder, Motortreiber, Controller und Software. Und dann mal die Regelungsroutine dazu schreiben. Ich hatte das beim Hand-Drehgelenk meines Archie (https://www.roboternetz.de/community/threads/61379-Kopfsache-und-ein-m1284-etliche-Servos-viel-Alu?p=625271&viewfull=1#post625271) gemacht - dort ist ein kleiner Getriebemotor mit Encoder eingebaut mit einer eigenständigen Steuerung. Angeschlossen wird das Ganze an einen üblichen Servoanschluss - mit den üblichen Vorgaben. Und bei so etwas kann man dann an den Reglertypen rumspielen - P-Regler, PI, PD und PID, kann die verschiedenen Parameter selbst bestimmen und den Effekt bei Änderungen sehen.

Moppi
05.05.2019, 18:19
Fazit: die Regelung ist dann so verstimmt, dass Schwingen auftritt.

Danke für die Info!


wenn Du mal einen eigenen Servo baust: Motor mit Encoder, Motortreiber, Controller und Software.

Damit hatte ich mal angefangen. Wollte einen Stepper dafür nehmen. Aber wegen der nicht zu erreichenden Kraft (die ich mir vorstellte), bei einer gewissen Mindestgeschwindigkeit, aufgehört.



MfG

oberallgeier
07.05.2019, 19:53
.. Wollte einen Stepper dafür nehmen. Aber wegen der nicht zu erreichenden Kraft .. bei einer gewissen Mindestgeschwindigkeit, aufgehört ..Wieviel Kraft? Wieviel Geschwindigkeit?

Bei Pololu (es gibts auch europäische Händler die das vertreiben, da spart man die fuffzig Dollar Porto) gibts recht kleine, kräftige Motoren mit Encoder (https://www.pololu.com/category/60/micro-metal-gearmotors). Einen aus dieser Baureihe hatte ich für archies Hand-Dreh genommen. Könnte so etwas (mit ner eigenen "Servo-Simulationssteuerung") reichen? Wenn die Power nicht reicht, dann gibts die Ø37-Getriebemotoren (https://www.pololu.com/category/116/37d-mm-metal-gearmotors) - die haben Encoder und Power, hab ich zwei für den Fahrantrieb vom archie. Meine Typen schaffen an die 60 W elektr. Leistung - pro Motor (12V, 5A).


Ich verwende zunächst mal so was hier, da sieht man auch schon, wieviel ich probiert habe .. muss man trotzdem noch ein gutes Augenmaß ..Bei den Discountern gibts immer wieder Winkelmesser, elektronisch, Digitalanzeige (https://www.lidl.de/media/product/0/2/9/4/5/2/5/powerfix-messschieber-winkelmesser-digital--9.jpg) für knapp fünfzehn Steine. Die zeigen auf 1/10° genau an mit gute Reproduzierbarkeit. Ich habe für genaue Messungen so was hier liegen (wenn ich nicht eletronisch-analog mit nem ausgebauten Servo-Poti messe) und bin zufrieden damit.

Moppi
07.05.2019, 23:26
Ich hatte vor, eigene Servos für einen Roboterarm zu bauen. Kraft bis 12kg. Ich hatte die Vorstellung, einen Schrittmotor zu nehmen, weil der sehr genau gesteuert werden kann. Im Getriebe an geeigneter Stelle wollte ich einen Hall-Effekt-Sensor verbauen oder eine Lichtschranke, um so die genaue Position bestimmen zu können (evtl. Schrittverluste). Aber das ist vom Tisch, habe dann gesehen, dass es Servos in der Größenordnung Drehmoment gibt, die weitaus weniger Gewicht haben.
Das war aber ein ganz anderes Thema bei mir.




Mit dem Winkelmessen hat es sich erst einmal auch erledigt. Ich bin seit heute in der Lage, erste Bewegungsmuster durchzugehen, nachdem ich eine Menüsteuerung mit UDP-Paketen (auf nodeMCU) aufgebaut habe. Im weiteren Verlauf werden einzelne Bewegungsabschnitte zu komplexeren zusammengefasst. Auffallend dabei: es richtet sich nach dem Bewegungsspielraum, eines einzelnen Arms, des Roboters. Wegen der max. 180° Stellwinkel sind einige Segmente im Winkel vertikal gespiegelt. Was bei dem Einen bspw. 25° oben, sind also bei einem Andern 25° unten. Durch die Spiegelung verschieben sich auch Min- und Max-Punkte in der Freiheit der Bewegungen. Horizontal weiß ich noch nicht, komme ich später zu, wird aber ähnlich sein. Manchmal muss ich das Servohorn nochmal 180° drehen, wenn die Freiheit in der Bewegung, in eine Richtung nicht ausreicht.

.....34154

Winkel benötige ich bis jetzt nicht, sondern die Bewegungen der Armsegmente richten sich nach bestimmten (zu erlernenden) Punkten/Stellungen, die sich in der Pulslänge für den jeweiligen Servo ausdrücken - Winkel hin oder her. Armsegmente lassen sich über die Zeit in Pulslängenschritten synchronisieren, so dass sie zeitgleich oder versetzt einen bestimmten Punkt erreichen. Im Grunde brauche ich also nichts weiter, als die Pulslänge, keine Winkelumrechnungen und die Genauigkeit eines Servos spielt hierfür auch keine sehr gewichtige Rolle. Nur eine Mindestauflösung im Stellwinkel sollte schon sein, dass der Servo nicht zu große Sprünge macht (diese 3 bis 5 Werte, in der Pulslängenänderung, wo eben keine Reaktion erfolgt). Bei dem Servo, der den längsten Hebel zu bedienen hat, wird es schon recht holprig, in den Bewegungen. Je kürzer der Hebel am Servo, desto gleichmäßiger die Bewegungen. Manchmal lässt sich das durch Gegenbewegungen ausgleichen.





Wusste noch gar nicht, dass es elekt. Winkelmesser gibt - Kann man mal sehen.! Habe lange Zeit gar keine mehr benutzt. :)



MfG

oberallgeier
08.05.2019, 11:43
.. eigene Servos für einen Roboterarm zu bauen. Kraft bis 12kg .. die Vorstellung, einen Schrittmotor .. weil der sehr genau gesteuert werden kann ..Hmm. Mal Anmerkungen.

Mit 12 kg meinst Du sicherlich zwölf "Kilogrammzentimeter" - eine Dimensionsangabe die obsolet, nicht wirklich sinnig aber leider gebräuchlich ist. Meistens meint man dann eine "Kraft" in Kilogramm die an einem Hebel von 1 (!) Zentimeter angreift. Hier im Forum wurde schon ellenlang und teils heftig-oberlehrer-dünkelhaft über diese Angabeform seitenweise geschrieben. Die "Kraft" Kilogramm ist total veraltet - die meinte vor etlichen Jahrzehnten eine Kraft die von der Masse eines (unbewegten) Kilogramms in Meereshöhe der Erde auf die Unterlage ausgeübt wird. Und nach gesetzlich (https://www.buzer.de/gesetz/4787/index.htm) geltenden Größen (https://www.buzer.de/gesetz/4787/a66419.htm) ist auch der Zentimeter keine "offizielle" Längeneinheit - Meter ist da angesagt. Das führt manchmal zu Potenzen, mit der weniger geübte Menschen (im "Altdenken" geblieben) sich unwohl fühlen - und die "zulässigen" Angaben wie Terra oder Femto sind auch nicht geläufig. So - Ende des dünkelhaften Rumlaberns.

Deine 12 kg dürften 12 kgcm sein, die man normgerecht heute als ungefähr 1,2 Nm (ganz genau 1,177 Newton Meter) bezeichen sollte - die Kraft von 1,2 N auf einen Meter Hebellänge - oder 120 N auf 1 Zentimeter Hebel. 1,2 Newton auf einen Hebelarm von einem Meter - das ist schon ne satte Anforderung. Meine Servos Typ 1501 MG (https://www.pololu.com/product/1057) schaffen bei guter Reproduzierbarkeit und einem Preis von unter 20 EuroFlocken laut DAtenblatt bei 4,8 V 1,521 Nm und bei 6V 1,668 Nm.


.. Winkel benötige ich bis jetzt nicht, sondern die Bewegungen der Armsegmente richten sich nach bestimmten (zu erlernenden) Punkten/Stellungen, die sich in der Pulslänge für den jeweiligen Servo ausdrücken - Winkel hin oder her ..Na ja. Ich stelle fest, dass die Wiederholgenauigkeit 1) von Servos wirklich nicht perfekt ist, dass die VOrwärts-Rückwärtspositionierung 2) nicht deckungsgleich ist und so fort. Aber vermutlich machst Du ein Teaching 3) und da ist Dein Vorgehen ok.

Schon wieder viel zu viel Buchstaben :-/

1) Die gleiche Stelle wiederholt anfahren aus unterschiedlichen Stellungen, in wiederholten Testzyklen mit "Kaltstart" usf.
2) Zwei Servos fahren bei gegensätzlicher Drehrichtung mit exakt gleicher Pulslängendifferenz NICHT den gleichen Winkel
3) Teachen - Roboterarme fahren bestimmbare Positionen an und die Steuerung merkt sich die Winkelstellung der verschiedenen Aktoren für diese Stellung

Moppi
08.05.2019, 12:08
Mit 12 kg meinst Du sicherlich zwölf "Kilogrammzentimeter"

Ja, ist eigentlich richtig.


Hier im Forum wurde schon ellenlang und teils heftig-oberlehrer-dünkelhaft über diese Angabeform seitenweise geschrieben.

Muss mich erst etwas dran gewöhnen, hatte ich nie in Verwendung, lerne also noch dazu ;) Wird schon, dauert etwas.


Zwei Servos (http://rn-wissen.de/wiki/index.php?title=Servos) fahren bei gegensätzlicher Drehrichtung mit exakt gleicher Pulslängendifferenz NICHT den gleichen Winkel

Erklär noch mal bitte, wie / was Du genau meinst.


Teachen - Roboterarme fahren bestimmbare Positionen an und die Steuerung merkt sich die Winkelstellung der verschiedenen Aktoren für diese Stellung

Nur noch mal so, denke das hast Du schon verstanden:
Da der Servo eh nur die Pulslänge für die Position interpretiert oder umrechnet, beschränke ich mich gleich auf Pulslängen und lasse die Umrechnung über Winkel weg.





MfG

oberallgeier
09.05.2019, 09:22
.. Erklär noch mal bitte, wie / was Du genau meinst ..Die simultane Bewegung von ZWEI bau- und typgleichen Servos war für mich notwendig, um die Kopfneigung meines archies (siehe Sekunde 23 .. 26 (https://www.youtube.com/watch?v=Kt4UiEaTicc)) glatt und "richtig" aussehen zu lassen. Dazu wurden die Servos zuerst in der Lage (A) angeordnet.


......https://dl.dropbox.com/s/1kcem9iqy2oe10o/Drehsinn-paarige-Servos_k.jpg?dl=0

Das funktionierte NICHT, wenn für gleiche Bewegungen (gleich nach Stellung sowie Zeit/Geschwindigkeit) gleiche Increment-Fortschritte bzw. PulsUNTERSchiede pro Periode gewählt wurden. In diesem Fall liefen die Servos bei gleicher Richtung der Schwenkbewegung relativ zum "andern" Servo NICHT simultan - und der Kopf wackelte. Die Bewegungen waren - auf beide Servos bezogen - jeweils gegensinnig. Erst die Anordnung nach (B) - bei der für gleiche Bewegung der Servohörner die Servos ja "absolut" gleichsiinnig drehten - brachte die gewünschte Übereinstimmung. Den Grund - ungleiche Geschwindigkeitsverteilung (gering aber messbar) konnte ich bei Testfahrten in unterschiedlichen Drehrichtungen mit meinen Servotester bestätigen : siehe hier die (https://www.roboternetz.de/community/threads/62904-Servomesstester-%28Servotester-und-%C2%96messaufbau%29?p=585556&viewfull=1#post585556) Welligkeit im Geschwindigkeitsverlauf der abfallenden und der ansteigenden dicken, blauen Linie.

Klar?

Moppi
09.05.2019, 09:48
Danke, für Deine Erklärung!

-------------------------------

Ich habe beim PCA9685 festegestellt, dass da manchmal Ausgänge weggeschaltet werden. Ich wollte Servos ansprechen und habe mich gewundert, warum manche nicht funktionieren. Habe mir dann die Pin-Nummern gesucht und die betr. Servos, bei eingeschaltetem PCA9685-Board, einmal ab und wieder angesteckt. Dann funktionierten die. Ist mir schon mal aufgefallen, dass wohl - aus verschiedenen Gründen - Ausgänge abgeschaltet werden.


MfG