Projekt fertig: \/

US-Code für ASURO mit folgenden Extras:

- Geradeausfahrt mit Odometriezähler (Ausgleich Links, Rechts)
- Wegdrehen bei Tasterberührung von der Wand (T1,T2,T3 links - T4,T5,T6 rechts)
- bei Abstand < 15 cm wegdrehen von der Wand mittels Zufallsgenerator (Links oder Rechts mittels Timer TCNT2)

Code:
#include "asuro.h" 
#include "ultrasonic.h" 

#define TRIGGERLEVEL 600
#define HYSTERESIS 10
#define LOW 0
#define HIGH 1
  
int main(void) 
{ 
int abstand, sw, sw0, sw1, sw2; 
unsigned char ocr = 0; 
unsigned char ocr1 = 0; 
unsigned int data[2];
signed int status[2]={0,0};
signed int difference=0;

Init(); 

  while(1) 
 { 

sw0=PollSwitch(); 
sw1=PollSwitch(); 
sw2=PollSwitch(); 
    
if ((sw0==sw1) && (sw0==sw2)) sw=sw0; else sw=0; 

	 {
	 StatusLED(GREEN); 
     MotorDir(FWD, FWD); 
     MotorSpeed(150, 150);
	 }

abstand = Chirp(); 
StatusLED(YELLOW); 

	if (sw==32) 
	   { 
	   StatusLED(RED); 
    
	   MotorDir(RWD,RWD); 
	   MotorSpeed(150, 150); 
	   Msleep(600); 

	   MotorDir(FWD,RWD); 
	   MotorSpeed(150, 150); 
	   Msleep(600); 
	   } 
	if (sw==16) 
	   { 
	   StatusLED(RED); 
    
	   MotorDir(RWD,RWD); 
	   MotorSpeed(150, 150); 
	   Msleep(600); 

	   MotorDir(FWD,RWD); 
	   MotorSpeed(150, 150); 
	   Msleep(600); 
	   } 
	if (sw==8) 
	   { 
	   StatusLED(RED); 
    
	   MotorDir(RWD,RWD); 
	   MotorSpeed(150, 150); 
	   Msleep(600); 

	   MotorDir(FWD,RWD); 
	   MotorSpeed(150, 150); 
	   Msleep(600); 
	   } 
	if (sw==1) 
	   { 
	   StatusLED(RED); 
    
	   MotorDir(RWD,RWD); 
	   MotorSpeed(150, 150); 
	   Msleep(600); 

	   MotorDir(RWD,FWD); 
	   MotorSpeed(150, 150); 
	   Msleep(600); 
	   } 
	if (sw==2) 
	   { 
	   StatusLED(RED); 
    
	   MotorDir(RWD,RWD); 
	   MotorSpeed(150, 150); 
	   Msleep(600); 

	   MotorDir(RWD,FWD); 
	   MotorSpeed(150, 150); 
	   Msleep(600); 
	   } 
	if (sw==4) 
	   { 
	   StatusLED(RED); 
    
	   MotorDir(RWD,RWD); 
	   MotorSpeed(150, 150); 
	   Msleep(600); 

	   MotorDir(RWD,FWD); 
	   MotorSpeed(150, 150); 
	   Msleep(600); 
	   } 

	else if (abstand<15) 
   	  { 
      ocr = TCNT2; 
      ocr1 =ocr/2; 
      ocr1 *=2; 
      if (ocr == ocr1){ 
      StatusLED(RED); 

      MotorDir(RWD,RWD); 
      MotorSpeed(150, 150); 
      Msleep(600); 

      MotorDir(RWD,FWD); 
      MotorSpeed(150, 150); 
      Msleep(600); 
      } 
      else 
       { 
      StatusLED(RED); 

      MotorDir(RWD,RWD); 
      MotorSpeed(150, 150); 
      Msleep(600); 

      MotorDir(FWD,RWD); 
      MotorSpeed(150, 150); 
      Msleep(600); 
      } 
   } 

else 
   { 

	         OdometrieData(data);
        if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) {
            status[0]=HIGH;
            difference++;
        }
        if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
            status[0]=LOW;
            difference++;
        }
        if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERESIS)) {
            status[1]=HIGH;
            difference--;
        }
        if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERESIS)) {
            status[1]=LOW;
            difference--;
        }

        if (difference<-155) difference=-155;
        if (difference>155) difference=155;
        

        StatusLED(status[0]+status[1]*2);
        
        if (difference>0) MotorSpeed(155-difference,155);
        else MotorSpeed(155,155+difference);

	  
    }
	
	
	 
 } 
  return 0; 
}
Mein ASURO verhält sich jetzt viel natürlicher (wie ein Hamster)

Kopieren erlaubt, Verbesserungsvorschläge willkommen!

Danke an inka und MartinFunk für die Unterstützung!