Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Variablen Werte zur weiterverabeitung verändern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.06.2017, 11:03 Uhr
Josef



Hallo zusammen,

Bin mir nicht sicher ob ich hier richtig bin doch falls nicht bitte in das "richtige" Forum verschieben.
Es geht um Folgendes:

Es wird ein Sensor abgefragt. Dieser misst die Entfernung zum Objekten ( es sind alles ca. Werte )


C++:
  unsigned int uS1 = sonar1.ping(); //Sensor rechts
  Serial.print("Ping: ");
  Serial.print(uS1 / US_ROUNDTRIP_CM);
  Serial.println("cm");
  uS1=uS1 / US_ROUNDTRIP_CM;
  if (uS1 ==0 ){
uS1=50;
}



Es soll ein Hindernis erkannt werden und in diesem Speziellen Fall ein Mover dreht nach Links , fährt Rückwärts oder ähnliches.


C++:
if ((uS1 <= 16 )) {//abstand kleiner als 16cm
      
        //Motor A forward @ full speed
     digitalWrite(12, LOW); //drehen Links
     digitalWrite(9, LOW);
     analogWrite(3, 255);
  
     //Motor B forward @ full speed
     digitalWrite(13, HIGH);
     digitalWrite(8, LOW);
     analogWrite(11, 255);
        
        }
}
else {
       //Motor A forward @ full speed
     digitalWrite(12, HIGH);
     digitalWrite(9, LOW);
     analogWrite(3, 255);
  
     //Motor B forward @ full speed
     digitalWrite(13, HIGH);
     digitalWrite(8, LOW);
     analogWrite(11, 255);
}



dies funktionier so weit sehr gut.
Nun zu der eigentlichen Aufgabe:

wie bewerkstelige ich das das ich so lange den Mover rückwärts bzw. nach Links / rechts fahren lasse bis der Sensor (der ja dauernd die Entfernung misst) z.B. 30 cm erreicht hat?

Dh. der Mover dreht sich so lange vom Hindernis bis 30 cm erreicht sind und geht in die else Anweisung über ( hier gerade aus fahren ).?

Habe es mit :


C++:
if ((uS1 <= 16 )) {//abstand kleiner als 16cm
        for (xS1==uS1; xS1 >= 30 ; xS1++)
        {
        //Motor A forward @ full speed
     digitalWrite(12, LOW);
     digitalWrite(9, LOW);
     analogWrite(3, 255);
  
     //Motor B forward @ full speed
     digitalWrite(13, HIGH);
     digitalWrite(8, LOW);
     analogWrite(11, 255);
        
        }
}
else {.....usw



probiert .... mit keinen Erfolg.
Es geht also "nur" um die Schleife wie kann ich der Sagen :
pass auf , dreh den mover so lange bis der uS1 30 cm vom Gegenstand entfernt ist brich die schleife bei 30 ab und da die Anweisung if false ist führe else aus ( also fahre gerade aus) ?

Ist das überhaupt mir einer schleife zu lösen.

Hier würde ich gerne darauf hinweisen das alle anderen Lösungen ( zb. mit 2 Sensor usw. ) nicht in Frage kommen. Mir geht es hier wirklich nur um reine Programmierlösung.

Da ich mich leider mit C++ sehr wenig auskenne bin ich für jede Hilfestellung dankbar.

Schöne Grüße

Chr.

Dieser Post wurde am 15.06.2017 um 21:05 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.06.2017, 10:24 Uhr
ao

(Operator)


Wenn ich es richtig verstehe, musst du zwei Zustände unterscheiden:
1. Normal (kein Hindernis in Sicht)
2. Es wurde ein Hindernis (in 16 cm Abstand) erkannt UND der Abstand wurde danach noch nicht auf 30 cm vergrößert.

Der Zustand 2 tritt ein, wenn der Näherungssensor in 16 cm Abstand (oder weniger) ein Hindernis erkennt. Er wird wieder verlassen, wenn der Abstand zum Hindernis auf mindestens 30 cm angewachsen ist.

In Zustand 1 fährst du geradeaus. In Zustand 2 weichst du aus (rückwärts fahren, drehen, ...).

Um dir den Zustand zu merken und um ihn zu verarbeiten, brauchst du zum Beispiel eine Variable und eine If-Entscheidung innerhalb der Schleife.

Du kannst es auch mit mehreren Schleifen erledigen:

C++:
while (true)
{
    while (Abstand () > 16)
    {
        // fahren
    }
    while (Abstand () < 30)
    {
        // ausweichen
    }
}



Auch wenn man in diesem Fall dem Ansatz mit mehreren Schleifen eine gewisse Eleganz zusprechen könnte, empfehle ich den Ansatz mit der einfachen Schleife und der Zustandsvariablen, weil der flexibler ist, wenn sich die Bewegungsregeln und -abläufe mal ändern.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: