Reaali Robootika.COM

NXT robotimaailm ja programmeerimine C-keeles

5. tund: Värvilise rooliga auto

Käesoleva tunni eesmärk on õppida kasutama C-keeles switch-funktsiooni.

Õppematerjal: Juhend- IF ELSE ja SWITCH kasutamine

Ülesanne: Värvilise rooliga auto

Teha BOT mis on ühendatud juhtme abil värvianduriga, mis omakorda on BOT-i juhtimispult.

Juhtimispult ehitada selliselt, et värvianduri ees oleks pöörlev komponent (hammasratas, rool), mille peale on kinnitatud värviline ketas. Rooli otse hoides sõidab robot otse kuid keerates muutub värv ning robot hakkab sellele vastavalt pöörama.

Musta värvi paber kinnita teise klotsi külge, mis liigub värvilise ketta ning värvianduri ees edasi tagasi. Must värv on nagu autol gaas, kui must on ees, siis robot seisab, vastasel juhul liigub vastavalt ketta värvile. Sellesama pildi saad siit suuremana avada ja siis välja printida.

Värviline roolVärvide tähendused:

  • Punane: sõidab otse
  • Sinine-roheline: keerab veidi paremale-vasakule
  • Kollane-oranz: keerab keskmisel paremale-vasakule
  • Helesinine-heleroheline: keerab palju paremale-vasakule
  • Valge: keerab kohapeal ringi

Lahendus.

Nagu arvata oligi siis tegemist on lihtsa programmiga, kuid õpetab hästi switch-funktsiooni olemust.

Rooli ehitamise peamine raskus seisnes selles, et värviandur ei tundnud korralikult värve ära. Esialgu arvasime, et liiga ligidalt mõõdab ning jätsime vahe ca 3 cm. Kuid nüüd oli valge ja musta tulemus sama, mis oli eriti veider.

Lõpuks jõudsime lahenduseni, värviandur tuli paigutada väikese nurga all, muidu see mõõtis enda poolt välja kiirguva valguse peegeldust. Seega HiTechnicu värviandur poolviltu asetades oli tulemus perfektne.

/*
Autor: Ramses Sepp 02.02.2011
Sellel robotil on värviline rool ja must käigukang. 
Rooliga ta sõidab erinevalt ja käigukang peatab roboti. */ task main(){ SetSensorLowspeed(S2); while (TRUE){ switch (SensorHTColorNum(S2)) { //must - mootorid seisavad case 0: Off(OUT_BC); ClearScreen(); TextOut(5, LCD_LINE3, "must"); break; //sinine - robot keerab kergelt paremale case 2: OnFwdSync(OUT_BC, -50, 5); ClearScreen(); TextOut(5, LCD_LINE3, "sinine"); break; //helesinine - robot keerab palju paremale case 3: OnFwdSync(OUT_BC, -50, 35); ClearScreen(); TextOut(5, LCD_LINE3, "helesinine"); break; //roheline - robot keerab kergelt vasakule case 4: OnFwdSync(OUT_BC, -50, -5); ClearScreen(); TextOut(5, LCD_LINE3, "roheline"); break; //kollane - keerab keskmiselt paremale case 6: OnFwdSync(OUT_BC, -50, 15); ClearScreen(); TextOut(5, LCD_LINE3, "kollane"); break; //oranþ keerab keskmiselt vasakule case 8: OnFwdSync(OUT_BC, -50, -15); ClearScreen(); TextOut(5, LCD_LINE3, "oranþ"); break; //punane - sõidab otse case 9: OnFwdSync(OUT_BC, -50, 0); ClearScreen(); TextOut(5, LCD_LINE3, "punane"); break; //heleroheline - keerab palju vasakule case 13: OnFwdSync(OUT_BC, -50, -35); ClearScreen(); TextOut(5, LCD_LINE3, "heleroheline"); break; //valge - keerab kohapeal ringi case 17: OnFwdSync(OUT_BC, -50, 100); ClearScreen(); TextOut(5, LCD_LINE3, "valge"); break; } } }

4 tund: Kahe lülitiga roboti juhtimine

Õppematerjal:
3 tund- Lülititega roboti juhtimine
Juhend- while, until tsüklite kasutamine
Juhend- IF ELSE ja SWITCH kasutamine
Juhend- Andurite defineerimine ja lugemine

Sisuliselt on selleks tunniks 2 ülesannet.

Alljärgnevate ülesannete juurde on lisatud ka nende olekudiagrammid, mille abil on programmiosade töö selgitamine lihtsam. Samuti annavad programmist tervikliku ülevaate.

Ülesanne 2. Robotil on küljes kaks lülitiandurit.

roboti programmi olekudiagrammVariant a) Robot sõidab edasi, kuid vajutades ühte lülitit keerab sujuvalt paremale ning teise lüliti korral vasakule.

Lahendus. Iseenesest lihtne IF ELSE lausete jada. Esiteks täidetakse lõpmatult tsüklit, mille sees kontrollitakse iga tsükli käigus kas üks või teine lüliti on vajutatud.  Siin on kasutatud edasiliikumiseks OnRevSync funktsiooni, kuna antud BOT-l olid mootorid teisipidi peal.

task main(){
SetSensorTouch(S2);
SetSensorTouch(S1);
while(TRUE){
  if (Sensor(S2)){
    OnRevSync(OUT_BC, 50, -10);
  }
  else if(Sensor(S1)){
    OnRevSync(OUT_BC, 50, 10);
  }
  else{
    OnRev(OUT_BC, 50);
  }
}
}

roboti programmi olekudiagrammVariant b) Robot hakkab edasi sõitma siis kui mõlemad lülitid on korraga alla vajutatud ja lahti lastud. Üksikult kasutades toimivad lülitid paremale-vasakule keeramisena. Teistkordsel üheaegsel vajutamisel jääb robot seisma.

Lahendus.

Alguses robot seisab ja ootab kuni mõlemad lülitid on bumped (ehk vajutatud-lahti lastud).

Peale lülitite vajutamist käivitub funktsioon while, mille tingimuseks on määratud Bumped2Buttons muutuja. Kuna see muutuja on algväärtustatud eelnevalt FALSE-ks siis läheb antud tsükkel käima (kuna tingimuslauses on muutuja ees ! hüüumärk).

Seejärel toimib programm täpselt nii nagu ee on kirjeldatud eelmise variandi korral – ehk keerab paremale-vasakule-sõidab otse.

Kuid lisaks on toodud üks IF lause, mille tingimuseks on kontroll, kas mõlemad lülitid on vajutatud. Kui on alla vajutatud, täidetakse IF lause ning until-funktsioon jääb ootama, kuni lülitid on lahti lastud.

Lülitite lahti laskmisel muudetakse Bumped2Buttons väärtus TRUE-ks ning edasi läheb programm uuele tsüklile ja kontrollib tingimust. Kuna tingimus ei ole tema jaoks tõene, väljutakse while tsüklist lülitatakse mootorid välja ja jäädakse ootama taas nuppude bumped-vajutust roboti käivitamiseks.

Selle programmi loomisel tuli juba päris mitu viga ning algne versioon oli ka sutsu keerukam kui alljärgnev lõplik lahendus.

task main(){
bool Bumped2Buttons;
SetSensorTouch(S1);
SetSensorTouch(S2);
while(true){
  Bumped2Buttons = FALSE;
  until(Sensor(S1) && Sensor(S2));
  until(!Sensor(S1) && !Sensor(S2));
  while(!Bumped2Buttons){
    if (Sensor(S1)== 1){
       OnRevSync(OUT_BC, 50, -10);
    }
    else if(Sensor(S2)== 1){
       OnRevSync(OUT_BC, 50, 10);
    }
    else{
       OnRev(OUT_BC, 50);
    }
    if(Sensor(S1) && Sensor(S2)){
      until(!Sensor(S1) && !Sensor(S2));
      Bumped2Buttons = TRUE;
    }
  }
  Off(OUT_BC);
}
}

Teine variant sama ülesande lahendamiseks on alljärgnev.

2 lülitiga pöörav robot

Siin variandis ei ole kasutatud muutujat, mille alusel väljutaks teisest while-tsüklist. Siin on kasutatud ära matemaatilist loogika ning tsüklist väljumise tingimus on sisse kirjutatud while-tsükli enda tingimuseks. Tulemuseks on mõnevõrra lihtsam kood.

 

task main()
{
 SetSensorTouch(S1);
 SetSensorTouch(S2);
 while(TRUE)
 {
	until(Sensor(S1) && Sensor(S2)); //ootab nupu vajutust
	until(!Sensor(S1) && !Sensor(S2)); //ootab nupu lahti laskmist
	//While tsükli stoppimiseks, ootab kuni mõlemad nupud on alla vajutatud 
	while(!Sensor(S1) || !Sensor(S2)) 	{
		if(Sensor(S1))
		{
			OnFwdSync(OUT_BC, 75, 10);
		}
		else if(Sensor(S2))
		{
			OnFwdSync(OUT_BC, 75, -10);
		}
		else
		{
		OnFwdSync(OUT_BC, 75, 0);
		}
	}
	Off(OUT_BC);
	until(!Sensor(S1) && !Sensor(S2)); //ootab nupu lahti laskmist
 }
}