- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 52

Thema: "Hindernisfahrt"

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Danke dir.

    Das Problem ist nun aber genau dasselbe, wie wenn ich mit x = x*(-1) rechne. Der Roboter bewegt sich immer nur vor und zurück.
    Was ist das Problem?

    Code:
    #include "qfixMiniBoard.h"
    #include "qfixLCD.h"
    
    
    const int SENSOR3 = 3;
    	   int SENSOR1 = 1;
    	   int SENSOR2 = 2;
    	   int SENSOR = 0;
    
    MiniBoard robot;
    LCD lcd;
    
    
    int main(){
    {
    int i=0;
    int mitt = 0;
    int drehrichtung = 0;
      
    	while(1){
       int i = robot.analog(1) ;
       int mitt= robot.analog(3);
       
      
       if (i > 75){
       robot.motors(250,250); //geradeaus
       }
       else
    {if (drehrichtung == 0)
    {
    robot.motors(-200, 200);
    drehrichtung = 1;}
    else
    {
    robot.motors(200, -200);
    drehrichtung = 0;}
    msleep(300);
    }
       
       
      
       }
       }
       
       
       }

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.091
    Welcher Bereich wird bei der Drehzahl genutzt? Hast du Tasten oder Potis auf dem Roboter die du verwenden kannst?

    Du könntest éinmal versuchen statt -200 z.B. 100 eintragen. Ich vermute (ich kenne dein System nicht) das der Wertebereich von -127 bis +128 oder 0 bis 255 geht (das wäre genau ein Byte).

    MfG Hannes

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Ich habe Tasten zum Starten des Roboters und der Drehzahlbereich geht von -255 bis 255.

    Wenn ich das mit 100 versuche löst es das Problem leider nicht, der Roboter bewegt sich einfach nur langsamer hin und her...

    Edit: Ich glaube, das Problem liegt einfach in der Regelung mit "rechts" und "links" (das was ich mit x= x*(-1) lösen wollte.
    Geändert von timmy19 (29.12.2013 um 14:14 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.091
    Gib einmal die ganzen "int ..." aus der main Funktion hinaus (vor "main {"). Dann könntest du einmal versuchen ohne Analogauswertung die Motoren drehen lassen.

    z.B.
    Code:
    main
     {
    while(1)
    {
    robot.motors (200,200); msleep(1000); robot.motors (-200,200); msleep(1000); robot.motors(200,-200); msleep(1000);
    }
    }
    Wenn das funktioniert hast du ein Problem mit der Analogauswertung. Eventuell passt der Messwert nicht. Ich habe etwas von "LCD" gelesen, hast du eines? Eventuell kannst du dir den Messwert ausgeben lassen.

    MfG Hannes

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Das klappt. Kann mir aber nicht vorstellen, dass das ein falscher Messwert ist, vorallem da der ja in dem Falle ja gar nicht relevant ist, denn er gehört ja zum Ultraschall. Was könnte es denn noch sein? Bin ganz verzweifelt, denn wenn ich die links rechts- Regelung rausnehm klappt alles, was ich möchte...

    Achso und nein, ich hab kein LCD, die Werte haben wir in der Schule gemessen. Ist ja auch nur der "Abstand" zum Hindernis.

    Edit: Mein aktueller Code:

    Code:
    #include "qfixMiniBoard.h"
    #include "qfixLCD.h"
    
    
    const int SENSOR3 = 3;
    	   int SENSOR1 = 1;
    	   int SENSOR2 = 2;
    	   int SENSOR = 0;
    
    MiniBoard robot;
    LCD lcd;
    
    int i=0;
    int mitt = 0;
    int drehrichtung = 0;
      
    
    int main(){
    {  
    	while(1){
       int i = robot.analog(1) ;
       
      
       if (i > 75){
       robot.motors(250,250); //geradeaus
       }
       else
    {if (drehrichtung == 0)
    {
    robot.motors(-200, 200);
    drehrichtung = 1;
    }
    else
    {
    robot.motors(200, -200);
    drehrichtung = 0;
    }
      msleep(2500);
      if( mitt > 185){
       robot.motors(100,-100);
      msleep(300);
    }
    Geändert von timmy19 (30.12.2013 um 11:55 Uhr)

  6. #6
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    31
    Beiträge
    449
    Du solltest dir unbedingt eine übersichtliche Einrückung angewöhnen! Das unterschätzt man als Anfänger, aber sowas erhöht die Lesbarkeit ungemein (und dann kommt auch nicht so ein Durcheinander raus, z.B. zu viele { und } (nach main) oder eine Variable zwei mal als Int deklariert (i) usw)

    So ganz kann ich deinen Code auch nicht nachvollziehen wenn ich ehrlich bin (was soll "mitt" sein?).. Aber ich glaube dein Hauptproblem ist, dass du bei einem Abstand von <75 (also z.B. 74) kurz (300ms) nach links drehst, und dann gleich wieder geradeaus fährst weil der Abstand jetzt ja >75 (also z.B. 76) ist. Somit zuckelt der Robo nur etwas umher...

    Als inspiration (sollte eigentlich lauffähig sein wenn ich keine Tippfehler gemacht habe und dein Sensor einen Abstand von 120 messen kann):
    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 linksDrehung    1
    #define rechtsDrehung    2
    
    #define hindernis        75
    #define freieSicht        120 // 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() 
    {
        int abstand=0;
        unsigned char drehrichtung = geradeaus;    // unsigned char = 8bit integer von 0 bis 255, braucht weniger Platz im RAM
        unsigned char schonNachLinksAusgewichen = False;    
      
        while(1)
        {
            abstand   = robot.analog(1);
            if( drehrichtung == geradeaus)
            {
                robot.motors(250,250); //geradeaus fahren
                if( abstand < hindernis)
                {
                    if(schonNachLinksAusgewichen == False)
                        drehrichtung = linksDrehung;
                    else
                        drehrichtung = rechtsDrehung;
                }
            }
            if( drehrichtung == linksDrehung )
            {
                robot.motors(-200, 200); // nach links drehen
                if( abstand >= freieSicht )
                {
                    drehrichtung = geradeaus;
                    schonNachLinksAusgewichen = True;
                }
            }
            if( drehrichtung == rechtsDrehung )
            {
                robot.motors(200, -200); // nach rechts drehen
                if( abstand >= freieSicht )
                {
                    drehrichtung = geradeaus;
                    schonNachLinksAusgewichen = False; // Er ist zwar schon mal nach links ausgewichen, aber inzwischen auch schon rechtsrum, also wieder von vorne
                }
            }
        }
    }

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Wow danke, das hilft mir schon nen ganzes Stück weiter. Nur ein Problem hab ich:

    Wenn der Robo die Linksdrehung gemacht hat, fährt der bei deinem Code plötzlich rückwärts weiter. Das kann ich nicht ganz nachvollziehen. Kannst du mir da helfen?

    PS: "mitt" sollte ein Infrarotsensor sein, den ich zwischendrin eingebaut hatte, aber nicht funktionierte und daher wieder rausstrich(der muss aber noch rein!)

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2013
    Beiträge
    25
    Keine Angst, ich lese mir die Beiträge schon genau durch. Ich habe die Anweisungen mit den Variablen auch so umgesetzt gehabt, nur zwischen drin klappte das dann nicht mehr... ist jetzt auch egal.

    Und doch, Schumis Programm klappt bis auf die Tatsache, dass der Robo erst minimal vor dem Hindernis dreht und die Infrarotsteuerung(die klappt immer noch nicht...) Es klappt wahrscheinlich aber nur, weil da ohne Else-Steuerung gearbeitet wird. Um weiter zu kommen, wäre es vllt. sinnvoll, die Else-Steuerung(so leid es mir tut, sowohl um deine Arbeit, als auch darum da ich es gerne so gemacht hätte, da es schicker aussieht), weg zulassen und an dem anderen Programm weiterzuarbeiten.

    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 linksDrehung    1
    #define rechtsDrehung    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
        unsigned char schonNachLinksAusgewichen = False;  
    	int abstand   = robot.analog(1);
    	int infrarot  = robot.analog(3);
      
        while(1)
        {
            
    		
            if( drehrichtung == geradeaus)
            {
                robot.motors(100,100); //geradeaus fahren
                if( abstand < 150)
                {
                    if(schonNachLinksAusgewichen == False)
                        drehrichtung = linksDrehung;
                    else
                        drehrichtung = rechtsDrehung;
                }
            }
            if( drehrichtung == linksDrehung )
            {
    		    robot.motors(-100,-100);
    			msleep(100);
                robot.motors(-150, 150); // nach links drehen
    			msleep(300);
                if( abstand >= 150 )
                {
                    robot.motors(100,100);
    				msleep(500);
                    schonNachLinksAusgewichen = True;
    				
    				
    				if( infrarot < 150){
    		        robot.motors(100,-100);
    				msleep(500);
    				
                }
            }
            if( drehrichtung == rechtsDrehung )
            {
                robot.motors(150, -150); // nach rechts drehen
    			msleep(300);
                if( abstand >= 150 )
                { 
    			    robot.motors(-100, -100);
    				msleep(100);
                    robot.motors(100,100);
    				msleep(500);
                    schonNachLinksAusgewichen = False; 
    				
    				int infrarot  = robot.analog(3);
    				if( infrarot < 150){
    				robot.motors(-100,100);
    				msleep(500);
    				
    	
    			// Er ist zwar schon mal nach links ausgewichen, aber inzwischen auch schon rechtsrum, also wieder von vorne
    			
    			
    			
    			
    			
    			}  
    		}		  
    	}	
    
    }	
    }
    }
    Wie gesagt: Das hier funktioniert soweit(arbeite sozusagen an zwei Versionen gleichzeitig), dass der Robo fährt, sich dann minimal vor dem Hindernis dreht. Die Rücksteuerung per Infrarot wäre jetzt das nächste, was ich gerne versuchen würde, vllt. klappt es dann ja. Würde mich extrem freuen.

    Also, weißt du, was hier der Fehler an der Infrarotsteuerung sein könnte? Ich sehe keinen und weiß deshalb nicht was ändern.

    _____

    Bei dem mit der Else-Schleife bleibt das Problem, dass er sich nur dreht. Hab schon ein paar Dinge verändert, aber immer dasselbe Problem, er scheint den "If-Teil" einfach nicht auszuführen.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    31
    Beiträge
    449
    Irgendwie ist das alles etwas durcheinander.. Es ehrt mich zwar, dass das Grundgerüst deines Codes immer noch das von mir gepostete ist, aber mit dem Infrarot dazwischen wird das jetzt nicht mehr so funktionieren. Denn mein Code war so gedacht:
    • Kein Hindernis -> Roboter fährt vorwärts
    • kurz vor Hindernis -> so lange nach links drehen bis absolut kein Hindernis mehr
    • vorwärts bis zum nächsten Hindernis -> so lange nach links drehen bis absolut kein Hindernis mehr
    • vorwärts bzw. wieder von vorne

    Aber jetzt soll er irgendwie über infrarot merken, dass er sich nicht mehr weiter nach links drehen soll oder so, so ganz habe ich das auch noch nicht verstanden. Und man kann jetzt nicht das Programm so ändern wie du es willst, indem man einfach Zeilen dazu schreibt, sondern man muss das Programm durch und durch verstehen (!) und dann abändern (Wie Hannes auch schon schrieb). Ich habe mich da bei meinem Code anscheinend etwas zu viel auf aussagekräftige Variablennamen verlassen und zu wenig erläutert..

    An deiner Stelle würde ich jetzt folgendermaßen vorgehen:
    1. Eine Skizze anfertigen (und hier posten. Entweder von Hand zeichnen und ein scharfes Foto machen, oder ein Foto von deinem Aufbau machen und genau erklären, oder auch am PC zeichnen wenn du passende Software hast)
    2. Ganz genau Punkt für Punkt erläutern was der Robo machen soll. Worauf soll er reagieren, was spielt alles eine Rolle etc. (Der hat auch kein "Verständnis" und erkennt selbst was du tun möchtest, du musst alles haarklein definieren)
    3. Herausfinden, wie die Sensoren des Roboters funktionieren, insbesondere bei welchen Werten du reagieren möchtest. Du schreibst z.B. dass er zu spät vor dem Hindernis stehen bleibt. Dann musst du zuerst einmal herausfinden bei welchem Abstandswert er reagieren soll. Um das zu tun schreibst du ein ganz einfaches Programm, das z.B. dass der Robo bis zu einem bestimmten Wert vorwärts fährt und dann stehen bleibt. Dann änderst du diesen Wert bis er dir passt, notierst ihn und postest ihn dann auch hier (das betrifft den Abstand und den Infrarot Wert)


    Wenn du das hast, können wir dir helfen das Programm zu schreiben. Denn ich denke, dass du mit der bisherigen Vorgehensweise nicht mehr weiter kommst..

    Viele Grüße
    schumi

    PS: Wie steht es eigentlich um deine Kenntnisse in Sachen C? Kannst du mit "#define" überhaupt was anfangen? Was ist der unterschied zu "const"? Und warum const' du deine SENSOR* Variablen?

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.091
    Schumi kann ich nur zustimmen.

    Du könntest dich ins Thema C einlesen, wäre vielleicht nicht schlecht. Z.B. http://www.c-howto.de/ => dort findest du alles was du brauchst (Schleifen, Verzweigungen, Variablen,...)

    MfG Hannes

Ä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
  •  

Labornetzteil AliExpress