- SF800 Solar Speicher Tutorial         
Seite 3 von 6 ErsteErste 12345 ... LetzteLetzte
Ergebnis 21 bis 30 von 52

Thema: "Hindernisfahrt"

  1. #21
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Anzeige

    Powerstation Test
    Der Ruckelt auch nur so rum, wenn gar kein Hindernis in Sicht ist.

    _______

    Meinst du es etwa so?(nur der if(Hindernis==false)-Pfad)

    Code:
    if (Hindernis == false)
    {
    Drehrichtung = geradeaus;
    }
    else
    {
    if (abstand < 85)
    {
    Hindernis = true;
    Drehrichtung = links;
    robot.motors (200, -200);
    Drehrichtung = rechts;
    }
    else
    {
    robot.motors (-200, 200);
    Drehrichtung = links;
    }
    Dann dreht der Robo sich nur nach links, auch wenn kein Hindernis in Sicht ist.

    Zu den Hindernissen: Ich benutzte 2 glatte Schachteln, etwa 15 cm hoch und 30 cm lang, bei beiden die selbe Reaktion, jeweils erst kurz vorher wird das Hindernis erkannt. Bei meiner Hand ist das komplett anders, da dreht er sich früh genug

    Wie meinst du das mit einem kompletten Ausweichmanöver? Kann mir gar nicht vorstellen, wie ich das schreiben sollte...(weiß z.B. gar nicht wie man die Messung ausschaltet, vllt. kannst mir ja kurz nen kleines Bsp. geben)

  2. #22
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.089
    Das Programm sieht nicht annähernd so aus wie das was ich gescchrieben habe. Bei dir steht im "if (Hindernis == false)" Zweig "Drehrichtung = geradeaus;" bei mir steht "robot.motors (-250, -250);". "Drehrichtung = geradeaus;" habe ich gar nicht.

    Du hast das "if (abstand < 85)" in den else Zweig gegeben. Ich habe geschrieben das das in den "if (Hindernis == false)" Zweig soll.

    Poste einmal das Programm als *.c Datei (Datei hochladen).

    Einen Sensor ausschalten kannst du nicht, das war schlecht ausgedrückt. Du überprüfst den Sensor einfach nicht (du lässt das "abstand = robot.analog(1);" einfach weg.

    Das Ausweichmanöver kannst du später hinzufügen. Hast du schon die Entfernung getestet so wie ich es im Post 18 geschrieben habe?

    MfG Hannes

  3. #23
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Ach du meine Güte, sorry. Hab das komplett falsch verstanden und geändert. Aber auch nachdem ich es geändert habe, dreht sich der Robo einfach nur linksherum.
    Tut mir leid, aber meine Datei ist ne cc und die kann man hier scheinbar nicht hochladen...

    Ich habe leider kein LED, dementsprechend kann ich auch keine Werte messen, das hatten wir schon in der Schule gemacht.

    ____
    Achso, jetzt versteh ich, soweit bin ich aber glaub noch nicht, dass ich das könnte. Wie man denke ich merkt, bin ich blutiger Anfänger.

    Da ich es nicht hochladen kann, hier mal der Code so:

    Code:
    #include "qfixMiniBoard.h"
    #include "qfixLCD.h"
    
    
    const    int SENSOR3 = 3;
            int SENSOR1 = 1;
            int SENSOR2 = 2;
            int SENSOR = 0;
    
    MiniBoard robot;
    LCD lcd;
    
    #define geradeaus        0
    #define links		    1
    #define rechts          2
    
    #define hindernis        85
    #define freieSicht       150 // Wenn der Robo etwas nach links fährt, aber dann gegen das Hindernis, ist dieser Wert zu klein
    
    #define True            1
    #define False            0
    
    int main() 
    {
       
    	unsigned char Drehrichtung =  geradeaus; // unsigned char = 8bit integer von 0 bis 255, braucht weniger Platz im RAM
    	int abstand = robot.analog(1);
    	int infrarot = robot.analog(3);
      
        while(1)
    {
    unsigned char Hindernis = false ;
    
    if (Hindernis == false)
    {
    abstand = robot.analog (1);
    robot.motors(250,250);
    if(abstand < 85)
    {
    Hindernis = true;
    }
    }
    else
    {
    if(Drehrichtung == links)
    {
    
    robot.motors (200, -200);
    Drehrichtung = rechts;
    }
    else
    {
    robot.motors (-200, 200);
    Drehrichtung = links;
    }
    
    infrarot = robot.analog (3);
    
    if ( infrarot < 85)
    {
    Hindernis = false;
    }
    }
    msleep(500);
    }
    }

  4. #24
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.089
    Was mir schon einmal auffällt ist das du in der while Schleife ("while(1)") "unsigned char Hindernis = false;" steht. Gehe einmal durch was das Programm macht. Normalerweise müsste sich der Roboter immer nach vorne bewegen. Du sagst vor der if Schleife immer das Hindernis falsch ist und somit wird nur der if... Zweig und nie der else Zweig ausgeführt.

    Gleichzeitig gibts du das "#define geradeaus 0" weg. Stattdessen weißt du links 0 zu und rechts 1.

    Wenn du vor dem links bzw rechtsdrehen noch zurückfahren willst kannst du so schreiben:
    Code:
    if (drehrichtung == links)
    {
    robot.motors (-100, -100); msleep(100); robot.motors (-200, 200); drehrichtung = rechts;
    }
    MfG Hannes

  5. #25
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Leider löst das mein Hauptproblem nicht. Der Robo dreht sich immer noch nur im Kreis...

  6. #26
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.089
    Kannst du mit deiner IDE simulieren? Da könntest du genau sehen wie das Programm funktioniert. Wenn du nicht simulieren kannst könntest du den Else Zweig auskommentieren und sehen was passiert.

    Das Programm sollte eigentlich passen (wenn die Limits passen).

    MfG Hannes

  7. #27
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Komischerweise macht der Robo GAR nichts, wenn man den Else-Zweig auskommentiert. Das könnte das Problem sein, warum dem so ist, blick ich leider immer noch nicht. Weißt du vllt. woran es noch liegen könnte?

  8. #28
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.089
    Das ist ganz einfach. Wenn der else Zweig nicht auskommentiert ist und der Robo dreht sich und wenn der else Zweig auskommentiert ist dreht er sich nicht. Was bedeutet das? Der Else Zweig wird ausgeführt.

    Ich weiß jedoch nicht warum. Das einzige was ich mir vorstellen kann ist das das Programm nicht dem entspricht das du gepostet hast.

    Kannst du das Programm simulieren?

    MfG Hannes

  9. #29
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Aber eigentlich sollte der Robo doch geradeaus fahren, denn kein Hindernis ist in Sicht. Zudem ist das komische ja, dass er sich nun wieder nur vor und rückwärts bewegt(vorher war das noch anders). Warum er das tut, versteh ich immer noch nicht. Er dreht sich ja nicht mal, nein, er bewegt sich kosequent vor und zurück. Alles bisschen seltsam.

    Nein kann ich leider nicht...

    EDIT: Wenn ich das Infrarot rausnehme, dann dreht er sich wieder.

    Dieses Programm hab ich derzeit auf dem Robo:

    Code:
    #include "qfixMiniBoard.h"
    #include "qfixLCD.h"
    
    
    const    int SENSOR3 = 3;
            int SENSOR1 = 1;
            int SENSOR2 = 2;
            int SENSOR = 0;
    
    MiniBoard robot;
    LCD lcd;
    #define links		    0
    #define rechts          1
    
    #define hindernis        85
    #define freieSicht       150 // Wenn der Robo etwas nach links fährt, aber dann gegen das Hindernis, ist dieser Wert zu klein
    
    #define True            1
    #define False            0
    
    int main() 
    {
       
    	unsigned char Drehrichtung = links;
    	int abstand = robot.analog(1);
    	int infrarot = robot.analog(3);
      
        while(1)
    {
    unsigned char Hindernis = true; // unsigned char = 8bit integer von 0 bis 255, braucht weniger Platz im RAM
    
    if (Hindernis == false)
    {
    abstand = robot.analog (1);
    robot.motors(250,250);
    if(abstand < 85)
    {
    Hindernis = true;
    }
    }
    else
    {
    if(Drehrichtung == links)
    {
    
    robot.motors (200, -200);
    Drehrichtung = rechts;
    }
    else
    {
    robot.motors(-100,-100);
    msleep(100);
    robot.motors (-200, 200);
    Drehrichtung = links;
    }
    
    infrarot = robot.analog (3);
    
    if ( infrarot < 85)
    {
    Hindernis = false;
    }
    }
    msleep(500);
    }
    }

  10. #30
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.089
    Liest du auch meine Posts genau durch? Ich habe im Post 6, 18, 24 geschrieben wo du die Variablen initialisieren musst.

    Beim Programmieren geht es um das verstehen. Du verstehst es aber nicht, du schreibst einfach das hin was ich schreibe und das noch nichteinmal richtig (z.B. den Codeausschnitt in Post 24).

    Das mit den Einrückungen ist auch extrem unübersichtlich. Schumi hat das schon geschrieben. Dann hat es funktioniert und seit Post 21 funktioniert es wieder nicht.

    Versuche die Posts genau durchzulesen und umzusetzen. Wenn es dann nicht funktioniert poste nocheinmal das Programm.

    MfG Hannes

Seite 3 von 6 ErsteErste 12345 ... LetzteLetzte

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 01.11.2017, 12:53
  2. Antworten: 2
    Letzter Beitrag: 15.06.2011, 21:18
  3. LPC1114 (Cortex M0): "sei()" und "cli()"
    Von Jaecko im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 1
    Letzter Beitrag: 02.07.2010, 12:25
  4. "Soft-Reset?" und "Finger-Interrupt?"
    Von trapperjohn im Forum Asuro
    Antworten: 8
    Letzter Beitrag: 10.06.2008, 23:02
  5. ASM: was machen "swap" und "cbr" genau?
    Von RHS im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 18.08.2004, 17:16

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress