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í, Robota, Motor, Lega, Lego, Lego Mindstorms, Mindstorms

reklama
Určitě si přečtěte

Facebook o nás ví vše. Díky dobře skrytému vyhledávači se to dozví i ostatní

Facebook o nás ví vše. Díky dobře skrytému vyhledávači se to dozví i ostatní

** Facebook o nás ví vše, protože mu to sami řekneme ** V jeho nitru se skrývá mocný vyhledávač ** Mohou jej zneužít stalkeři, sociální inženýři a další nezbedníci

16.  2.  2017 | Jakub Čížek | 76

Pojďme programovat elektroniku: Žádný bastlíř se neobejde bez armády švábů

Pojďme programovat elektroniku: Žádný bastlíř se neobejde bez armády švábů

** Každý bastlíř se po čase neobjede bez armády švábů ** Dnes si některé z nich vyzkoušíme ** Třeba zázračný posuvný registr

19.  2.  2017 | Jakub Čížek | 33

K čemu jsou v zimě dobré chytré hodinky? Z lyžování vám udělají datové orgie

K čemu jsou v zimě dobré chytré hodinky? Z lyžování vám udělají datové orgie

** Chytré hodinky našly uplatnění především ve sportu ** Běhání či jízdu na kole zvládnou všechny, ale co třeba lyžování? ** Podívejte se, jak jsou na zimní sporty připraveny hodinky Garmin Fenix 3

15.  2.  2017 | David Polesný | 22


Aktuální číslo časopisu Computer

Stavba 3D tiskárny

Výbava domácí elektrodílničky

Budoucnost 5G sítí

Velké testy microSD karet a vodních chladičů

Přehled mobilních tarifů

reklama
reklama