Ja ich denke auch, Du solltest dich mal mit den Grundlagen der Sprache 'C' befassen. Mit dem Servo hat die Zeile direkt erstmal garnichts zu tun. Das ist ein for-Schleife. (Ok. den Link hat Michael schon gepostet)
Bei jedem Schleifendurchlauf ändert sich die Variable pos. Das erste ist der Wert beim 1. Durchlauf, das 2. gibt an wann die Schleife beendet werden soll ( wenn die Bedingung nicht mehr erfüllt ist), und das dritte gibt an wie sich pos von Durchlauf zu Durchlauf ändert. Und dann sieht man, dass das so nicht funktioniert:
Durchlauf pos = 90.
dann wird pos geändert -> pos = 0 ( 90-90 )
Durchlauf wird nicht mehr ausgeführt, da pos nicht mehr >= 90 ist.
D.h. Dein Servo wird auf pos = 90 gestellt und das wars.
Habe das gefühl so langsam dahinter zu kommen, auch wenn ich nicht weiß wie
Mein code sieht wie folgt aus
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created
int pos = 70; // variable to store the servo position
int button = 4; // The button will be on Pin 2
void setup()
{
myservo.attach(5); // attaches the servo on pin 9 to the servo object
pinMode(pos, OUTPUT);
pinMode(button, INPUT);
digitalWrite (button, HIGH);
}
void loop()
{
if (digitalRead(button) == HIGH)
for(pos = 70; pos <= 105; pos += 105) // goes from 0 degrees to 90 degrees
{ // in steps of degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
// waits 1s for the servo to reach the position
}
if (digitalRead(button) == LOW)
for(pos = 105; pos >= 70; pos-= 1) // goes from 90 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(50); // waits 50ms for the servo to reach the position
}
}
So funktioniert das mit dem Taster 1A
problem was ich habe, ich würde gerne das wenn ich den Knopf drücke, das der Servo langsam auf seine position fährt.
Wenn ich "pos += 105" auf 1 ändere und ein delay rein mache geht dies zwar, jedoch in dauerschleife und er ignoriert mein knopf/taster völlig
Das liegt daran, dass Du ja nicht nur die for-Schleife hast, sondern auch noch den loop(), der ja letztendlich auch nichts anderes ist als eine Dauerschleife.
Wenn Du jetzt durch eine kleine Schrittweite die for-Schleife zu einer 'echten' Schleife machst, hast Du 2 ineinadergeschachtelte Schleifen. D.h. je nachdem ob der Taster gedrückt ist oder nicht, wird eine deiner beiden for-Schleifen immer wieder aufgerufen, was zu einer immerwährenden Bewegung des Servos führt. Solange die for-Schleife gar keine 'echte' Schleife war, sondern den Servo nur fest auf eine Position gestellt hat, ist das nicht aufgefallen.
Ich glaube, da hast Du etwas gründlich missverstanden. Damit:
Bartho:
Wenn ich "pos += 105" auf 1 ändere und ein delay rein mache geht dies zwar, jedoch in dauerschleife und er ignoriert mein knopf/taster völlig
hast Du ja schon eine 'echte' for-Schleife. Du musst aber dafür sorgen, dass die nur 1x und nicht in jedem loop-Durchlauf ausgeführt wird, sonst bewegt sich dein Servo endlos. Du darfst die for-Schleife also nur ausführen, wenn sich das Servo nicht schon in der gewünschten Position befindet. Das kannst Du durch Abfragen von pos erreichen.
In loop() keine weiteren Schleifen zu haben, vereinfacht oft alles:
Wenn Taste gedrückt, in jedem loop Durchlauf einen Schritt Richtung ** ** +** **
fahren, bis Ziel erreicht ist
Wenn Taste nicht gedrückt ist, einen Schritt Richtung ** ** -** **
fahren, bis du wieder am Anfang bist.
Hast du zwar so nicht beschrieben, könnte dir aber vielleicht gefallen
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int pos ; // variable to store the current servo position
const byte button = 4; // The button will be on Pin 4
const byte POS_A = 10; // Ziel wenn Taster offen
const byte POS_B = 150; // Ziel wenn Taster zu
void setup()
{
myservo.attach(5); // attaches the servo on pin 5 to the servo
pinMode(button, INPUT_PULLUP); // button connects to GND ( LOW when pressed )
}
void loop()
{
if (digitalRead(button) == HIGH) {
if ( pos > POS_A) {
// in steps of 1°
myservo.write(--pos); // tell servo to go stepwise down to POS_A
}
}
if (digitalRead(button) == LOW) {
if ( pos < POS_B) {
// in steps of 1°
myservo.write(++pos); // tell servo to go stepwise up to POS_B
}
}
delay(50); // langsame Bewegung : 20 ° / Sekunde
}
POS_A muss hier kleiner als POS_B sein
Du wolltest zwar lernen, wie eine for-Schleife funktioniert, aber Servo mit Taster ansteuern geht besser so. Das delay kannst du auch gern verkleinern.
Oder/und statt pos in jedem Durchlauf nur um 1 zu ändern, kannst du natürlich auch pos += 10; // 10° je Durchlauf
machen.
michael_x:
In loop() keine weiteren Schleifen zu haben, vereinfacht oft alles:
Das ist richtig, und es wird oft vergessen, dass man mit loop() ja bereits eine Schleife hat, die man auch nutzen kann ( und sollte )
Da sie immer da ist, muss man sie sowieso berücksichtigen, sonst gibt es Probleme (s.o.). Und dann ist es besser, sie gleich aktiv zu nutzen.