Ich möchte ein Messgerät simulieren, das einen bestimmten Wert langsam anfährt und dann um diesen Wert pendelt. Das ganze soll per Servo laufen. Startwert ist Position 180, Endwert ist Position 10, er
fährt also rückwärts. Um die Position 10 soll der Servo dann pendeln.
Ich habe das Sweep-Programm aus den Beispielen genutzt. Dabei gibt es das Problem, das der Servo zwar perfekt den Wert 10 anfährt, aber das immer wieder da er ja in der Loop ist.
Ich habe dann die Schleife, in der die Position angefahren wird, aus dem Loop in die Setup gesetzt. Da besteht aber das Problem, das der Delay Befehl ignoriert wird. Der Servo fährt also mit voller Geschwindigkeit in die gewünschte Position. Auch wenn ich eine Do while Schleife nehme wird delay ignoriert.
Wie kann ich das gewünschte Verhalten erreichen? Habe überlegt, statt delay dem Arduino was zu tun zu geben, z.b. in einer 2. Schleife von 0 auf 100.000 zählen zu lassen aber das ist irgendwie unelegant.
Skino:
Ich habe dann die Schleife, in der die Position angefahren wird, aus dem Loop in die Setup gesetzt. Da besteht aber das Problem, das der Delay Befehl ignoriert wird. Der Servo fährt also mit voller Geschwindigkeit in die gewünschte Position. Auch wenn ich eine Do while Schleife nehme wird delay ignoriert.
Das wird nicht ignoriert, sondern Du sagst im Code, das nur der nächste Befehl ausgeführt werden soll und nicht ein ganzer Block.
Delay im setup ist ok, in loop eher nicht.
#include <Servo.h>
Servo myservo;
int pos;
void setup()
{
myservo.attach (9);
for ( pos = 180; pos >= 1; pos -= 10)
{
myservo.write (pos);
delay (1150);
}
}
unsigned long lastmillis = 0;
void loop()
{
if (millis() - lastmillis > 800) // für 800 ms
{
long randomNumber = random (9);
myservo.write (10 + randomNumber);
lastmillis = millis();
}
}
Nun delay funktioniert auch im setup, das ist nicht Den Problem. Mit dem myservo.attach(9) fährt der Servo erst mal schnell in eine Mittelstellung, das kannst Du so einfach nicht ändern.
Wenn Du alles im Loop machen willst kannst Dir einen Hilfmerker setzten nachdem Du estmalig in die Position 10 gefahren bist. Den mit if abfragen und dann nur auf die mit random gebildeten Positionen fahren.
ich würde das fahren in eine eigenen Funktion auslagern und der die Zielposition und Geschwindikeit übergeben. Rückgabewert Position ist erreicht. Anstelle von delay dann millis verwenden um die Geschwindigkeit zu machen.