reklama

Programování pro malé i velké – Lego RIS 2.0, základy jazyka NQC, 3. díl

V posledním díle seriálu o základech jazyka NQC se budeme nejprve zabývat úlohami, ale seznámíme se také s podprogramy. Ukážeme si například, jaké mají výhody i jaká mohou mít omezení.

Úlohy

Úlohy využijeme v programech, ve kterých má robot vykonávat více činností současně – například má-li hrát hudbu a zároveň kontrolovat, zda do něčeho nenarazil.

Jak už víme, musí být v programu jedna úloha s názvem main(). Syntaxe dalších úloh je stejná:

task jina_uloha()
{}

Název úlohy mohou tvořit písmena, číslice a podtržítka (číslice a podtržítka nesmí být na prvním místě). Úlohu  spustíme z úlohy main() příkazem start jmeno_nasi_ulohy(). Obě úlohy poté zdánlivě běží naráz. Chceme-li zastavit běžící úlohu, použijeme příkaz stop.

Použití v konkrétním případě vypadá následovně:

task pohyb()
{
  while(true) 
  {
    Wait(150);
    OnRev(OUT_A);
    Wait(120); 
    OnFwd(OUT_A);
  }
}
task hudba()
{
  while(true) 
  {
    PlayTone(262,40); Wait(50);
    PlayTone(294,40); Wait(50);
    PlayTone(330,40); Wait(50);
    PlayTone(294,40); Wait(100);
  }
}
task main()
{
  OnFwd(OUT_A+OUT_C);
  start pohyb; 
  start hudba;
}

Robot nyní jezdí a zároveň hraje hudbu.

Úloh může být maximálně deset (včetně úlohy main), a proto je dobré psát úlohy jen v nezbytných případech, jinak je lepší použít podprogramy (viz dále).

Při spouštění více úloh je potřeba dávat pozor na přístup ke globálním hodnotám (hlavně motory, ale třeba i proměnné). Podívejme se na následující program:

task pohyb()
{
  while(true)
  {
    OnFwd(OUT_A+OUT_C);
    Wait(50);
    OnRev(OUT_A+OUT_C);
    Wait(50);
  }
}
task zmackni_senzor()
{
  while (SENSOR_1 ==1)
  {
    OnRev(OUT_A);
    Wait(120);
    OnFwd(OUT_A);
  }
}
task main()
{
  OnFwd(OUT_A+OUT_C);
  start pohyb;
  start zmackni_senzor;
}

Spustíme-li program, začne se robot pohybovat směrem dopředu a couvat. Pokud stlačíme dotykový senzor, tak se robot namísto otočení o 90 ° bude dál pohybovat pouze dopředu a dozadu. Chyba je v přístupu programu k motorům. Ve chvíli, kdy se robot v úloze zmackni_senzor() začne otáčet, převezme opět kontrolu motorů úloha pohyb() (úlohy běží současně).

Tuto situaci lze vyřešit pomocí zmiňovaného příkazu stop. Pokud na začátku úlohy zmackni_senzor() zastavíme úlohu pohyb() a na konci ji opět zapneme, bude vše fungovat, jak má. Upravený kód úlohy zmackni_senzor() vypadá následovně:

task zmackni_senzor()
{
  stop pohyb;
  OnRev(OUT_A);
  Wait(120);
  OnFwd(OUT_A);
  start pohyb;
}

Podprogramy

Zatím jsme psali veškerý náš zdrojový kód pouze do úloh. Tento zápis může být někdy zbytečně dlouhý. Naštěstí lze zápis zkracovat pomocí podprogramů. Podívejme se na následující program:

task main()
{
  OnFwd(OUT_A+OUT_C);
  Wait(100);
  OnRev(OUT_C);
  Wait(60);
  OnRev(OUT_A);
  Wait(100);
  OnFwd(OUT_A+OUT_C);
  Wait(100);
  OnRev(OUT_A+OUT_C );
  Wait(100);
  OnFwd(OUT_A+OUT_C);
  Wait(100);
  Off(OUT_A+OUT_C);
}

Po spuštění tohoto programu pojede robot chvíli dopředu, pak zatočí a dvakrát pojede dozadu a dopředu. Všimněme si, že kód OnFwd(OUT_A+OUT_C); Wait(100); se v textu vyskytuje třikrát. Nyní zapíšeme program s využitím podprogramu:

sub pohyb_rovne();
{
  OnFwd(OUT_A+OUT_C);
  Wait(100);
}
task main
{
  pohyb_rovne();
  OnRev(OUT_C);
  Wait(60);
  OnRev(OUT_A);
  pohyb_rovne();
  OnRev( OUT_A+OUT_C );
  Wait(100);
  pohyb_rovne();
  Off(OUT_A+OUT_C);
}

Stále se opakující kód jsme nahradili jedním podprogramem. Za klíčovým slovem sub je jméno našeho podprogramu, přičemž podprogram zavoláme z úlohy pomocí jeho názvu. Pro název platí stejná pravidla (první je písmeno a další mohou být písmena, číslice a podtržítka), za ním jsou závorky stejně jako u úloh.

Hlavní výhodou je větší přehlednost kódu a lepší možnost upravovat hodnoty. Určitě se lépe mění kód na jednom místě než v několika místech naráz. Použití podprogramů má ale také svá omezení. Jeden program smí obsahovat nejvýše osm podprogramů. Podprogramy nemohou obsahovat příliš složité výrazy, kvůli omezení firmwaru RCX, a  také nemohou být spouštěny z jiných podprogramů.

Podprogram můžeme sice spouštět i z jiných úloh než z úlohy main(), ale je třeba dát pozor, aby se nevolal současně z několika úloh. Potom totiž mohou nastat neočekávané komplikace.

To je ze základů jazyka NQC vše. Pro vaše další pokusy s roboty LEGO MIDNSTORMS nabízíme několik odkazů:

Oficiální stránky LEGO MINDSTORMS:
 http://mindstorms.lego.com/?domainredir=www.legomindstorms.com

Stránky se zajímavými roboty:
 http://www.lipperfamily.org/lego%20robots.htm
 http://home.arcor.de/markus.matern/Robotics/index.html

autoři: Filip Děchtěrenko, Mirek Dočekal a Jakub Sedlák

Témata článku: Programování, Lego, Stop, Lego Mindstorms, Mindstorms

Nejnovější komentáře

Přidat příspěvek
reklama
Určitě si přečtěte

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

** V Brně byl velký výpadek služeb UPC ** Důvodem je překopnutý páteřní kabel ** V některých lokalitách služby stále nefungují

5.  12.  2016 | Jakub Čížek | 104

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

** Zmizí klasické vyhledávače ** Budeme programovat buňky ** Kvantové počítače překonají šifry

6.  12.  2016 | Jakub Čížek | 36

11 tipů na dobrý stolní počítač: od základu po herní mašiny

11 tipů na dobrý stolní počítač: od základu po herní mašiny

** Postavte si stolní počítač! Máme pro vás 11 vzorových sestav s rozpisem komponent ** Většina tipů cílí na hráče, věnujeme se ale i základnímu PC a počítačům na střih videa ** Nadělte si nový počítač třeba pod stromeček

5.  12.  2016 | Adam Kahánek | 74

Nejlepší notebooky nad 20 tisíc: poradíme, které teď chcete

Nejlepší notebooky nad 20 tisíc: poradíme, které teď chcete

** V notebooku s cenou nad 20 tisíc nesmí chybět kvalitní displej a rychlé úložiště ** Za dalších deset tisíc můžete dostat navíc styl nebo výkonnější komponenty ** Vybírat můžete z různých velikostí i konstrukcí

8.  12.  2016 | Stanislav Janů | 87

Technosféra naší Země má už hmotnost 30 bilionů tun

Technosféra naší Země má už hmotnost 30 bilionů tun

** Vědci odhadli přibližné množství strukturu vytvořených člověkem, které jsou na Zemi ** Přibližný odhad je, že tyto struktury mají dohromady hmotnost kolem 30 bilionů tun ** Jak to ovliní biosféru?

Včera | Karel Javůrek | 9


reklama