Rev 1 | Blame | Last modification | View Log | Download
// Soutezni robot pro Istrobot 2004// Objeti cihly vpravo// $Archive: /Lego/Callis/Callis_R.nqc $// $Date: 27.04.04 20:52 $// $Revision: 3 $#define THRESHOLD 50 // rozhodovaci uroven mezi cernou a bilou#define ML OUT_A // Motory#define MR OUT_C#define FL OnFwd(ML) // Vpred#define FR OnRev(MR)#define BL OnRev(ML) // Vzad#define BR OnFwd(MR)#define RSENSOR SENSOR_3 // Senzory na caru#define LSENSOR SENSOR_1#define BUMPER SENSOR_2 // Senzor na cihlu#define MEZERA 38 // jak se muze jet dlouho bez cary#define COUVEJ 70 // kolik se ma couvat po detekci diry#define CIKCAK 40 // kolik se ma jet cik/cak#define PRES_DIRU 35 // jak predpokladame velkou diru#define L 0 // left#define R 1 // right#define S 2 // straight#define STOP Off(ML + MR); Wait(10); // zastav 8int movement; // smer minuleho pohybuint line; // na ktere strane byla detekovana caraint dira; // pocitadlo pro nalezeni preruseni caryint n; // pomocna promena pro cyklus FORvoid cikcak() // Hledani cary{n=CIKCAK/2; // poprve hned zatoc opacne, nez se jelo pred detekci diryswitch(movement) // zmenime smer zataceni{case L:FL; BR; // dopravamovement=R; // poznamenej kam jedemline=L; // kdyz prejedem, tak bude cara vlevobreak;case R:FR; BL; // dolevamovement=L; // poznamenej kam jedemline=R; // kdyz prejedem, tak bude cara vpravobreak;}while(true) // jed cik-cak, dokud nenajdes caru{if ((THRESHOLD < RSENSOR) || (THRESHOLD < RSENSOR)) // je cara ?{STOP;break;};if (CIKCAK < n++) // Jedeme uz dost dlouho cik? Pak jed cak.{n=0;STOP;switch(movement) // zmenime smer zataceni{case L:FL; BR; // dopravamovement=R; // poznamenej kam jedemline=L; // kdyz prejedem, tak bude cara vlevobreak;case R:FR; BL; // dolevamovement=L; // poznamenej kam jedemline=R; // kdyz prejedem, tak bude cara vpravobreak;}}}}task main(){PlaySound (SOUND_DOUBLE_BEEP);Wait(100); // 1sSetSensor(RSENSOR,SENSOR_LIGHT); // senzor na caru modry pravySetSensor(LSENSOR,SENSOR_LIGHT); // senzor na caru modry levySetSensor(BUMPER,SENSOR_TOUCH); // sensor na prekazkuSetPower (ML,OUT_FULL); // vykon motoruSetPower (MR,OUT_FULL);movement=R;line=S;dira=0;cikcak(); // toc se, abys nasel caruFL; FR; // vpred// Sledovani carywhile(true){if(BUMPER) // je cihla?{PlaySound(SOUND_DOWN);objizdka(); // objed cihlu}if (THRESHOLD < RSENSOR) // Cara pod pravym senzorem{dira=0; // nuluj pocitadlo diry, protoze jsme videli caruline=R; // zaznamenej, kdes videl caruFL; FR; // rovnecontinue;}if (THRESHOLD < LSENSOR) // Cara pod levym senzorem{dira=0; // nuluj pocitadlo diry, protoze jsme videli caruline=L; // zaznamenej, kdes videl caruFL; FR; // rovnecontinue;}// oba senzory mimo caruif (0==dira) // v prvnim cyklu po ztrate cary zacneme zahybat// v ostatnich cyklech nedelame nic (pro urychleni snimani){switch(line) // kdyz nevidis caru, tak jed tam, kdes ji videl naposled{case L:Off(ML); // dolevamovement=L; // poznamenej kam jedesbreak;case R:Off(MR); // dopravamovement=R; // poznamenej kam jedesbreak;};dira++; // zvets pocitadlo diry, aby to pristi cyklus tudy neslocontinue; // co nejrychleji se vrat na snimani cary}if (MEZERA < dira++) // nejedeme uz moc dlouho bez cary?{dira=0;PlaySound (SOUND_FAST_UP);switch(movement) // kam se jelo ?{case L:Off(ML); // couvej dopravaBR;Wait(COUVEJ+10);movement=R;break;case R:BL; // couvej dolevaOff(MR);Wait(COUVEJ);movement=L;break;}PlaySound(SOUND_CLICK);STOP; // konec couvaniFL; FR; // rovne pres diruWait(PRES_DIRU);STOP;cikcak(); // najdi caruFR; FL; // vpred} // dira} // while(true)}void objizdka(){BL; BR; // zacouvejWait(15);STOP;cikcak(); // vyrovnej se na carucikcak(); // radeji 3x, aby se vyrovnaly setrvacne silycikcak();FL; BR; Wait(23); // vpravoSTOP;FL; FR; Wait(65); // rovneSTOP;BL; FR; Wait(23); // vlevoSTOP;FL; FR; Wait(75); // rovneSTOP;BL; FR; Wait(23); // vlevoSTOP;FL; FR;Wait(20); // kousek rovne// rovne, dokud nenarazis na caruwhile(THRESHOLD > LSENSOR); // levej senzor, protoze cihla je levoSTOP;FL; BR; // toc se doprava, dokud nenarazis na caruwhile(THRESHOLD > RSENSOR); // pravej senzor, protoze cara je urcite vpravoSTOP;line=L; // caru predpokladame vlevo, kdybysme ji prejelidira=0;FL; FR; // vpred}