Esimerkki ohjelmasta, joka koostuu neljästä askelleesta. Ohjelma seuraa teippiä lattiassa ja kääntyy teipin päässä. Askeleet eli ohjelman toiminnot ovat seuraavat:
- odotus
- ajo mustalle alueelle
- ajo valkoiselle alueelle
- kääntyminen teipin päässä
Tilakonemalli ohjelman toiminnasta
Code Block |
---|
#pragma config(Sensor, S1, kosketus2, sensorTouch) #pragma config(Sensor, S2, starttinappi, sensorTouch) #pragma config(Sensor, S3, ultra, sensorNone) #pragma config(Sensor, S4, RGB, sensorCOLORFULL) #pragma config(Motor, motorB, motorB, tmotorNormal, PIDControl, encoder) #pragma config(Motor, motorC, motorC, tmotorNormal, PIDControl, encoder) //*!!Code automatically generated by 'ROBOTC' configuration wizard !!*// // esitellaan funktio, jolla kysellaan halusta ajella robotilla int OnkoRobottiStartattuKosketusanturista(); void RobotinAjo(); // paaohjelma, jonka nimi on aina main task main() { while(1) // ikuinen silmukka alkaa tasta { RobotinAjo(); } // ikuinen silmukka loppuu tahan } void RobotinAjo() { // esitellaan muuttuja static maareella, jotta funktiossa sailyy edelliskerran arvo static int askel = 0; // 0 =odotusaskel 1 = aja mustalle, 2 = aja valkoiselle 3= kaanny teipin paassa // askel nollan iftoiminnot if(askel==0) // odotellaan starttausta { ClearTimer(T1); eraseDisplay(); nxtDisplayBigStringAt(0, 31,"odotellaan"); motor[motorC] = 0; motor[motorB] = 0; if(1==OnkoRobottiStartattuKosketusanturista()) // testataan koko ajan kayttajan halua ajaa robottia { askel=1; ClearTimer(T1); eraseDisplay(); nxtDisplayBigStringAt(0, 31,"a1 valkoinen"); motor[motorC] = 0; motor[motorB] = 80; } } // ifaskel 1 toiminnot if(askel==1) // ollaan valkoisella ja yritetaan mustalle { if(SensorValue(RGB) == 1) { askel=2; ClearTimer(T1); eraseDisplay(); nxtDisplayBigStringAt(0, 31,"a2 musta"); motor[motorC] = 80; motor[motorB] = 0; } if(0==OnkoRobottiStartattuKosketusanturista()) {askel=0; } if(time1[T1]>500) // ei loytynyt mustaa 0,5 sekunnissa { eraseDisplay(); nxtDisplayBigStringAt(0, 31,"a3 kaanto"); askel=3; } } // askel 2 toiminnot if(askel==2) //ollaan mustalla ja yritetaan valkoiselle { if(0==OnkoRobottiStartattuKosketusanturista()){askel=0;} if(SensorValue(RGB) != 1) //Poistuttiinko mustalta alueella { askel=0; // kun musta teippi loytyi niin vaihdetaan takaisin askeleelle yksi ClearTimer(T1); // nollataan ajastin seuraavaa suoraan ajoa varten motor[motorC] = 0; motor[motorB] = 80; } } } //askel 3 toiminnot if(askel==3) // kaannytaan paikoillaan ympari { motor[motorC] = -40; motor[motorB] = 40; // moottori peruuttaa if(SensorValue(RGB) == 1) // BLACKCOLOR) tultiinko takaisin mustalle alueella { askel=1; // kun musta teippi loytyi niin vaihdetaan takaisin askeleelle yksi ClearTimer(T1); // nollataan ajastin seuraavaa suoraan ajoa varten } } } // Talla funktiolla tutkitqaan takimmaisen kosketusanturin toimintaa // joka toisella panalluksella funktio palauttaa nollan ja robotin pitaisi pysahtya int OnkoRobottiStartattuKosketusanturista() { static int flipflop = 0; // esitellaan muuttuja staattisena, jotta se muistaa edellisen kerran tilansa static int flipAskel = 0; // 0=odotellaan napin painallusta 1=nappi painettu alas 2=nappi paastetty ylos 3=nappi toisen kerran alas int kosketus2Value=0; kosketus2Value = SensorValue(starttinappi); if(kosketus2Value==1 && flipAskel==0) // eka painallus alas { flipflop=1; flipAskel=1; } if(kosketus2Value==0 && flipAskel==1) // eka paasto { flipAskel=2; } if(kosketus2Value==1 && flipAskel==2) // toka kerta alas { flipflop=0; flipAskel=3; } if(kosketus2Value==0 && flipAskel==3) // toka kerta ylos { flipAskel=0; } return flipflop; } |