INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Servo steuerung
25.04.2014, 17:16
Beitrag #1
Servo steuerung
Hallo ich bin Einsteiger mit dem Adruino.
Habe einige Beispiel Projekte aus Büchern durchgemacht darunter auch mit dem Servo
Ich habe diesen einfachen Sketch geschrieben bei dem der Servo bis 150 fährt und stoppt

#include <Servo.h>
Servo servo1;
void setup(){
servo1.attach(9);
}
void loop(){
servo1.write(150);
}

Dann habe ich diese Zeile geschrieben

#include <Servo.h>
Servo servo1;
int pos = 0;

void setup(){
servo1.attach(9);
}
void loop(){
for (pos = 0; pos < 150; pos += 1) // dreht sich von 0 zu 150 in einer Schritten
{
servo1.write(pos); // servo soll zur variable 'pos' drehen
delay(15);
}
}

So dreht sich der Servo von 0 nach 150 und fängt dann wieder von vorne an
Ich möchte aber dass der Servo bis 150 fährt und dann an dieser Position stehen bleibt.
Ich habe mir gedacht mit einer if schleife aber ich weiß nicht wie ich das schreiben soll.
Ich hoffe doch dass ihr mir dabei helfen könnt
Es ist kein Projekt mit dem Servo, ich möchte einfach nur die Programmierung verstehen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.04.2014, 08:55 (Dieser Beitrag wurde zuletzt bearbeitet: 26.04.2014 09:04 von rkuehle.)
Beitrag #2
RE: Servo steuerung
Hallo dimotec,

um den Unterschied zwischen beiden Sktechen zu verstehen muß man beachten, dass ein Servo im wesentlichen aus zwei Komponenten besteht.
1. ein bischen Elektronik die ständig den aktuellen Drehwinkel des Motors ermittelt
2. eben dem Motor , der, falls erforderlich, durch die Elektronik auf den per Sketch geforderten Drehwinkel gebracht wird (write()).

Weiterhin muß man beachten, dass die in loop() gesetzten Anweisungen immer wieder durchlaufen werden.

1. Sketch: hier wird einfach nur ein Drehwinkel von 150 gefordert.
Der Sketch wird immer wieder durchlaufen, nach dem ersten Durchlauf stellt die Elektronik fest, dass der Motor bereits auf 150 steht und zieht den Motor daher nicht nach. Es erfolgt also einmal eine Änderung des Winkels von 0 auf 150.

2. Sketch: hier wird in der for-Schleife nacheinander ein Drehwinkel von 1,2,3,4 ...150 gefordert. Da die Angabe des geforderten Drehwinkel ständig hochzählt erfolgt hier 150 mal eine Änderung des Winkels von n auf n+1, bis die 150 erreicht ist. Der optische Eindruck ist zwar sehr ähnlich, die Steuerung erfolgt jedoch schrittweise. Dies passiert jedoch alles nicht im loop() sondern in der for-Schleife.
Wenn die for-Schleife beendet ist (also 150 erreicht ist) springt der Sketch wieder an den Anfang von loop() und beginnt die for-Schleife von neuem. Dort steht aber als Startwert 0. Also geht der Motor zurück auf 0 und beginnt wieder von neuem.

Würdest du die for-Schleife in setup() unterbringen, würde die schrittweise Winkeländerung von 0 bis 150 nur einmal durchlaufen, da Anweisungen in setup() nur einmal abgearbeitet werden. Der optische Eindruck wäre wieder sehr ähnlich wie im 1. Sketch, jedoch wäre auch dies eine schrittweise Änderung des Drehwinkels.

Der zweite Sketch könnte auch so aussehen, wenn du die Steuerung im loop() unterbringen möchtest:
Code:
#include <Servo.h>
boolean jump = false;
Servo servo1;
int pos = 0;
void setup() {
  servo1.attach(9);
}
void loop() {
  if (jump == false)
  {
    for (pos = 0; pos < 150; pos += 1) // dreht sich von 0 zu 150 in einer Schritten
    {
      servo1.write(pos); // servo soll zur variable 'pos' drehen
      if (pos == 150) jump = true;
    }
  }
}

Nicht schön, sollte aber laufen.

Hoffe ich konnte mich einigermaßen ausdrücken.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.04.2014, 09:26
Beitrag #3
RE: Servo steuerung
Vielen Dank für die schnelle Antwort.
Ich habe den Sketch umgeschrieben und es funktioniert
#include <Servo.h>
Servo myservo;
int pos = 0;

void setup() {
myservo.attach(9);
for(pos = 0; pos < 160; pos += 1)
{
myservo.write(pos);
delay(15);
}
}

void loop()
{
}
Ich habe das in den Büchern so verstanden, das SETUP() für die Pin Belegung
und das LOOP() zum Steuern der angeschlossenen Komponenten ist
Dann habe ich den Sin von SETUP() und LOOP() doch noch nicht richtig verstanden und ich sollte die Bücher nochmals Lessen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.04.2014, 09:32
Beitrag #4
RE: Servo steuerung
Hallo dimotec,
das "delay(15);" macht im setup() keinen Sinn, es sei denn du möchtest vor der Ausführung der evetuell noch zu schreibenden loop() - Zeilen eine Pause einlegen!?

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.04.2014, 14:34
Beitrag #5
RE: Servo steuerung
(26.04.2014 09:32)rkuehle schrieb:  das "delay(15);" macht im setup() keinen Sinn, es sei denn du möchtest vor der Ausführung der evetuell noch zu schreibenden loop() - Zeilen eine Pause einlegen!?

Aus meiner Sicht macht das schon Sinn, um dem Servo die Zeit zu geben jedes Mal mechanisch die Position anzufahren (steht ja innerhalb der for-Schleife; ggf. kann man die Zeit aber kleiner wählen; oder es ist eine langsamere Drehung gewünscht).
Um schnellstmöglich auf die Position zu kommen, wäre sicherlich eine direkte Positionsangabe ohne Schleife am besten (siehe Beispiel 1).

Gruß, Alex
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.04.2014, 15:25
Beitrag #6
RE: Servo steuerung
Hallo Alex,

völlig richtig.
Zitat:steht ja innerhalb der for-Schleife;
Genau das hab ich nicht beachtet.
Ich glaube ich bin langsam zu alt für sowas Huh

Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.05.2014, 13:20
Beitrag #7
RE: Servo steuerung
Moin Moin,
du könntest die for-Schleife auch wie du geschrieben hast in eine if abfrage einbauen:
if (read.Servo(myservo)<150)
{
for...
}
wenn du dann inder setup den Servo auf einen Winkel von null stellst wird der Servo beim einmaligen setupduchlauf auf 0 gesetzt und kleiner als 150 sein.
In der Loop Anweisung wird der Winkel abgefragt und kleiner als 150 verglichen.
Ist der Wert kleiner so wird deine for-Schleife ausgeführt. Das wird nur beim ersten durchlauf der Fall sein.

Gruß Sven

Nichts auf der Welt ist unnütz, es kann im schlimmsten Fall immer noch als schlechtes Beispiel dienen.
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Star ATtiny Servo SOS SOS hansanne1310 9 158 Gestern 22:33
Letzter Beitrag: Franz54
  Servo über Temperatur steuern querkopf71 3 72 07.12.2016 19:21
Letzter Beitrag: hotsystems
  Infrarot zu RS232 für Steuerung DG0JG 46 692 22.10.2016 11:35
Letzter Beitrag: hotsystems
  Slider Steuerung, Programmierung blueblack 21 622 16.10.2016 22:31
Letzter Beitrag: blueblack
  ATtiny und Servo Bibliothek malsehen 9 311 15.10.2016 18:09
Letzter Beitrag: malsehen
  Hilfe: IR Remote Steuerung, MSGEQ7 + RGB-LED Streifen dastob 1 123 14.10.2016 21:40
Letzter Beitrag: hotsystems
  Servo soll nur in Ruhelage stoppen Sven1996 1 241 19.08.2016 14:37
Letzter Beitrag: StephanBuerger
  Steuern von 4 Servo mittels eines Taster und eines Potis Jackie09 17 758 16.07.2016 11:43
Letzter Beitrag: Binatone
  Servo und PWM Ausgabe F2Ingo 4 496 17.06.2016 14:53
Letzter Beitrag: F2Ingo
  Hilfe bei Servo-steuerung Innocence 7 820 23.02.2016 11:00
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste