Hallo
Hier meine Präsentation
Das Video:
http://www.youtube.com/watch?v=Ytfs5m9FXbE
Das Prinzip:
Der Roboter sucht mit der Asuro-Snake Erweiterungsplatine (In der 1ten Suchphase) grob eine Wärmequelle indem er einen Rundumscann vornimmt. Wenn er eine erhöhte Temperatur im Vergleich zur vorher gemessenen Umgebugnstemperatur findet richtet er sich zu der Wärmequelle aus und fährt suchend (im 2ten Programmteil) in die Richtung an der die Temperatur immer wärmer wird (sonst geradeaus --> also auf die Qärmequelle zu). Hat er sich unmittelbar vor die Wärmequelle gerbeitet (Wenn der gemessene Temperaturwert eine gewisse Grenze überschreitet) dreht der RP6 sich leicht so dass er mit Hilfe eines kleinen Propellers die Kerze löschen kann.
Der Quelltext:
Code:
int z; //Globale Vriable
void scan (int ds)
{
int max;
do
{
uint16_t adc2r = readADC(ADC_2);
uint16_t adc3r = readADC(ADC_3);
max=adc2r-adc3r; //Wert der Umgebung wird genommen
moveAtSpeed(50,0); //Drehe
setLEDs(0b1110);
}
while(!(max<ds-13)); //Bis neu gemessener Wert stark von dem Übergebenen Anfangswert abweicht
}
...
void Snake(int dif)
{
uint16_t adc2 = readADC(ADC_2);
uint16_t sSnake = adc2 ;
uint16_t adc3 = readADC(ADC_3);
uint16_t sSnake2 = adc3 ;
int a,b;
a=(sSnake-sSnake2); //Neuer Wert wird genommen
b=0;
if(a>dif+10) //Wenn neu gemessener Wert abzüglich Tolleranzwert rechts höher ist
{ setLEDs(0b1100);
moveAtSpeed(50,0); //Drehenach rechts
b=1; //Damit später nicht geradeaus gefahren wird
}
if(a<dif-5) //Wenn neu gemessener Wert abzüglich Tolleranzwert links höher ist
{ setLEDs(0b0011);
moveAtSpeed(0,50); //Drehe nach links
b=1; //Damit später nicht geradeaus gefahren wird
}
if(b==0) //Wenn sich nichts verändert hatte ist man auf direktem Kurs
{ setLEDs(0b0110);
moveAtSpeed(40,40); // Also geradeaus fahren
z=a; // Neuen Wert setzten der als Umgebungswert (s.u. in der Hauptschleife) genommen wird um den Roboter direkt und immer mehr Außenfaktorunabhängig
//auf die Wärmequelle fahren zu lassen da man sich ja nun auf direktem Weg zu der Wärmequelle befindet
}
if((sSnake> 310 ||sSnake2>310)) // Wenn man sich sehr nah an der Wärmequelle befindet mit löschen beginnen
{
int n;
changeDirection(FWD);
moveAtSpeed(50,0);
mSleep(1000);
moveAtSpeed(0,0);
for(n=0;n<25;n++)
{
l(); //Löschemethode
mSleep(150);
}
PORTC &= ~IO_PC5; //Löschvorgang beenden
mSleep(2000);
uint16_t adc2 = readADC(ADC_2);
uint16_t sSnake = adc2 ;
uint16_t adc3 = readADC(ADC_3);
uint16_t sSnake2 = adc3 ;
a=(sSnake-sSnake2); // Neuen Umgebungswert setzen
z=a; //Wird später in der Hauptschleife übergeben
scan(z); //Neue Wärmequelle grob orten
}
clearLCD();
setCursorPosLCD(0, 0);
writeStringLCD("Rechts: ");
writeStringLCD(" ");
writeIntegerLCD(sSnake, DEC);
writeStringLCD(" ");
writeIntegerLCD(a, DEC);
setCursorPosLCD(1, 0);
writeStringLCD("Links: ");
writeIntegerLCD(sSnake2, DEC);
writeStringLCD(" ");
writeIntegerLCD(b, DEC);
mSleep(200);
}
...
int main(void)
{
initRP6Control();
initLCD();
...
showScreenLCD("Search heat...", "");
uint16_t adc2 = readADC(ADC_2);
uint16_t sSnake =adc2 ;
uint16_t adc3 = readADC(ADC_3);
uint16_t sSnake2 = adc3 ;
int dd;
dd=(sSnake-sSnake2); // Ein Startvergleichswert wird gesetzt enspricht der Umgebungstemperatur
scan(dd); // s.o. Es wird nach einer Wärmequelle gesucht welche deutlich vom Vergleichswert abweicht (höher ist)
setLEDs(0b0001);
sSnake=readADC(ADC_2);
sSnake2=readADC(ADC_3);
dd=(sSnake-sSnake2); // Nachdem man auf die Wärmequelle grob ausgerichtet ist wird ein neuer Vergleichswert gesetzt
z=dd;
moveAtSpeed(20,20);
changeDirection(BWD);
mSleep(200);
changeDirection(FWD);
while(true)
{
Snake(dd); //Methode zur genauen Ortung der Wärmequelle anhand des Verlgeichswert wird aufgerufen
task_checkINT0();
task_I2CTWI();
dd=z; //Falls der Umgebungswert verändert wurde wird er hier übergeben
}
return 0;
}
Gruß Thund3r
Lesezeichen