Difference between revisions of "Jednoduchá príručka programovania v NQC"

From RoboWiki
Jump to: navigation, search
 
(15 intermediate revisions by 2 users not shown)
Line 1: Line 1:
= eXtreme robotics =
+
V dnešnej dobe je spôsobov na programovanie robotických stavebníc Lego Mindstorms a Lego Mindstorms NXT je viacero. Za najrozšírenejší medzi školami sa pokladá Robolab v rôznych verziách. Ak sa chcete naučiť niečo nové neváhajte a vyskúšajte programovací jazyk NQC. V nasledujúcich pár riadkoch sa zoznámime s vývojovím prostredím Bricx Command Center.
= Úvod do programu Bricx Command Center =
 
= Lukáš Boško, Považská Bystrica =
 
 
 
 
 
V dnešnej dobe je spôsobov na programovanie robotických stavebníc Lego Mindstorms a Lego Mindstorms NXT je viacero. Za najrozšírenejší medzi školami sa pokladá Robolab v rôznych verziách. Predstavme si teda ďalší z možných spôsobov.
 
 
 
  
 
== Pojmy BricxCC a NQC ==
 
== Pojmy BricxCC a NQC ==
Bricx Command Center (ďalej BricxCC) je IDE (Integrated Development Enviroment – integrované vývojárske prostredie). Využíva kompilátor programovacieho jazyku NQC alebo NXC pre stavebnice NXT.
+
Bricx Command Center (ďalej BricxCC) je IDE (Integrated Development Enviroment – integrované vývojárske prostredie). Je to grafické prostredie, ktoré využíva kompilátor programovacieho jazyku NQC pre RCX alebo NXC pre stavebnice NXT. Je v ňom možné vyvíjať programy pre tieto platformy bez obmedzení, ktoré prináša prostredie RoboLab.
 
 
  
== Rozdiel: BricxCC vs. Robolab ==
+
== Rozdiel medzi BricxCC vs. RoboLab ==
V Robolabe dokážete naprogramovať takmer všetko. Výhodou je pre základoškolákov, ktorí sa nestretli ešte s písaním programov v textovom editore. Ďalšou výhodou ikoniek je lepšia predstavivosť. Po niekoľkoročnej práci v Robolabe som ale natrafil na niekoľko nevýhod a úloh, ktoré nedokázal vyriešiť.  
+
V Robolabe dokážete naprogramovať takmer všetko jednoduchou a hravou cestou. To je výhodou pre základoškolákov, ktorí sa ešte nestretli s písaním programov v textovom editore. Ďalšou výhodou ikoniek je lepšia predstavivosť. Po niekoľkoročnej práci v Robolabe som ale natrafil na niekoľko nevýhod a úloh, ktoré nedokázal vyriešiť.  
 
Výhodou BricxCC je taktiež možnosť využívať pomocné aplikácie, ktoré si spomenieme neskôr.
 
Výhodou BricxCC je taktiež možnosť využívať pomocné aplikácie, ktoré si spomenieme neskôr.
  
 
+
== Začiatok - čo vlastne potrebujeme? ==
== Začiatok: čo vlastne potrebujeme? ==
+
Začiatkom práce je nájdenie inštalačného súboru. V súčasnej dobe je najnovšou verziou verzia 3.3. Nájdete ju na domácej stránke [http://bricxcc.sf.net projektu BricxCC].
Začiatkom práce je nájdenie inštalačného súboru. V súčasnej dobe je najnovšou verziou verzia 3.3. Nájdete ju na CD zo súťaže v adresári install, alebo na stránke http://bricxcc.sf.net.
+
Ak skúšate BricxCC na počítači, na ktorom predtým nebol nainštalovaný RoboLab je nutné nainštalovať LEGO Mindstorms SDK vo verzii 2.0 alebo 2.5 (kvôli firmwareu a ovládačom pre vežu). SDK nájdete aj na stránke firmy [http://mindstorms.lego.com/sdk2point5/LEGOMindstormsSDK25.zip LEGO]. Ovládače sa nachádzajú v adresári LEGO SDK v podadresári TowerDrv. Po zapojení veže, keď systém vyhodí hlášku o nainštalovaní ovládačov, treba zadať cestu a ovládače sa samé nainštalujú.
Na komunikáciu medzi PC a RCX potrebujete mať nainštalovaný program LEGO Mindstorms SDK vo verzii 2.0 alebo 2.5 (kvôli firmwareu a ovládačom pre vežu). Ten nájdete okrem CD aj na stránke www.lego.download.com.
 
 
Po jednoduchej inštalácii oboch programov spustíme program BricxCC.
 
Po jednoduchej inštalácii oboch programov spustíme program BricxCC.
  
Úvodné okno nám umožňuje nastaviť port pripojenia vežičky(najvýhodnejšie Automatic), firmware a typ riadiaceho centra(v našom prípade RCX).
+
Úvodné okno nám umožňuje nastaviť port pripojenia vežičky(najvýhodnejšie Automatic - automatické vyhladanie portu), firmware a typ riadiaceho centra(v našom prípade RCX).
Zapnuté RCX priblížime k vežičke. Ak program neohlási problém s pripojením RCX, zobrazí sa hlavné okno.
+
Zapnuté RCX priblížime k vežičke. Ak program neohlási problém s pripojením RCX, zobrazí sa hlavné okno. Ak by sa vyskytol problém tak RCX je vždy možne pripojiť v menu v položke Tools/Find Brick.
 
   
 
   
 
== Nahrávame Firmware ==
 
== Nahrávame Firmware ==
Firmware je nízkoúrovňový program na ovládanie hardwareu a interpretovanie príkazov, ktorý musí mať pred použitím každé RCX. Ak prebehlo pripojenie RCX v poriadku, v sekcii Tools\Download\Firmware nájdeme firmware, ktorý chceme nahrať(pokiaľ mám položku Download firmware šedú a nedá sa mi na ňu kliknúť, zvolím najskôr možnosť Find BricxCC). Nachádza sa v adresári, kde je nainštalovaný LEGO SDK. Môžete si ho vložiť do adresáru k Vašim programom, aby ste k nemu mali vždy dobrý prístup.
+
Firmware je nízkoúrovňový program na ovládanie hardwareu a interpretovanie príkazov, ktorý musí mať pred použitím každé RCX. Ak prebehlo pripojenie RCX v poriadku, v sekcii Tools\Download Firmware sa nám otvorí okno, v ktorom zvolíme firmware, ktorý chceme nahrať (pokiaľ je položka Download firmware šedá a nedá sa na ňu kliknúť, je potrebné najskôr najst RCX cez Tools/Find Brick). Firmware sa nachádza v adresári, kde je nainštalovaný LEGO SDK (súbor s príponou .lgo). Môžete si ho skopírovať do adresáru k Vašim programom, aby ste k nemu mali vždy dobrý prístup.
Píšeme prvý program
+
 
Jazyk nqc(not quite C – nie celkom C) používa syntax jazyka C. Práca s premennými a preprocesorom funguje rovnako, až na to, že treba dbať na pamäťovú obmedzenosť RCX. Za každým príkazom musíme napísať „ ; “, bloky vkladáme do zložených zátvoriek {}, pri každom volaní funkcie musíme za ňou napísať zátvorky (aj v prípade, že funkcia nepoužíva parametre).  
+
== Píšeme prvý program ==
Jazyk NQC je Case Sensitive - treba dávať pozor aj na písanie malých a veľkých písmen.  
+
Jazyk NQC(Not Quite C – Nie Celkom C) používa syntax jazyka C. Práca s premennými a predprocesorom funguje rovnako, až na to, že treba dbať na pamäťovú obmedzenosť RCX. Za každým príkazom musíme napísať „ ; “, bloky vkladáme do zložených zátvoriek {}, pri každom volaní funkcie za ňou musíme napísať zátvorky (a to aj v prípade, že funkcia nepoužíva parametre).  
Celková štruktúra programu je nasledovná: všetko sa začína hlavnou úlohou(angl. task) označenou main. Tá je zavolaná vždy na začiatku programu, ale nie je problém ju znovu spustiť.  
+
Jazyk NQC je Case Sensitive (rozlišuje malé a VEĽKÉ písmená) - treba dávať pozor aj na písanie malých a veľkých písmen.
 +
Celý program sa začína hlavnou úlohou(angl. task) označenou main. Tá sa automaticky zavolá vždy na začiatku programu, ale nie je problém ju, v prípade potreby, znovu spustiť.  
  
 
Štruktúra programu vyzerá nasledovne
 
Štruktúra programu vyzerá nasledovne
  
<nowiki>task main()
+
task main()
{
+
{
 
  //telo programu
 
  //telo programu
}</nowiki>
+
}
  
 
Poznámky k programom budeme písať takto  
 
Poznámky k programom budeme písať takto  
/*toto je poznámka*/
+
 
// toto je tiež poznámka
+
/*toto je poznámka*/
Pri robotoch bude najdôležitejší pohyb. Základné príkazy na pohyb sú  
+
// toto je tiež poznámka
OnFwd(OUT_A+OUT_C); motory A a C pôjdu dopredu   
+
 
OnRev(OUT_A+OUT_C); motory A a C pôjdu dozadu
+
Pri robotoch bude najdôležitejší pohyb. Základné príkazy na pohyb sú OnFwd, OnRev, Off, Float
Wait(100); proces bude trvať 1 sekundu(100 stotín)
+
 
Off(OUT_A+OUT_C); motory A a C sa vypnú 
+
OnFwd(OUT_A+OUT_C); //motory A a C pôjdu dopredu   
 +
OnRev(OUT_A+OUT_B); //motory A a B pôjdu dozadu
 +
Wait(100); //proces bude trvať 1 sekundu(100 stotín)
 +
Off(OUT_B); //motor B sa vypne 
 +
Float(OUT_C); //motor C sa vypne a umožní otáčanie
  
 
Jednoduchý program:
 
Jednoduchý program:
  
task main()
+
task main()
{
+
{
 
   SetPower(OUT_A+OUT_C,2);
 
   SetPower(OUT_A+OUT_C,2);
 
   OnFwd(OUT_A+OUT_C);
 
   OnFwd(OUT_A+OUT_C);
Line 57: Line 54:
 
   Wait(400);
 
   Wait(400);
 
   Off(OUT_A+OUT_C);
 
   Off(OUT_A+OUT_C);
}
+
}
  
 
== Práca so senzormi ==
 
== Práca so senzormi ==
Line 64: Line 61:
 
SENSOR_1 označuje port, SENSOR_TOUCH typ – dotykový. Ďalej poznáme SENSOR_LIGHT, SENSOR_ROTATION,SENSOR_CELSIUS a iné.
 
SENSOR_1 označuje port, SENSOR_TOUCH typ – dotykový. Ďalej poznáme SENSOR_LIGHT, SENSOR_ROTATION,SENSOR_CELSIUS a iné.
  
S hodnotami senzorov pracujeme ako s konštantou, preto si ich môžeme uložiť aj do premenných
+
S hodnotami senzorov pracujeme ako s konštantou, preto si ich hodnoty môžeme uložiť aj do premenných
int svetelnost=SENSOR_1;
+
int svetelnost=SENSOR_1;
 
Taktiež dokážeme spraviť priemernú hodnotu dvoch senzorov:
 
Taktiež dokážeme spraviť priemernú hodnotu dvoch senzorov:
int svetelnost=(SENSOR_1+SENSOR_2)/2;
+
int svetelnost=(SENSOR_1+SENSOR_2)/2;
  
 
== Jednoduché cykly ==
 
== Jednoduché cykly ==
Line 73: Line 70:
 
Budeme vykresľovať štvorce trajektóriou robota.  
 
Budeme vykresľovať štvorce trajektóriou robota.  
  
#define MOVE_TIME  100    // čas chodu dopredu–dĺžka strany
+
#define MOVE_TIME  100    // čas chodu dopredu–dĺžka strany
#define TURN_TIME    85    // čas na otočenie o 90°
+
#define TURN_TIME    85    // čas na otočenie o 90°
 +
 +
task main()
 +
{
 +
  repeat(10)              // urob 10 štvorcov
 +
  {
 +
    repeat(4)
 +
    {
 +
      OnFwd(OUT_A+OUT_C);
 +
      Wait(MOVE_TIME);
 +
      OnRev(OUT_C);
 +
      Wait(TURN_TIME);
 +
    }
 +
  }
 +
  Off(OUT_A+OUT_C);        // a potom všetko vypni
 +
 
 +
== Predprocesor jazyka NQC ==
 +
Predprocesor je súčasť kompilátora, ktorá sa volá pred procesom samotnej kompilácie. Kontroluje správnosť zdrojového kódu, prípadne s ním vykonáva zadané operácie. Zadávať operácie môžeme špeciálnymi príkazmi, ktoré sa začínajú #. Medzi základné funkcie predprocesora patrí define a include. Define používame na nahradenie časti kódu inou časťou. Syntax je nasledovná:
  
task main()
+
#define MOTOR_LAVY OUT_A
{
+
#define MOTOR_PRAVY OUT_C
  repeat(10)              // urob 10 štvorcov
+
#define SVETELNY_SENZOR SENSOR_1
  {
+
#define OBA_MOTORY OUT_A+OUT_C
    repeat(4)
+
#define DOBA_CAKANIA 50
    {
 
      OnFwd(OUT_A+OUT_C);
 
      Wait(MOVE_TIME);
 
      OnRev(OUT_C);
 
      Wait(TURN_TIME);
 
    }
 
  }
 
  Off(OUT_A+OUT_C);        // a potom všetko vypni
 
  
== Preprocesor jazyka NQC ==
+
časti kódu definované cez define sú pokladané za konštanty a preto by sa mali nazývať veľkými písmenami oddelenými podtržníkom ale predprocesor niečo také nerozlišuje a preto je spravna aj syntax
Preprocesor je súčasť kompilátora, ktorá sa volá pred procesom samotnej kompilácie. Kontroluje správnosť zdrojového kódu, prípadne s ním vykonáva zadané operácie. Zadávať operácie môžeme špeciálnymi príkazmi, ktoré sa začínajú #. Medzi základné funkcie preprocesora patrí define a include. Define používame na nahradenie časti kódu inou časťou. Syntax je nasledovná:
 
  
#define motorlavy OUT_A
+
#define MotOr_LaVY OUT_A
#define motorpravy OUT_C
 
#define svetelnysenzor SENSOR_1
 
#define obamotory OUT_A+OUT_C
 
  
 
Pozor: za definovaním nepíšeme bodkočiarku!!!
 
Pozor: za definovaním nepíšeme bodkočiarku!!!
  
== Tasks(úlohy)==
+
Include vloží na miesto kde bola zavolaná súbor v úvodzovkách. To má využitie vtedy ak chceme spojiť pár zdrojových kódov (napr. pre viac RCX). Napríklad môže existovať jeden súbor, ktorý zastrešuje komunikáciu medzi RCX. V nom budú definované (cez define) čísla správ, ktoré si RCX budú posielať. Tým pádom ak zmeníme konštantu len v tomto súbore zmení sa naraz aj v obidvoch programoch. Tieto súbory sa nazývaju všeobecne hlavičkové súbory. Existuje konvencia, ktorá hovorí, že súbory programov písaných v jazyku NQC majú koncovku nqc. Tá istá konvencia hovorí, že hlavičkové súbory budú mať koncovku .nqh.
Väčšina programov potrebuje tasky využívať, pretože nevykonávajú len jednu činnosť. Úlohu si môžeme ľubovoľne pomenovať, pričom ďalej budeme používať jej názov. Ako bolo hore spomínané, základný task má názov main. Je to preto, aby ho RCX dokázal rozpoznať a začať s ním. Tasky iné ako main nezačínajú automaticky, musím ich zapnúť príkazom start nazovtasku;.
+
 
 +
#include "globalne_premenne.nqh"
 +
 
 +
== Tasks(úlohy) ==
 +
Tasky sú častami kódu ktoré pracuju simultánne. Príkladom móže byť program pre robota zachranára, v ktorom jeden task prechádza po čiare a druhý hladá farebné obete. Väčšina programov potrebuje tasky využívať, pretože nevykonávajú len jednu činnosť. Úlohu si môžeme ľubovoľne pomenovať, pričom ďalej budeme používať jej názov. Ako bolo hore spomínané, základný task má názov main. Je to preto, aby ho RCX dokázal rozpoznať a začať s ním. RCX zvláda maximálne 10 taskov a je potrebné na to myslieť pri programovaní. Tasky iné ako main nezačínajú automaticky, musím ich zapnúť príkazom
 +
 +
start nazovtasku;
 +
 
 +
v ktorej koľvek časti programu (aj v inom tasku) môžeme task vypnúť príkazom
  
== Ukážkový program==
+
stop nazovtasku;
Tento program je program na robosoccer. Je to jeho základ. Pointa je v hľadaní lopty točením. Keď ju nájdem, idem dopredu za ňou.
 
  
#define lavy OUT_A
+
== Ukážkový program ==
#define pravy OUT_C
+
Tento program je program na robosoccer. Je to len jeho základ. Pointa je v hľadaní lopty točením. Keď ju nájdem, idem dopredu za ňou.
#define svetelny SENSOR_2
 
  
task main()
+
#define lavy OUT_A
{
+
#define pravy OUT_C
SetSensor(SENSOR_2, SENSOR_LIGHT);
+
#define svetelny SENSOR_2
start hladanie;
+
}
+
task main()
 +
{
 +
  SetSensor(SENSOR_2, SENSOR_LIGHT);
 +
  start hladanie;
 +
}
 
   
 
   
 
  task hladanie()
 
  task hladanie()
 +
{
 +
  while(true)
 
   {
 
   {
   while(true)
+
   SetPower (lavy+pravy,3);
    {
+
  OnFwd(lavy);
      SetPower (lavy+pravy,3);
+
  OnRev(pravy);
      OnFwd(lavy);
+
      OnRev(pravy);
+
  if (svetelny>50)
 
+
  {
        if (svetelny>50)
+
    start nasla_sa_lopta;
      {
+
    stop hladanie;
          start nasla_sa_lopta;
+
  }
          stop hladanie;
 
      }
 
    }
 
 
   }
 
   }
 
+
}
 +
 
  task nasla_sa_lopta()
 
  task nasla_sa_lopta()
 +
{
 +
  while(svetelny>50)
 
   {
 
   {
    while(svetelny>50)
+
  OnFwd(lavy+pravy);
    {
 
      OnFwd(lavy+pravy);
 
    }
 
    start hladanie;
 
    stop nasla_sa_lopta;
 
 
   }
 
   }
 +
  start hladanie;
 +
  stop nasla_sa_lopta;
 +
}
  
 
== Ďalšie užitočné funkcie programu BricxCC ==  
 
== Ďalšie užitočné funkcie programu BricxCC ==  
V BricxCC tiež fungujú tzv. správy (Message) na komunikáciu medzi viacerými RCX.
+
V BricxCC tiež fungujú tzv. správy (Messages) na komunikáciu medzi viacerými RCX.
 
Všetky príkazy nájdete po stlačení F9 – Templates. Kliknete naň a automaticky sa vloží do programu.  
 
Všetky príkazy nájdete po stlačení F9 – Templates. Kliknete naň a automaticky sa vloží do programu.  
 
Na ľavej strane máme lištu kde sú všetky tasky – vo veľkom programe sa nám to môže hodiť.  
 
Na ľavej strane máme lištu kde sú všetky tasky – vo veľkom programe sa nám to môže hodiť.  
  
== Viac informácii o BricxCC ==  
+
== Viac informácií o BricxCC ==  
Nájdete na internete(www.google.com).Slovenský preklad programu ani celého manuálu zatiaľ nie je. Na CD zo Starej Turej nájdete oficiálny Tutoriál v anglickom jazyku.
+
Nájdete na internete(na [http://www.google.com googli] vyhľadajte Bricx, Lego Mindstorms, NQC). Slovenský preklad programu ani celého manuálu zatiaľ nie je ale v pripade veľkého zaujmu o preklad by bolo možné zorganizovať prekladací tím, ktorý by ju preložil.
  
== Autor ==  
+
== Autori ==  
Je študentom 2.ročníka Gymnázia v Považskej Bystrici a trojnásobným majstrom Slovenska a účastníkom MS RoboCup 2004 Portugal, 2005 Japan a 2006 Germany.  
+
Lukáš Boško je študentom 2.ročníka Gymnázia v Považskej Bystrici a trojnásobným majstrom Slovenska a účastníkom MS RoboCup 2004 Portugal, 2005 Japan a 2006 Germany.  
 
Popri svojej účasti na súťaži vedie krúžok Robolab v ZŠ Domaniža v okrese Považská Bystrica.  
 
Popri svojej účasti na súťaži vedie krúžok Robolab v ZŠ Domaniža v okrese Považská Bystrica.  
  
Kontakt  
+
Kontakt<br>
e-mail: lukasbosko@gmail.com
+
e-mail: lukasbosko[[Image:zavinac.gif]]gmail.com<br>
icq: 229-836-917
+
icq: 229-836-917<br>
web: www.lukash.colorko.net
+
web: [http://www.lukash.colorko.net/ www.lukash.colorko.net]
 +
 
 +
Andrej Pančík je študentom 4. ročníka Gymnázia Jozefa Gregora Tajovského v Banskej Bystrici. Zúčastnil sa MS RoboCup 2003, 2004 a 2006.
 +
 
 +
Kontakt<br>
 +
e-mail: apancik[[Image:zavinac.gif]]gmail.com<br>
 +
icq: 281-284-500<br>
 +
web: [http://ave.ic.cz ave.ic.cz]
 +
 
 +
 
 +
[[Category:LEGO]]

Latest revision as of 22:55, 4 March 2009

V dnešnej dobe je spôsobov na programovanie robotických stavebníc Lego Mindstorms a Lego Mindstorms NXT je viacero. Za najrozšírenejší medzi školami sa pokladá Robolab v rôznych verziách. Ak sa chcete naučiť niečo nové neváhajte a vyskúšajte programovací jazyk NQC. V nasledujúcich pár riadkoch sa zoznámime s vývojovím prostredím Bricx Command Center.

Pojmy BricxCC a NQC

Bricx Command Center (ďalej BricxCC) je IDE (Integrated Development Enviroment – integrované vývojárske prostredie). Je to grafické prostredie, ktoré využíva kompilátor programovacieho jazyku NQC pre RCX alebo NXC pre stavebnice NXT. Je v ňom možné vyvíjať programy pre tieto platformy bez obmedzení, ktoré prináša prostredie RoboLab.

Rozdiel medzi BricxCC vs. RoboLab

V Robolabe dokážete naprogramovať takmer všetko jednoduchou a hravou cestou. To je výhodou pre základoškolákov, ktorí sa ešte nestretli s písaním programov v textovom editore. Ďalšou výhodou ikoniek je lepšia predstavivosť. Po niekoľkoročnej práci v Robolabe som ale natrafil na niekoľko nevýhod a úloh, ktoré nedokázal vyriešiť. Výhodou BricxCC je taktiež možnosť využívať pomocné aplikácie, ktoré si spomenieme neskôr.

Začiatok - čo vlastne potrebujeme?

Začiatkom práce je nájdenie inštalačného súboru. V súčasnej dobe je najnovšou verziou verzia 3.3. Nájdete ju na domácej stránke projektu BricxCC. Ak skúšate BricxCC na počítači, na ktorom predtým nebol nainštalovaný RoboLab je nutné nainštalovať LEGO Mindstorms SDK vo verzii 2.0 alebo 2.5 (kvôli firmwareu a ovládačom pre vežu). SDK nájdete aj na stránke firmy LEGO. Ovládače sa nachádzajú v adresári LEGO SDK v podadresári TowerDrv. Po zapojení veže, keď systém vyhodí hlášku o nainštalovaní ovládačov, treba zadať cestu a ovládače sa samé nainštalujú. Po jednoduchej inštalácii oboch programov spustíme program BricxCC.

Úvodné okno nám umožňuje nastaviť port pripojenia vežičky(najvýhodnejšie Automatic - automatické vyhladanie portu), firmware a typ riadiaceho centra(v našom prípade RCX). Zapnuté RCX priblížime k vežičke. Ak program neohlási problém s pripojením RCX, zobrazí sa hlavné okno. Ak by sa vyskytol problém tak RCX je vždy možne pripojiť v menu v položke Tools/Find Brick.

Nahrávame Firmware

Firmware je nízkoúrovňový program na ovládanie hardwareu a interpretovanie príkazov, ktorý musí mať pred použitím každé RCX. Ak prebehlo pripojenie RCX v poriadku, v sekcii Tools\Download Firmware sa nám otvorí okno, v ktorom zvolíme firmware, ktorý chceme nahrať (pokiaľ je položka Download firmware šedá a nedá sa na ňu kliknúť, je potrebné najskôr najst RCX cez Tools/Find Brick). Firmware sa nachádza v adresári, kde je nainštalovaný LEGO SDK (súbor s príponou .lgo). Môžete si ho skopírovať do adresáru k Vašim programom, aby ste k nemu mali vždy dobrý prístup.

Píšeme prvý program

Jazyk NQC(Not Quite C – Nie Celkom C) používa syntax jazyka C. Práca s premennými a predprocesorom funguje rovnako, až na to, že treba dbať na pamäťovú obmedzenosť RCX. Za každým príkazom musíme napísať „ ; “, bloky vkladáme do zložených zátvoriek {}, pri každom volaní funkcie za ňou musíme napísať zátvorky (a to aj v prípade, že funkcia nepoužíva parametre). Jazyk NQC je Case Sensitive (rozlišuje malé a VEĽKÉ písmená) - treba dávať pozor aj na písanie malých a veľkých písmen. Celý program sa začína hlavnou úlohou(angl. task) označenou main. Tá sa automaticky zavolá vždy na začiatku programu, ale nie je problém ju, v prípade potreby, znovu spustiť.

Štruktúra programu vyzerá nasledovne

task main()
{
//telo programu
}

Poznámky k programom budeme písať takto

/*toto je poznámka*/
// toto je tiež poznámka

Pri robotoch bude najdôležitejší pohyb. Základné príkazy na pohyb sú OnFwd, OnRev, Off, Float

OnFwd(OUT_A+OUT_C); 			//motory A a C pôjdu dopredu  
OnRev(OUT_A+OUT_B); 			//motory A a B pôjdu dozadu
Wait(100); 				//proces bude trvať 1 sekundu(100 stotín)
Off(OUT_B); 				//motor B sa vypne  
Float(OUT_C);				//motor C sa vypne a umožní otáčanie

Jednoduchý program:

task main()
{
 SetPower(OUT_A+OUT_C,2);
 OnFwd(OUT_A+OUT_C);
 Wait(400);
 OnRev(OUT_A+OUT_C);
 Wait(400);
 Off(OUT_A+OUT_C);
}

Práca so senzormi

BricxCC pozná všetky typy senzorov ako Robolab. Pred používaním ich hodnôt najskôr musíme zadefinovať, o aký typ senzoru sa jedná. Nato slúži funkcia SetSensor: SetSensor(SENSOR_1, SENSOR_TOUCH); SENSOR_1 označuje port, SENSOR_TOUCH typ – dotykový. Ďalej poznáme SENSOR_LIGHT, SENSOR_ROTATION,SENSOR_CELSIUS a iné.

S hodnotami senzorov pracujeme ako s konštantou, preto si ich hodnoty môžeme uložiť aj do premenných

int svetelnost=SENSOR_1;

Taktiež dokážeme spraviť priemernú hodnotu dvoch senzorov:

int svetelnost=(SENSOR_1+SENSOR_2)/2;

Jednoduché cykly

Programovací jazyk NQC pozná nasledovné cykly while, while-do, repeat-until,repeat, for, swich.. Základnou podmienkou je podmienka IF. Syntax je uvedená v sekcii Templates(F9). Jednoduchý program ukazuje použitie cyklu repeat(opakuj). Budeme vykresľovať štvorce trajektóriou robota.

#define MOVE_TIME   100     // čas chodu dopredu–dĺžka strany
#define TURN_TIME    85     // čas na otočenie o 90°

task main()
{
  repeat(10)               	// urob 10 štvorcov
  {
    repeat(4)
    {
      OnFwd(OUT_A+OUT_C);
      Wait(MOVE_TIME);
      OnRev(OUT_C);
      Wait(TURN_TIME);
    }
  }
  Off(OUT_A+OUT_C);         // a potom všetko vypni

Predprocesor jazyka NQC

Predprocesor je súčasť kompilátora, ktorá sa volá pred procesom samotnej kompilácie. Kontroluje správnosť zdrojového kódu, prípadne s ním vykonáva zadané operácie. Zadávať operácie môžeme špeciálnymi príkazmi, ktoré sa začínajú #. Medzi základné funkcie predprocesora patrí define a include. Define používame na nahradenie časti kódu inou časťou. Syntax je nasledovná:

#define MOTOR_LAVY OUT_A	
#define MOTOR_PRAVY OUT_C
#define SVETELNY_SENZOR SENSOR_1
#define OBA_MOTORY OUT_A+OUT_C
#define DOBA_CAKANIA 50

časti kódu definované cez define sú pokladané za konštanty a preto by sa mali nazývať veľkými písmenami oddelenými podtržníkom ale predprocesor niečo také nerozlišuje a preto je spravna aj syntax

#define MotOr_LaVY OUT_A

Pozor: za definovaním nepíšeme bodkočiarku!!!

Include vloží na miesto kde bola zavolaná súbor v úvodzovkách. To má využitie vtedy ak chceme spojiť pár zdrojových kódov (napr. pre viac RCX). Napríklad môže existovať jeden súbor, ktorý zastrešuje komunikáciu medzi RCX. V nom budú definované (cez define) čísla správ, ktoré si RCX budú posielať. Tým pádom ak zmeníme konštantu len v tomto súbore zmení sa naraz aj v obidvoch programoch. Tieto súbory sa nazývaju všeobecne hlavičkové súbory. Existuje konvencia, ktorá hovorí, že súbory programov písaných v jazyku NQC majú koncovku nqc. Tá istá konvencia hovorí, že hlavičkové súbory budú mať koncovku .nqh.

#include "globalne_premenne.nqh"

Tasks(úlohy)

Tasky sú častami kódu ktoré pracuju simultánne. Príkladom móže byť program pre robota zachranára, v ktorom jeden task prechádza po čiare a druhý hladá farebné obete. Väčšina programov potrebuje tasky využívať, pretože nevykonávajú len jednu činnosť. Úlohu si môžeme ľubovoľne pomenovať, pričom ďalej budeme používať jej názov. Ako bolo hore spomínané, základný task má názov main. Je to preto, aby ho RCX dokázal rozpoznať a začať s ním. RCX zvláda maximálne 10 taskov a je potrebné na to myslieť pri programovaní. Tasky iné ako main nezačínajú automaticky, musím ich zapnúť príkazom

start nazovtasku;

v ktorej koľvek časti programu (aj v inom tasku) môžeme task vypnúť príkazom

stop nazovtasku;

Ukážkový program

Tento program je program na robosoccer. Je to len jeho základ. Pointa je v hľadaní lopty točením. Keď ju nájdem, idem dopredu za ňou.

#define lavy OUT_A
#define pravy OUT_C
#define svetelny SENSOR_2

task main()
{
 SetSensor(SENSOR_2, SENSOR_LIGHT);
 start hladanie;
}

task hladanie()
{
 while(true)
 {
  SetPower (lavy+pravy,3);
  OnFwd(lavy);
  OnRev(pravy);

  if (svetelny>50)
  {
    start nasla_sa_lopta;
    stop hladanie;
  }
 }
}

task nasla_sa_lopta()
{
 while(svetelny>50)
 {
  OnFwd(lavy+pravy);
 }
 start hladanie;
 stop nasla_sa_lopta;
}

Ďalšie užitočné funkcie programu BricxCC

V BricxCC tiež fungujú tzv. správy (Messages) na komunikáciu medzi viacerými RCX. Všetky príkazy nájdete po stlačení F9 – Templates. Kliknete naň a automaticky sa vloží do programu. Na ľavej strane máme lištu kde sú všetky tasky – vo veľkom programe sa nám to môže hodiť.

Viac informácií o BricxCC

Nájdete na internete(na googli vyhľadajte Bricx, Lego Mindstorms, NQC). Slovenský preklad programu ani celého manuálu zatiaľ nie je ale v pripade veľkého zaujmu o preklad by bolo možné zorganizovať prekladací tím, ktorý by ju preložil.

Autori

Lukáš Boško je študentom 2.ročníka Gymnázia v Považskej Bystrici a trojnásobným majstrom Slovenska a účastníkom MS RoboCup 2004 Portugal, 2005 Japan a 2006 Germany. Popri svojej účasti na súťaži vedie krúžok Robolab v ZŠ Domaniža v okrese Považská Bystrica.

Kontakt
e-mail: lukasboskoZavinac.gifgmail.com
icq: 229-836-917
web: www.lukash.colorko.net

Andrej Pančík je študentom 4. ročníka Gymnázia Jozefa Gregora Tajovského v Banskej Bystrici. Zúčastnil sa MS RoboCup 2003, 2004 a 2006.

Kontakt
e-mail: apancikZavinac.gifgmail.com
icq: 281-284-500
web: ave.ic.cz