reklama

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

Minule jsme zmiňovali možnost programovat roboty postavené ze stavebnice Lego RIS 2.0 v jazyce NQC a prostředí BricxCC. V článku použité programy jsou testované na modelu ZRP, Základním Robotu na Pásech. Postup jeho konstrukce najdete na stránkách http://www.roboti.unas.cz v sekci konstrukce robotů.

Pokud se ZRPa sestavit nepodaří, můžete klidně použít robota Roverbot, jehož konstrukce je popsaná v návodu u stavebnice. Náš ZRP vypadá takto:

Klepněte pro větší obrázek

Klepněte pro větší obrázek

Každý program v NQC musí obsahovat hlavní úlohu task main(), kterou překladač označí za výchozí bod hotového programu. Klíčové slovo task označuje, o jaký druh úlohy se jedná, identifikátor main je názvem úlohy. Syntaxe vypadá následovně:

task main()
{
  /*tady bude kód*/
}

Mezi složené závorky {} budeme psát jednotlivé příkazy, které se po spuštění úlohy main() vykonají.  Kód uzavřený mezi dvěma lomítky s hvězdičkou je poznámka, tu překladač ignoruje.

Začneme s tím nejjednodušším – s pohybem robota. Robota pohání dvojice motorů a ty chceme spustit. Příkazy pro ovládání motorů jsou: OnFwd(„motory“), OnRev(„motory“) a Off(„motory“), přičemž pomocí prvního příkazu robot rozjedeme dopředu, pomocí druhého dozadu a pomocí příkazu Off() ho zastavíme. Nezapomeňte přitom, že směr vpřed a vzad určuje polarita zapojených kontaktů. Jednotlivé příkazy musí být odděleny středníkem. Nyní si to vyzkoušíme na příkladu

task main()
{
  OnFwd(OUT_A+OUT_C);  /*OUT_A je motor na výstupu A, OUT_C je o motor na výstupu C*/
  Wait(100); /*viz dále*/
  OnRev(OUT_A+OUT_C);
  Wait(100); 
  Off(OUT_A+OUT_C);
 
}


Robot pojede jednu sekundu dopředu, poté sekundu zpátky a zastaví. V programu je použit příkaz Wait(100). Ten je velice důležitý, protože jinak by zapnutí a vypnutí motorů proběhlo téměř souběžně. Doba, po jakou nedojde k žádné úmyslné změně stavu robota, je uvedena v závorce v setinách sekundy.

Zatáčení u pásového vozidla docílíme tak, že jeden motor necháme běžet směrem dopředu a druhý dozadu. Opět nezapomeneme vložit příkaz Wait(). Motory robota nejsou krokové a chceme-li docílit otočení např. o 90°, musíme patřičnou prodlevu odhadnout a zkoušením doladit, mimo jiné i podle typu povrchu, po jakém se budou pásy pohybovat.

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

Pomocí příkazu SetPower(„motory“, „síla“), kde síla je číslo od 0 do 7 (sedm pro nejvyšší otáčky), lze ovlivnit výkon motorů. konkrétní případ může vypadat třeba takto:

SetPower(OUT_B,5); /* nastaví rychlost otáčení motoru na výstupu B na 5)*/

Toto je pouze základní přehled příkazů pro motory, o dalších až příště.

V programu můžeme použít proměnné, konstanty nebo náhodná čísla. Proměnné definujeme na kterémkoliv místě zdrojového textu programu příkazem int „název proměnné“ před jejich prvním použitím; například takto:

task main()
{
  int ipohyb_vpred;
  ipohyb_vpred = 100; /*takto vypadá přiřazení*/
  OnFwd(OUT_A+OUT_C);
  Wait(ipohyb_vpred); /*proměnné lze použít jako parametry příkazů*/
  Off(OUT_A+OUT_C);
}

Konstanta je identifikátor, který nahrazuje jednu konkrétní hodnotu. Konstanty se definují na začátku programu takto:

#define pohyb_rovne 150

Konstanta dostala název pohyb_rovne a zastupuje hodnotu 150. Stejně jako názvy pro čísla můžeme definovat např. názvy motorů:

#define levy_motor OUT_A /*v programu místo OUT_A stačí psát levy_motor*/

Zbývá se zmínit o náhodných číslech. Zatím jsme do proměnných přiřazovali pouze neměnné hodnoty, jazyk NQC však dovoluje pracovat i s náhodnými čísly; syntaxe je následující:

int nahoda;
nahoda = Random(100);

Proměnná nahoda bude obsahovat náhodně vybrané číslo z intervalu 0 až 100 (včetně 0 a 100); obecně příkazem x=Random(n) se do proměnné x uloží číslo od 0 do n. S náhodnými čísly může být chování robota mnohem zajímavější.

Prostou posloupnost příkazů doplníme podmíněným příkazem. Příkaz if se dá česky vyjádřit větou: „Jestliže platí podmínka, něco vykonej.“ Syntaxe vypadá následovně:

if (podmínka)
{}
else /* tato část je nepovinná */
{}

Pokud platí podmínka v závorce, vykonají se příkazy ve složených závorkách, a pokud podmínka splněna není, bude program vykonávat příkazy ve složených závorkách následujících po příkazu else. Část s else u příkazu if být nemusí, potom by se v případě nesplnění podmínky vykonával kód až za ukončovací složenou závorkou. V podmínce se vyhodnocuje pravdivost nějakého výrazu, např.:

  int i;
  i =  Random(5);
  if(i>2) /*pokud bude hodnota v i větší než 2, bude se provádět část za if*/
  {
    OnFwd(OUT_A+OUT_C);
  }
  else /*jinak se bude provádět tato část*/
  {
    OnRev(OUT_A+OUT_C);
  }

Operátory použitelné při zápisu podmínek jsou shrnuty v tabulce:

Symbol Význam
== je rovno
!= není rovno
< je menší
> je větší
<= je menší nebo rovno
>= je větší nebo rovno

V závěrečném programu necháme robota rozjet rovně a po 1,5 sekundě náhodně zatočí o 90 stupňů doleva nebo doprava. Po další sekundě znovu náhodně zatočí a poté zastaví.

task main()
{
  OnFwd(OUT_A+OUT_C);
  Wait(150);
  if (Random(1) ==  0 )
  {
    OnRev(OUT_A);
    Wait(105);
    OnFwd(OUT_A);
  }
  else
  {
    OnRev(OUT_C);
    Wait(105);
    OnFwd(OUT_C);
  }
  Wait(100);
/*------------------po prvním zatočení----------------------------*/
  if (Random(1) ==  0 )
  {
    OnRev(OUT_A);
    Wait(105);
    OnFwd(OUT_A);
  }
  else
  {
    OnRev(OUT_C);
    Wait(105);
    OnFwd(OUT_C);
  }
/*------------------po druhém zatočení----------------------------*/
  Off( OUT_A+OUT_C );
}


Příště se podíváme na cykly, využití senzorů a přehrávání hudby.

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

Témata článku: Programování, Motor, Robota, Elsa, Random, Syntax

6 komentářů

Nejnovější komentáře

  • Holly 29. 5. 2006 12:25:19
    Mno, tohle je vyzva... jestlipak zvladnu sestavit robota prehravajiciho...
  • Filip D. 12. 5. 2006 11:19:16
    Ano, lze. Jednu se nam podarilo postavit
  • JK 12. 5. 2006 9:27:35
    LOL
reklama
Určitě si přečtěte

Vybíráte herní periferii nebo hardware? Pak zapomeňte na nálepku Gaming

Vybíráte herní periferii nebo hardware? Pak zapomeňte na nálepku Gaming

** Herní hardware se od toho běžného často liší jen vzhledem ** Při výběru stále nezapomínejte na základní parametry ** Poradíme jak vybrat herní hardware i periferie

20.  2.  2017 | Stanislav Janů | 36

10 nejhorších produktů v historii Microsoftu

10 nejhorších produktů v historii Microsoftu

20.  2.  2017 | Karel Javůrek | 141

AMD oficiálně představilo procesory Ryzen. Známe i jejich české ceny

AMD oficiálně představilo procesory Ryzen. Známe i jejich české ceny

** AMD uvedlo první tři procesory Ryzen 7 ** Všechny budou pracovat s osmi jádry a šestnácti vlákny ** Na pulty obchodů se dostanou už za týden

22.  2.  2017 | Stanislav Janů | 132

EU se děsí Windows 10. Prý o nás vědí až příliš. Microsoft chystá změny

EU se děsí Windows 10. Prý o nás vědí až příliš. Microsoft chystá změny

** Evropští úředníci chtějí, aby byly Desítky transparentnější ** Microsoft od jara skutečně chystá změny ** Ochráncům soukromí to ale nestačí

21.  2.  2017 | Jakub Čížek | 218

Remix Singularity: Microsoft si na tom vylámal zuby. Jak dopadne Android?

Remix Singularity: Microsoft si na tom vylámal zuby. Jak dopadne Android?

** Microsoft do svých telefonů integroval desktopové prostředí ** Moc to ale nevyšlo, chyběl pořádný výkon ** Teď to zkoušejí ex-googleři s Remix Singularity

23.  2.  2017 | Jakub Čížek | 74


Aktuální číslo časopisu Computer

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

AMD Ryzen přichází

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

Příslušenství do USB-C

reklama
reklama