-         
Ergebnis 1 bis 9 von 9

Thema: While Schleife verlassen?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.02.2012
    Ort
    50KM über Hamburg
    Beiträge
    108

    While Schleife verlassen?

    Anzeige

    Hallo,
    aus einer while Schleife komme ich zwar herraus, aber bei einem Neustart ist immer noch die letzte Position drin.
    Ein Servo wird über einen Rauftaster von 0-100° und von einem Runtertaster von 100-0° mit beliebigem Stop und Wechsel gesteuert. Das geht. Wenn ich einen 3. Taster drücke(Bremstaster) dann wird alles abgebrochen und das Servo fährt schnell auf Null. Wenn ich jetzt aber wieder die Rauftaste drücke, fängt das Servo nicht bei 0° an, sondern an der Position an der ich unterbrach. Mit "break" ist der Effekt der gleiche.
    Code:
    #include<Servo.h>
    int pos = 0;
    const int Bremstaster = 8;
    Servo servo;
    void setup() {
     
      pinMode(6, INPUT);//Rauftaster
      pinMode(7, INPUT);//Runtertaster
      pinMode(Bremstaster, INPUT);//Bremstaster
      servo.attach(9);
    }
    void loop() {
      int val = digitalRead( Bremstaster);
    
      if (val == HIGH)
    
      {
        servo.write(0);//Null Position
        delay(200);
    
      }
      else
      {
    
        while (digitalRead(6) == HIGH && pos < 100)
        {
          pos++;
          servo.write(pos);//Bei Tasterdruck Schritt um Schritt hoch
          delay(150);
        }
        while (digitalRead(7) == HIGH && pos > 0)
        {
          pos--;
          servo.write(pos);//Bei Tasterdruck Schritt um Schritt runter
          delay(150);
    
        }
      }
    }
    Wie lösche ich die letzte Position?
    Oder habe ich die völlig falsche Richtung gewählt?

    Dankeschön
    Achim

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.537
    Blog-Einträge
    127
    Hallo,
    die variable pos speichert die Position und müßte auf 0 gesetzt werden.
    Code:
      if (val == HIGH)
    
      {
    
    (hier die variable pos noch auf Null setzen)
    servo.write(0);//Null Position
        delay(200);
    
      }
    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.02.2012
    Ort
    50KM über Hamburg
    Beiträge
    108
    Hallo Searcher,
    herzlichen Dank!!!
    Nun ist alles Ok.
    Ich hatte mich da total in der falschen Richtung bewegt.
    Super!
    Schönen Abend noch
    Achim

    - - - Aktualisiert - - -

    Nun habe ich mich aber getäuscht?
    Wenn ich das 1. Mal starte, fährt das Servo schnell auf 100°. Wenn ich dann den Runtertaster drücke passiert nichts.
    Wenn ich den Rauftaster drücke, fährt er schnell runter auf 0° und geht dann längsam hoch. Dann läuft es erst richtig?
    Woher kommt diese Funktion.
    ?
    Achim

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.537
    Blog-Einträge
    127
    Zitat Zitat von achso Beitrag anzeigen
    Woher kommt diese Funktion.
    ?
    Hallo Achim,
    ist es ein Arduino? Welcher?

    Ich kenne mich mit damit nicht so gut aus, aber sind die Eingänge für die Taster gegen Prellen geschützt? Ich sehe auch keine aktvierten Pullup- bzw. Pulldown-Widerstände für die Taster. Da Du nach HIGH abfragst, müßtest Du externe Pulldown Widerstände haben. Eventuell haben die Eingänge bei nicht gedrückten Tastern deshalb keinen definierten Pegel.

    Was bedeutet
    Wenn ich das 1. Mal starte,...
    Nach Stromeinschalten oder erst nach erstmaligem Betätigen welcher Taste?

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.691
    Wenn ich das Arduino-Konzept richtig verstanden habe (ich benutze keinen Arduino), ist das anders gedachr. Die Funktion loop() sollte alles tun, was zu einem Zeitpunkt zu tun ist, und sich dann beenden. Dann kann das Framework seine Arbeit erledigen und ruft danach loop() wieder auf. Blockierende Schleifen sollte man in der loop-Funktion also unterlassen. Ich skitziere hier mal einen möglichen Ablauf in Pseudocode

    Code:
    loop(){
        if Taste-hoch {
            pos++
        } else if Taste-runter {
           pos--
        } else if Taste-stop {
           pos = 0
        }
    
        if pos > MAX {
           pos = MAX
        else if pos < MIN {
           pos = MIN
        }
        SetServo(pos)
        delay(xx)
    }
    Das xx beim delay bestimmt, wie schnell das System reagiert. Da ein Servo so rund alle 20ms einen neuen Sollwert entgegen nehmen kann, kann man nicht schneller als diese 20ms werden. Ich kenne die Funktion servo.write(0) nicht. Wenn sie für die 20ms eines Servosignal blockiert, braucht man möglicherweise das delay() garnicht. Blockiert sie nicht sondern erzeugt das Servosignal im Hintergrund, darf man sie nicht zu schnell hintereinder aufrufen, da sonst das neue Signal das alte störtt. Wie es wirklich ist, verrät sicher die Doku.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.02.2012
    Ort
    50KM über Hamburg
    Beiträge
    108
    Entschuldigung Searcher,
    einmal für die ungenügende Fragestellung und besonders für meine Dösigkeit!
    Ich habe einen Uno auf einer Platte. Ein Display ist immer angeschlossen.Zudem 2 Steckbretter. Die Spannungsversorgung nur über USB. Das kleine Testservo natürlich am Steckbrett, wie auch die Taster mit Pulldown 4K7. Wenn ich nun den USB angeschlossen habe, bricht natürlich erstmal die Spannung ein. Das fiel mir dummerweise erst heute Nacht ein. Wenn ich das Servo extern versorge ist alles OK.
    Sorry,
    Wofür das Ganze:
    Ich habe ein Tuc tuc mit Drehgriffgas. Mir schlafen beim Gasgeben immer die Finger ein. Jetzt will ich mit den Rauf/runtertastern ein Servo ansteuern, welches direkt vor der Einspritzeinstellung, also da wo der Gaszug dransitzt, platziert wird. Das Gefährt hat eine Fußbremse mit Bremslichtschalter. Auch die Kupplung hat einen Schalter, damit man nur bei getrennter Kupplung starten kann. Die nehme ich als pos 0 Funktion. Dann fährt das Servo schnell zurück. Die normale Gasfunktion bleibt also erhalten, da das Servo parallel arbeitet. Sicherheitsmäßig habe ich keine Bedenken. Das 3-Rad hat zwar noch Garantie, aber es weiß ohnehin kein Schwein wie da was funktioniert. Beziehungsweise was da verbaut ist. Zumal in Indien wohl unendlich viele Varianten gebaut werden. Die Italiener holen die Teile aus dem Container, kleben ihr Emblem drauf, beschaffen sich eine COC Betriebserlaubnis und verticken die Dinger dann selbstverständlich nur zum Selbstkostenpreis.
    Danke, du hast mir sehr geholfen. Im ganzen Haus sind zwar schon für viele Funktionen Attinys verbaut, aber Ahnung habe ich nicht wirklich.
    Ich wünsche Dir einen schönen Sommer
    Achim

    - - - Aktualisiert - - -

    Danke Klebwax,
    Gibt es zwischen setup und Loop noch etwas?
    Im Setup gebe ich an was + wer wozu da ist.
    Im Loop sind die Funktionen die sich wiederholen.
    Wenn ich jetzt nach dem Setup eine Funktion nur einmal haben will, die nichts mit dem Loop zu tun hat und nur am Anfang einmal kommen soll, gibt es da was?
    Achim

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    4.511
    hallo,
    klar, in bzw. auch am Ende von setup() kannst du beliebige andere Funktionen aufrufen:
    Code:
    void tuirgendwas() {
       Serial.println("Serial + Wire started");
    }
    
    
    void tunochirgendwas() {
       Serial.println("bin jetzt  fertig mit setup, jetzt kommt die loop!");
    }
    
    
    void setup(){
       Serial.begin(115200);
       Wire.begin();
       
       tuirgendwas();
    
       tunochirgendwas();
    }
    
    void loop(){
    
        // hier wird jetzt alles in einer Endlosschleife wiederholt
    
    }


    Es ist übrigens kein mystisches "Framework" was irgendwas abarbeitet,
    setup und loop sind etwa so definiert:

    Code:
    void setup();
    
    void loop();
    
    int main() {
    
       setup();
    
       while(true) { loop(); }
    
      // exit main()
    }
    dabei ist main() als weak definiert, man kann also sogar auch eine eigene main() schreiben, das würde ich allerdings keinem Arduino- und C-Anfänger empfehlen.
    Geändert von HaWe (22.06.2019 um 12:19 Uhr) Grund: typo
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.691
    Zitat Zitat von achso Beitrag anzeigen
    Gibt es zwischen setup und Loop noch etwas?
    Im Setup gebe ich an was + wer wozu da ist.
    Im Loop sind die Funktionen die sich wiederholen.
    Wenn ich jetzt nach dem Setup eine Funktion nur einmal haben will, die nichts mit dem Loop zu tun hat und nur am Anfang einmal kommen soll, gibt es da was?
    Achim
    Ich bin nun nicht so der große Arduino-Erklärer, ich benutze es nicht. Im Prinzip sind meine Programme aber ähnlich aufgebaut. Im Setup() wird alles das gemacht, was nur einmal am Anfang eines Programms gemacht werden muß. Dazu gehört auch die Pins einzurichten. Wenn ich in Loop() mit einer Variable und einem bestimmten Wert starten will, muß ich sie ebenfalls in Setup() setzen. Sollen meine LEDs am Anfang ausgeschaltet sein, schalte ich sie in Setup() aus. Wenn ich in verschiedenen Durchläufen der Loop einen Pin mal als Eingang und mal als Ausgang brauche, dann setze ich den Pin in Loop(). Also alles, was nur am Anfang gemacht werden soll in Setup(), alles regelmäßige in Loop().

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.02.2012
    Ort
    50KM über Hamburg
    Beiträge
    108
    Danke für die netten Erklärungen!
    Das hilft mir bei zukünftigen Projekten weiter. Irgendwas plant man ja immer!

    Erstmal mache ich jetzt einen Stromlaufplan/Verdrahtungsplan und den technischen Einbau in mein Tuc Tuc.

    Geniessen wir den Sommer!
    Achim

Ähnliche Themen

  1. Willow Garage: Mitarbeiter verlassen Roboterhersteller
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 22.08.2013, 10:20
  2. Stack beim verlassen einer Schleife...
    Von Klingon77 im Forum Software, Algorithmen und KI
    Antworten: 10
    Letzter Beitrag: 26.04.2009, 10:17
  3. if then else Schleife möglich mit goto zu verlassen?
    Von mat-sche im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 27
    Letzter Beitrag: 14.04.2009, 09:17
  4. Select case , if then,for next schleifen verlassen ????
    Von molleonair im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 06.04.2007, 10:57
  5. Zustand der Ports nach verlassen von Schleife festlegen
    Von popi im Forum C - Programmierung (GCC u.a.)
    Antworten: 11
    Letzter Beitrag: 21.06.2006, 22:17

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •