Rev 1 | Blame | Last modification | View Log | Download
#define THRESHOLD 44 // rozhodovaci uroven mezi cernou a bilou#define FTHRESHOLD 100 // Rozhodovaci uroven dalkoveho sensoru#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 // Sensory na caru#define LSENSOR SENSOR_1#define BUMPER SENSOR_2 // Dalkovy sensor#define L 0 // left#define R 1 // right#define S 2 // straightint movement; // smer minuleho pohybuint line; // na ktere strane byla detekovana caraint dira; // pocitadlo pro nalezeni preruseni caryvoid Straight() // rovne{FL;FR;movement=S;}void Left() // doleva{Off(ML);FR;movement=L;}void Right() // doprava{FL;Off(MR);movement=R;}task main(){PlaySound (SOUND_DOUBLE_BEEP);Wait(100); // 1sSetSensor(RSENSOR,SENSOR_LIGHT); // senzor na caru modry pravySetSensor(LSENSOR,SENSOR_LIGHT); // senzor na caru modry levy// sensor na prekazkuSetSensor(BUMPER,_SENSOR_CFG(SENSOR_TYPE_LIGHT, SENSOR_MODE_RAW));SetTxPower(TX_POWER_HI); // aby daleko videlSetPower (ML,OUT_FULL); // vykon motoruSetPower (MR,OUT_FULL);movement=S;line=S;dira=0;start cara;start cihla;}task cara() // sledovani cary{Straight();while(true){if (THRESHOLD < RSENSOR) // Cara vpravo{line=R; // cara zrejme bude na druhe stranedira=0; // nuluj pocitadlo diryswitch(movement){case L:Right();break;default:Straight();};}elseif (THRESHOLD < LSENSOR) // Cara vlevo{line=L; // zaznamenej, kdes videl carudira=0; // nuluj pocitadlo diryswitch(movement){case R:Left();break;default:Straight();};}else // sensory mimo caru{if (20 < dira++) // nejedeme uz moc dlouho bez cary?{PlaySound (SOUND_FAST_UP);switch(movement){case L:line=R; // cara zrejme bude na druhe straneOff(ML); //couvejBR;break;case R:line=L; // cara zrejme bude na druhe straneBL; // couvejOff(MR);break;};Wait(50); // zpet, ale ne uplne a kousek rovneStraight();Wait(5);dira=0; // myslime si, ze diru jsme vyresili};switch(line) // kdyz nevidis caru, tak jed tam, kdes ji videl naposled{case L:Left();break;case R:Right();break;};}} // while(true)}task cihla() // dalkovy sensor{int lastlevel;lastlevel = 0;while(true){SendMessage(0);if(lastlevel > BUMPER){PlaySound(SOUND_DOWN);stop cara;Off(ML); // zatim pouze zastavOff(MR);Wait(300);start cara;}lastlevel = BUMPER;lastlevel -= FTHRESHOLD;}}