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

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

Kes või mis on AKI?

AkiAkiKes on üldse Aki ja kust ta pärit on?

Ühel tiiminõupidamisel kus me arutasime esitluse plaani oli meil vaja anda ühele tegelasele nimi. Proovisime erinevaid häid eesti nimesid aga midagi põrutavat välja ei hüpanud – kõik Augustid, Jaanid ja Mihklid tundusid liiga tavalised.

Siis vaatasin ma särke poiste seljas ja kirjutasin tahvlile nime Akitoobor. Kõik loevad, et mis asi see veel on? Siis plahvatas enamvähem korraga kõigil, et see on tagurpidi sõna robootika. Kuna aga Akitoobor hääldamisel pikaks jääb siis tehti sellest automaatselt lühend Aki ja nii meie tiim endale nime saigi. Või õigemini sai meie tiimi robot-logo endale nime Smile

Seega, tervitame kõik meie uut nime AKI, kelle nimi sünnipäraselt on Akitoobor.

Kuidas meie tiim esitluseks valmistub

Juba mitu nädalat on tegeletud projekti esitluse ettevalmistamisega.

Robootika.COM tööhoos

Küll sai toodud mööblipoest pappkaste, ehitatud maja, kleebitud kirjasid peale, teibitud lahtisi kohti, värvitud jäätiseid, lõigatud kosmonauti, joonistatud kirjasid jne. Kõik mis on vajalik ühe 5 minuti pikkuse teatrietenduse rekvisiitideks.

Uskumatu millise innuga kogu seda tööd tehti, käidi õues ja keldris rekvisiite värvimas, teibiti ja ehitati Aki pead jms.

RaimondAKI

Ja siin on näha ka kaua-tehtud-kaunikene Aki pea.