Reaali Robootika.COM

NXT robotimaailm ja programmeerimine C-keeles

Informaatika olümpiaadi põhikooli eelvoor – Summa arvutamine

Põhikooli ja muidugi ka gümnaasiumi õpilased on ikka mega-targad. Informaatika olümpiaad tekkis sel aastal päevakorda ning siis mõtlesin, et proovin kõige lihtsamad ehk põhikooli ülesanded ära lahendada. No ausalt öeldes võttis mul ikka aega, et meelde tuletada mingeid lihtsaid matemaatika põhitõdesid ja alljärgnevale ülesandele lahendus kirjutada. Keeleks valisin puhta C, mis lisas omakorda veidi keerukust keele õppimise näol.

http://www.teaduskool.ut.ee/orb.aw/class=file/action=preview/id=6379/poh.et.pdf 

1. Summa - 0,5 sekundit - 20 punkti

Kirjutada programm, mis leiab antud täisarvude A ja B vahele jäävate täisarvude summa (A ja B ise kaasa arvatud).

Sisend. Tekstifaili summa.sis ainsal real on tühikuga eraldatud täisarvud A (−109 <= A <= 109) ja B (−109 <= B <= 109).

Väljund. Tekstifaili summa.val ainsale reale väljastada täisarv S — otsitav summa.

Näide. summa.sis

1 5

summa.val

15

Näide. summa.sis

3 2

summa.val

5

Hindamine. Testides summaarse väärtusega 10 punkti on liidetavate arv <= 10 000.


Lahenduse tegemisel võtsin aluseks Rao koodi ning täiendasin seda viisil, et tööle hakkaks.

Code Snippet
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.   FILE *sisf;
  5.   FILE *valf;
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9.   int  x, y, hoidja;
  10.   double summa;
  11.  
  12.   sisf = fopen( "summa.sis", "r" );
  13.   fscanf( sisf, "%i %i", &y, &x );
  14.  
  15.   printf("X on %i\n", x);
  16.   printf("Y on %i\n", y);
  17.   if(y > x)
  18.   {
  19.        hoidja = y;
  20.        y = x;
  21.        x = hoidja;
  22.   }
  23.  
  24.   for(summa = 0; y <= x; y++)
  25.     {
  26.            summa += y;
  27.     }
  28.  
  29.   printf("Summa on %.f\n", summa);
  30.   valf = fopen("summa.val", "w");      /* avame faili kirjutamiseks */
  31.    fprintf(valf, "%.f\n", summa);                           /* v?¤ljastame */
  32.    fclose(valf);                                        /* sulgeme faili */
  33.    return 0;
  34. }

Tunnitöö: Explorer 4 – maadeavastaja robot

explorer

Ülesanne 4

Ehita BOT, millel on peal mootoriga Ultrasonic ning allpool asuvate objektide jaoks lülitiandur.

Kirjuta programm, mille käigus robot sõidab otse kuni näeb ees seina 20 cm kaugusel või põrkab lülitiga mõne väiksema takistuse vastu. Takistuse avastamisel robot peatub, vaatab Ultrasonic anduriga paremale / vasakule ning see kummal pool on rohkem ruumi (ehk US andur näeb kaugemale), sinna sõidab.

Lahendus

Käesolev explorer kasutab kahte andurit, seega lisandub veidi keerukust roboti programmeerimisele.

task main(){
SetSensorLowspeed(S1);
SetSensorTouch(S2);

int Kaugus;
int ParemPool;
int VasakPool;
Kaugus = 20;

while (TRUE){
	if(SensorUS(S1) < Kaugus || Sensor(S2)){
		Off(OUT_BC);
		if(Sensor(S2))
			{
			RotateMotor(OUT_BC, -50, 360);
			}

		RotateMotor(OUT_A, 50, 90);
		ParemPool = SensorUS(S1);
		RotateMotor(OUT_A, -50, 180);
		VasakPool = SensorUS(S2);
		RotateMotor(OUT_A, 50, 90);
		
		if(ParemPool > VasakPool)
			RotateMotorEx(OUT_BC, 50, 217, -100, TRUE, TRUE);
		else
			RotateMotorEx(OUT_BC, 50, 217, 100, TRUE, TRUE);
		}
	else{OnFwd(OUT_BC, 100);}
	}
}

Tunnitöö: Explorer 3 – maadeavastaja robot

image

Ülesanne 3 (Exploreri sarjast)

Ehita BOT, millel on peal mootoriga Ultrasonic andur.

Kirjuta programm, mille käigus robot sõidab otse kuni näeb ees seina 20 cm kaugusel. Seina nägemisel robot peatub, vaatab Ultrasonic anduriga paremale / vasakule ning see kummal pool on rohkem ruumi (ehk US andur näeb kaugemale), sinna sõidab.

 

Lahendus

Ultrasonic anduriga paremalt-vasakult kaugust mõõtes peab selle salvestama muutujatesse ning siis neid omavahel võrdlema. Selle põhjal otsustab robot kuhu keerata.

 

task main(){
SetSensorLowspeed(S1);

int Kaugus;
int ParemPool;
int VasakPool;
Kaugus = 20;

while(TRUE){
	if(SensorUS(S1) < Kaugus){
		Off(OUT_BC);
		RotateMotor(OUT_A, 25, 90);
		ParemPool = SensorUS(S1); //mõõdab paremal kaugust
		RotateMotor(OUT_A, 25, -180);
		VasakPool = SensorUS(S1); //mõõdab vasakult poolt kaugust
		RotateMotor(OUT_A, 25, 90);
		if(ParemPool > VasakPool){
			RotateMotorEx(OUT_BC, 50, 217, 100, TRUE, TRUE); //keerab paremale
			}
		else{
			RotateMotorEx(OUT_BC, 50, 217, -100, TRUE, TRUE); //keerab vasakule
			}
		}
	
	else{
		OnFwdSync(OUT_BC, 100, 0);
		}
	}
}

Tunnitöö: Explorer 1 ja 2 – maadeavastaja robot

Explorer

Ülesanne 1

Ehita BOT, millel on ees Ultrasonic kauguseandur.

Kirjuta programm, mille käigus robot sõidab otse kuni näeb ees seina 20 cm kaugusel. Seina nägemisel robot peatub, tagurdab ja keerab kas paremale või vasakule (valitakse juhuslikkuse meetodil, funktsiooniga Random()).

 

Ülesanne 2

Ehita BOT, millel on ees lülitiandur.

Kirjuta programm, mille käigus robot sõidab otse kuni lüliti vajutamiseni ehk seina vms takistuseni. Takistuse avastades robot peatub, tagurdab ja keerab kas paremale või vasakule (valitakse juhuslikkuse meetodil, funktsiooniga Random()).

 

Lahendus ülesannetele 1 ja 2

Mõlemad ülesanded on sarnased, erinedes ainult selle poolest, et ühel puhul keerab robot tagasi kauguseandurist saabuva signaali tõttu ning teisel juhul lülitist saabuva signaali tõttu.

Alljärgnevas näites on kasutatud switch-elementi, kuid selle võib asendada ka if-else lausega.

task main(){
/*
KAUGUS muutuja abil määrab robot kas peab tagasi sõitma
RAND muutuja abil määrab robot kas ta sõidab paremale või vasakule
*/
SetSensorLowspeed(S4);
int KAUGUS = 20;
int RAND;
while (TRUE){
      if (SensorUS(S4) < KAUGUS){          //Kui robot näeb seina lähedamal kui 20 cm siis ta sõidab tagasi
        RAND = Random(2);
        switch (RAND)
        {
          case 0:                          //Robot sõidab paremale
          RotateMotorEx(OUT_BC, 100, 335, -50, TRUE, TRUE);
          break;
          case 1:                          //Robot sõidab vasakule
          RotateMotorEx(OUT_BC, 100, 335, 50, TRUE, TRUE);
          break;
        }
      }
      else {
           OnRevSync(OUT_BC, 100, 0);      //Muidu sõidab robot edasi
      }
}
}

2. koht Eesti Lego-roboti võistluselt !

RobotFLL ehk Lego-roboti võistlus mis on suunatud põhikoolile vanuses 9-16 aastased saavutas tiim Robootika.COM 2. koha.

Tegelikult koosnes võistlus 4-st osast, millest kõige vaatemängulisem on muidugi roboti platsivõistlus, kus robot peab 2,5 minuti jooksul ära lahendama suure hulga keerulisi ülesandeid. Platsivõistlusel saavutas Kivilinn 147 punkti ning Robootika.COM tiim 140 punkti. Kolmas koht Master (Narva) saavutas 128 punkti.

Kui aga võistluse kolm ülejäänud ala juurde arvestati – projekt koos esitlusega, roboti disaini ning programmeerimise hindamine ja tiimitöö tulemuslikkus - jäi lõpptulemus ikka samaks, ehk esikohad on järgmised, vahetus vaid kolmas koht.

  1. Kivilinna gümnaasium
  2. Robootika.COM
  3. Öökullid

Vähemalt kahel esimesel kohal oli robot arvestatud tegema ca 200 punkti, kuid mõlema tiimi robot tegi platsil ettearvamatuid liigutusi ja nõnda jäid kodustes testides saavutatud paremad punktid võistlusel täitmata.

Igatahes minu poolt tiimile PALJU ÕNNE!

Te kõik olite väga tublid ning täna võite julgelt öelda, et te olete Eesti ainukese segakoolide tiimina Eesti teine koht!!

Kui programmeerimises olite selgelt Eesti parim! Selle eest ka pildil nähaolev karikas.

Parim Lego-robot joonejälgija

Veelkord palju õnne tiimile Robootika.COM!

Robotexi joonejälgimise võistlusel oli palju vingeid joonejälgijaid ning esikohad läksid kõik välismaale.

Lego-robotite hulgast oli tiimi Robootika.COM robot nimega LegoPID kõige kiirem. Kui arvestada et kokku oli roboteid umbes 30 ja kolm esikohta läksid Eestist välja, on LegoPID roboti saavutatud ca 10. koht ülikõva tulemus. Joonejälgija klassis olid ülejäänud võistlejad valdavalt kõrgkoolidest.

Täpsustan lõpliku tulemuse kui need üles laetakse.

Rao LegoPID joonejälgija robotiga

Xbox party vol.2

Laupäeval toimus järjekordne xbox party. Meil oli seal ülilõbus, mängisime Halo 3, Halo CE anniversary ja ka palju Kinecti mänge. Oli väga lahe, ootan huviga järgmist partyt

Robotivõistluse tulemus: Parim programmeerimine!

KarikasFLL ehk Lego-roboti võistluse tulemus lõppes Kivilinna jaoks jätkuvate unetute ööde ja plokkidega programmeerimiskeeles kirjutamisega, kuna nemad nimelt võitsid peaauhinna ning lähevad edasi Mannheimi Saksamaale kevadel.

Meie tiim sai parima programmeerimisalase auhinna! Ja pärast võistlust küsis Alvo, et kes see imelaps oli kes niimoodi programmeeris …

Igatahes oli kogu tiim VÄGA VÄGA tubli ning kindel on see, et poisid suutsid oma tiimile kõige laiema tuntuse koguda nii flaierite, tiimimärkide jagamise kui ka muu heliga tähelepanu tõmmates – kes kohal see kuulis.

PS! Rao tuli ka pärast Robotexi robootikasse ning programmeeris südamerahustamiseks C-keeles sumo robotit Smile

Robootika.COM

Meie FLL projekt

clip_image002

Ühel ilusal suvepäeval, kui AKI leidis et tal on alles 1€, otsustas ta osta selle eest endale ühe jäätise.

Pärast 2 tunnist jalutamist märkas AKI, et tema jäätis oli ära sulanud. Ta oli väga kurb. Ta

hakkas mõtlema, kuidas saaks jäätist kauem säilitada.

clip_image002[6]

clip_image002[8]

Ta mõtles, et kosmonautidel ei ole kosmoses külm, järelikult peab kosmonautide skafander nii sooja kui külma. Ta mõtles, kuidas oleks, kui ta jäätist ostma läheb ning talle skafandriga jäätist antakse. AKI naeris selle peale ja otsustas konsulteerida teadlastega.

clip_image002[10]

AKI otsustas konsulteerida teadlastega Balbiinos ja TTÜ’s. Teadlased ei kiitnud AKI mõtet heaks, kuid lubasid, et nad mõtlevad midagi üheskoos välja. Töötati 2 aastat ning lõpuks jõuti lahendusele. Nende idee oli ülikerges metalses mikrovõres, mis on võrreldav aerogeeliga. Seekord õnnestus see neil valmistada vaid laboritingimustes, kuid nad uskusid, et tulevikus võib see olla täitsa potentsiaalne uus jäätise pakend.

clip_image002[12]

Tulevikus, kui AKI taaskord jäätist ostis, oli juba uus pakend kõikides jäätiseputkades. Pärast 2 tunnist jalutamist märkas AKI, et jäätis polnudki sulanud ning AKI’l oli hea meel :)