-         

Ergebnis 1 bis 5 von 5

Thema: Vergleich zweier werte für aktion

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    15.06.2013
    Beiträge
    8

    Unglücklich Vergleich zweier werte für aktion

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo zusammen,

    vorweg möchte ich erwähnen, dass ich ein neuling in sachen programmieren bin...

    Verwendete hardware :
    - Arduino Uno
    - Adafruit Motorshield
    - Handelsüblicher Servo
    - hc-sr04

    gewollter ablauf:
    - wenn der abstand den wert X unterschreitet, sollen die beiden DC-motoren stoppen. Im anschluss dreht der servo mit dem darauf montierten Sensor jeweils nach rechts und links und vergleicht die werte mit anschließender reaktion (links- o. rechtsdrehung)

    Ich sitze bereits seit etwa 2 monaten an dem programm welches den kleinen steuern soll und bin nun gänzlich am verzweifeln. Bei meinen recherchen nach einem ähnlichen code, kam leider nichts brauchbares zu tage und ich bitte um nachsicht, sollte ich etwas übersehen haben.
    Immerhin habe ich es geschafft ein compilierbares programm zu schreiben, welches in etwa das tut was ich mir vorstelle.

    Leider hapert es an dem punkt wo der servo den sensor in die jeweiligen richtungen dreht und die abstände vergleichen soll. Er macht es nämlich nicht, sondern beginnt die schleife von vorn.

    Ich habe zur festlegung der einzelnen werte "int" verwendet. Könnte das mein problem sein ?
    Müsste ich die werte im eeprom speichern ? - Wenn ja, wäre es möglich mir eine bessere beschreibung zu zeigen als jene die im arduinoforum zu finden ist ?


    vielen dank für konstruktive hilfe im vorhinein

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557
    Zitat Zitat von Capper Beitrag anzeigen
    ... gewollter ablauf ... seit etwa 2 monaten an dem programm ...
    Dann zeig doch mal das Programm
    Ciao sagt der JoeamBerg

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    15.06.2013
    Beiträge
    8
    Code:
    #define servoPin 10
    #define trigPin A1
    #define echoPin A2
    
    #include <Servo.h>
    int b;
    int c;
    int pos;
    
    Servo scanservo;
    
    void setup()
    {
    scanservo.attach(servoPin);
    Serial.begin(9600);
    Serial.println("bereit");
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
    scanservo.attach(servoPin);
    
    
    }
    
    int range()
    {
    int duration;
    digitalWrite(trigPin, HIGH);
    delay(100);
    digitalWrite (trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    delay (50);
    //duration => cm
    return  duration/58.2;
    }
    /////////////////////////////////////////////////////////////////
    void loop()
    {
    Serial.println(range());
    int a = range();
    if (a <=5)
      {
        Serial.println("Stop"); 
        for(pos=90;pos>=10;pos-=1)
      {
        scanservo.write(pos);
      }
        delay(1500);
        int b= range();
        delay(600);
        
    //Links//
    
    for(pos=10;pos<169; pos+=1)
      {
        scanservo.write(pos);
      }
      delay(1500);
      int c= range();
      delay(600);
    
    //rechts//
    
    for (pos=170;pos>=90; pos-=1)
      {
        scanservo.write(pos);
        
      }
      delay(1000);
      scanservo.write(90);
      delay(20);  
    
      if (b<c)
      {
      //motoren links
      Serial.println("links");
      delay(200);
    
      }
      else if (c<b)
      {
      //motor rechts
      Serial.println("rechts");
      delay(200);
      }
      else if (c=b)
      {
      //rückwärts
      Serial.println("rückwärts");
      delay(200);
    
    }
    else
    {
    //go
    Serial.println("go");
    }
    
    } 
    
    }
    nun... wie gesagt, bis zur Bewegung des Servo ist alles scheints zu klappen. Ich bekomme nur keine Ausgabe ob Rechts oder Links.
    Geändert von Capper (04.11.2013 um 21:02 Uhr)

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    32
    Beiträge
    563
    Zuerst der Hinweis und die Bitte, Code bitte in dem dafür vorgesehenen Blöcken zu posten. Dann werden auch die Tabulatoren zum Einrücken berücksichtig und der Code ist deutlich lesbarer. Dazu einfach den kleinen Button mit dem # klicken oder den Code zwischen [*CODE][*/CODE] (ohne die *) schreiben.

    Ich habe den Code nur kurz überflogen. Ein Problem ist, dass du den Sensor schwenken lässt, aber die Werte außerhalb der Schleife ausliest
    Code:
    //Links//
    
    for(pos=10;pos<169; pos+=1)
    {
        scanservo.write(pos);
    }
    delay(1500);
    int c= range();
    delay(600);
    Dazu kommt, dass du den Sensor erst von 10 - 170 drehen lässt und im Anschluss von 170 zurück auf 90. Jeweils am Ende führst du, wie oben erwähnt eine Messung durch. Also effektiv nur bei 170 und bei 90.

    Ich gehe mal davon aus, dass mit diesen Werten die Stellung des Servos in Grad gemeint ist wobei 90 eine Ausichtung nach vorne entspricht.

    Um jetzt einen Vergleich zwischen Links und Rechts vorzunehmen wäre folgendes Beispiel ein einfacher Ansatz.

    Du lässt den Servo von 10°-90° drehen um den Bereich links zu scannen. Nach jedem Schritt, den sich der Sensor dreht liest du den Wert aus und überprüfst ob er größer als der bisherige Maximalwert ist. (sollte der Sensor mit abnehmendem Abstand auch abnehmende Werte erzeugen ist der Code entsprechend anzupassen.

    Code:
    for(i=10; i<90; i++)
    {
        scanservo.wirte(i);
        links_aktuell = range();
        if(links_aktuell > links_max)
        {
            links_max = links_aktuell;
        }
    }
    (Code erhebt keinen Anspruch auf Funktionalität sondern soll das Prinzip erklären)

    Damit erhälst du, nachdem der Sensor von 10°-90° geschwenkt wurde einen Maximalen für den Bereich links des Roboters.Die gleiche Prozedur lässt du für den rechten Bereich laufen. Dann solltest du zwei Werte (links_max und rechts_max) haben die du vergleichen kannst.

    Den Servo in 1°-Schritten drehen zu lassen ist wahrscheinlich etwas übertrieben. ich denke 5° oder gar 10°-Schritte sollten ausreichen. Das kommt aber auf die Hindernisse, Empfindlichkeit des Sensors, "Blickwinkel" des Sensors und einigen anderen Parametern an.

    Bei weiteren Fragen weißt du ja, wo du uns findest.
    Alles ist möglich. Unmögliches dauert nur etwas länger!

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    15.06.2013
    Beiträge
    8
    soo, hab das mal eben geändert


    also so wie du es beschreibst hatte ich es eig auch gedacht. die int b und c sind jeweils rechts / links ( hatte keinen tieferen sinn diese belegung).

    meine frage ,die sich mir stellt um den fehler zu verstehen, worin liegt der unterschied die sensorerfassung nicht nach beenden der servobewegung laufen zu lassen sondern bis zum max punkt?
    oder habe ich das falsch interpretiert/gelesen ?


    edit:

    hat auf jedenfall hingehauen, danke nochmals
    Geändert von Capper (10.11.2013 um 14:49 Uhr)

Ähnliche Themen

  1. Vergleich zweier Werte stimmt nicht.
    Von Daniel2412 im Forum Software, Algorithmen und KI
    Antworten: 3
    Letzter Beitrag: 23.09.2011, 22:11
  2. Aktion: Flowcode 4 für PIC (Pro-Version) jetzt inklusive GRATIS-Entwicklungsboard
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 06.04.2011, 12:20
  3. Bollywood -> Roboter in Aktion !
    Von Andree-HB im Forum Offtopic und Community Tratsch
    Antworten: 0
    Letzter Beitrag: 01.02.2011, 07:29
  4. Vergleich zweier Werte führt zu merkwürdigem Verhalten
    Von chris@franke im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 27.01.2010, 16:50
  5. Aktion für best. Zeit
    Von *C-3PO* im Forum Asuro
    Antworten: 8
    Letzter Beitrag: 12.12.2008, 17:45

Berechtigungen

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