-         

Ergebnis 1 bis 4 von 4

Thema: Hilfe beim Ausweichmuster

  1. #1

    Hilfe beim Ausweichmuster

    Anzeige

    Moin zusammen,


    Wir arbeiten in der Schule momentan mit dem Asuro als projekt, der zusammen bau und der test einzelner programme( kollision, linie) hat wunderbar funktioniert, nun sollen unser ASURO einer linie folgen, einen Hinderniss auf der Linie ausweichen und die Linie wieder suchen und dieser folgen. Folgendes haben wir bis jetzt erreicht, doch irgendwie wissen wir nicht wie wir aus der void crash wieder in die main funktion zurück kommen. quasi endlosschleife der main...

    Code:
    #include "asuro.h"
    
    
    //Kollisionserkennung 
    
    Crash(void)
    {
    	unsigned int t1,t2;
    	
    	//doppelte Schalterabfrage
    	t1 = PollSwitch();
    	t2 = PollSwitch();
    	
    	if(t1 > 0 && t2 > 0 && t1 == t2)
    	{
    					//ASURO zurückfahren
    		MotorSpeed(180,180);
    		MotorDir(RWD,RWD);
    		Msleep(200);
    		
    					//nach links drehen
    		MotorDir(RWD,FWD);
    		Msleep(180);
    		
    		
    		MotorSpeed(240,240);	/*Vorwärts immer, rückwärts nimmer! */
    		MotorDir(FWD,FWD);
    		Msleep(1000);	
    
    					//nach rechts drehen
    		MotorDir(FWD,RWD);
    		Msleep(180);
    
    		MotorSpeed(240,240);	/*Vorwärts immer, rückwärts nimmer! */
    		MotorDir(FWD,FWD);
    		Msleep(1500);
    		
    					//nach rechts drehen
    		MotorDir(FWD,RWD);
    		Msleep(180);
    
    		MotorSpeed(240,240);	/*Vorwärts immer, rückwärts nimmer! */
    		MotorDir(FWD,FWD);
    		Msleep(1500);
    
    	}
    }
    
    int main(void)
    {
    	//ASURO initialisieren
    	Init();
    	
    	unsigned int data[2],data_ref[6];
    	int speed_left,speed_right;
    	int degree5;
    	int keepinline;
    	int j,i=0;
    	int leave=0;
    	
    	FrontLED(ON); //Linienverfolgungs-LED ein
    	
    	//hell 0	
    	//dunkel 1023
    	
    	//Variablen initialisieren
     	data_ref[0] = 35;//60|35
    	data_ref[1] = 35;//60|35
    	speed_left = 202;//109
    	speed_right= 200;//100
    	degree5 = 29;//80
    	keepinline = 15;
    	
    	//Geschwindigkeit einstellen
    	MotorSpeed(speed_left,speed_right);
    	
    	while(1)
    	{
    	LineData(data);//Sensordaten einlesen
    	MotorDir(FWD,FWD);//vorwŠrts fahren
    	Crash();//Kollisionserkennung
    	
    	//beide Sensoren befinden sich au§erhalb der wei§en Linie
    	//-> Linie muss wieder gefunden werden
    	if(data[0] < data_ref[0] && data[1] < data_ref[1])
    	{
    	BackLED(ON,ON);//Anzeige fŸr Liniensuche
    	j=17;
    	leave=0;
    	
    	while(1)
    		{
    			//nach rechts drehen und Linie suchen
    			for(i=0;i<j;i++)
    			{
    			MotorDir(FWD,RWD);
    			Msleep(degree5);//Drehbewegung fŸr degree5 msec zulassen
    			MotorDir(BREAK,BREAK);
    			//kurze Programmunterbrechung, damit ASURO tatsŠchlich
    			//zum Stillstand gekommen ist
    			Msleep(keepinline);
    			LineData(data);//Sensoren einlesen
    			//Wenn ein Sensor im Bereich der Linie ist, Liniensuche
    			//verlassen
    			if(data[0] > data_ref[0] || data[1] > data_ref[1])
    				{
    				leave = 1;
    				break;
    				}
    			}
    			
    			if(leave==1) break;
    			
    			//nach links drehen und Linie suchen
    			for(i=0;i<35;i++)//35(41)
    			{
    			//Funktionsweise wie oben
    			MotorDir(RWD,FWD);
    			Msleep(degree5);
    			MotorDir(BREAK,BREAK);
    			Msleep(keepinline);
    			LineData(data);
    			if(data[0] > data_ref[0] || data[1] > data_ref[1])
    				{
    				leave = 1;
    				break;
    				}
    			}
    			
    			if(leave==1) break;
    			
    			//Šndern der Drehweite von 175 auf 355 Grad
    			j=35;
    		}//while
    	
    	BackLED(OFF,OFF);//Liniensuche-Status-LEDs ausschalten
    	
    	}
    	//             HELL                    DUNKEL
    	else if(data[0] > data_ref[0] && data[1] < data_ref[1])
    		{
    		//           DUNKEL					HELL
    		while(data[0] > data_ref[0] && data[1] < data_ref[1])
    			{
    			//nach rechts fahren
    			MotorDir(BREAK,FWD);
    			LineData(data);//Sensoren einlesen
    			Crash();//Kollisionserkennung
    			}
    		}
    	//Funktionsweise wie oben
    	else if(data[0] < data_ref[0] && data[1] > data_ref[1])
    		{
    		while(data[0] < data_ref[0] && data[1] > data_ref[1])
    			{
    			//nach links fahren
    			MotorDir(FWD,BREAK);
    			LineData(data);
    			Crash();
    			}
    		}
    	}
    	
    	return 0;
    }
    könnt ihr uns vielleicht weiter helfen?

    Danke schonmal
    2 verzweifelte schüler

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Hallo

    Euer Code erinnert mich an alte Goto-Zeiten, vermutlich ist er "natürlich" gewachsen und sieht deshalb entsprechend chaotisch aus. Ihr solltet etwas ausputzen und die einzelnen Aktionen aus der Hauptschleife in selbstständige Funktionen umwandeln.

    Für Schleifen, die auf eine Abbruchbedingung warten, ist meiner Meinung nach eine do .. while-Konstruktion leserlicher als eure while .. Break-Versionen.

    Für Programme, die schrittweise ausgeführt werden sollen (oder testweise nur zum Ablauf festlegen und späterem umformulieren), sind Schrittketten mit case praktisch und zudem gut zu debuggen. (ein Beispiel aus den ersten Tagen meiner asuro-Ehe. main() ist hier nur die Steuerung der Schrittkette.)

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    so nu bin ich wieder allein vorm rechner^^

    danke fuer die schnelle antwort! ich werd mir dein beispiel mal anschauen und dann mal gucken was ich an unserm code noch so verbessern kann..*g*

    hoffe mal das wird was...

    danke nochmal

    bole

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Hallo

    hoffe mal das wird was...
    Das wird sicher was, euer Code sieht schon jetzt sehr vielversprechend aus. Ich bin absichtlich nicht auf den Code selbst eingegangen, weil ich denke, ihr habt es so weit geschafft, der Rest wird euch auch gelingen. Was mir aufgefallen ist: Was passiert, wenn der weitere Verlauf der Linie nicht im Drehbereich des asuros liegt? Sollten nicht besser die Werte für die 5°-Drehung für links und rechts getrennt definiert werden? Was passiert bei einer Kollision beim Suchen?

    Bei Kommentaren im Quellcode solltet ihr Sonderzeichen und Umlaute meiden. Sie werden nicht richtig angezeigt (nur bei mir?) und manche C-Compiler verweigern dadurch den Dienst und brechen mit einer Fehlermeldung ab.

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

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