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

Operační systém běžným počítačům nedal Bill Gates, ale Gary Kildall

Operační systém běžným počítačům nedal Bill Gates, ale Gary Kildall

** Gary Kildall pochopil, že levné výpočetní čipy mohou posloužit jako univerzální počítače pro všechny ** Připravil pro ně proto první operační systém ** Později mu systém vyfoukl Microsoft a nazval ho MS DOS

23.  4.  2017 | Pavel Tronner | 54

Umělá inteligence je sice v plenkách, už teď ale přestáváme rozumět, jak vlastně funguje. To je problém

Umělá inteligence je sice v plenkách, už teď ale přestáváme rozumět, jak vlastně funguje. To je problém

** Už je to tady, lidé přestávají chápat počítače ** Systémy neuronových sítí začínají pracovat tak, že ani jejich tvůrci přesně neví, co se uvnitř děje ** Do budoucna to může být závažný problém

24.  4.  2017 | Jakub Čížek | 112

Před 35 lety měl premiéru legendární počítač ZX Spectrum. Připomeňte si „Gumáka“

Před 35 lety měl premiéru legendární počítač ZX Spectrum. Připomeňte si „Gumáka“

** Slavný osmibitový počítač Sinclair ZX Spectrum byl uveden právě před 35 lety ** Připomeňte si tento průkopnický počítač v tematických článcích ** Podívejte se, jak funguje dnes

23.  4.  2017 | Pavel Tronner | 13

Správný počítač má alespoň dva monitory. Anebo je to jinak?

Správný počítač má alespoň dva monitory. Anebo je to jinak?

** David si nedokáže představit práci bez dvou a více monitorů ** Kubovi naopak stačí jeden a ve více displejích se ztrácí ** Jaký přístup je lepší?

23.  4.  2017 | Jakub Čížek | 59

Český Google Překladač začal používat umělou inteligenci. Konec „drahoušků zákazníků“

Český Google Překladač začal používat umělou inteligenci. Konec „drahoušků zákazníků“

** Google ve svém překladači roky používal statistickou technologii ** Nyní zavádí strojové učení a neuronové sítě ** Rozdíl by měl být zvláště na větších textech patrný už nyní

20.  4.  2017 | Jakub Čížek | 31

Brno otevřelo největší českou dílnu pro bastlíře. Kladívka, vrtačky, 3D tiskárny, laserové řezačky. Je tu vše

Brno otevřelo největší českou dílnu pro bastlíře. Kladívka, vrtačky, 3D tiskárny, laserové řezačky. Je tu vše

** Máte nápad, ale chybí vám stroje a pořádná dílna? ** Chcete postavit ptačí budku, nebo krabičku pro Arduino? ** Brno otevřelo svůj FabLab – laboratoř pro bastlíře

19.  4.  2017 | Jakub Čížek | 31


Aktuální číslo časopisu Computer

První test AMD Ryzen

Velké testy: 22 powerbank a 8 bezdrátových setů

Radíme s koupí Wi-Fi routeru

Co dokáží inteligentní domy?