Rev 1 | Blame | Last modification | View Log | Download
// Soutezni robot pro Istrobot 2004// $Archive: /Lego/Callis/Callis_log.nqc $// $Date: 9.05.04 6:34 $// $Revision: 1 $#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 FORtask 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 prekazkuSetEvent(L, LSENSOR, EVENT_TYPE_PRESSED);SetEvent(R, RSENSOR, EVENT_TYPE_PRESSED);SetPower (ML,OUT_HALF); // vykon motoruSetPower (MR,OUT_HALF);movement=R;line=S;dira=0;// cikcak(); // toc se, abys nasel caru//!!! FL; FR; // vpredCreateDatalog(1000);// Sledovani carywhile(true){monitor( EVENT_MASK(L) | EVENT_MASK(R) ){//!!! FL; FR; // rovneWait(1);}catch (EVENT_MASK(L)){SetUserDisplay(2, 1);PlaySound(SOUND_CLICK);Wait(50);line=L; // zaznamenej, kdes videl carun=-dira;// AddToDatalog(n);dira=0; // nuluj pocitadlo diry, protoze jsme videli caru}catch (EVENT_MASK(R)){SetUserDisplay(3, 1);PlaySound(SOUND_LOW_BEEP);Wait(50);line=R; // zaznamenej, kdes videl carun=dira;// AddToDatalog(n);dira=0; // nuluj pocitadlo diry, protoze jsme videli caru}SetUserDisplay(1, 1);Wait(50);/*// 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 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;}}}}