-
        

Ergebnis 1 bis 7 von 7

Thema: Asuro drehen lassen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    13.10.2005
    Beiträge
    5

    Asuro drehen lassen

    Anzeige

    Hallo,

    ich habe ein recht komischen Vorfall.

    Ich möchte den Asuro einmal um 90° links und einmal um 90° rechts drehen lassen.

    Meine Funktion für links geht da ganz gut nur rechts will der nicht so recht. Da dreht er ein wenig mehr als 300°

    Dazu muß ich sagen, dass ich dies über die Odometrie mache. Dafür habe ich die Schwarz/weiß flächen umgebaut. nun habe ich halb schwarz und halb silber. Somit habe ich das "Rauschen" wegbekommen und der kleine fährt eine super linie.

    Hier mal mein code

    Code:
    #include "asuro.h"
    
    unsigned int data[2];
    
    	int OdoDifferenz;
    	int wegzaehler=0;
    	unsigned int lineData[2];
    	
    	char zeichen[4];
    	int start=0,wechsel=0;
    	int schwarz=0,silber=0;
    	int odo=0;
    	int exit=0;
    
    void einmalrechts(void)
    {
    	schwarz=0;
    	silber=0;
    	start=0;
    	wechsel=0;
    	OdometrieData(data);
    	
    	if (data[0]<110)
    		{
    		start=0;
    		wechsel=0;
    		}
    	else 
    		{
    		start=1;
    		wechsel=1;
    		}
    	
    	
    	
    	if(start==0)
    		{
    			while(schwarz<8 && silber <7)
    			{
    				MotorDir(FWD,FREE);
    				MotorSpeed(110,0);
    				OdometrieData(data);	
    				if(data[0]<110 && wechsel!=0)
    				{
    					silber++;
    					wechsel=0;
    				}
    				else if (data[0]>110 && wechsel!=1)
    				{
    					schwarz++;
    					wechsel=1;
    				}
    				SerWrite("Silber: ",8);
    				itoa(silber,zeichen,10);
    				SerWrite(zeichen,sizeof(zeichen));
    				SerWrite("Schwarz: ",9);
    				itoa(schwarz,zeichen,10);
    				SerWrite(zeichen,sizeof(zeichen));
    				
    			}
    		}
    	else 
    		{
    			while(schwarz<8 && silber <7)
    			{
    				MotorDir(FWD,FREE);
    				MotorSpeed(110,0);
    				OdometrieData(data);
    				if(data[0]<110 && wechsel!=0)
    				{
    					silber++;
    					wechsel=0;
    				}
    				else if (data[0]>110 && wechsel!=1)
    				{
    					schwarz++;
    					wechsel=1;
    				}
    				
    				SerWrite("Silber: ",8);
    				itoa(silber,zeichen,10);
    				SerWrite(zeichen,sizeof(zeichen));
    				SerWrite("Schwarz: ",9);
    				itoa(schwarz,zeichen,10);
    				SerWrite(zeichen,sizeof(zeichen));
    				
    			}
    		}
    		
    MotorSpeed(0,0);
    MotorDir(FWD,FWD);
    BackLED(ON,ON);
    }
    
    void undjetzt_links(void)
    {
    	schwarz=0;
    	silber=0;
    	start=0;
    	wechsel=0;
    	OdometrieData(data);
    	
    	if (data[1]<110)
    		{start=0;
    		wechsel=0;}
    	else {start=1;
    			wechsel=1;}
    	
    	
    	
    	if(start==0)
    		{
    			while(schwarz<8 && silber <7)
    			{
    			
    				MotorDir(FREE,FWD);
    				MotorSpeed(0,110);
    				OdometrieData(data);
    				
    				if(data[1]<110 && wechsel!=0)
    				{
    					silber++;
    					wechsel=0;
    				}
    				else if (data[1]>600 && wechsel!=1)
    				{
    					schwarz++;
    					wechsel=1;
    				}
    				
    			
    			}
    		}
    	else 
    		{
    			while(schwarz<8 && silber <7)
    			{
    				MotorDir(FREE,FWD);
    				MotorSpeed(0,110);
    				OdometrieData(data);
    				
    				if(data[1]<110 && wechsel!=0)
    				{
    					silber++;
    					wechsel=0;
    				}
    				else if (data[1]>600 && wechsel!=1)
    				{
    					schwarz++;
    					wechsel=1;
    				}
    			}
    		}
    		
    MotorSpeed(0,0);
    MotorDir(FWD,FWD);
    }
    
    int main(void)
    {
    
    	Init();
    einmalrechts();
    undjetzt_links();
    
    	return 0;
    }
    Evtl. kann man das noch besser lösen!!?

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    31.07.2005
    Ort
    Ehningen
    Alter
    43
    Beiträge
    35
    Hei diesy2,

    ein paar Sachen fallen mir auf:
    • * beim Rechtsdreh fragst du auf <110 und >110 ab, beim Linksdreh auf <110 und >600 ab. Eine Hysterese tut sicherlich not, aber diese schein mir sehr groß zu sein. Lass dir doch die Werte der rechten Odo-Sensorik auch mal ausgeben, wie du es beim Rechtsdreh schon machst.
      * Beim Rechtsdreh hast du Ausgaben über die serielle Schnittstelle drin. Die brauchen ewig, beim Linksdreh fehlen die. Es gibt also auf jeden Fall ein unterschiedliches Timing in den Funktionen.
      * Ich bin kein C-Profi, meine aber, dass du bei logischen Verknüpfungen innerhalb von if/while/...-Abfragen Klammern setzen musst; auf jeden Fall solltest du, z. B. also while((schwarz<8 ) && (silber <7)). Keine Ahnung, was der Compiler da sonst draus macht.
      * Es gibt hier im Forum einige geniale Erweiterungen für den Asuro. Dabei werden die Odometrie-Sensoren interruptgesteuert ausgewertet, dadurch gehen praktisch keine Ticks verloren. Im Programm kann man dann ganz einfach zwei globale Variablen verwenden, die die rechtenund linken Ticks beinhalten. Die Erweiterung kommt in Form einer neuen Asuro.c und Asuro.h und gibt außerdem noch eine Funktion namens PrintInt(int) mit - ganz praktisch. Hier findest du den letzten Entwicklungsstand der Dateien: http://www.roboternetz.de/phpBB2/zei...?t=11256<br />


    Viel Erfolg,

    Rakke

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    13.10.2005
    Beiträge
    5
    Danke für deine Antwort.

    Deine Anmerkungen aus Punkt 1 und 2 habe ich verbessert. Leider geht es immernoch nicht.

    edit:
    Jetzt geht es. Nur hört er nicht auf wenn er einmal durch ist. Woran kann das liegen?

  4. #4
    Hi,

    schreib vor das return 0; noch ein while(1); damit der in ner Endlosschleife bleibt. Bei einfach nur return 0; soll der Mikrocontroller wohl probleme haben.

    Code:
    while(1);
    return 0;

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    13.10.2005
    Beiträge
    5
    Danke für den Tipp.

    Ich habe aber einfach die Asuro.c .h getauscht und dann gings komischerweise.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    31.07.2005
    Ort
    Ehningen
    Alter
    43
    Beiträge
    35
    Hei,

    gegen welche asuro.h hast du denn welche getauscht?

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    13.10.2005
    Beiträge
    5
    Na ich habe deinen Link genommen und bin dann auf die Seite von Andun oder so.

Berechtigungen

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