Projekte.ctBot2_OberlaenderLi.unterseite10 (Struktur)


Problem 10: Test der Spurverfolgung

Zuallererst zog der c't-Bot nur Kreise, denn eine mit Filsschreiber gemalte Spur konnten die Liniensensoren des c't-Bots nicht ausreichend erkennen. Als eine wesentliche Verbesserung stellte sich die Verwendung einer mit schwarzer Farbe gedruckten Spur von 3 cm Breite heraus.

Die Funktion Spurverfolgung funktionierte ebenfalls nicht optimal. Der c't-Bot verlor noch sehr häufig seine auf einem Brett aufgeklebte schwarz gedruckte Spur, hauptsächlich deshalb, weil er auf längeren geraden Spurabschnittsstücken zu viel Geschwindigkeit aufnahm und dann in Kurven über die schwarze Spur hinaussauste. Die Drehungen, die er dann vollführte, um die schwarze Spur wiederzufinden, halfen nur in Ausnahmefällen weiter. Dieses Problem konnte aber durch kleine Änderungen im Code beseitigt werden:

Spurverfolgung.c:


void spurverfolgung(void){
	
   if (abs(adc_wert[2])<400){
	    
		CTMotor(23,0);
		led_set(LED_RECHTS);
	}	 	
	
	else if (abs(adc_wert[3])<400){
	
		CTMotor(0,23);
		led_set(LED_LINKS);
	}
		
	else if (abs(adc_wert[2])>400 && abs(adc_wert[2])<800 &&abs(adc_wert[3])>400 && abs(adc_wert[3])<800){
	    
		CTMotor(23,23);
		led_set(LED_LINKS|LED_RECHTS);
	}	
	
	else if (abs(adc_wert[2])>800 && abs(adc_wert[3])>800){
	    
		CTMotor(0,0);
		led_aus(LED_ALL);
	}	
	
}

Es erwies sich als sehr hilfreich, an den Drehzahlwerten für die Motoren (CTMotor(23,0)) herumzuspielen. Die Geschwindigkeit des c't-Bots sollte dem Schwierigkeitsgrad der Bahnführung angepasst sein. Die in Spurverfolgung_neu.c gewählten Werte funktionierten für unsere Bahngestaltung recht gut.

Außerdem schien es sinnvoll zu sein, dass, wenn beide Liniensensoren weißen Untergrund detektieren, der c't-Bot eine langsame Rückwärtsfahrt mit sehr leichter Drehung in Fahrtrichtung nach rechts ausführen soll. Auf diese Weise gelingt es ihm, die schwarze Spur wiederzufinden.

Spurverfolgung_neu.c:


void spurverfolgung(void)
{	
    if (abs(adc_wert[2])<200 && (abs(adc_wert[3])>200 && abs(adc_wert[3])<800))    //wenn der linke Liniensensor weissen Untergr. &&  der rechte schwarzen Untergr. detektiert, 
        {	    
		CTMotor(23,-23);    // dann soll der c't-Bot eine fluessige Drehung nach rechts ausfuehren,  
		led_set(LED_RECHTS);    // und die rechte LED soll leuchten 
	}	 	
	
	else if (abs(adc_wert[3])<200 && (abs(adc_wert[2])>200 && abs(adc_wert[2])<800))    // es sei denn der rechte Liniensensor detektiert weiss && der linke schwarz, 
        {	
		CTMotor(-23,23);    //dann fluessige Drehung nach links 
		led_set(LED_LINKS);     //und die linke LED soll leuchten
	}
		
	else if (abs(adc_wert[2])>200 && abs(adc_wert[2])<800 &&abs(adc_wert[3])>200 && abs(adc_wert[3])<800)    // wenn beide Sensoren schwarzen Untergrund detektieren, 
	    
	{	CTMotor(15,15);    // dann mittellangsame Geradeausfahrt
		led_set(LED_LINKS|LED_RECHTS);    // mit beiden LEDs an
	}	
	else if (abs(adc_wert[2])<200 && abs(adc_wert[3])<200)    // wenn beide Sensoren weissen Untergrund detektieren, 
	{	CTMotor(-10,-9);    // langsame Rueckwaertsfahrt mit sehr leichter Drehung in Fahrtrichtung nach rechts
	}
	else if (abs(adc_wert[2])>800 && abs(adc_wert[3])>800)   // wenn beide Sensoren einen tiefen Abgrund detektieren, 
	    							  
	{	CTMotor(0,0);    // dann Motoren bei voller Fahrt Stop
		led_aus(LED_ALL);    // alle LEDs aus  
	}	
	                                                            
}


Autor: ifko, Letzte Änderung: 19.09.2008 19:44:13


 TU Clausthal 2020  Impressum