hallo Dirk,
ich habe den code von vorhin mit kommentaren versehen, so wie sie mir zutreffend scheinen...
der roboter steht zunächst im raum, ist eingeschaltet, weiss nicht wo er ist, weisst nicht wo die IR-bake ist.
und das sollte er tun:
- misst nach 50ms zuerst ob er IR empfang hat
- hat er empfang, misst er weiter bis er 10x empfang hatte
- dann prüft er, ob er diese 10 signale innerhalb von 520ms (tg) empfangen hat
- ist tg<520 fährt er 100mm
- ist tg>520 rotiert er um 1 grad
- fängt wieder mit IR messung an
Code:
case 3://
setLEDs(0b0100);
writeString_P("suche der bake \n");
writeChar('\n');
initRP6Control();
initLCD();
startStopwatch3();
t=0; //t, t1, t2, tg sind am programmanfang definiert (unint_8)
while(true) //schleife bis button gedrückt
{
while(true) //dauerschleife - wie komme ich da raus?
{
if(getStopwatch3() > 50) //wenn stopwatch3 > 50ms messe IR empfang
{
temp = read_IR_value(); //Ir empfang (PB2) messen
if (temp == 0) //wenn IR empfang dann schleifendurchlauf, sonst rotate
{
t1 = getStopwatch3(); // stopwatch3 wert beim ersten "treffer"
setMultiIOLED3(1);
setMultiIOLED3(0);
if (t<10) // schleife für 10 treffer
{
t++;
setStopwatch3(0); // stopwatch nach treffern 1 - 9 auf 0
if (t == 10) // wenn t=10 dann
{
t2 = getStopwatch3(); // stopwatch3 wert für den 10. treffer
tg = t2-t1;
if (tg<520) // wenn tg < 520 move
{
move(100, FWD, DIST_MM(100), false);
setStopwatch3(0); //stopwatch3 na 10 treffern auf 0
t=0;
}
}
}
}
else
{
setMultiIOLED1(1);
setMultiIOLED1(0);
rotate(80, RIGHT, 1, false); // drehe rechts um 1 grad, nicht blockierend
setStopwatch3(0); //stopwatch3 nach rotate auf 0
}
}
}
/**************************/
uint8_t key_1;
key_1 = getMultiIOPressedButtonNumber();
if(key_1 != 0) break;
/**************************/
}
break;
Lesezeichen