Servo langsam in Grundstellung fahren

Hallo zusammen.

Auf Grund der letzten Post´s zum Thema Servo hab ich mal wieder einen auf den Tisch gelegt und damit was gemacht. Dabei ist mir aufgefallen das beim Einschalten das Ding erst mal schnell in eine Mittelstellung fährt. Passieren tut das mit dem attach(Pin). Das steht auch so in der Lib Doku drin und ist anscheinend gewollt.

Zum Thema Langsam fahren hatte ich hier mal was gepostet und mit Eurer Hilfe hab ich mir dann eine Lib gebaut mit der die Standarlib erweiter wurde , so das man eben auch langsam auf eine Position fahren kann. Dabei wird in kleinen Schritten von der aktuellen Position auf Zielposition gefahren und mittels milllis() die Geschwindigkeit bestimmt. Aber das hat mit dem Thema eigendlich nichts zu tun.

Jetzt hab ich alledings immer noch das Problem mit dem ersten Fahren, wobei es zwei Fälle gibt. Im Setup habe ich ein servo.write(0) direkt hinter dem attach(pin). Das muss direkt dahinter sonst will er erst auf Mitte fahren.

  1. Beim Einschalten steht der Servo in Null Stellung, er bleibt stehen , soweit ok

  2. Beim Einschalten steht er nicht in Grundstellung dann fährt er natürlich erst mal mit max auf 0.

ich könnte mir allerdings gut vorstellen das es Anwendungen gibt bei denen das losrasen nicht so wirklich gut ist.

Kennt jemand eine Lösung fur das Problemchen.

Heinz

Hi

Eine Lösung habe ich nicht, bin derzeit aber auch mit einem PSA9685 (16-fach PWM-Kontroller) am Spielen.
… wie immer, versorge ich beim Testen die Spielereien von einem Arduino-Pin …
Liebe Kinder zuhause: nicht nachmachen, ist böse!!
Bei 4 Servo’s der Klasse ‘9g’ (eBay) hat man aber schnell eine Art interaktives Blinklicht gebaut - der PWM-Kontroller und der Arduino klauen sich gegenseitig den Strom, einige Resets später sind die Servos in Grundstellung und vereinzeltes Fahren oder langsame Fahrt sind kein Problem mehr.

Ok, DAS musste gelöst werden!

Der PCA9685 bietet an, die Kanäle VOLL-AN oder eben auch VOLL-AUS zu schalten (Bit 4 im High-Byte des LOW_ oder HIGH-Register auf 1, LOW hat Vorrang).
Das nutze ich nun, um beim Initialisieren die Kanäle auf AUS zu stellen und im Arduino die Kanäle ‘der Reihe nach’ zu aktivieren - klappt eigentlich ganz gut.

In meiner benutzten Lib

name=FaBo PWM PCA9685
version=1.0.0
author=FaBo<info@fabo.io>
maintainer=Akira Sasaki<akira@fabo.io>
sentence=A library for FaBo PWM.
paragraph=PCA9685 is I2C PWM.
category=PWM
url=https://github.com/FaBoPlatform/FaBoPWM-PCA9685-Library
architectures=avr,esp32

ist allerdings ein Fehler enthalten, bei der Initialisierung wird 2x das LOW-Byte beschrieben.
Ab Zeile 39 der FaBoPWM_PCA9685.cpp

void FaBoPWM::init(uint8_t value)
{
  writeI2c(PCA9685_ALL_LED_ON_L_REG, 0x00);
  writeI2c(PCA9685_ALL_LED_ON_H_REG, 0x00);
  writeI2c(PCA9685_ALL_LED_OFF_L_REG, value & 0xFF);
  writeI2c(PCA9685_ALL_LED_OFF_L_REG, value >> 8);

Die unterste Zeile müsste PCA9685_ALL_LED_OFF_H_REG heißen.
Wenn man dem dortigen Wert noch ein | 1<<4 ‘spendiert’ wird das Bit 4 (Wert 16) gesetzt und im OFF_H-Register ist Das ‘Dauer-AUS’.
Beim nächsten Setzen im Programm wird das Bit wieder gelöscht und der Channel beginnt mit der Arbeit.

Somit ist das Problem bei mir ebenfalls noch vorhanden - ich kann aber bestimmen, in welcher Reihenfolge die Servor’s in welche Position gehen - DAS machen Die dann wieder ‘so schnell, wie geht’ - sind halt Servos.
In meinem aktuellem Versuch werden die Servos im Sekundentakt zugeschaltet und fahren dann vor/zurück in verschiedenen Geschwindigkeiten.

Für einen Hexapoden könnte man so zumindest ‘die Geburt’ so programmieren, daß sich die Servos nicht ins Gehege kommen sollten, wenn man die ‘Beine’ einzeln reaktiviert.

Kann mir aber auch nicht vorstellen, daß es hierfür eine wirkliche Lösung gibt - die Position der Servos ist dem Arduino nicht bekannt, ob man z.B. Digital-Servos auslesen kann ist mir nicht bekannt, wäre aber ‘doch Mal schön’.
Alternativ: externen Winkelencoder/Sensor

MfG

Das Problem ist, daß die Steuerung der den Servo ansteuert nicht weiß, wo der Servo steht. Somit kann diese nicht von der aktuellen Position beim Einschalten langsam zur Mittelstellung fahren.
Die einzige Möglichkeit einer Positionsbestimmung wäre über ein externes Potentiometer auch der Servoachse oder durch Modifizieren des Servos und Abgreifen des internen Positionspotentiometer.

Als Beispiel eines Umbau zu ein digitalen Servo mittels eines magnetischen Encoders, eines Arduino Pro MINI und einer H-Brücke: https://www.instructables.com/id/359-Degree-Servo-Modification/

Grüße Uwe

Rentner:
Kennt jemand eine Lösung fur das Problemchen.

Ja, beschrieben in meinem Thema "RC-Servo mit Istpositionsmeldung", wobei die Idee leider nicht von mir ist. Man zapft das eingebaute Poti an und mißt die Position, die dann zu ersten Sollposition wird, oder man kauft gleich eins mit vier Drähten.

Bei meinem Kohlekranfunktionsmodell war ein "Sausen" des Hakens nicht gewünscht.

Hallo,
für das langsame Bewegen eines Servos hatte ich mal eine Lib geschrieben, die MobaTools ( lassen sich über den Bibliotheksverwalter installieren ). Die Aufrufe sind weitgehend kompatibel zur Standard Servo.h, aus den oben genannten Gründen, erzeugt die Lib mit dem attach aber noch keinen Impuls. Erst der erste write-Aufruf führt zur Ausgabe von Impulsen.
Allerdings bleibt das Problem der erstmaligen schnellen Bewegung, wenn diese Impulsbreite nicht der aktuellen Servostellung entspricht. Wie Uwe schon geschrieben hat, ist das ein prinzipielles Problem. Man muss dazu aber nicht den Servo umbauen. Man kann sich auch immer die letzte Position des Servo im EEPROM merken, und beim Neustart im setup zuerst auf diese Position 'fahren'. Wurde das Servo nicht inzwischen mechanisch bewegt, bleibt es dann still stehen.
Das EEPROM hält pro Zelle 100000 Schreibzyklen aus. Wenn das Servo nicht extrem dynamisch bewegt wird, reicht das eine Weile aus :wink: . Man muss sich ja nur die jeweils aktuelle Endposition merken. Ansonsten gibt es auch noch die Möglichkeit, die Positionsdaten in einem rolling-Verfahren auf mehrere Zellen zu verteilen.

https://www.mikrocontroller.net/articles/Modellbauservo_Ansteuerung

Der Servo interpretiert eine Signallänge als Position. Sein Encoder ist ein Poti. Seine Grundstellung ist Mittig. Die wird angefahren, sobald Spannung angelegt wird. Nur wenn ein Signal ansteht, wird die Position verändert. Ohne Signal wird immer mittig geregelt.

Im Servogehäuse ist also ein normaler DC-Motor mit Bürsten, ein Getriebe und ein Poti, sowie ein kleiner Chip als Regelkreis.

Will man das Anfahren der Mittelstellung verhindern, muss man diesen Chip austricksen.Manche Chips prüfen vor Grundstellung ob ein Signal anliegt. Man könnte also immer eine definierte Position anfahren vor dem Abschalten und vor dem wieder einschalten diese Position anlegen. Aber einige Chips regeln auch zuerst die Grundstellung und prüfen erst dann einen Fahrbefehl.

Jedenfalls ist dieses schnelle hinfahren an die Grundstellung Systemimmanent und nur schwer in Griff zu bekommen. Man könnte wie oben geschrieben, das Poti abgreifen und selbst messen und so vor dem zuschalten der Servospannung über extra Relais den passenden Positionsbefehl geben, so das kein Fahrvorgang stattfindet. Ist aber viel gebastel.

Und leider kommt dazu, das der Servo in wenigen ms nach Spannung anlegen schon fährt, der Arduino aber deutlich länger braucht bis zum ersten Ausführungszyklus. Daher wird man keine Chance haben, wenn man beide gleichzeitig an Spannung legt. Servos müssten seperat per Relais zugeschaltet werden, am besten vom Arduino selbst, wenn er soweit im Zyklus rennt.

chefin:
Der Servo interpretiert eine Signallänge als Position. Sein Encoder ist ein Poti. Seine Grundstellung ist Mittig. Die wird angefahren, sobald Spannung angelegt wird. Nur wenn ein Signal ansteht, wird die Position verändert. Ohne Signal wird immer mittig geregelt.

Die ersten 2 Sätze sind richtig ( Wobei 'Encoder' mMn nicht das richtige Wort ist, Encoder sind digital ), der Rest einfach falsch. Ohne anstehendes Steuersignal macht ein Servo schlicht nichts. Der bleibt einfach da stehen wo er steht. Beim Einschalten der Versorgungsspannung kann es das berühmt berüchtigte 'Einschaltzucken' geben. Das hat aber nichts mit einem kontrollierten Fahren zu tun. Und es gibt verschiedene Methoden, das zu unterdrücken, wobei der Erfolg sehr vom jeweiligen Servo abhängt.

Danke für die vielen Ratschläge, damit ist es wohl am einfachsten nach jedem Zyklus in eine definiert Stellung zu fahren und dann nach einem Power ein wieder genau auf diese zu fahren. Oder die Lösung mit dem auf Eeprom schreiben ist auch nicht schlecht

Heinz

Mit etwas Gebastel könnte man in das Servo vor die H-Brücke eine Strombegrenzung einbauen… man muss die aber deaktivieren können, damit man nach der Initialisierung wieder die volle Kraft/Geschwingigkeit hat.

Rintin:
Mit etwas Gebastel ...

Kabel ans Servo-Poti löten oder gleich passenden Servo kaufen finde ich einfacher, da der Arduino einen A/D-Wandler eingebaut hat.

MicroBahner:
Die ersten 2 Sätze sind richtig ( Wobei 'Encoder' mMn nicht das richtige Wort ist, Encoder sind digital ), der Rest einfach falsch. Ohne anstehendes Steuersignal macht ein Servo schlicht nichts. Der bleibt einfach da stehen wo er steht. Beim Einschalten der Versorgungsspannung kann es das berühmt berüchtigte 'Einschaltzucken' geben. Das hat aber nichts mit einem kontrollierten Fahren zu tun. Und es gibt verschiedene Methoden, das zu unterdrücken, wobei der Erfolg sehr vom jeweiligen Servo abhängt.

Echt, ein analoger Encoder gibt es garnicht. Ach wie blöd auch. Die ganzen Modellbauer und Servolieferanten, Drehmaschinenhersteller und andere machen seit 30 Jahren diesen Fehler und nennen ihren Poti oder Hallsensoren einen Encoder. Ich werde da gleich mal ein Rundschreiben aufsetzen, das die in Zukunft deine Meinung berücksichtigen sollen.

Und wo habe ich geschrieben, das der Servo irgendwas macht ohne Signal, ausser in die Grundstellung zu fahren bei Spannungswiederkehr?

chefin:
Und wo habe ich geschrieben, das der Servo irgendwas macht ohne Signal, ausser in die Grundstellung zu fahren bei Spannungswiederkehr?

Du scheinst sehr schnell zu vergessen, was Du geschrieben hast:

chefin:
Seine Grundstellung ist Mittig. Die wird angefahren, sobald Spannung angelegt wird. Nur wenn ein Signal ansteht, wird die Position verändert. Ohne Signal wird immer mittig geregelt.

Und genau das stimmt eben nicht. Ein Modellbauservo - um die geht es hier - hat keine Grundstellung, die es selbständig anfährt. Weder nach dem Einschalten noch sonst irgendwann.

Wikipedia:

Ein Drehgeber (bzw. Drehwinkelgeber oder Encoder) ist ein Sensor für Drehwinkel, der meist digitale Ausgangssignale liefert, die am anderen Ende der Sensorleitung im Auswertegerät decodiert werden müssen. Deshalb wird er auch als Encoder (englisch: rotary encoder) bezeichnet.

Ein einfaches Poti ist was anderes - und ein Servo enthält nunmal nur ein einfaches Poti. Es ist natürlich ein 'Drehgeber', aber wenn Du meinst, kannst Du das gern auch weiter Encoder nennen. Ich werde das nicht tun, denn ein Poti kodiert nunmal nichts.

Dein Gefasel ist absolut haltlos. Such dir einen Anderen für deine Rechthaberei.

Cui

Hi

Also soziale Kompetenzen werden hier aber schon schön gezeigt - vll. sollten wir unsere Userschaft um ein paar Psychologen erweitern?

Wenn's wieder OnToppic wird, wäre Das zumindest im Sinne der TO.

MfG

Rintin:
Mit etwas Gebastel könnte man in das Servo vor die H-Brücke eine Strombegrenzung einbauen... man muss die aber deaktivieren können, damit man nach der Initialisierung wieder die volle Kraft/Geschwingigkeit hat.

Wenn man den Servo erweitern möchte dann ist es besser gleich die ganze Ansteuerung der H-Brücke ersetzen und die Funktion selber bauen zB mittels eines Microcontrollers.

Grüße Uwe