Servo anhalten mit Sensor

Hallo,

ich versuche eine Servo mit Ultraschallsensor anzuhalten. Die Servo soll die ganze zeit von 0-180 Grad und von 180-0 Grad geschwenkt werden. Dies funktioniert einwandfrei.

Nun hätte ich gerne, dass sobald die erkannte Distanz von dem Sensor und Objekt unter 40cm liegt, die Servo direkt stoppt und die aktuelle Position beibehält und sobald ich wieder über 40cm bin die Servo weiter schwenkt.

Dass sie an der aktuellen Position stoppt wäre mir wichtig das andere ist eher Kosmetik.

Die Idee meiner Seite war, dass man die Variable "pos" in einer zweiten "pos2" speichert und die dann übergibt, aber anscheinend funktioniert das nicht, weil die for-Schleife weiterzahlt und nicht unterbrochen wird.

Hat Jemand eine Idee, wie ich das lösen könnte?

Sketch:

#include <Servo.h>

Servo myservo;

int trigger=7;
int echo=6;

int dauer = 0;
int entfernung = 0;
int pos = 90;
int pos2;


void setup() {
  
  Serial.begin (9600);       //Damit am Anfang das Fenster verbunden wird und wir die Messdaten auslesen können
  pinMode(trigger,OUTPUT);   //Trigger PIN auf Output gesetzt
  pinMode(echo, INPUT);      //Echo PIN auf Input gesetzt
  
  myservo.attach(12); 

}

int Messung(){

  digitalWrite(trigger, LOW);   //trigger ausschalten
  delay(1);                     //verzögerung von 5ms
  digitalWrite(trigger, HIGH);  //trigger anschalten
  delay(5);                    //verzögerung von 10ms wo Impulse geschickt werden
  digitalWrite(trigger, LOW);   //trigger ausschalten
  dauer = pulseIn(echo, HIGH);  //PulseIn beinhaltet die zeit vom verlassen des Pulses und wieder eintreffen des pulses

  entfernung = (dauer/2)*0.03432 ;  //Berechnung der entfernung von einer strecke

  Serial.print(entfernung);   //im Serial Window ausgeben
  Serial.println(" cm");

  return entfernung;
}




void loop() {

Messung();

if( entfernung >= 40)        
{ 
    for (pos = 0; pos <= 180; pos += 2)   // from 0 degree to 180 degree // in steps of 2 degree
    {
      pos2 =pos;
      myservo.write(pos);                 // tell servo to go to position in variable 'pos'
      delay(10);                          // waits 10ms for the servo to reach the position

      Messung();

      if(entfernung < 40)
      {
        pos = 90;
        myservo.write(pos);
      }
     }

   myservo.write(pos);
    
    for (pos = 180; pos >= 0; pos -= 2)   // from o degree to 180 degree // in steps of 2 degree
    { 
      pos2 = pos;                                  
      myservo.write(pos);                 // tell servo to go to position in variable 'pos'
      delay(10);                          // waits 10ms for the servo to reach the position

      Messung();

      if(entfernung < 40)
      {
        pos = 90;
        myservo.write(pos);
      }
     }
     
}

Vielen Dank im Voraus.

Philip

for (pos = 180; pos >= 0; pos -= 2)   // from o degree to 180 degree // in steps of 2 degree
    {
      pos2 = pos;                                 
      myservo.write(pos);                 // tell servo to go to position in variable 'pos'
      delay(10);                          // waits 10ms for the servo to reach the position
      Messung();
      if(entfernung < 40)
      {
        pos = 90;
        myservo.write(pos);
      }
     }

ja. Der Servo wackelt hin und her wenn die Messung unter 40cm ist.
Der Servo posizioniert sich auf pos und dann wenn die Distanz kleiner als 40 ist auf 90. Du unterbrichst die FOR Schleife nicht nach dem Messen unter der Minimumdistanz.

Grüße Uwe

uwefed:
ja. Der Servo wackelt hin und her wenn die Messung unter 40cm ist.
Der Servo posizioniert sich auf pos und dann wenn die Distanz kleiner als 40 ist auf 90. Du unterbrichst die FOR Schleife nicht nach dem Messen unter der Minimumdistanz.

Grüße Uwe

Danke Uwe,

ich hatte versucht die for-Schleife durch einen break; Befehl zu unterbrechen, dann habe ich aber das Problem dass ich nicht wieder in die for-Schleife komme.

Mein Ziel ist es, dass sobald die 40cm delektiert werden, der Servo an der aktuellen Position stehen bleibt und sobald die Entfernung wieder größer wird an der gleichen Stelle weitergeht.

Vielleicht hast du dazu noch einen Tipp, wie man das ohne for-Schleife lösen könnte?

Danke!

Philip

Du kannst statt for eine Variable und if ob der Endwert erreicht ist verwenden.
Grüße UWe

uwefed:
Du kannst statt for eine Variable und if ob der Endwert erreicht ist verwenden.
Grüße UWe

Super Danke, hat funktioniert. Läuft jetzt wie gewünscht.

Philip