Für manche Anwendungen ist die Stellgeschwindigkeit von Servos (wenn sie über einen Arduino gesteuert werden) viel zu schnell oder kann störend wirken. In diesem Beitrag wird per Software diese Geschwindigkeit angepasst, ohne dass der Servo modifiziert oder anders verschaltet werden muss.
(siehe Servos)
Die Library https://github.com/netlabtoolkit/VarSpeedServo soll es ermöglichen, bis zu 8 Servo-Motoren asynchron zu steuern (es werden Interrupts verwendet). Zusätzlich kann man die Stellgeschwindigkeit der Motoren variieren. Der erste Versuch mit der VarSpeedServo-Library soll einen Servo-Motor mit verschiedenen Stellgeschwindigkeiten in unterschiedliche Positionen bringen:
#define PIN_SERVO 9
#include <VarSpeedServo.h>
VarSpeedServo s1;
void setup()
{
s1.attach(PIN_SERVO);
}
void loop()
{
// move to 0° with full speed (wait until move is complete)
s1.write(0, 0, true);
delay(2000);
// move to 180° with speed of 50 (wait until move is complete)
s1.write(180, 50, true);
delay(2000);
// move to 90° with minimum speed of 1 (wait until move is complete)
s1.write(90, 1, true);
delay(2000);
// move to 180° with speed of 5 (wait until move is complete)
s1.write(180, 5, true);
delay(2000);
}
Das Resultat ist gut: die niedrigste Geschwindigkeit ist wirklich sehr langsam, aber dafür leidet die Präzision der Drehung etwas.
Eine weitere Möglichkeit ist die Verwendung der Library
https://github.com/Locoduino/SlowMotionServo
Hier werden die Positionen nicht als Winkel, sondern als Trajektorien angegeben. Genaueres dazu
erfährt man in der Dokumentation der Library selbst.
Der folgende Sketch stellt den Winkel des Servos zunächst initial auf den minimalen Winkel (hier: 0°)
und fährt dann langsam alle Positionen bis zum maximalen Winkel (hier: 180°) linear ab. Sobald der maximale
Winkel erreicht ist, fährt der Servo wieder langsam zurück in die Ausgangsposition und das Ganze
beginnt von vorne.
#define PIN_SERVO 9
#define MIN_ANGLE_MS 544
#define MAX_ANGLE_MS 2400
#include <Servo.h>
#include <SlowMotionServo.h>
SMSLinear s1;
float target = 0.0;
void setup()
{
s1.setInitialPosition(target);
s1.setMinMax(MIN_ANGLE_MS, MAX_ANGLE_MS);
s1.setPin(PIN_SERVO);
s1.setSpeed(0.9);
}
void loop()
{
if (s1.isStopped()) {
target = 1.0 - target;
s1.goTo(target);
}
SlowMotionServo::update();
}
Die Bewegung des Servos wird auch hier sehr langsam vollzogen wobei
die Präzision der Drehung vergleichbar mit der vorherigen Library ist.
Allerdings kann "SlowMotionServo" auch noch eine Glättung
der Bewegung, d.h. die Stellgeschwindigkeit ist nicht zwingend linear.
Anstatt des SMSLinear
-Objekts kann man ein SMSSmooth
-Objekt
verwenden, welches dann die zu Beginn und Ende der Drehung die Stellgeschwindigkeit
langsam einstellt und nicht abrupt.
Auch in einem YouTube-Beitrag des Hobbyelektronikers wurden langsam laufende Servos besprochen und eine selbstgeschriebene Library vorgestellt.
zurück