See materjal on loodud Tiigrihüppe Sihtasutuse programmi ProgeTiiger raames.
Ülesande eesmärk
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.
Ülesande tingimused
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.
Ülesande lahendamine
Ü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
Lahendus
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));
}