Jump to content

Recommended Posts

Geschrieben

Hallo zusammen,

 

ich habe eine Frage zum Servo Brick.

Und zwar hängt ein digitaler Servo mit +-2,5 Umdrehungen am Brick.

(Es ist der Modelcraft RS-D22YMB)

 

Zu Beginn ist der Servo Brick komplett stromlos.

Nun schließe ich den USB sowie die externe Stromversorgung an den StepDownPowerSupply. Ich öffne den Brick Viewer und wähle den Servo Brick aus.

Nun stelle ich meine passende Geschwindigkeit, Beschleunigung und die PWM Werte ein. Dann setze ich einen Ziel-Winkel UNGLEICH 0.

Sobald ich auf Enable drücke, fährt der Servo mit voller Geschwindigkeit und Beschleunigung in die 0-Position (vermutlich 1.5ms Pulslänge) und danach mit der von mir ausgewählten Geschw. / Beschl. an den eingestellten Ziel-Winkel.

 

Das stört meine Applikation leider empfindlich, da der Servo nach dem Aufwachen das erste Signal gleich übernehmen muss und nicht erst mit hoher Geschwindigkeit in die Startposition fahren soll.

 

Interessant ist, dass das Verhalten nicht auftritt, wenn ich den USB danach abstecke und wieder anstecke. Wenn ich dann die Werte wieder einstelle und auf Enable drücke, dann tut der Servo sofort, was ich möchte. Der Stack wird nach dem Abstecken des USB natürlich noch über die StepDownPowerSupply versorgt. Meine Applikation sieht vor, dass der Stack zu Beginn stromlos ist.

 

Hat das etwas mit meinem Digital-Servo zu tun oder steckt da ein Feature / definiertes Verhalten in der API drin? Entweder der Servo Brick macht eine Art Initialisierung auf 0 Grad oder der Digital-Servo zeigt das Verhalten. Ein Oszi habe ich grad leider nicht da...

 

Danke für eine Rückmeldung dazu!

 

Grüße

  marco

Geschrieben

Das ist ein interessantes Problem :).

 

Der Servo Brick weiß nicht in welcher Position ein Servo ist wenn du ihn das erste mal bestromst. Es ist nicht möglich von der Startposition langsam auf eine Sollposition zu fahren bevor der Servo Brick die Position eines Servos kennt.

 

Falls das keinen Sinn ergibt musst du dir angucken was technisch passiert. Die Position des Servos wird vom Duty Cycle des PWM bestimmt. Wenn du nun eine Position anfährst ändert sich der Duty Cycle und die Beschleunigung gibt die Rate an mit der er sich ändert. Von welchem Duty Cycle aus soll der Servo Brick anfangen zu beschleunigen wenn er die Position nicht kennt direkt nach einem Neustart? :o

 

 

Was du machen kannst ist auf die erste Sollposition mit einer Beschleunigung von 65535 zu fahren. Dann springt er diese sofort an (vorher nicht auf 0) und ab dann kannst du wieder mit den Beschleunigungswerten arbeiten.

 

 

Geschrieben

Hallo borg,

 

danke für die schnelle Antwort & die Nachtschicht :)

 

Dein Beitrag hat mich der Lösung näher gebracht. Ich werde bei Gelegenheit testen, die erste Sollposition mit maximaler Geschwindigkeit/Beschleunigung zu fahren.

 

Ich habe bemerkt, dass es eigentlich 2 getrennte Probleme sind:

[*]Der Servo fährt zu Beginn mit maximaler Geschwindigkeit

[*]Der Servo fährt zu Beginn erst auf 0 und dann meine Sollposition an

Zu 1: Mir ist klar, dass ein Servo (wenn er nicht modifiziert ist) keine Positionsrückmeldung liefert. Nachdem die Geschwindigkeits- bzw. Beschleunigungswerte der API die Änderungsgeschwindigkeit der Pulsweite beeinflussen, muss für eine korrekte Funktion davon ausgegangen werden, dass erstens der Servo der Bewegung folgen kann und zweitens dass die in der Firmware gespeicherte Position stimmt. Ansonsten wird natürlich der Servo zu Beginn gleich mit Vollgas in die Position fahren, die der Start-Pulsweite der TF API Bewegung entspricht. Die einzige Option wäre, der API mitzuteilen, wo sich der Servo initial befindet. In meinem Fall weiß ich das, es ist die Position, an der ich beim letzten Shutdown stehen geblieben bin. Der Servo verdreht sich bei mir nicht von selbst. Soweit ich die API durchgesehen habe, ist das nicht möglich. Wäre es nicht hiflreich, dem User die optionale Möglichkeit zu geben, die Initialposition selbst festzulegen?

 

Zu 2: Ich habe etwas die Servo Brick Firmware durchgesehen und dabei ist mir in servo.h die Initialisierung aufgefallen:


#define SERVO_POSITION_ORIG 0
#define SERVO_VELOCITY_ORIG 0xFFFF
#define SERVO_ACCELERATION_ORIG 0xFFFF

Die Variablen werden hier mit möglichst sinnvollen Startwerten initialisiert. Ich würde aber von der API erwarten, dass, wenn ich eine Ziel-Position setze und zugleich Geschwindigkeits-/Beschleunigungswerte kleiner als 0xFFFF wähle, der Servo dann nicht erst auf 0 fährt und dann auf die Zielposition.

Die Firmware könnte z.B. ein Initialisierungs-Flag setzen, so dass bei der ersten Bewegung automatisch ohne Transition direkt die Ziel-Pulsweite angefahren wird. Bei allen weiteren Bewegungen ist die Zielposition dann bekannt.

Gut, dass alles OpenSource, dann übersetze ich mal meine eigene Firmware :)

 

Ich habe noch ein weiteres Anliegen: Mein Servo schafft wie gesagt +-2.5 Umdrehungen, was +-900° entspricht. Die Position wird lt. API in °/100 angegeben. Das würde bei mir bedeuten, dass ich -90000 .. 90000 wählen müsste, was nicht in einen Java Short Datentyp passt. Vermutlich wurde die Firmware so designed, dass ein Kompromiss aus Speicherplatz und Auflösung für normale Servos (max. +-180°) entsteht.

Als Lösung habe ich Min/Max Winkel als +-900 angegeben und finde mich damit ab, dass die Geschwindigkeit und Beschleunigung zwar die Bewegung beeinflussen, aber keine physikalisch sinnvollen Werte mehr sind. Das ist soweit ok, ich wollte es nur als Hinweis loswerden.

 

Grüße

  marco

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...