hi hans,
für die IR-ortung verwende ich die original IR diode und transistor, sie sind halt nicht an der originalstelle, sondern nach vorne gerichtet und mit leitungen mit den originalanschluss-stellen verbunden (dien IR diode sitzt inzwischen nicht mehr auf den widerständen, sondern ist auf einem kleinen platinchen auf dem anderen großen kondensator mit heisskleber befestigt)...
https://www.roboternetz.de/phpBB2/vi...97eb82ac2ea6e7

als software habe ich folgendes ausprobiert:
Code:
//Programm zum Umfahren von Hindernissen mithilfe der Infrarot-Hinderniserkennung von waste
//zusammengestellt und programmiert von julien

#include "asuro.h" 
#include <stdlib.h>
#include "inka.h" 

int main(void) 
{ 
   float puls;
   int hindernis=0;
   int richt=0, wegr=0, wegl=0, vorher=0, auswl=0, auswr=0, schritt=0;
   unsigned int Rmin = 1024, Rmax = 0, Lmin = 1024, Lmax = 0, Rmitte = 512, Lmitte = 512, lspeed=185, data[2];  
   unsigned char flagl=FALSE, flagr=FALSE;
   Init();
   WaitforStart();
   DDRD |= (1 << DDD1);      // Port D1 als Ausgang 
   PORTD &= ~(1 << PD1);      // PD1 auf LOW 
   puls = 1; 
while(1) 
{
      if (PIND & (1 << PD0)){
         StatusLED(GREEN);   // kein Hindernis
		 } else {
		 vorher=(int)(puls);
		hindernis=1;
		StatusLED(RED);      // Hindernis erkannt
		}
       
   puls = 1.02 * puls;      // Pulsbreite wird um 2% erhöht 
   if (puls > 10){
   if (PIND & (1 << PD0)) hindernis=0;
   puls = 1;
   }
   OCR2 = 255 - (int)(puls);
   
   if(hindernis==1){ //"gucken", wo noch ein freier Weg ist und diesen dann fahren
   if(schritt==0){ //nach rechts "gucken"
   MotorDir(FWD,RWD);
   Msleep(100);
   }
   if(schritt==1){ 
   auswr=(int)(puls);
   }
   if(schritt==2){ //nach links gucken
   MotorDir(RWD,FWD);
   Msleep(100);
   }
   if(schritt==3){
   auswl=(int)(puls);
   }
   if(schritt==4){ //richtigen weg fahren
    if(auswr>auswl) richt=1;
	if(auswr<auswl) richt=2;
	if(auswr==auswl) richt=3;
	}
	if(schritt<4) schritt++;
	}
   
   if(hindernis==0){ //kein Hindernis in Sicht - geradeaus fahren
   richt=0;
   schritt=0;
           OdometrieData(data); // 0. links, 1. rechts        
        // max links 
        if (data[0] > Lmax) 
            Lmax += (data[0] - Lmax) / 2; 
        // min links 
        if (data[0] < Lmin) 
            Lmin -= (Lmin - data[0]) / 2; 
        // max rechts 
        if (data[1] > Rmax) 
            Rmax += (data[1] - Rmax) / 2; 
        // min rechts 
        if (data[1] < Rmin) 
            Rmin -= (Rmin - data[1]) / 2; 
    Rmitte=(Rmax+Rmin)/2; 
    Lmitte=(Lmin+Lmax)/2; 
      if ((data[0] < Lmitte) && (flagl == TRUE)) { 
      flagl = FALSE; 
      wegl++; 
      } 
      if ((data[0] > Lmitte) && (flagl == FALSE)) { 
      flagl = TRUE; 
      wegl++; 
      } 
      if ((data[1] < Rmitte) && (flagr == TRUE)) { 
      flagr = FALSE; 
      wegr++; 
      } 
      if ((data[1] > Rmitte) && (flagr == FALSE)) { 
      flagr = TRUE; 
      wegr++; 
      }
	if(wegl<wegr) lspeed++;
	if(wegl>wegr) lspeed--;
	if(wegl>=1000){ wegl=0; wegr=wegr-1000; } //zurücksetzen, damit kein Überlauf nach
	if(wegr>=1000){ wegr=0; wegl=wegl-1000; } //längeren Fahrten passiert
	}
	if(richt==0) MotorDir(FWD,FWD); //geradeaus
    if(richt==1) MotorDir(RWD,FWD); //links
	if(richt==2) MotorDir(FWD,RWD); //rechts
	if(richt==3) MotorDir(RWD,RWD); //zurück

    MotorSpeed(lspeed,155);
  }
   return 0; 
}
es funktioniert