Seilwinde ruhig und ohne Pause laufen lassen

Hallo zusammen,

vor einer Woche wusste ich noch nicht was Arduino ist und habe auch noch nie programmiert, also danke für eine gewisse Nachsicht. Immerhin macht’s langsam Spaß.

Ich möchte eine Seilwinde laufen lassen und bin ganz froh, dass ich das inzwischen auch hinbekomme, aber die Details gefallen mir noch nicht. Die Winde soll natürlich ruhig und kontinuierlich laufen, das heißt erst in eine Richtung bis zu einem gewissen Punkt, dann ohne langen Stopp in die andere.

Die einfachste Variante ist diese hier, aber so ist das Tempo zu hoch und die Verzögerung beim Richtungswechsel ist zu groß.

#include <Servo.h> //Die Servobibliothek wird aufgerufen.
Servo servoblau; //Erstellt für das Programm ein Servo mit dem Namen
//„servoblau“
void setup()
{
servoblau.attach(9); //Servo wird mit Pin9 verbunden

}
void loop()
{
servoblau.write(40); //Bewegung in eine Richtung
delay(7500); //Das Programm läuft für 7,5 Sekunden
servoblau.write(175); //Bewegung in eine Richtung
delay(7500); //Das Programm läuft für 7,5 Sekunden
}

Alternativ habe ich eine Variante, die die Geschwindigkeit reguliert und am Beginn und Ende einer Richtungsbewegung langsamer wird, um sanfter zu stoppen. So ruckelt es aber.

#include <Servo.h> //Die Servobibliothek wird aufgerufen.

Servo servoblau; //Erstellt für das Programm ein Servo mit dem Namen „servoblau“

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

void setup()
{
servoblau.attach(9); //Servo wird mit Pin9 verbunden

}
void loop(){
 for (pos = 14; pos <= 40; pos += 1) { // goes from 14 degrees to 40 degrees in steps of 1 degree
    servoblau.write(pos);              // tell servo to go to position in variable 'pos'
    delay(100);                       // waits 100ms for the servo to reach the position
  }
for (pos = 41; pos <= 140; pos += 1) { // goes from 41 degrees to 140 degrees in steps of 1 degree
    servoblau.write(pos);              // tell servo to go to position in variable 'pos'
    delay(45);                       // waits 45ms for the servo to reach the position
  }
for (pos = 141; pos <= 180; pos += 1) { // goes from 141 degrees to 180 degrees in steps of 1 degree
    servoblau.write(pos);              // tell servo to go to position in variable 'pos'
    delay(100);                       // waits 100ms for the servo to reach the position
  }
   for (pos = 180; pos >= 141; pos -= 1) { // goes from 180 degrees to 141 degrees
    servoblau.write(pos);              // tell servo to go to position in variable 'pos'
    delay(100);                       // waits 100ms for the servo to reach the position
  }
for (pos = 140; pos >= 41; pos -= 1) { // goes from 140 degrees to 41 degrees
    servoblau.write(pos);              // tell servo to go to position in variable 'pos'
    delay(45);                       // waits 45ms for the servo to reach the position
  }
  for (pos = 40; pos >= 14; pos -= 1) { // goes from 40 degrees to 14 degrees
    servoblau.write(pos);              // tell servo to go to position in variable 'pos'
    delay(100);                       // waits 100ms for the servo to reach the position
  }
}

Meine Fragen dazu:

  1. Wie kann ich die Verzögerung bis zum Neustart des Loops vermeiden oder verringern, wenn er durchgelaufen ist?

  2. Gibt es eine Möglichkeit die Laufgeschwindigkeit zu drosseln, ohne dass es ruckelt? Oder kann man sogar von einer gewissen Geschwindigkeit stufenlos zum Halten kommen? Und auch langsam starten und sanft schneller werden?

  3. Noch ein bisschen extra das leidige Thema Netzteil: Mit dem 5V Netzteil, das mir mitverkauft wurde, läuft nichts. Mit einem Handylader geht’s. Also muss ich ein Netzteil mit mehr Spannung besorgen, auch wenn das den Arduino zerstören kann?

Danke schon mal!

Martin

MDO_EWI:
... Seilwinde ...

Ein Servo läuft normalerweise zwischen einer Position von 0° bis 180°. Mit servoblau.write(90); wird die Mittelstellung angefahren.

Ein Seilwinden-Servo hat kein eingebautes Poti und dreht daher endlos wie ein normaler Motor.

Welchen Servotyp verwendest Du?

Zu 1: loop() wird endlos wiederholt, da gibt es keine (relevante) Verzögerung. Oder meinst Du die Verzögerung nach Reset, wenn der Arduino auf ein neues Programm wartet?

Zu 2: Die Bibliothek möchte ganze Gradzahlen, zwischen 0° und 1° gibt es nichts. Alternativ kannst Du eine Zeit je nach Servo so zwischen 544 und 2400 µs mitgeben. servoblau.write(1500); sollte bei einem normalen Servo die Mitte (90°) anfahren. Wegen des größeren Zahlenbereichs von 2000 sollte ein weicherer Übergang möglich sein.

Zu 3: Die Spannung bleibt bei 5V, der vom Netzteil maximal gelieferte Strom darf größer sein. Wobei viele Servos 6 bis 7 Volt bei mehr Drehmoment vertragen. Um das auszuschöpfen kannst Du auch ein Netzteil >9V mit zwei StepDown-Reglern auf 5V und 6 - 7V nutzen. Bei manchen StepDown kann man die Spannung einstellen.

Ein Seilwinden-Servo hat kein eingebautes Poti und dreht daher endlos wie ein normaler Motor.

Es gibt Seilwindenservo mit 3,5 Umdrehungen (statt der 0,5 bzw 180°) die also keine Dauerdrehung haben.

Das genaue Modell wäre hilfreich.

Du kannst ein Netzteil mit der für den Servo geeigneten Spannung und nötigen max Strom alleine den servo versorgen. Die Massen (Minuspole) müssen dabei verbunden sein.

Grüße Uwe

Danke für Eure Antworten!

Ich verwende diese Winde:
https://www.conrad.com/ce/de/product/1233317/Reely-Spezial-Servo-Segelwindenservo-Getriebe-Material-Kunststoff-Stecksystem-JR

Zu 1: Ich meinte nicht das Warten auf ein neues Programm, sonderm hatte tatsächlich Pausen zwischen der Bewegung in die eine und die andere Richtung. Scheint aber an den delays gelegen zu haben. Jetzt geht’s auch ohne.

Zu 2: Ich hab das mal mit den µs versucht. Funktioniert auch. Hat allerdings auch die gleichen Effekte. Wenn man der Bewegung viel Zeit gibt, ruckelt es. Mit weniger Zeit ist es eine Bewegung, aber die ist mir nach wie vor zu schnell. Vielleicht habe ich aber die µs auch nicht richtig eingearbeitet.
Generell habe ich den Code vereinfacht und jetzt sieht er mit µs so aus:

#include <Servo.h> //Die Servobibliothek wird aufgerufen.

Servo servoblau; //Erstellt für das Programm ein Servo mit dem Namen „servoblau“

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

void setup()
{
servoblau.attach(9); //Servo wird mit Pin9 verbunden

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

Ist das so richtig mit den µs?

Zu 3: Wenn ich also jetzt ein Netzteil mit 5V/1000mA habe, bräuchte ich eins, dass z. B. 5V/2000mA liefert, oder?
Oder ich ich schließe gleich das Netzteil an den Servo. Dann müsste ich aber den Stecker abnehmen und die Kabel direkt verbinden. Da schrecke ich als Laie immer etwas zurück. Dann bräuchte ich außerdem noch wieder eine separate Stromversorgung für den Arduino.