- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 3 von 3

Thema: Linienverfolgung und Kollisionstest klappen nicht ... HILFE!

  1. #1

    Linienverfolgung und Kollisionstest klappen nicht ... HILFE!

    Anzeige

    Powerstation Test
    Hallo!
    Für ein Schulprojekt sollte mein Asuro eine Linie verfolgen und mithilfe der Taster Hindernisen ausweichen, je nachdem welche Taster betätigt werden.

    Leider will das Programm nicht so wie ich.

    Könnte jemand vllt. mit dem geschulten Auge einen Blick drauf werfen und den Fehler finden?
    Der Asuro verfolgt nur die Linie, auf Taster gibt es keine Reaktion.

    Ich sitze schon seit 2 Tagen an dem und bin ratlos.
    Danke euch sehr im Voraus!!

    Code:
    #include "asuro.h"
    #include "myasuro.h"
    
    
    #define FULL_L 200
    #define FULL_R 200
    
    
    /*************************************************************************** 
    *
    *   unsigned int data[2]; = Speicher fur Liniensensor reservieren
    *
    *   data[0] = linker Sensor, data[1] = rechter Sensor
    ****************************************************************************/
    
    
    
    //DEFINITIONEN FUER TEILPROGRAMM DER TASTER
    
    
    /* Motor vorwдrts */
    void MotorFwd(void)
    {
      MotorDir(FWD,FWD);
      MotorSpeed(FULL_L,FULL_R);
    }
    
    /* Motor rьckwдrts */
    void MotorRwd(void)
    {
      MotorDir(RWD,RWD);
      MotorSpeed(FULL_L,FULL_R);
    }
    
    /* Motor rьckwдrts Links */
    void MotorRwdL(void)
    {
      MotorDir(RWD,RWD);
      MotorSpeed(FULL_L,0);
    }
    
    /* Motor rьckwдrts Rechts */
    void MotorRwdR(void)
    {
      MotorDir(RWD,RWD);
      MotorSpeed(0, FULL_R);
    }
    
    /* Motor stop */
    void MotorStop(void)
    {
      MotorSpeed(0,0);
    }
    
    
    //ENDE DER DEFINITIONEN
    
    
    
    
    
    void FollowLine (void)          //FollowLine wird erklдrt bzw. definiert
    
    {
       unsigned int data[2];       //Speicher fuer Liniensensor reservieren
       Init();
       FrontLED(ON);
       MotorDir(FWD,FWD);
     
       while(1)
       
       {
       {
       
       if
       
       (PollSwitch()<=0) 
       LineData(data);            //Liniensensor auslesen
          
       if(data[0]>data[1])       //Wenn links heller als rechts
       
       {
       MotorSpeed(150,30);       //dann links schneller als rechts
       }
       
       else                      //ansonsten
      
       {
       MotorSpeed(30,150);      //rechts schneller als links
       }
    }
    }    
    }
       
    
    
    
    
    
    int main(void)
    
    
    {
      unsigned char t1, t2;
      Init();
      EncoderInit ();
      
      
      while (1)
      {
       
       if 
       (PollSwitch()>=0);  
       
       {
    	t1 = PollSwitch();  			 //Taster zweimal abfragen
        t2 = PollSwitch();
       } 
    	
    	{
    	
    	  if (t1 == 0 && t2 == 0)         /* keine Taste gedrueckt*/
       
          {
          FollowLine();                  //Linie folgen (Programm von oben ausfuehren) 
    	  FrontLED(ON);
          BackLED(OFF,OFF);
          }
        
    	
    	  else if ( (t1 != 0) && (t2 != 0) && (t1 == t2))   //sonst wenn Tasten ungleich null
          {
          MotorStop();                   //Motor anhalten. WELCHE TASTEN gedrueckt? 3 Moeglichkeiten:
          
    	  
    	  
    	  
    	  
    	  
    	  if ( t1 == 0x12)               //0x12, also tasten vorne gedrьckt?
    	  	  
    	  {	  
    	  Go(-10,100);                   // dann: 10cm nach hinten; geschw 100
    	  BackLED(ON,OFF);				 // mit eingeschalteten hinteren LEDs
    	  }
    	  
    	  
    	  
    	  
    	  if ((t1 & 0x07) > 0 )          /* Tasten links gedrьckt? */
          	  
    	  {       
          Turn (-90, 150);               // dann: rechts um 90 grad geschw 150
          FrontLED(OFF);
          BackLED(ON,OFF);
          }
    	  
    	  
    	  
    	  
    	  
          if (t1 & 0x30)                   /* Tasten rechts gedrьckt? */
          {
    	  Turn (90, 150);                // links um 90 grad geschw 150
          FrontLED(OFF);
          BackLED(OFF,ON);
          }
          
    	  
    	  
    	  Msleep(1000);                    /* 1 Sekunde warten */
        }
      }
      }
      return 0;
    }

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

    In dieser Version deines Programms wird auf Tasten nicht mehr reagiert wenn die Funktion FollowLine() ausgeführt wird. Es gibt keine Entkommen aus while(1) {...}!

    Warum betreibst du in main() den großen Aufwand um das Ergebniss von PollSwitch() zu überprüfen und in FollowLine() prüfst du nur einmalig auf ein (PollSwitch()==0)? (kleiner als 0 kann das Ergebniss von unsigned char PollSwitch() nicht werden)

    btw: In FollowLine() sollte kein erneutes Init() aufgerufen werden.
    if (PollSwitch()>=0); in main() ist natürlich auch unnötig, den Rest des Programms habe ich mir noch nicht genauer angeschaut.

    Gruß

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

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    kleine warnung: übermäßiges PollSwitch() oder LineData() aufrufen stört den AutoEncoder EMPFINDLICH!!! also mit timer interrupt das werte abfragen machen (timer1 ist UNBENUTZT ... wenns mit der letzten asurolib noch net geändert wurde )

Berechtigungen

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

12V Akku bauen