PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo Steuerung



Andri
07.11.2013, 16:42
Hallo,

ich habe vor einen Roboterarm zu bauen,welcher mit Servos betrieben wird. Ich habe als Vorbild die Sweep Datei genommen,aber da bin ich auf folgendes Problem gestoßen: Immer wenn sich der Servo 180° gedreht hat,macht er es erneut. Ich möchte aber,dass er sich nur einmal 180° dreht und dann stoppt. wie verändere ich das? Ich hab das Programm folgendermaßen bearbeitet:



#include*<Servo.h>
*
Servo myservo;
****************
*
int pos = 0;
*
void setup()
{*
**myservo.attach(9);
}*
*
*
void loop()
{*
**for(pos = 0; pos < 180; pos += 1)
**{**********************************// in steps of 1 degree
****myservo.write(pos);
****delay(15);
*********************
**}*
}*


Ich hab gedacht,dass es so geht,aber geht nicht.

Danke für die Hilfe!

Hubert.G
07.11.2013, 17:59
Du darfst die for-Schleife nur solange durchlaufen bis pos==180.
In deinem Programm beginnst du durch das void loop() wieder von neuem mit pos=0
Also vor dem for(.....) noch ein if(pos<180){

Andri
07.11.2013, 18:48
Das wiederholt sich immer noch,ich glaub ich setzte die Klammern falsch.

#include <Servo.h>

Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created

int pos = 0; // variable to store the servo position

void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}


void loop()
{
if(pos<180){for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}}
for(pos = 180; pos>=1; pos-=1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}

Kann ich nicht einfach eine Abbruchbedingung einfügen (http://www.arduino-tutorial.de/2010/06/schleifen/)?

Hubert.G
08.11.2013, 09:08
So wie du es schreibst willst du das Servo langsam hin und herdrehen lassen.


for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees in steps of 1 degree
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for(pos = 180; pos>=1; pos-=1) // goes from 180 degrees to 0 degrees
{ myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position

}

Das if dann weglassen.

Andri
08.11.2013, 14:02
Das versteh ich nicht du hast den gleichen Code gepostet wie in dem Beispiel aber schreibst dann ich soll das if weglassen. Was meinst du damit?

oberallgeier
08.11.2013, 14:34
... hast den gleichen Code gepostet ... ich soll das if weglassen. Was meinst du damit?Der Code ist gleich - aber nur das Teilstück, das da steht.


if(pos<180){for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}}
for(pos = 180; pos>=1; pos-=1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}


Ohne if - also ohne die rot markierten Teile *ggg*.

Andri
08.11.2013, 15:39
Also wenn du das meinst:

#include <Servo.h>

Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created

int pos = 0; // variable to store the servo position

void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop()
{
for(pos = 0; pos < 180; pos += 1)
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}

}

Ich hab das schonmal ausprobiert,das funktioniert nicht. Warum funktioniert das nicht wenn ich statt loop setup eingebe? Ich hab das hier gelesen: http://www.arduino-tutorial.de/2010/06/programmstruktur/

PlasmaTubeI²C
08.11.2013, 15:57
Hi,

setup() und loop() müssen immer dastehen, weglassen kann man keines von beiden. Wenn du nur ne einmalige 180° Bewegung willst, pack mal die gesamte for-schleife ins setup().
Die loop() einfach leer lassen.
Ist zwar programmiertechnisch nicht gerade sauber gelöst, erfüllt aber seinen Zweck.

Andri
08.11.2013, 16:29
Vielen Dank! So soll's laufen!