Servo die 2-te

Hallo

kämpfe mit den Servos und es scheint kein ende zu nehmen…
hier mein Code

   case 'i': 
if((links <160) & (links != 160)) links++;{
meinServo.write(links); //Dreht nach links
}
 delay(150);
   break;
   case 'o':
    if((rechts > 2 & rechts !=2 )) rechts--;{
    meinServo.write(rechts); //Dreht nach rechts
    }
 delay(150);
   break;

Was passiert ist folgendes :
Ich kann den Servo durchtippen bis er eine der Positionen erreicht hat (entweder 160 oder 2) doch dann springt er auf 160 und bleibt dort fest stehen.
Jetzt muss ich mein Arduino resetten und das gleiche geht von vorne los.

Wie kann ich die beiden Werte Gradweise anfahren ohne dem arduino neu starten zu müssen und wieso verhält sich der Servo so ?

Als Library benutze ich die servo.h

Gruß

Chris

Deine Abfragen sind mir ein bisschen suspekt, liegt vielleicht daran, dass der Sketch nicht vollständig ist.

if(links <= 160) l++;
if(rechts >= 2) r–;

Hi

ja das könnte sein :wink:

#include <Servo.h>

char command;
  
Servo meinServo;
char links = 80;
char rechts = 80;

void setup() 
{       
  Serial2.begin(9600);  
  meinServo.attach(40);
}

void loop(){
  if(Serial2.available() > 0){ 
    command = Serial2.read(); 
    //Change pin mode only if new command is different from previous.   
    //Serial.println(command);
    switch(command){
          
   case 'i': 
if((links <160) & (links != 160)) links++;{
meinServo.write(links); //Dreht nach links
}
 delay(150);
   break;
   
   case 'o':
    if((rechts > 2 & rechts !=2 )) rechts--;{
    meinServo.write(rechts); //Dreht nach rechts
    }
 delay(150);
   break;
        }
      }
}

Jetzt ist es vollständig.

Ich sehe links++ und rechts--, nirgends aber, daß links kleiner oder rechts größer werden könnte. Die Variablen gehen an Anschlag und dann ist Schluß.

In diesem Beispiel habe ich das Rauf- und Runterlaufen mit drin, kannst Du Dir abschauen.

Hi

Danke für das Bsp. leider blicke ich hier absolut nicht durch.

Zumal es geht ohne Servo.h oder einer ähnlicher Library. (Da wird es wirklich komplex - für mich )

Wie meinst du links kleiner rechts größer ? Ich kann doch die Servo Werte nicht wirklich abfragen.

Warum ist das mit dem Servo so schwer...???

Gruß

Chr.

Das hat mit dem Servo nix zu tun.

Wenn Du mit links++ immer einen draufzählst, dann wird der Wert immer größer. Das begrenzt Du mittels links <160 auf 159. Danach kann sich der Wert nicht mehr ändern, da ein Befehl fehlt, der was abzieht.

Wenn Du in einen Eimer immer Wasser einfüllst, ist der irgendwann voll. Wenn Du kein Wasser entnimmst, bleibt das auch so (Verdunstung kennt ein Arduino nicht!).

OOOOkkkeeyyy

:frowning: soll das bedeuten ich soll das gleich vor dem Setup bei der Initialisierung machen ?
sprich :

char links <160; ???

Sorry aber das kann ich nicht ganz nachvollziehen ich sage ihm doch nicht anderes als wenn du kleiner als 160 bis dann drehe nach links sobald du 160 oder größer bist darfst du nicht mehr drehen.
das gleiche passiert mit rechts kleiner als 2 usw…
(stimmt das was ich hier sage ??? )

Soll das heißen ich muss ich quasi bei 159 wieder auf 0 bzw 80 zurücksetezen
simpel ausgedrückt if links = 159 dann links = 80 ??
Wie …?? :confused: :confused: :confused:

Du hast einen Servo, der eine Position haben kann, also braucht es auch nur eine Variable für die Position. Mit "i" willst Du nach links, mit "o" nach rechts. Also ziehst Du mit "i" etwas von der Variablen ab, mit "o" addierst Du.

Wenn die Variable größer ist als 160, setzt Du sie auf 160, wenn kleiner als 2, setzt Du auf 2.

Dann positionierst Du den Servo.

Entweder stehe ich auf den Schlauch oder ich habe einen Sonnenstich abbekommen ich komme nicht drauf wie ich das im Prog. ausdrücken soll

soll dann die variable 'o' besipielsweise die 160 haben ??

Ich komme nicht drauf ...

Gruß Chr.

"o" steht in der Variablen command und wird mittels switch/case ausgewertet.

AAAHHHH!!! :slight_smile: :slight_smile:

manchmal brauch Man/n schon eine weile um es zu “begreifen”

Danke für die richtige Weg Führung.

Jetzt habe ich es und es funktioniert prima :smiley:

if(pos <= 160) pos+=5;{
meinServo.write(pos); //Dreht nach links
}
 delay(550);
   break;
   case 'o':
    if(pos >=2 ) pos-=5;{
    meinServo.write(pos); //Dreht nach rechts
    }
 delay(550);
   break;
        }
      }
}

Habe den Code Schnipsel eingefügt. Auch wenn es bestimmt nicht 100%-ig ist es läuft.

Gruß an alle

Chris

    }

delay(550);
  break;
        }
      }
}

In den 6 Zeilen sind mindestens 3 Sachen, über die du nachdenken solltest, damit

  • man dich bzw. deinen Code versteht
  • nicht gleich Abwehr-Reflexe geweckt werden.

Was hältst du von

void loop() {
   int command = Serial2.read();
   switch (command) {
   case -1: break; // keine Eingabe
   case 'i': dreh(false); delay (500); break;  // nach links
   case 'o': dreh(true); delay (500); break; // nach rechts 
   default: Fehlermeldung(command); break;
   }
}

Da sind wenigstens die Klammern richtig eingerückt. Über das delay() reden wir später :wink:

Der Vollständigkeit halber:

byte pos; // Servo-Position
const byte MINPOS = 2;
const byte MAXPOS = 165;

void dreh(boolean dir) {
   // dir = false : -5 nach links, true : +5 nach rechts
   // mit Berücksichtigung der Grenzen
   if ( dir && pos < MAXPOS-5 ) pos += 5;
   if ( !dir && pos > MINPOS+5 ) pos -= 5;
   meinServo.write(pos); 
}

void Fehlermeldung(char input) {
   Serial.print(input); Serial.println (" nicht vorgesehen");
}

Ja keine Frage es sieht elegant aus nur ....

Es funktioniert nicht ( klar bei mir geht grundsätzlich etwas nicht )

Sobald ich links 'o' oder rechts 'i' drücke fährt er nach rechts und bleibt dort stehen keine Chance ihn zu bewegen.

Keine Ahnung warum ??

Ne Idee ?

Gruß Chris

Hallo Chris, an der Software kann es nicht liegen, denn mein Servo tut, was er soll. Spannungsversorgung, kalte Lötstelle, defekte Bauteile ... :)

@michael_x: Es geht auch ohne delay (500);.

Hmm

mein weniger eleganter code geht.

Was ich geklaut habe ist die const Byte min max

Auf jeden Fall vielen Dank Leute Ihr habt mir richtig genial geholfen.

100 Pkt. an das Forum

Gruß Chr.