Loomulikult oli päeva nael FLL-i laua kokkupanek.
Alljärgnevalt olulisi viiteid FLL-ga seoses.
NXT robotimaailm ja programmeerimine C-keeles
Loomulikult oli päeva nael FLL-i laua kokkupanek.
Alljärgnevalt olulisi viiteid FLL-ga seoses.
Käesolev võrratuste lahendamise juhend õpetab võrratusi lahendama Microsoft Mathematics (tasuta Microsofti tarkvara) abil ja neid graafiliselt kujutama.
Kui kahe avaldise (arvu) vahel on võrratusmärk (<, >, <= või >= ), siis sellist seost nimetatakse võrratuseks.
Võrratuste ja nende ettekujutamine joonisel annab parema mõistmise võrratuste lahendamisele.
Võrratustel võib olla
a) üks lahend
b) mitu või lõpmatu arv lahendeid
c) lahendid võivad puududa
Võrratuste lahendamine tähendab selle kõigi lahendite leidmist. Ülesanded võivad olla antud tekstiga „leia ühine positiivsus- või negatiivsuspiirkond“. Ka sellisel juhul on tegemist võrratuste lahendamise ülesannetega.
On antud järgmised võrratused, mis tuleb lahendada.
![]()
![]()
Võrratuse lahendamiseks tuleb see sisestada Mathematics töölehele (Worksheet) viisil, et nende võrratuste vahel on sõna and. See annab programmile teada, et tegemist on kahe võrratuse samaaegse lahendamisega.

Vajuta enter, tulemusena kuvatakse lahendus x > 3. See on mõlema võrratuse ühine piirkond.
Lisaks pannakse lahendatav võrrand sulgudesse, mis algab sõnaga solveIneq ja mille lõpus on „x“. SolveIneq tähendab et lahednatakse võrratust ja x tähistab, et seda lahendatakse muutuja x-suhtes. Mathematics leidis, et antud võrrandis on ainult üks muutuja ning eeldas, et kasutaja soovib leida just seda muutujat.

Selleks, et paremini mõista, mida tähendab võrratuse lahendamine graafiliselt, kuva antud tulemus joonisel. Selleks vajuta lingil „plot this inequality“. Joonisel on näha viirutatud ala, mis asub x-teljel number 3-st paremal. See iseloomustabki lahendust x > 3.
Selleks, et aru saada kuidas need kaks võrratust kokku sellise tulemuse annavad, kirjutame need üles võrranditena ja kuvame joonisel.
Töölehele sisesta see võrrand järgmisel kujul:
ja vajuta enter. Tulemusena kuvatakse võrrandi lahendid, kuid praegusel juhul huvitab meid rohkem graafik.
Vajuta lingile „plot both sides of this expression in 2D“. Kõrvutades antud tulemus esialgse võrratuse graafikuga, on näha et mõlemad graafikud on positiivsed alates kolmest, ehk siit jooniselt on lihtne välja lugeda nende võrratuste lahend x > 3.

Olgu antud kaks võrrandit ning ülesanne on leida ühine negatiivsuspiirkond.
![]()
![]()
Ülesande tekst nõuab, et need mõlemad võrrandid tuleb teisendada võrratusteks ja seejärel lahendada. Seega ülesande täitmiseks Mathematics abil on tarvis need võrratustena sisestada töölehele järgmisel kujul.
![]()
Mõlema võrrandi puhul on = y ära vahetatud võrratusega < 0. Ehk siis leitakse mõlema võrratuse ühised lahendid, mis on väiksemad kui 0.
Sisesta see Mathematics töölehele ja vajuta enter. Mathematics annab lahenduseks 3 varianti: x < -1, x > 5/3 ja x < 3.
Kuvame selle tulemuse graafikul, vajutades lingil „plot this inequality“. Graafiline lahendus on viirutatud ala joonisel.

Vaata nüüd kuidas need graafikud joonisel välja näevad ja miks tekkis lahenduseks selline situatsioon.
Sisesta antud võrrandid töölehele ja vajuta enter.
![]()

Kuva need graafikud joonisel vajutades linki „plot both sides of this expression in 2D“. Alljärgneval joonisel on näha graafiliselt tulemus mõlema graafiku negatiivsest piirkonnast. See on vasakul pool y-telge alates sellest punktist kus parabool on allpool x-telge. Y-teljest paremal pool on näha väike kolmnurkne piirkond, kus parabool on allpool x telge ning sirge pole veel jõudnud veel x-telge ületada.

Käesolev võrrandite lahendamise juhend õpetab võrrandeid lahendama Microsoft Mathematics (tasuta Microsofti tarkvara) abil ja neid graafiliselt kujutama.
Võrrandite ja nende kuvamine joonisel annab parema mõistmise võrrandite lahendamisele.
Võrranditel võib olla
a) üks lahend
b) mitu või lõpmatu arv lahendeid
c) lahendid võivad puududa
Antud võrrandi mõlemal pool on ruutvõrrand seega on siin situatsioon, kus üks ruutvõrrand võrdub teise ruutvõrrandiga.
![]()
1. Kirjuta Mathematics töölehele (Worksheet) ülaltoodud võrrand ja vajuta enter.

2. Mathematics väljastab koheselt võrrandi tulemuse, x=-3.
Lisaks pannakse lahendatav võrrand sulgudesse, mis algab sõnaga solve ja mille lõpus on „x“. See tähendab et antud võrrand lahendatakse muutuja x-suhtes. Mathematics leidis, et antud võrrandis on ainult üks muutuja ning eeldas, et kasutaja soovib leida just seda muutujat.

3. Kuna tegemist on numbrite ja x-dega mida on keeruline hoomata, tekib paratamatult küsimus et mis asi on õigupoolest see x mida otsitakse. Sellise võrrandi lahendust on kõige lihtsam mõista graafikul. Vajuta lingile „ploth both sides of this expression in 2D“, et näha antud lahendust joonisel.
Selle lingi vajutamise järel suunatakse kasutaja automaatselt joonise (Graphing) vahelelehele ja kuvatakse antud võrrand graafikul. Joonisel on näha kaks joont, kummagi võrrandi poole jaoks üks joon. Joonise kohal kuvatakse mõlemad võrrandid vastava värviga, millele need joonisel vastavad.
Toodud joonisel on näha, et x, mida otsitakse on mõlema võrrandi lõikekoht x-teljel, mis asubki täpselt -3 peal.
![]()
Sisesta võrrand Worksheet lehele, vajuta enter ja kuva lahendus joonisel. Näeme, et mõlemal võrrandi poolel asuvad lineaarvõrrandid ehk sirged ning neil on ühine lõikepunkt x-teljel, x=1/8=0,125.

![]()
Käesoleva võrrandi esimene pool on absoluutväärtus ruutvõrrandist ning teine pool tavaline sirge ehk lineaarvõrrand. Sellel võrrandisüstemil on kolm lahendust, see tähendab et mõlema graafiku lõikuvad üksteisega kolmel korral: x=-3, x=2, x=0.

Vaatame jooniselt kuidas selline kolme x-ga lahendus on võimalik.
Joonisel on näha, et ruutvõrrandi kaar mis tavaliselt on allpool x-telge on nüüd ülespoole keeratud. Põhjus on selles, et antud ruutvõrrand on absoluutväärtuse märkide vahel, st see ei saa olla negatiivne. Selle tulemusena ongi võimalik saavutada kolm puutepunkti sirgega.

See materjal on loodud Tiigrihüppe Sihtasutuse programmi ProgeTiiger raames.
Ehitada ja programmeerida robot, mis suudab ekraanile kuvada oma läbitud teekonna.
Käesoleva ülesande lahendamine kestab 2 robootika tundi, kusjuures ühe tunni pikkuseks on arvestatud 2x45 min.
Õpilased peavad olema hästi kursis matemaatikaga ja oskama arvutada täisnurkse kolmnurga külgede pikkuseid nii koosinuse kui ka siinuse abil.
Õpilane peab arvesse võtma ülesande lahendamisel järgmisi asjaolusid:
1) Ratta läbimõõt
2) Rataste teljevahe
3) Peab oskama tuletada roboti pöördenurga, kui ülejäänud muutujad on teada
![]()
4) Peab oskama arvutada kolmnurga lähiskaateti pikkust tervanurga ning hüpotenuusi abil
![]()
5) Peab oskama arvutada vastaskaateti pikkust teravnurga ning hüpotenuusi abil
![]()
6) Peab oskama aru saada NXT koordinaatteljestikust, mis on mõõtudega 100x64 pikselit
Lahenduse koodi pole mõttekas õpilastele ette anda, tegemist on nii lihtsa koodiga, et selle mahakirjutamine võtaks aega 10 min, kuid tarkus jääks tulemata.
Ülesanne on jaotatud neljaks etapiks mille käigus õpilased jõuavad järk-järgult lahenduseni.
Etapid ja õppetundide jaotus:
1. Tund
a. Roboti pöördenurga leidmine rataste pöördenurga abil
b. Kolmnurga lahendamine, lähis- ja vastaskaatetite leidmine (siinus, koosiinus)
2. Tund
a. Roboti pöördenurk ning kolmnurga lahendamine kokku pandud (suunamõõdik ekraanil)
b. Lõplik ülesande lahendus
Selle etapi eesmärk on lasta õpilastel jõuda valemini, mille abil saab teisendada roboti rattakeeramise kraadid roboti enda pööramise kraadideks. See on vajalik, kuna ülesande lahendus baseerub omadusel, et meil on teada igal hetkel rataste omavahelise pöördenurga vahe.

Kõige lihtsam on tuua näide seisva robotiga, kus meil on teada et üks ratas seisab ja teine ratas pöörab näiteks 360 kraadi, ehk teeb ühe tiiru. Sellisel juhul saame roboti pöördenurgaks 90 kraadi, eeldusel et rataste teljevahe on 110 mm ja diameeter 56 mm.
Õpilased on varasemalt lahendanud ülesandeid, mille käigus nad on pidanud vastupidist ülesannet lahendama, st. et on teada mitu kraadi peab robot pöörama ning õpilased peavad välja arvutama mitu kraadi peab ratas pöörama, et saavutada roboti õige positsioon.
Õpilased on siiani kasutanud valemit:
![]()
Käesoleva ülesande käigus peavad õpilased algatuseks avaldama valemist RobotiPöördenurga.
Kui neil on valem õigesti avaldatud, kirjutavad nad programmi, mille abil saab kuvada roboti pöördenurga ekraanile numbriliselt. See annab neile kohest tagasisidet, kas nad on õigesti avaldanud RobotiPöördenurga ning seda ka õigesti rakendada oskavad.
Antud etapi lahendus on alljärgnev programmikood.
//käesolev programm kuvab ekraanil roboti pöördenurga
//roboti mootorite pöörete järgi arvutatakse välja roboti pöördenurk
//ja kuvatakse see ekraanil
//testimiseks tuleb robotit käsitsi liigutada.
//Roboti pööramise nurk = (Diameeter * x kraadi)/(Rataste vahe * 2)
task main()
{
int RattaDiameeter = 56; //ratta diameeter
int RatasteVahe = 110; //ratastevaheline kaugus, teljevahe
int suund; //mootori pöörete vahe
float BMootor; //mootori B pöörded
float CMootor; //mootori C pöörded
int RobotiNurk; //roboti pööramise nurk
while (1)
{
//mootorite pöörded loetakse muutujatesse
BMootor = MotorRotationCount(OUT_B);
CMootor = MotorRotationCount(OUT_C);
//lahutatakse ühe mootori pöördenurgast teise mootori pöördenurk
//tulemuseks on ratastevaheline erinevaus pöördenurgas
suund = BMootor - CMootor;
//siin arvutatakse välja roboti pöördenurk, võttes arvesse rataste läbimõõtu
//rataste teljevahe ja ratastevaheline kraadide erinevus
RobotiNurk = (RattaDiameeter * suund)/(RatasteVahe * 2);
ClearLine(LCD_LINE1);
//ekraani ülemisel real kuvatakse roboti nurk
NumOut(0, LCD_LINE1, RobotiNurk);
TextOut(30, LCD_LINE1, "kraadi");
}
}
Selle etapi eesmärk on lasta õpilastel lahendada kolmnurk, mille kohta on teada üks teravnurk ning hüpotenuus. Leida on tarvis lähiskaateti ja vastaskaateti pikkused.
Lahendatud kolmnurk tuleb kuvada ekraanil ning peab olema muutumises koos nurga muutmisega. Nurga muutmine teostada noolenuppudega parem-vasak, sammuga 5 kraadi.
Antud etapp on olulise tähtsusega, kuna selle abil jõuavad õpilased ülesande lõpuks äratundmisele, kuidas aitab kolmnurga lahendamine neid robootika liikumisülesande juures teekonna kuvamisel. Neil peaks tekkima side matemaatika õppimise vajaduse ja reaalse elu vahel.
Kolmnurga lähis- ja vastaskaateti pikkuste arvutamise valemid. Vaata joonist.
![]()
![]()

Kui nad on kolmnurga lahendamisest aru saanud, tuleb selle kohta programm kirjutada. Programm võiks välja näha selline, et hüpotenuus on ette antud (ülesande lahenduses on see samuti mittemuutuv suurus), kuid nurka peab saama muuta ja tulemusena kuvatakse ekraanil kolmnurga lähis- ja vastaskaatetite pikkused.
Kolmnurga lahendamise programmikood.
//käesolev programm lahendab kolmnurga
//ja joonistab selle ekraanile
//lähiskaatet = teravnurga koosinu * hüpotenuus
//vastaskaatet = teravnurga siinus * hüpotenuus
task main()
{
int RobotiNurk=45; //roboti pööramise nurk
int Lkaatet; //lähiskaatet
int Vkaatet; //vastaskaatet
int Hypotenuus=80; //hüpotenuus
while (1)
{
ClearScreen();
TextOut(0, LCD_LINE1, "Sisesta nurk");
NumOut(85, LCD_LINE1, RobotiNurk);
if(ButtonPressed(BTNCENTER, FALSE))
{
while(ButtonPressed(BTNCENTER, FALSE));
break;
}
if(ButtonPressed(BTNRIGHT, FALSE))
RobotiNurk += 5;
while(ButtonPressed(BTNRIGHT, FALSE));
if(ButtonPressed(BTNLEFT, FALSE))
RobotiNurk -= 5;
while(ButtonPressed(BTNLEFT, FALSE));
//arvutatakse välja lähiskaateti pikkus
Lkaatet = cosd(RobotiNurk) * Hypotenuus;
//arvutatakse välja vastaskaateti pikkus
Vkaatet = sind(RobotiNurk) * Hypotenuus;
TextOut(0, LCD_LINE2, "Lkaat");
TextOut(50, LCD_LINE2, "Vkaat");
NumOut(35,LCD_LINE2, Lkaatet);
NumOut(85,LCD_LINE2, Vkaatet);
//ekraanile joonistatakse lähiskaatet
LineOut(1, 1, Lkaatet, 1);
//ekraanile joonistatakse vastaskaatet
LineOut(Lkaatet, 1, Lkaatet, Vkaatet);
//ekraanile joonistatakse hüpotenuus
LineOut(1, 1, Lkaatet, Vkaatet);
Wait(100);
}
}
Selle etapi eesmärk on panna kokku esimene ja teine etapp, ehk siis ühendada omavahel roboti pöördenurga arvutamine ja kolmnurga lahendamine.
Etapi lõpptulemusena valmib NXT ekraanile suunanäidik, mis näitab suunda kuhu poole robot sõidab. Seda omadust kasutame lõpplahenduses roboti teekonna kuvamiseks.
Roboti suunanäitamise programmi kood.
//käesolev programm kuvab ekraanile roboti liikumise suuna
//Roboti pööramise nurk = (Diameeter * x kraadi)/(Rataste vahe * 2)
//lähiskaatet = teravnurga koosinu * hüpotenuus
//vastaskaatet = teravnurga siinus * hüpotenuus
task main()
{
int RattaDiameeter = 56; //ratta diameeter
int RatasteVahe = 110;//ratastevaheline kaugus, teljevahe
intsuund; //mootori pöörete vahe
float BMootor;//mootori B pöörded
float CMootor;//mootori C pöörded
int RobotiNurk;//roboti pööramise nurk
int Lkaatet;//lähiskaatet
int Vkaatet;//vastaskaatet
int Hypotenuus=60;//hüpotenuus
while (1)
{
//mootorite pöörded loetakse muutujatesse
BMootor = MotorRotationCount(OUT_B);
CMootor = MotorRotationCount(OUT_C);
suund = BMootor - CMootor;
//siin arvutatakse välja roboti pöördenurk, võttes arvesse rataste läbimõõtu
//rataste teljevahe ja ratastevaheline kraadide erinevus
RobotiNurk = (RattaDiameeter * suund)/(RatasteVahe * 2);
//arvutatakse välja lähiskaateti pikkus
Lkaatet = cosd(RobotiNurk) * Hypotenuus;
//arvutatakse välja vastaskaateti pikkus
Vkaatet = sind(RobotiNurk) * Hypotenuus;
ClearScreen();
//ekraanile joonistatakse roboti suunanäidik
LineOut(50, 25, Vkaatet+50, Lkaatet+25);
//ekraani ülemisel real kuvatakse roboti nurk ning lähis- ja vastaskaatet
NumOut(0, LCD_LINE1, RobotiNurk);
NumOut(50,LCD_LINE1, Lkaatet);
NumOut(80,LCD_LINE1, Vkaatet);
Wait(100);
}
}
Alljärgnevalt roboti teekonna kaardistamise programmi kommenteeritud kood.
Sisuliselt tekib ekraanile joon hästi paljude pisikeste kolmnurkade lahendamise tulemusena.
Siin on lisandunud eelkirjeldatud etappidega võrreldes kaks olulist võtet.
1. Kaardistamise sageduseks kasutatakse rataste pöörlemist. Kui ükskõik kumb ratas teeb 360 kraadi, ehk ühe täisringi, arvutatakse ja salvestatakse selle hetke roboti olukord ekraanil. See võte on vajalik eelkõige seetõttu, et robot ei suuda ühe rattapöörde jooksul kuigi palju viga teha ning see on piisav et saada küllaltki täpne joon ekraanil. Alati võib proovida ise selle täpsust suurendada, vähendades roboti rataste kraadide arvu mille jooksul toimub kaardistamine.
2. Kolmnurga hüpotenuusi seadmine. See võimaldab muuta ekraanile kujutatava joone pikkust ja täpsust. Kui hüpotenuus panna liiga lühike, näiteks 2 punkti, siis on kaatetite tulemuseks ainult 1 või 0 ning joone täpsus kannatab olulisel määral. Kui aga hüpotenuus panna liiga pikk, joonistatakse ekraanile korraga väga pikk joon, mis on samuti mõttetu ekraani väikse pinna tõttu.
Ekraanipilt antud programmi tulemusest NXT ekraanil.
//käesolev programm on roboti teekonna kaardistaja
//roboti mootorite pöörete järgi arvutatakse välja roboti teekonna kaart
//ja kuvatakse see ekraanil
//task soida on lihtsalt roboti sõitmise ja kaardistamise testimiseks
//task sõida abil sõidab robot südame kujutise ning joonistab selle ka ekraanile
task soida()
{
while(1)
{
RotateMotorEx(OUT_BC, 40, 360, 0, TRUE, TRUE);
RotateMotorEx(OUT_BC, 40, 360, 15, TRUE, TRUE);
RotateMotorEx(OUT_BC, 40, 1300, 0, TRUE, TRUE);
RotateMotorEx(OUT_BC, 40, 1600, -20, TRUE, TRUE);
RotateMotorEx(OUT_BC, 40, 370, 100, TRUE, TRUE);
RotateMotorEx(OUT_BC, 40, 1400, -25, TRUE, TRUE);
RotateMotorEx(OUT_BC, 40, 1300, 0, TRUE, TRUE);
//sõidu lõppedes oodatakse kuni nuppu vajutatakse
while(!ButtonPressed(BTNCENTER, FALSE));
}
}
//siin paar abivalemit, mille alusel arvutatakse roboti teekonna kaart
//Roboti pööramise nurk = (Diameeter * x kraadi)/(Rataste vahe * 2)
//lähiskaatet = teravnurga koosinus * hüpotenuus
//vastaskaatet = teravnurga siinus * hüpotenuus
task main()
{
int RattaDiameeter = 56; //ratta diameeter
int RatasteVahe = 110; //ratastevaheline kaugus, teljevahe
int suund; //mootori pöörete vahe
float BMootor; //mootori B pöörded
float CMootor; //mootori C pöörded
float LastBMootor;
float LastCMootor;
int RobotiNurk; //roboti pööramise nurk
int Lkaatet=0; //lähiskaatet
int Vkaatet=50; //vastaskaatet
int xLkaatet;
int xVkaatet;
int Hypotenuus=6; //hüpotenuus, selle numbri ja nurga põhjal arvutatakse välja Lähis- ja Vastaskaatet
StartTask(soida);
while (1)
{
//mootorite pöörded loetakse muutujatesse
BMootor = MotorRotationCount(OUT_B);
CMootor = MotorRotationCount(OUT_C);
//antud if lause tingimus on võte, millega tagatakse kaardistamise sagedus
//1 rattapööre = 1 joonistus ekraanil
//seega antud if lause käivitub alles siis, kui B või C Mootor on teinud 360 kraadi
if (BMootor > LastBMootor+360 || CMootor > LastCMootor + 360)
{
LastBMootor = BMootor;
LastCMootor = CMootor;
suund = BMootor - CMootor;
//siin arvutatakse välja roboti pöördenurk, võttes arvesse rataste läbimõõtu
//rataste teljevahe ja ratastevaheline kraadide erinevus
RobotiNurk = (RattaDiameeter * suund)/(RatasteVahe * 2);
//eelmise tsükli käigus saadud lähis- ja vastaskaatet salvestatakse ajutisse muutujasse
//selle alusel määratakse ekraanil joone alguspunkt
xLkaatet = Lkaatet;
xVkaatet = Vkaatet;
//arvutatakse välja lähiskaateti pikkus
Lkaatet = cosd(RobotiNurk) * Hypotenuus;
//arvutatakse välja vastaskaateti pikkus
Vkaatet = sind(RobotiNurk) * Hypotenuus;
//välja arvutatud lähis- ja vastaskaatetile liidetakse juurde nende
//eelmise tsükli tulemus, et tagada joone jätkumine samast punktist
//kus eelmise tsükli aja lõpetati
Vkaatet += xVkaatet;
Lkaatet += xLkaatet;
//kui kaatetid omandavad väärtuse mis on ekraani piirdeist väljas
//siis korrigeeritakse numbreid selliselt, et joon jätkuks ekraani vastasservast
if (Vkaatet>100)
{
Vkaatet = 1;
xVkaatet = 1;
}
if (Vkaatet<1)
{
Vkaatet = 100;
xVkaatet = 100;
}
if (Lkaatet>48)
{
Lkaatet = 1;
xLkaatet = 1;
}
if (Lkaatet<1)
{
Lkaatet = 48;
xLkaatet = 48;
}
//ekraanile joonistatakse roboti teekonna joon
LineOut(xVkaatet, xLkaatet, Vkaatet, Lkaatet);
ClearLine(LCD_LINE1);
//ekraani ülemisel real kuvatakse roboti nurk ning lähis- ja vastaskaatet
NumOut(0, LCD_LINE1, RobotiNurk);
NumOut(50,LCD_LINE1, Lkaatet);
NumOut(80,LCD_LINE1, Vkaatet);
}
}
}
See materjal on loodud Tiigrihüppe Sihtasutuse programmi ProgeTiiger raames.
Robot peab sõitma täisnurkse kolmnurga hüpotenuusi ühest tipust teise (külg c), kusjuures teada on vaid kaatetite pikkused (küljed a ja b) ja robot asub alguses kolmnurga tipus paralleelselt kaatetiga.
Alljärgneval joonisel on näidatud roboti algne asukoht ja lõpp-positsioon.

Robot peab iseseisvalt lahendama nurga ja teepikkuse arvutamise. Kusjuures robot peab olema võimalikult sõltumatu rataste suurusest ja rataste omavahelisest kaugusest.
Robot peab olema sõltumatu kolmnurga külgede pikkustest. Selle saab tagada võttega, et programmi alguses küsib robot kasutaja käest lõikude a ja b pikkuseid, mille annab ette õpetaja. Peale lõikude sisestamist käivitub programm mis pöörab robotit vajaliku hulga kraade ning robot sõidab nõutud teepikkuse jõudes kolmnurga teise tippu.
NB! Õpilastel võiksid olla sellised robotid, millel saab kerge vaevaga rattaid vahetada suuremate-väiksemate vahel kuna see mõjutab otseselt programmi käitumist. Ratta suurus võib olla samuti alguse küsimus, mida kasutajalt küsitakse programmi käivitamisel. Alljärgnevas programminäites seda tehtud pole, kuid olemasoleva koodi analoogia põhjal on see kergesti teostatav.
Ülesanne baseerub lihtsal matemaatikal ning teada on tarvis kahte valemit.
Tähistame tundmatud nimedega PöördeNurk ja teepikkus ehk c.
1) Pöördenurga arvutamiseks on valem: ![]()
2) Teepikkuse arvutamiseks on Pythagorase teoreem ![]()
Tunni läbiviimise metoodika.
Anda õpilastele kätte ülesanne ja tingimused. Kogu edasise võiksid olla nad suutelised ise välja mõelda.
Kui tarvis siis järgmise asjana võib tahvlile kirjutada pöördenurga arvutamise valemi ja Pythagorase teoreemi juhuks kui need kohe meelde ei tule.
Kogu edasine protsess peaks olema nende enda looming. Alljärgnev on üks võimalik lahendus käesolevale ülesandele.
Muutujatena on kirjeldatud ratta diameeter ning rataste telje vahe. Kogu ülejäänud matemaatika toimub programmi siseselt.
//Robot peab sõitma täisnurkse kolmnurga hüpotenuusi ühest tipust teise (külg c),
//kusjuures teada on vaid kaatetite pikkused (küljed a ja b)
//ja robot asub alguses kolmnurga tipus paralleelselt lähiskaatetiga.
//
float WheelDiameter = 56; //ratta diameeter
float Wheel; //ratta ümbermõõt
float TeljeVahe = 110; //rataste telje vahe
float a=30; //külg a sentimeetrites
float b=40; //külg b sentimeetrites
float TeePikkus;
float PoordeNurk;
task main(){
Wheel = WheelDiameter * PI;
//järgmine tsükkel võimaldab kasutajal valida kolmnurga lähiskülje pikkuse
//algne pikkus 30cm, seda saab suurendada/vähendada 10 cm kaupa
while (TRUE){
TextOut(0, LCD_LINE2, "Sisesta lahiskylg");
NumOut(30, LCD_LINE3, a);
if(ButtonPressed(BTNCENTER, FALSE))
{
while(ButtonPressed(BTNCENTER, FALSE));
break;
}
if(ButtonPressed(BTNRIGHT, FALSE))
a += 10;
while(ButtonPressed(BTNRIGHT, FALSE));
if(ButtonPressed(BTNLEFT, FALSE))
a -= 10;
while(ButtonPressed(BTNLEFT, FALSE));
Wait(MS_100);
ClearScreen();
}
//järgmine tsükkel võimaldab kasutajal valida kolmnurga vastaskülje pikkuse
//algne pikkus 40cm, seda saab suurendada/vähendada 10 cm kaupa
while (TRUE){
TextOut(0, LCD_LINE2, "Sisesta vastaskylg");
NumOut(30, LCD_LINE3, b);
if(ButtonPressed(BTNCENTER, FALSE))
{
while(ButtonPressed(BTNCENTER, FALSE));
break;
}
if(ButtonPressed(BTNRIGHT, FALSE))
b += 10;
while(ButtonPressed(BTNRIGHT, FALSE));
if(ButtonPressed(BTNLEFT, FALSE))
b -= 10;
while(ButtonPressed(BTNLEFT, FALSE));
Wait(MS_100);
ClearScreen();
}
ClearScreen();
//ekraanil kuvatakse valitud lähiskülje ning vastaskülje pikkused
NumOut(70, LCD_LINE1, a);
NumOut(70, LCD_LINE2, b);
TextOut(0, LCD_LINE1, "Lahiskylg:");
TextOut(0, LCD_LINE2, "Vastaskylg:");
//arvutatakse välja pöördenurk ja teepikkus
PoordeNurk = atan2d(b, a);
TeePikkus = sqrt(b*b+a*a);
//pöördenurk ja teepikkus kuvatakse ekraanil
TextOut(0, LCD_LINE3, "Poordenurk:");
TextOut(0, LCD_LINE4, "Teepikkus:");
NumOut(70, LCD_LINE3, PoordeNurk);
NumOut(70, LCD_LINE4, TeePikkus);
//Pöördenurk ja teepikkus teisendatakse robotile arusaadavateks ühikuteks
//pöördenurk saab uue väärtuse väljendades roboti jaoks seda
//mitu kraadi peab rattaid pöörama et robot keeraks soovitud hulga kraade
PoordeNurk = (PoordeNurk * TeljeVahe) / WheelDiameter;
//teepikkus saab uue väärtuse väljendades roboti jaoks seda
//mitu kraadi peab rattaid pöörama, et robot läbiks vajaliku teepikkuse
TeePikkus = TeePikkus * 10 / Wheel * 360;
//robot pöörab vajaliku nurga
RotateMotorEx(OUT_BC, 50, PoordeNurk, -100, TRUE, TRUE);
Wait(MS_100);
//robot sõidab edasi vajaliku teepikkuse
RotateMotorEx(OUT_BC, 75, TeePikkus, 0, TRUE, TRUE);
//programm jääb lõpus ootama, kuni kasutaja vajutab nuppu
//senikaua kuvatakse ekraanil roboti poolt välja arvutatud numbrid
while(!ButtonPressed(BTNRIGHT, FALSE));
}
See materjal on loodud Tiigrihüppe Sihtasutuse programmi ProgeTiiger raames.
Ping-pong mäng seisneb selles, et ekraanil põrkab edasi-tagasi ja paremale-vasakule pall mis võib ekraani altservast nö. maha kukkuda. Palli ekraanil hoidmiseks on allservas värav mida saab nooltega paremale vasakule liigutada ning mille pealt pall on võimeline tagasi põrkama.
Õppetundide jaotuse aluseks on arvestatud ühe tunni kestuseks 2x45 min.
1. Tund.
a. Töötava mängu tutvustamine NXT peal
b. Programmi algoritmi tutvustamine
c. Värava liigutamise funktsiooni loomine.
2. Tund
a. Palli liigutamise funktsiooni kirjutamine
b. Palli ja värava alamprogrammide kokkupanek
3. Tund
a. Raskusastme lisamine
b. Punktiarvestuse lisamine ja initsialiseerimine
c. Mäng valmis
Vaata joonist. Programmi käivitudes küsitakse kasutajalt mängu keerukust, peale selle valmisit lähevad paralleelselt käima kaks alamprogrammi: värava liigutamine ja palli põrkamine. Need kestavad seni kuni pall kukup ekraani altservast välja. Selle peale katkestatakse mäng, kuvatakse kasutajale tema punktisumma, küsitakse uuesti mängu keerukust ja seepeale algab mäng otsast peale.
1. Värava liigutamise funktsioon
2. Palli liigutamise funktsioon (lõpmatult ekraanil põrkamas)
3. Palli ja värava liigutamise funktsioonid kokku pandud (kas pall põrkas?)
4. Raskusastme valimine
5. Punktiarvestuse lisamine ja initsialiseerimine
6. Lõplik mängu kood
Koos kommentaaride ja tühjade ridadega (koodi parema loetavuse nimel) on programmi pikkus ca 220 rida.
Antud funktsiooni eesmärgiks on liigutada väravat paremale ja vasakule. Kui nuppu hoitakse alla, liigub värav sõites ühte või teise serva.
int Dash;
//Gate protseduur joonistab ekraanile värava
//antud alamprotseduur kutsutakse välja värava liigutamise juurest
void Gate(int i){
ClearLine(LCD_LINE8);
TextOut(i, LCD_LINE8, "__");
}
//MoveTheGate funktsioon liigutab väravat paremale/vasakule
task MoveTheGate(){
while (TRUE) {
//liigutame värava paremale kuni lõpuni
if (ButtonPressed(BTNRIGHT, TRUE)){
//väravat liigutatakse 5 pikseli kaupa
//kui ollakse piksli 85 juures jääb seisma ning värav on paremal
if (Dash < 85)
Dash += 5;
else
Dash = 85;
}
//liigutame väravat vasakule kuni algusesse
else if (ButtonPressed(BTNLEFT, TRUE)){
//väravat liigutatakse 5 piksli kaupa vasakule
//kui ollakse 1 piksli juures jääb seisma ning värav on vasakul
if (Dash > 1)
Dash -= 5;
else
Dash = 1;
}
//kutsutakse välja alamprotseduur Gate mis joonistab värava asukoha
//vastavalt oma parameetrile dash
Gate(Dash);
//ootame 0,1 sekundit, et värav liiguks paraja kiirusega
Wait(100);
}
}
task main(){
StartTask(MoveTheGate);
}
Antud funktsioon paneb palli ekraanil põrkama ning tulemuseks on palli lõpmatu põrkumine ekraanil 45 kraadise nurga all servade suhtes.
Pall liigub igas suunas ühe pikseli ehk punkti kaupa. Ekraani kõrgus on 64 ja laius 100 pikselit ehk punkti. Ülemist serva kontrollime numbriga 56 ja paremat numbriga 93, kuna ekraanil liigub tegelikkuses „o“ täht ja NXT arvestab selle tähe asukohta vasaku-alumise nurga järgi.
int Ball_X; //palli asukoht x teljel
int Ball_Y; //palli asukoht y teljel
bool Yles; //palli liikumise suund üles-alla
bool Paremale; //palli liikumise suund paremale-vasakule
int Ball_Last_X; //palli eelmine asukoht
int Kiirus = 60; //palli liikumise kiirus, kasutatakse raskusastme määramisel hiljem
//funktsioon Ball joonistab ekraanile palli
void Ball(int k, int i, int j){
ClearLine(k);
TextOut(j, i, "o");
}
//MoveTheBall liigutab palli üles-alla paremal-vasakule
task MoveTheBall(){
while (TRUE)
{
//Ball_Last_X postisioon on vajalik, et õige ekraani rida ära puhastada
//seega, algselt salvestatakse palli asukoht ajutisse muutujasse
Ball_Last_X = Ball_X;
//pall liigub üles
if (Yles)
Ball_X += 1;
//pall liigub alla
else
Ball_X -= 1;
//pall liigutatakse paremale
if (Paremale)
Ball_Y += 1;
//pall liigutatakse vasakule
else
Ball_Y -= 1;
//kutsutakse välja palli asukohta muutmise funktsioon
//esimene parameeter määrab rea mis kustutatakse
//teine ja kolmas parameeter määravad palli asukoha
Ball(Ball_Last_X, Ball_X, Ball_Y);
//kontrollitakse kas pall on all või üleval
//vastavalt olekule põrkab pall järgmise tsükli käigus vastassuunas
if (Ball_X > 56)
Yles = FALSE;
else if (Ball_X <= 2)
Yles = TRUE;
//kontrollitakse/juhitakse, kas pall peab paremale-vasakule põrkama
if (Ball_Y > 93)
Paremale = FALSE;
else if (Ball_Y < 1)
Paremale = TRUE;
//palli liikumise kiirus, edaspidi kasutatakse raskusastme jaoks
Wait(Kiirus);
}
}
task main ()
{
StartTask(MoveTheBall);
}
Palli ja värava liigutamise funktsioonid kokkupandult tähendavad seda, et pall saab alla jõudes aru, kas tema alla on värav või mitte. Kui palli all on värav, põrkab pall üles tagasi või muidu kukub ekraani alt läbi ja mäng on läbi.
Antud funktsioonide kokkupanekul muutub palli liigutamise alamprogramm, värava liigutamine jääb samaks, seal ei muutu midagi. Seega värava liigutamise alamprogrammi siinkohal kordama ei hakka.
Palli liigutamise alamprogrammis muutub ainult koht koodis, mis kontrollib kas pall on all, seega välja on ainult see osa toodud.
//kontrollitakse kas pall on all või üleval
//vastavalt olekule põrkab pall järgmise tsükli käigus vastassuunas
if (Ball_X > 56)
Yles = FALSE;
//kontrollitakse kas pall on all
if (Ball_X <= 2)
{
//kui pall põrkab vastu alust, saad punkti
//ja pall liigub järgmise tsükli käigus üles
//aluse kontroll on alusest 8 pikslit paremale või 5 vasakule
//seega värava laiuseks on tegelikkuses 13 pikselit
if (Ball_Y >= Dash-5 && Ball_Y <= Dash + 8)
{
Yles = TRUE;
}
//kui pall ei põrka vastu alust
else
//kui pall ei põrka vastu alust, on mäng läbi
{
PlayTone(500, MS_20);
StopTask(MoveTheGate);
ExitTo(main);
}
}
Muutub ka alamprogramm main(), kus peab välja kutsuma kaks alamprogrammi. Alamprogrammid MoveTheGate ja MoveTheBall käivad paralleelselt, kuid alljärgnevas koodis on näha, et kõigepealt käivitatakse MoveTheGate() ja seejärel väljutakse main()-st ja käivitatakse MoveTheBall(). Selline koodijärjestus on vajalik, kuna kui käivitades lihtsalt mõlemad alamprogrammid käsuga StartTask lõpeb mõlema käivitamise järel main() programm ning rakendus sulgub koheselt.
NB! Selle küsimuse võib jätta koduseks ülesandeks: Miks käivitatakse paralleelselt käivad alamprogrammid alljärgneval moel ja mitte ei käivitata mõlemaid käsuga StartTask?
task main ()
{
StartTask(MoveTheGate);
ExitTo(MoveTheBall);
}
Lisaks tuleb koodi algusesse kirjutada alljärgnev rida. See deklareerib kompilaatorile, et eksisteerib alamprogramm nimega main(), mida kasutatakse MoveTheBall() alamprogrammis. Kompilaator kompileerib koodi järjest ning kui kõige alguses ei oleks deklareeritud main(), tekiks kompileerimisel viga kui programmi koodis kasutatakse viidet main()-le, kuna kompilaator ei tea veel, et see alamprogramm eksisteerib.
task main();
Raskusastme valimisega muutuvad mängus 2 omadust.
1) Esiteks muutub palli liikumise kiirus, mis teeb mängimise raskemaks.
2) Teiseks muutub punktiarvestus: kui pall liigub kiiremini, saab iga tagasipõrgatatud palli eest rohkem punkte kui palli aeglasemalt liikumise eest ehk kergema raskusastme korral.
int Score; //loeb kokku mängu jooksul saadud punktid
int Raskus = 2; //raskusastmed on 1..3, vaikimisi on 2, st. keskmine
int Kiirus = 250; //mängu kiirus on vaikimisi 250, kuid erinevad raskusastmed mõjutavad kiirust
task Start(){
string msg;
bool ExitWhile = FALSE;
//mängu käivitamisel kuvatakse ekraanil allolevad kirjad
ClearScreen();
msg = "-= Ping Pong =-";
TextOut(1, LCD_LINE1, msg);
msg = "----------------";
TextOut(1, LCD_LINE2, msg);
msg = "Let's play it !";
TextOut(1, LCD_LINE3, msg);
msg = "Sinu punktid: ";
msg += NumToStr(Score);
TextOut(1, LCD_LINE5, msg);
msg = "< vali raskus >";
TextOut(1, LCD_LINE6, msg);
//alljärgnev tsükkel on raskusastme valimiseks ning väljutakse siis kui
//kasutaja vajutab keskmist ehk oranzi nuppu
while (!ExitWhile)
{
//nupuvajutus lisab raskusastmele 1-e juurde
if (ButtonPressed(BTNRIGHT, TRUE))
{
while(ButtonPressed(BTNRIGHT, TRUE));
Raskus ++;
}
//nupuvajutus lautab raskusastmest 1-e
if (ButtonPressed(BTNLEFT, TRUE))
{
while(ButtonPressed(BTNLEFT, TRUE));
Raskus --;
}
//järgmised if laused tagavad selle, et raskusastme valimine käiks ringiratast
if (Raskus > 3) Raskus = 1;
if (Raskus < 1) Raskus = 3;
ClearLine(LCD_LINE7);
//switchi abil kuvatakse ekraanil raskusastmele vastav nimetus
//lisaks muudetakse kiiruse muutujat, mis mõjutab mängu raskust
switch (Raskus)
{
case 1:
TextOut(1, LCD_LINE7, " ---Kerge---");
Kiirus = 350;
break;
case 2:
TextOut(1, LCD_LINE7, " --Keskmine--");
Kiirus = 250;
break;
case 3:
TextOut(1, LCD_LINE7, " ---Raske---");
Kiirus = 150;
break;
}
//kui kasutaja vajutab keskmist nuppu, hakkab mäng pihta
if (ButtonPressed(BTNCENTER, TRUE))
{
while(ButtonPressed(BTNCENTER, TRUE));
ExitWhile = TRUE;
}
//oodatakse 100ms et välistada juhuslikud nupuvajutused
Wait(100);
}
//programm ootab enne väljumist 3 sekundit
//see on vajalik ainult käesoleva mooduli testimiseks
//mängus seda ootamist tarvis pole
Wait(SEC_3);
}
task main ()
{
StartTask(Start);
}
Punktiarvestus toimub põhimõttel, et mitu palli suudeti tagasi põrgatada. Erinevate kiiruste korral saab iga tagasipõrgatamise eest erineva arvu punkte. See osa koodist tuleb lisada sinna, kus kontrollitakse kas pall põrkab tagasi või kukub läbi.
if (Ball_Y >= Dash-5 && Ball_Y <= Dash + 8)
{
Yles = TRUE;
//siin antakse vastavalt mängu raskusele punktid
switch (Raskus)
{
case 1:
Score ++;
break;
case 2:
Score += 5;
break;
case 3:
Score += 10;
break;
}
}
Initsialiseerimine tähendab seda, et enne iga mängu alustamist saaksid pall, värav ja punktiarvestus nullitud. Selleks otstarbeks käivitatakse alljärgnev alamprotseduur.
//See protseduur algväärtustab muutujad
void Initialize()
{
Raskus;
Dash = 50; //see on värav ning alguses seatakse see keskele
Ball_X = 9; //rida millelt pall alustab liikumist
Ball_Y = 20; //veerg millelt pall alustab liikumist
Yles = TRUE; //muutuja, mis määrab et pall liigub alguses üles
Paremale = TRUE; //muutuja, mis määrab et pall liigub alguses paremale
Score = 0; //punktid nulli
ClearScreen(); //puhastame ekraani
Gate(Dash); //see joonistab värava algasukoha
}
Kõik eelnevalt läbi käidud programmikoodi komponendid on alljärgnevalt kokku pandud üheks töötavaks tervikuks.
Esimesel real olev task Start() on siin põhjusel, et seda kutsutakse koodis välja enne kui antud alamprogramm on deklareeritud. Seetõttu on tarvilik defineerida kompilaatori jaoks tühi alamprogramm.
task Start();
int Dash;
int Score; //loeb kokku mängu jooksul saadud punktid
int Raskus=2; //raskusastmed on 1..3, vaikimisi keskmine
int Ball_X; //palli asukoht x teljel
int Ball_Y; //palli asukoht y teljel
bool Yles; //palli liikumise suund üles-alla
bool Paremale; //palli liikumise suund paremale-vasakule
int Ball_Last_X; //palli eelmine asukoht
int Kiirus = 60; //palli liikumise kiirus, kasutatakse raskusastme määramisel hiljem
//Gate protseduur joonistab ekraanile värava
//antud alamprotseduur kutsutakse välja värava liigutamise juurest
void Gate(int i){
ClearLine(LCD_LINE8);
TextOut(i, LCD_LINE8, "__");
}
//See protseduur algväärtustab muutujad
void Initialize()
{
Raskus;
Dash = 50; //see on värav ning alguses seatakse see keskele
Ball_X = 9; //rida millelt pall alustab liikumist
Ball_Y = 20; //veerg millelt pall alustab liikumist
Yles = TRUE; //muutuja, mis määrab et pall liigub alguses üles
Paremale = TRUE; //muutuja, mis määrab et pall liigub alguses paremale
Score = 0; //punktid nulli
ClearScreen(); //puhastame ekraani
Gate(Dash); //see joonistab värava algasukoha
}
//MoveTheGate funktsioon liigutab väravat paremale/vasakule
task MoveTheGate(){
while (TRUE) {
//liigutame värava paremale kuni lõpuni
if (ButtonPressed(BTNRIGHT, TRUE)){
//väravat liigutatakse 5 pikseli kaupa
//kui ollakse piksli 85 juures jääb seisma ning värav on paremal
if (Dash < 85)
Dash += 5;
else
Dash = 85;
}
//liigutame väravat vasakule kuni algusesse
else if (ButtonPressed(BTNLEFT, TRUE)){
//väravat liigutatakse 5 piksli kaupa vasakule
//kui ollakse 1 piksli juures jääb seisma ning värav on vasakul
if (Dash > 1)
Dash -= 5;
else
Dash = 1;
}
//kutsutakse välja alamprotseduur Gate mis joonistab värava asukoha
//vastavalt oma parameetrile dash
Gate(Dash);
//ootame 0,1 sekundit, et värav liiguks paraja kiirusega
Wait(100);
}
}
//funktsioon Ball joonistab ekraanile palli
void Ball(int k, int i, int j){
ClearLine(k);
TextOut(j, i, "o");
}
//MoveTheBall liigutab palli üles-alla paremal-vasakule
task MoveTheBall(){
while (TRUE)
{
//Ball_Last_X postisioon on vajalik, et õige ekraani rida ära puhastada
//seega, algselt salvestatakse palli asukoht ajutisse muutujasse
Ball_Last_X = Ball_X;
//pall liigub üles
if (Yles)
Ball_X += 1;
//pall liigub alla
else
Ball_X -= 1;
//pall liigutatakse paremale
if (Paremale)
Ball_Y += 1;
//pall liigutatakse vasakule
else
Ball_Y -= 1;
//kutsutakse välja palli asukohta muutmise funktsioon
//esimene parameeter määrab rea mis kustutatakse
//teine ja kolmas parameeter määravad palli asukoha
Ball(Ball_Last_X, Ball_X, Ball_Y);
//kontrollitakse kas pall on all või üleval
//vastavalt olekule põrkab pall järgmise tsükli käigus vastassuunas
if (Ball_X > 56)
Yles = FALSE;
//kontrollitakse kas pall on all
if (Ball_X <= 2)
{
//kui pall põrkab vastu alust, saad punkti
//ja pall liigub järgmise tsükli käigus üles
//aluse kontroll on alusest 8 pikslit paremale või 5 vasakule
//seega värava laiuseks on tegelikkuses 13 pikselit
if (Ball_Y >= Dash-5 && Ball_Y <= Dash + 8)
{
Yles = TRUE;
//siin antakse vastavalt mängu raskusele punktid
switch (Raskus)
{
case 1:
Score ++;
break;
case 2:
Score += 5;
break;
case 3:
Score += 10;
break;
}
}
//kui pall ei põrka vastu alust
else
//kui pall ei põrka vastu alust, on mäng läbi
{
PlayTone(500, MS_20);
StopTask(MoveTheGate);
ExitTo(Start);
}
}
//kontrollitakse/juhitakse, kas pall peab paremale-vasakule põrkama
if (Ball_Y > 93)
Paremale = FALSE;
else if (Ball_Y < 1)
Paremale = TRUE;
//palli liikumise kiirus, edaspidi kasutatakse raskusastme jaoks
Wait(Kiirus);
}
}
task Start(){
string msg;
bool ExitWhile = FALSE;
//mängu käivitamisel kuvatakse ekraanil allolevad kirjad
ClearScreen();
msg = "-= Ping Pong =-";
TextOut(1, LCD_LINE1, msg);
msg = "----------------";
TextOut(1, LCD_LINE2, msg);
msg = "Let's play it !";
TextOut(1, LCD_LINE3, msg);
msg = "Sinu punktid: ";
msg += NumToStr(Score);
TextOut(1, LCD_LINE5, msg);
msg = "< vali raskus >";
TextOut(1, LCD_LINE6, msg);
//alljärgnev tsükkel on raskusastme valimiseks ning väljutakse siis kui
//kasutaja vajutab keskmist ehk oranzi nuppu
while (!ExitWhile)
{
//nupuvajutus lisab raskusastmele 1-e juurde
if (ButtonPressed(BTNRIGHT, TRUE))
{
while(ButtonPressed(BTNRIGHT, TRUE));
Raskus ++;
}
//nupuvajutus lautab raskusastmest 1-e
if (ButtonPressed(BTNLEFT, TRUE))
{
while(ButtonPressed(BTNLEFT, TRUE));
Raskus --;
}
//järgmised if laused tagavad selle, et raskusastme valimine käiks ringiratast
if (Raskus > 3) Raskus = 1;
if (Raskus < 1) Raskus = 3;
ClearLine(LCD_LINE7);
//switchi abil kuvatakse ekraanil raskusastmele vastav nimetus
//lisaks muudetakse kiiruse muutujat, mis mõjutab mängu raskust
switch (Raskus)
{
case 1:
TextOut(1, LCD_LINE7, " ---Kerge---");
Kiirus = 120;
break;
case 2:
TextOut(1, LCD_LINE7, " --Keskmine--");
Kiirus = 60;
break;
case 3:
TextOut(1, LCD_LINE7, " ---Raske---");
Kiirus = 40;
break;
}
//kui kasutaja vajutab keskmist nuppu, hakkab mäng pihta
if (ButtonPressed(BTNCENTER, TRUE))
{
while(ButtonPressed(BTNCENTER, TRUE));
ExitWhile = TRUE;
}
//oodatakse 100ms et välistada juhuslikud nupuvajutused
Wait(100);
}
//initialize algväärtustab kõik mängu vajalikud omadused
Initialize();
StartTask(MoveTheGate);
ExitTo(MoveTheBall);
}
task main ()
{
Initialize();
StartTask(Start);
}
Selle aasta teema on “Senior Solutions”.
http://www.robootika.ee/flleesti/
Tegin excelis valmis punktiskoori arvutamise.
FLL Senior Solutions Score Calculation.xlsx (25,83 kb)
Robotimängu ametlik tutvustus:
Microsofti kontoris tegime lõpupeo kuhu said vanemad kutsutud. Sõime kooki, vaatasime üle aasta jooksul saavutatu.
Siin on meie suurimad saavutused õppeaastal 2011/2012:
Lisaks sai üle antud tasemetöö tulemused ja diplomid.
Ja lõpuks muidugi Xbox Party mis kestis poole kümneni õhtul Quitar Hero’d ja Haloga. Halo oli muidugi tavapäraselt projektoriga kahel suurel seinal ning kokku kaheksa mängijat üle võrgu koos müdistamas.
Kaunist suve kogu tiimile!
Aasta lõpus robootika diplomi välja andmiseks on tarvis kontrollida õpilaste teadmisi mitmes vallas.
Ülesanded said koostatud põhimõttel, et oleksid kaetud kõik peamised programmeerimisalased võtted, andurid ja NXT.
Kokku 5 ülesannet, igas ülesandes on kaks taset, lihtsam ja keerulisem. Diplom tuleb igaühele personaalne, arvestades tehtud ülesandeid ja taset.
| Eeldus: programmeerimine on tehtud NXC-keeles, BricxCC keskkonnas. Ülesannete vabadus: Võib spikerdada, maha kirjutada, kopeerida, kasutada enda või teiste varem tehtud programme Ülesande vastuvõtmine: Iga üks selgitab oma koodi ja programmi toimise põhimõtet. |
Oranž nupp käivitab stopperi, seejärel kuvatakse ekraanil info, et stopper käib. Uuesti oranži nupu vajutamine peatab stopperi ning NXT kuvab ekraanil kulunud aja.
Kolmas oranži nupu vajutus nullib stopperi ja seejärel algab protsess otsast peale – st. saab jälle käivitada stopperi.
Ekraanil kuvatakse stopperi numbrid täpsusega kümnendik sekundit.
NXT teeb iga 10 sekundi järel piuksu sel ajal kui stopper käib.
Ehitada kõige tavalisem bot, ehk robot mis liigub ja keerab kahe vedava rattaga.
Robot peab sooritama järgmise ülesande:
NB! Programmis peab kasutama roboti omadusi – ratta läbimõõtu, ratastevahelist kaugust ning liikumine tuleb välja arvutada mootori pööreteks.
Kasutada liikumiseks ja pööramiseks alamprotseduure. Parameetritena anda ette teepikkus, pöördenurk ja pööramise iseloom (ümber ühe ratta/kahe rattaga).
Ehitada robot, mis loendab uksest sisenevaid inimesi. Vabal valikul kasutada Ultrasonic, valguse või Mindsensor IR distance andurit.
Inimesed mööduvad ca 30 cm kaugusel andurist. Inimese möödumisest annab NXT heliga märku.
Arvestades inimeste möödumise tihedust, kuvada ekraanil eeldatav keskmine inimeste möödumise arv:
Ehitada robot, mis tuvastab värviandurist mööduvate klotside värvid ja loendab kokku erinevat värvi klotsid ja kuvab informatsiooni ekraanil. Kasutada ühte mootorit klotside ükshaaval läbilaskmiseks.
Värviklotside loendamisel saadud informatsioon salvestada massiivi ja ekraanil kuvada massiivi salvestatud informatioon.
Ehitada joonejärgija robot kasutades valgusandurit.
Joonejärgija robot
1) Mindsensors LineLeaderiga või
2) programmeerida ning häälestada PID-controller koos ühe valgussensoriga
Windows Phone’i on sisse ehitatud kolmesuunaline kiirendusandur. Alljärgnevas rakenduses kasutatakse punase palli liigutamiseks kahte dimensiooni, kuid värvilised jooned ekraanil iseloomustavad telefoni liikumist kolmes erinevas suunas.
MSDN artikkel: http://msdn.microsoft.com/en-us/library/ff431810(v=vs.92).aspx
Antud kood on internetinäidete põhjal kokku pandud kahest erinevast rakendusest – kolmemõõtmeliste joonte kuvamine ning palli edasi-tagasi sõitmine mööda ekraani.
MainPage.xaml
MainPage.xaml.cs