Lego mindstorm - Robot triedič

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání

V predchádzajúcich kapitolách bola venovaná pozornosť základným komponentom stavebnice LEGO Mindstorms Education a programovaciemu jazyku NXC. S danými znalosťami môžeme pristúpiť k navrhovaniu a programovaniu LEGO robota.

Návrh robota

Úlohou bude navrhnúť a naprogramovať robota, ktorý by bol schopný triediť LEGO kocky troch farieb. Na internete je možné nájsť veľké množstvo rôznych robotov z LEGA. Konštrukcia robota sa dá pomerne ľahko odpozorovať, avšak samotné know-how spočíva v tvorbe programu, ktorým by sme daného robota oživili. Pri návrhu robota sme sa nechali inšpirovať robotom zo stránky: http://www.youtube.com/watch?v=jDQgvLB_wnA&feature=player_embedded

Obr. 8. Robot triedič

Robot triedič na obr. 8. sa skladá z NXT kocky, dvoch servomotorov, svetelného senzora a iných technických častí. V najvrchnejšej časti sa nachádza zásobník na LEGO kocky. Každá kocka, ktorá sa nachádza na spodku zásobníka je zosnímaná pomocou svetelného senzora. Svetelný senzor je vhodné umiestňovať čo najbližšie k snímanému povrchu. Má tu vlastnosť, že dokáže generovať vlastné svetlo a čím bližšie je umiestnený, tým su vplyvy okolitého svetla menšie. Na základe hodnoty zo senzora sa rampa pripojená k servomotoru otočí tak, aby kocka mohla byť zatriedená do príslušnej krabičky podľa farby. Druhým servomotorom posúvame kocky zo zásobníka na rampu, alebo priamo do prostrednej krabičky. Senzor a servomotory sú pripojené pomocou káblov k NXT kocke. Svetelný senzor je pripojený k portu 1. Servomotor ktorým vysúvame kocky zo zásobníka je pripojený k portu A a servomotor ku ktorému je pripevnená rampa je pripojený k portu B.

Programovanie robota

Predpokladajme, že kocky ktoré chceme roztriediť sú žltej, šedej a čiernej farby. Aby sme vedeli hodnoty v programe správne nastaviť, musíme poznať intenzitu odrazeného svetla každej z nich. Vložíme kocku ktorej intenzitu chceme poznať na spodok zásobníka a pomocou tlačidiel na NXT kocke vyberieme možnosť „View“ a „Reflected light“. Týmto spôsobom sa presvedčíme že intenzita odrazeného svetla žltej kocky je približne 67%, šedej 47% a čiernej 27%.

Ďalej predpokladajme, že počet kociek v zásobníku je práve 10. Robíme tak z dôvodu, že intenzita odrazeného svetla žltej kocky a hodnota, keď sa v zásobníku žiadna kocka nenachádzala bola takmer rovnaká. Program k takémuto robotovi môže vyzerať nasledovne:

	
task main ( ){  // začiatok hlavnej úlohy
   int a,i;  // deklarácia premenných a a i
   SetSensorLight(IN_1);  /* nastaví premenné tak, že na porte IN_1 sa nachádza svetelný senzor */
   a = Sensor(IN_1);  // nameranú hodnotu zo senzora zapíšeme do premennej a
   for(i=0;i<10;i+=1){  // začiatok for cyklu – slučku opakujeme 10 krát
      if(a<35){  /* prvé rozhodovanie – podmienka je pravdivá ak snímač zosnímal čiernu kocku */
         RotateMotor(OUT_A,30,-85);  // vysunie kocku zo zásobníka
         RotateMotor(OUT_A,30,85);  // vráti rameno vysúvača späť
      }
      else{  // ak prvá podmienka nie je pravdivá pokračuje nasledovným rozhodovaním
         if (a>54){  // podmienka je pravdivá ak snímač zosnímal žltú kocku
            RotateMotor(OUT_B,30,52);  // otočí rampu o 30° vľavo
            RotateMotor(OUT_A,30,-85);  // vysunie kocku zo zásobníka
            RotateMotor(OUT_A,30,85);  //  vráti rameno vysúvača späť
            RotateMotor(OUT_B,30,-52);  // vráti rampu späť do zvislej polohy
         }
         else{  // ak podmienka nie je splnená, snímač zosnímal šedú kocku
            RotateMotor(OUT_B,30,-52);  // otočí rampu o 30° vpravo
            RotateMotor(OUT_A,30,-85);  // vysunie kocku zo zásobníka
            RotateMotor(OUT_A,30,85);  // vráti rameno vysúvača späť
            RotateMotor(OUT_B,30,52); /* vráti rampu späť do zvislej  polohy */
         }    
      }
      ResetSensor(S1);  // inicializácia senzora
   }
}