PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Position eines Servo auslesen



robkpc
22.03.2014, 00:17
Hallo,
Ich benutze ein Arduino-Uno-Board und einen kleinen Servomotor. Von dem würde ich gern die Position auslesen. In der Arduino-Referenz finde ich dazu den Befehl Servo.read().

Mit Servo.read() erhalte ich die Fehlermeldung:
_servoversuch_5_140320:31: error: expected primary-expression before '.' token

die ich aber nicht entschlüsseln kann. In Servo.h und Servo.cpp kommt zwar ein Programmteil mit "read" vor, aber mit den dort vorkommenden Instruktionen (z.B " this->servoIndex != INVALID_SERVO") kann ich nichts anfangen. Was mag das für eine Sprache sein?

Kann mir jemand schreiben, wie ich mit Arduino die Stellung eines Servo auslesen kann?
Würde es helfen, ein adafruit-motorshield zu benutzen?

Vielen Dank schon mal!
robkpc

Klebwax
22.03.2014, 03:18
Zu Arduino und Co kann ich nichts beitragen, aber ein RC-Servo kann man nicht auslesen. Es positioniert dahin, wo es soll. Wann und ob es überhaupt die Position erreicht, ist ohne zusätzlichen Aufwand nicht zu überprüfen.

MfG Klebwax

PICture
22.03.2014, 07:02
Hallo!

Am einfachsten ist messen der Spannung am Schleifer vom Potentiometer an der Motorwelle, was aber wie schon erwähnt, einen Eingriff ins Innere benötigt.

oberallgeier
22.03.2014, 08:31
Hi robkpc.

Was meinst Du mit "kleinen Servomotor"?? Ist das so ein Ding wie hier (klick) beschrieben? (http://www.rn-wissen.de/index.php/Servos)



... In der Arduino-Referenz finde ich dazu den Befehl Servo.read().
Mit Servo.read() erhalte ich die Fehlermeldung:
_servoversuch_5_140320:31: error: expected primary-expression before '.' token ...Hast Du Dir die Syntax genau angesehen? Soweit ich es sehe (ich habe zu diesem arduino-Basic kein gutes Verhältnis) ist der Ausdruck "Servo." eine Variable vom Typ Servo - sprich: eine Zahl. Das meckert ja der Compiler auch an.

Übrigens KANN der Dialekt "arduino" tatsächlich "die Servoposition auslesen" - einfach deswegen, weil damit der letzte an den mit "servo." definierten Servo genannte SERVO-STELLWERT gemeint ist. Ob dieser Servo den Wert bereits angefahren hat, ist aber nirgendwo und durch nix gesichert.

Übliche Modellbauservos können ihren Wert nicht wiedergeben - siehe Vorredner, Modelle mit Ansteuerung z.B. per I²C können das meist.

PlasmaTubeI²C
22.03.2014, 08:47
Hi,

eigentlich wurde schon fast alles dazu gesagt. (War wohl zu langsam ;))

Das Element vor dem Punkt ist der Variablenname des Typs Servo, den du beispielsweise mit "Servo servo1" deklarierst.
Dann muss natürlich servo1.read() aufgerufen werden oder wie du es auch immer nennen magst.

Das gibt dir allerdings nur die zuletzt gesetzte Position aus, die nicht absolut ist! Man kann nicht rückschließend sagen, ob der Servo diese Position wirklich erreicht hat.

Die einzigste Möglichkeit ist nur: Servo aufschrauben, Kabel an den Mittelschleifer des Potis anlöten und damit in den analogen Eingang des Mikrocontrollers, dann kann man über den Spannungswert den tatsächlichen Winkel bestimmen.

oberallgeier
22.03.2014, 09:23
... einzigste Möglichkeit ... aufschrauben ... Mittelschleifer des Potis ... Eingang des Mikrocontrollers ...Jein.

Der (Modellbau)Servo wird üblicherweise/hoffentlich an eine separate Versorgung angeschlossen, bei mir gelegentlich auch deutlich über Vcc des Controllers. Bei Bewegung insbes. unter Last zieht der Servo viel Strom, das kann an der Eingangsspannung des Servos diagnostiziert werden. Damit ist der Mittenabgriff zu einem externen Bezug (z.B. die Vcc des Controllers) nicht so konstant, wie die üblicherweise besser als 10-bittige Auflösung des Servopotis ermöglichen würde. Aber als Richtwert würde das gehen und wäre auch aktueller als der vorgegebene Sollwert.

PlasmaTubeI²C
22.03.2014, 12:12
Bei Bewegung insbes. unter Last zieht der Servo viel Strom ... Damit ist der Mittenabgriff zu einem externen Bezug (z.B. die Vcc des Controllers) nicht so konstant ...

Ja, da hast du natürlich Recht, hab ich gar nicht bedacht. :rolleyes:

Aber wenn man dann schon gezwungen ist, beispielsweise ein zweites Poti anzubringen, kann man sich wohl gleich einen Servo mit I2C-Interface aus einem Getriebemotor, Poti/Encoder und nem Attiny basteln. ^^

Oder: Man könnte auch gleichzeitig noch die Versorgungspannung des Servos messen, die ja je nach Belastung schwankt und nimmt das als Referenzspannung für den Maximalausschlag des internen Potis,
braucht man halt einen analogen Pin mehr.

malthy
22.03.2014, 12:51
unter Last zieht der Servo viel Strom, das kann an der Eingangsspannung des Servos diagnostiziert werden. Damit ist der Mittenabgriff zu einem externen Bezug (z.B. die Vcc des Controllers) nicht so konstant, wie die üblicherweise besser als 10-bittige Auflösung des Servopotis ermöglichen würde

Zumindest bei den digitalen Servos die ich mir bisher angesehen habe war es so, dass die Elektronik einen eigenen kleinen Linearregler hatte, der die äußere Versorgungsspannung des Servos auf 3.3V abgeregelt hat. Diese 3.3V lagen dann auch am Poti, sollten also stabil sein, bzw zumindest nicht den extremen Störungen und Schwankungen durch die Laständerungen am Motor unterworfen sein. Bei den old-school analog Dingern mag das anders sein.

Gruß
Malte

robkpc
22.03.2014, 23:43
Hmm,
da es also kein echtes Auslesen gibt, müßte man über das Entfernen der Elektronik und zwei Endschalter nachdenken (es sind bei mir nur zwei Stellungen erforderlich).

Wie steuert man den verbliebenen Gleichstrom-Getriebemotor dann an?
Wenn am passenden Spulenende HIGH anliegt, dreht er sich unentwegt und wenn umgesteuert werden soll, muß die Spule komplett umgepolt werden, entweder mit H-Brücke oder irgendwie manuell?
Reicht eigentlich der Strom aus einem Port oder muß noch ein passender Baustein eingebaut werden?

Gruß
robkpc

Geistesblitz
23.03.2014, 00:07
H-Brücke ist da genau das richtige Stichwort, weil du den Motor sonst nicht umgepolt bekommst. Was meinst du mit manuell? Einen Motor auf gar keinen Fall direkt am Controller betreiben, davon wird dieser höchstwahrscheinlich zerstört.

Musst du denn unbedingt wissen, dass der Servo in einer bestimmten Stellung ist? Wenn er richtig angesteuert wird, sollte er auch die gewünschte Stellung einnehmen. Kommt aber eben auf die Anwendung an.

robkpc
23.03.2014, 14:47
H-Brücke ist da genau das richtige Stichwort, weil du den Motor sonst nicht umgepolt bekommst. Was meinst du mit manuell? Einen Motor auf gar keinen Fall direkt am Controller betreiben, davon wird dieser höchstwahrscheinlich zerstört.
Bei "manuell" hatte ich ich an eben das komplette Umpolen der Spule nebst Löschdioden und einen Baustein zur Erhöhung der Portbelastung gedacht. Ziemlich umständlich und aufwendig; ich habe aber noch einen adafruit-motorcontroller, vielleicht kann ich damit den ausgeschlachteten Servo betreiben.



Musst du denn unbedingt wissen, dass der Servo in einer bestimmten Stellung ist? Wenn er richtig angesteuert wird, sollte er auch die gewünschte Stellung einnehmen. Kommt aber eben auf die Anwendung an.
Die "tatsächliche" Stellung wollte ich nur deshalb wissen, um diese bei Umsteuerung des Servo als Startwert eingeben zu können - damit er nicht erst mal auf den alten Startwert zurückfällt.

Was wird denn eigentlich im normalen Fall an den Servo geschickt? Ich lese da immer microseconds, bastelt sich die interne Servo-Elektronik daraus einen Winkelwert zurecht, den der interne Regler dann einhält? Muß dieser Wert dann alle 20 ms vom AVR erneut gesendet werden oder behält ihn der interne Regler, bis ein neuer Wert kommt?

Gruß
robkpc

oberallgeier
23.03.2014, 15:48
... Was wird denn eigentlich im normalen Fall an den Servo geschickt ...In dem von mir oben verlinkten Beitrag zur Ansteuerung der Servos steht das doch drin: im "Normalfall / Standardservo-analog" alle etwa 20 ms die gewünschte Position in Form der Rampe von etwa 1 bis 2 ms.


... oder behält ihn der interne Regler, bis ein neuer Wert kommt ...Standard ist die genannte 20ms-Periode - die man je nach Servo recht flexibel dimensionieren kann. Einige, meist digitale Servos behalten den Wert - manche könnten theoretisch bis zur nächsten, geänderten Wunschstellung ohne Input bleiben. Aber das macht wenig Sinn (wohl weil eben nicht alle alles können).

Mit diesem Beispiel (https://www.roboternetz.de/community/threads/61379-Kopfsache-und-ein-m1284-etliche-Servos-viel-Alu?p=577672&viewfull=1#post577672) (runterscrollen bis zum Video) kann ich aber gut zeigen, dass die einfache Sollwertvorgabe ohne jegliche Rückmeldung bei guter Programmierung den Servo ziemlich brav verschiedene Bewegungen machen lässt. Mit ner recht ordentlichen Feinmotorik. Und das sind hier alles billige Servos aus der <5€-Klasse.

i_make_it
24.03.2014, 06:46
1234567890