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

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

Kde nejlevněji uložit 1 TB dat: Srovnali jsme aktuální ceny cloudových úložišť

Kde nejlevněji uložit 1 TB dat: Srovnali jsme aktuální ceny cloudových úložišť

** Srovnali jsme známá cloudová úložiště podle toho, kolik měsíčně zaplatíte za 1TB ** Ceny se pohybují od dvou stovek až po tisíc korun ** Google umožní uložit až 30 TB dat

18.  3.  2017 | Stanislav Janů | 113

Pojďme programovat elektroniku: Meteostanice, která bude díky Sigfoxu posílat stav počasí třeba z vrcholu Sněžky

Pojďme programovat elektroniku: Meteostanice, která bude díky Sigfoxu posílat stav počasí třeba z vrcholu Sněžky

** Příští roky budou ve znamení internetu věcí ** Podívali jsme se podrobně na síť Sigfox ** Takhle s ní komunikují krabičky z celé Evropy

19.  3.  2017 | Jakub Čížek | 18

Obří Mechroboti jsou realitou, měří čtyři metry a mají hmotnost přes 1,5 tuny

Obří Mechroboti jsou realitou, měří čtyři metry a mají hmotnost přes 1,5 tuny

** Jihokorejská společnost Hankook Mirae Technology vyrábí obří Mechroboty ** Jsou určené pro ovládání člověkem uvnitř ** V prodeji se objeví koncem tohoto roku za 200 milionů korun

20.  3.  2017 | Karel Javůrek | 18

Google představil nový Android O. Na co se můžeme těšit?

Google představil nový Android O. Na co se můžeme těšit?

** Google vypustil vývojářskou verzi nového Androidu ** Přinese lepší notifikace nebo prodlouženou výdrž ** K uživatelům se dostane na podzim

Včera | Stanislav Janů | 49


Aktuální číslo časopisu Computer

Supertéma o počítačové bezpečnosti

AMD Ryzen přichází

Velké testy kinoprojektorů a levných sluchátek

Příslušenství do USB-C