guntherb:
Trotzdem eine Frage:
Warum die beiden Pulse gleichzeitig, warum nicht nacheinander?
Geschwindigkeit ist keine Hexerei:
Wenn beide Servos Ihren Refresh-Impuls zur selben Zeit starten, und der eine beendet seinen Impuls früher und der andere etwas später, dann brauchen zwei Servos für die Ausführung der Funktion immer genau so lange wie ein Servo: Maximal 2 Millisekunden.
Wenn man die Refresh-Impulse nacheinander sendet, dann brauchen 2 Servos zusammen bis zu 4 Millisekunden, also doppelt so lange.
Die Ansteuerung soll ja auch ein bisschen effektiv sein. Im Endeffekt kann ich eine Ansteuerung für 15 oder 30 Servos schreiben und die Funktion braucht immer nur: maximal 2 Millisekunden für den Refresh-Impuls, egal wie viele Servos. Aber damit das klappt, müssen sie eben gleichzeitig mit dem Refresh-Impuls anfangen, und dann nacheinander abschalten, je weiter nach links der Servo gedreht ist, desto früher beendet er seinen Impuls und die anderen Servos dann nach und nach je nach Drehwinkel, bis der mit dem längsten Refresh-Impuls als letzter fertig wird, aber auch innerhalb von 2 Millisekunden.
Ich weiß, für ein lahmes Temperaturregelungsprogramm mit nur zwei Servos ist das völlig irrelevant.
Aber es gibt auch Anwendungen, da sind 2 Millisekunden viel Zeit, die man nicht mal eben alle 20ms verschenken möchte.
guntherb:
Den Code funktioniert (standalone) toll, aber wenn beide Servos den gleichen Winkel stellen sollen, dann geht eines der Servos auf Block.
Hm, dann funktioniert entweder die Funktion delayMicroseconds() mit dem Parameter "0" nicht richtig.
Oder Deine Servos haben ein deutliches Problem mit der Stromversorgung, wenn beide Servomotoren in exakt derselben Mikrosekunde starten sollen. Bei Gleichstrommotoren ist es ja so: Der Anlaufstrom ist am höchsten. Die Stromaufnahme beim drehenden Motor ist geringer als beim Anlaufen im Moment des Einschaltens.
Vielleicht blockiert ein Motor, weil er zum Anlaufen nicht genug Strom erhält?
Ich habe bei mir auf dem Dachboden inzwischen einen einzelnen Servo wiedergefunden: Einen Graupner C601 von ca. 1980, und mit dem habe ich einige Tests gemacht. Ich teste aber nochmal weiter und schreibe dann nochmal etwas dazu.
Wie gesagt: Prüfe mal die Servo-Stromversorgung! Bei diesen Servos können kleinste Spannungsschwankungen zum Zittern führen und die Servos ziehen kräftig Strom!
Als Fehlerquelle beim Zittern kommen Interrupts und Spannungsschwankungen in Frage. Vielleicht hast Du neben den Servos auch noch andere Bauteile in der Schaltung, die schwankenden Strom ziehen?
Ich habe ehrlich gesagt das I2C-Display im Verdacht, dass das Spnnungsswankungen verursacht, wenn es angesteuert wird. Ich versorge meinen Servo momentan auf dem 5V Pin auf dem Arduino. Selbst wenn ich die Refresh-Impulse zwischen "noInterrupts()" und "interrupts()" packe, scheint das bei der Aktualisierung des Displays einen kleinen und mit der Fingerkuppe spürbaren "Zupp" zu geben. Und das kann eigentlich gar nicht sein.
guntherb:
Ich habe übrigens auch die Empfindlichkeit meiner (digitalen) Servos auf die Einhaltung der 20ms getestet: kein Problem!
Selbst ein "Refresh" mit mehr als 100ms Abstand macht das Servo zwar langsamer, aber es funktioniert.
Das ist schön. Mein Graupner "Vintage" Servo von 1980 zeigt folgendes Verhalten: Offenbar erfolgt das Nachstellen der Servoposition immer nur eine ganz kurze Zeit nach einem Refresh-Impuls. Möglicherweise immer genau die 20 ms lang, bis der nächste Refresh-Impuls kommen sollte. Wenn ich bei diesem Servo mal eine Refresh-Zeit von 500 ms statt 20 ms einstelle, dann kannst Du beim Verstellen die Refresh-Impulse mitzählen: Der Servo braucht dann von 45 auf 135 Grad insgesamt 7 Refresh "Ticks" und läuft sieben mal ein ganz kleines Stück, bis er den gesamten Verstellweg zurückgelegt hat. D.h. den Verstellweg, den der Servo bei 20ms Refresh in weniger als 0,2s zurücklegt, legt er dann in 3,5s zurück. Zwischendurch ist er dann immer im Zustand "nicht angesteuert" und läßt sich leicht von der Sollposition wegdrücken. Aber im Endeffekt: Der Servo erreicht mit beliebig langen Refresh-Zeiten immer auch seine Sollposition, auch wenn es dann sehr lange dauern kann.
Wie gesagt, ich betreibe wegen des Zitterns und seiner möglichen Gründe nochmal ein bisschen Ursachenforschung.