Go Down

Topic: servo Geschwindigkeit veringert? (Read 4856 times) previous topic - next topic

Floetzinger

Guten Morgen( Späties), (für alle anderen Guten Tag),

ein Servo soll in einer Richtung langsam auffahren, revers ruhig zügig ( oder auch langsam).
Vermutlich ist mein Sketch mit einer for Schleife nicht korrekt, den der der Servo veringert nicht seine Geschwindigkeit.
wird sicherlich nur eine kleine Änderung nötig sein, aber was weiß ich schon...
Würde sich das mal jemand anschauen und mich in die richtige Richtung schubsen?
Vielen Dank.


Code: [Select]
[code]
/* Servo für den Betrieb einer Laufkatze
    langsamfahrt, reversierter Betrieb

*/

#include <Servo.h> // Bibliothek
Servo Laufkatze;   // Servo Name

int LK =8;
int langsam;

void setup() {
Laufkatze.attach(8);// Pin 8 für Steuerltg.
}
void loop() {
  Laufkatze.write(6);// Startpos.,nicht kleiner als 6 Grad einstellen

  //  ******* Fehlerquelle?
 
    for (int langsam = 0 ; langsam <= 255; langsam += 2050);{

     digitalWrite(LK, langsam);
  }
  //********
  delay (5000);
  Laufkatze.write(180);// Endposition,nicht größer 180 Grad einstellen
  delay(5000);

}
[/code]

postmaster-ino

Hi

Häh?
for (int langsam = 0 ; langsam <= 255; langsam += 2050);{
langsam = 0, langsam = 2050 (und damit nicht mehr kleiner 255) - soll Das so?

Ein Servo ist eine in sich geschlossene Regelung.
Du gibst nur die Endposition an und das Servo fährt Diese, immer, mit höchst möglicher Geschwindigkeit an.
Ob Rampen enthalten sind - kA, denke aber nicht, da wir hier über einen 'normalen DC-Motor' sprechen.

Wenn Du willst, daß das Servo langsamer wird, musst Du die Ziel-Position entsprechend langsam ändern.
Code: [Select]

if (soll!=ziel){
  laufkatze_unterwegs=true;
  wartezeit=0;  //direkter Start
  startzeit=millis();
}

if (laufkatze_unterwegs && millis()-startzeit>=wartezeit){
  startzeit+=wartezeit; //oder startzeit=millis();, verschleppt ggf. eine ms, ist aber unempfindlich bei wartezeit=0!!
  if (soll<ziel){
    soll++;
    wartezeit=100;  //schnell in Plus-Richtung
  }elseif (soll>ziel){ //müsste immer true sein, wenn soll nicht kleiner ziel ist, da wir bei == kein laufkatze_unterwegs=true bekommen
     soll--
     wartezeit=200;  //langsam in Minus-Richtung
  }
  laufkatze.write(soll);
  if (soll==ziel){
      laufkatze_unterwegs=false;
  }
}

Denke, in der Art könnte Das klappen.

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

michael_x

#2
Mar 11, 2018, 02:49 pm Last Edit: Mar 11, 2018, 02:53 pm by michael_x Reason: Nachtrag
Was das digitalWrite (LK, langsam) soll, und die seltsame Schleife drumherum, weiß wohl keiner.
Warum nicht einfach so:

Code: [Select]

/* Servo für den Betrieb einer Laufkatze
    langsam bis 180, schnell zurück

*/

#include <Servo.h> // Bibliothek
Servo Laufkatze;   // Servo Name

void setup() {
Laufkatze.attach(8);
}
void loop () {
    for (int pos = 6 ; pos <= 180; pos++) {
       Laufkatze.write (pos);
       delay (100); // 10° / sec
    }
    delay (5000);
  Laufkatze.write(6);// schnell zurück
  delay (5000);
}

Nachtrag:
Ohne delay ist immer besser, aber das soll hier absichtlich nicht Thema sein.  :)

uwefed

Wenn Du willst daß sich ein Servo langsam von Punkt a nach Punkt b bewegt dann mußt Du Zwischenschritte mit Pausen machen.

Außerdem MUßT Du mal die Programmiergrundlagen lernen.  
https://www.arduino.cc/reference/en/language/structure/control-structure/for/

Code: [Select]
for (int langsam = 0 ; langsam <= 255; langsam += 2050);{
     digitalWrite(LK, langsam);
  }


Das sind gleich 2 Fehler.
Der Strichpunkt nach der For Klammer und das Inkrement (langsam += 2050) ist zu groß.

Grüße Uwe

Floetzinger

ganz lieben Dank.
wenn es erfolgreich läuft , gibts auch eine entsprechende Rückmeldung.
Verstanden, mehr lesen und lernen.
Merci!

Floetzinger

...läuft.
Aber mit dem Rückwärts von 180 zu 6 Grad krieg ich es nicht auf die Reihe.
Sollte doch einfach sein.
Also einfach die Start und Ende Gradzahl vertauscht :smiley-confuse:
Denk ich nicht schwierig genug? oder zu einfach?



Code: [Select]

#include <Servo.h> // Bibliothek
Servo Laufkatze;   // Servo Name

void setup() {
Laufkatze.attach(8);
}
void loop () {
    for (int pos =180 ; pos <= 6; pos++) {
       Laufkatze.write (pos);
       delay (100); // 10° / sec
    }
    delay (3000);

 Laufkatze.write(180);// schnell zurück
  delay (3000);

}


Könnt' ich nochmal so'n Schubs kriegen?

ah, und die Sache mit den Delays:
das ist grad jetzt zum Probieren einfach schneller und übersichtlicher.
sollte es mal so laufen wie ich es möchte, gibts Millis(), Taster und all die Bling Bling Sachen.
Danke fürs helfen.

Floetzinger

ha, falschen Fehler gefunden.
Nachdenken  hilft.
for (int pos =180 ; pos >= 6; pos--)
so ist es richtig.
 ;D  8)

Floetzinger

hier meine Testversion hin und zurück mit Wartezeit an den Endlagen.
falls es jemand nutzen kann, gern.

Code: [Select]


/* Servo für den Betrieb einer Laufkatze
   Startpos. bei 6 Grad, Endpos. 180 Grad
   bidirektionale langsame Drehung
   mit Verweildauer an den Endpos.
   Austausch Delay gegen Millis() erforderlich
   Testversion Arduino UNO
   (späterere Version auf ATinyxxxx)
   *** Credits:
   michael_x, uwefed, postmaster-ino (arduino.CC Forum)
*/

#include <Servo.h> // Servo-Bibliothek
Servo Laufkatze;   // Servo Name

void setup() {
  Laufkatze.attach(8); // Steuerltg. an Pin 8
}
void loop ()
//*** Richtung 180 Grad
{
  delay (5000);// Verweildauer
  for (int pos = 6 ; pos <= 180; pos++) {
    Laufkatze.write (pos);// Position auf Pin schreiben
    delay (100); // 10° / sec ,Wartezeit zwischen den nächsten Step
  }
  //*** Richtung 6 Grad
  delay (5000);
  for (int pos = 180 ; pos >= 6; pos--) {
    Laufkatze.write (pos);
    delay (100); // 10° / sec

  }
}


Nochmals Danke allen Helfern.
Gruß Flötzinger

Go Up