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, Lego Mindstorms, Zajímavý robot, Mindstorms, Stejná úloha, Motor, Díl, Dotykový senzor, Lega, Jazyk, Úloha, Základ

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

Tesla chce změnit nákladní dopravu. Její elektrický náklaďák má ohromující parametry

Tesla chce změnit nákladní dopravu. Její elektrický náklaďák má ohromující parametry

** Tesla představila elektrický kamion ** Má obdivuhodný výkon i dojezd ** Prodávat by se měl už za dva roky

17.  11.  2017 | Vojtěch Malý | 228

Nejlepší notebooky do 10 tisíc, které si teď můžete koupit

Nejlepší notebooky do 10 tisíc, které si teď můžete koupit

** I pod hranicí desíti tisíc korun existují dobře použitelné notebooky ** Mohou plnit roli pracovního stroje i zařízení pro zábavu ** Nejlevnější použitelný notebook koupíte za pět a půl tisíce

16.  11.  2017 | Stanislav Janů | 55

Google Mapy mají nový design. Líbí se vám víc než předchozí? Tady je srovnání

Google Mapy mají nový design. Líbí se vám víc než předchozí? Tady je srovnání

** Nový design Google Map přijde na počítače i mobilní telefony. ** Zaměřuje se na zvýraznění konkrétních míst, mapové podklady jsou mnohdy upozaděné. ** Lépe pracuje s chráněnými oblastmi a parky.

20.  11.  2017 | Vladislav Kluska | 27


Aktuální číslo časopisu Computer

Otestovali jsme 5 HDR 4K televizorů

Jak natáčet video zrcadlovkou

Vytvořte si chytrou domácnost

Radíme s koupí počítačového zdroje