KURZ: Časovače
- Podrobnosti
- Mgr. Jan Baťko
- Aktualizováno: 30.03.2014
- Zobrazení: 13693
Robotická stavebnice Lego Mindstorms NXT obsahuje vestavěné časovače, které nám při programování umožňují řídit jednotlivé úkony robota. Hlavní funkcí časovače je řídit dobu, po kterou bude určitý pohyb, funkce nebo pouze příkaz prováděn. Práci s časovači využijeme v rozsáhlých úkolech, ve kterých budeme potřebovat, aby na sebe události správně navazovali. Pomocí časovačů toho můžeme jednoduše dosáhnout.
POPIS V PROGRAMOVACÍM PROSTŘEDÍ
NXT-G
Časovače a oddálení vykonávání příkazů
Rozcestník
VYUŽITÍ ČASOVAČŮ
Časovač můžeme ovládat pomocí bloku Timer, který nalezneme v programovacím prostředí NXT-G v paletě Complete > Sensor.
Blok Timer obsahuje celkem šest konektorů, pomocí kterých jej můžeme propojit s dalšími bloky:
Timer - konektor vyjadřující, který ze tří dostupných časovačů je používán (1-3).
Trigger Point - vyjadřuje hodnotu, která je určena k porovnání se vstupem.
Greater/Less - hodnota logického datového typu sloužící pro srovnání dvou hodnot (větší nebo menší).
Reset - logický vstup sloužící k nulování časovače (True - vynulovat, False - nevynulovat).
YES/NO - hodnota logického datového typu vyjadřující výsledek porovnání.
Timer Value - hodnota časovače vyjádřená v milisekundách.
Timer: označuje, který z časovačů (1-3) je používán.
Action: sekce, ve které volíme, zda chceme z časovače číst jeho aktuální hodnotu (Read) nebo jej vynulovat (Reset).
Compare: pole sloužící k porovnání vstupní hodnoty s aktuální hodnotou časovače.
ODDÁLENÍ VYKONÁVÁNÍ PŘÍKAZU
Oddálit vykonávání dalšího příkazu můžeme v programovacím prostředí NXT-G pomocí bloku Wait umístěného v paletě Complete > Common.
Blok Wait neobsahuje žádné vstupní ani výstupní konektory, pomocí kterých by ho bylo možné propojit s dalšími bloky.
V nastavení bloku nalezneme v sekci Control dvě volby pro oddálení vykonávání dalšího příkazu. První volbou je možnost Time. Umožňuje nám nastavit dobu, po které se bude provádět vykonávání dalšího příkazu (bloku) umístěného za blokem Wait.
Druhou možností je čekání na vykonání akce řízené některým ze senzorů. Pro nastavení této možnosti musíme nejprve v sekci Control zvolit možnost Sensor. Zobrazí se pole Sensor, kde v rozbalovacím menu nalezneme seznam všech dostupných senzorů. Po zvolení senzoru se v pravé části pole zobrazí jeho funkce, pomocí kterých můžeme řídit další činnost programu. Na obrázku můžete vidět využití bloku Wait s řízením pomocí dotykového senzoru. Můžeme například nastavit, aby další příkaz byl prováděn až po stisknutí tlačítka (Pressed). Program se tedy v místě, kde bude umístěn blok Wait zastaví a bude čekat na vstup v podobě stisku tlačítka. Stejně můžeme využívat i další senzory. Bude se například čekat, až určitá veličina snímaná senzorem dosáhne požadované úrovně a podobně.
RobotC
ČASOVAČE A ODDÁLENÍ VYKONÁVÁNÍ PŘÍKAZŮ
Rozcestník
Využití časovačů
V programovacím prostředí RobotC můžeme pro práci s robotem využít celkem čtyři časovače, které jsou označovány T1, T2, T3 a T4. V programování nám slouží k přesnému časovému řízení určitých úkonů.
Nulování časovače
Před každým použitím časovače je nutné jej nejprve vynulovat. K nulování slouží příkaz ClearTimer(). Jeho parametrem v závorce je zmíněné označení právě používaného časovače (T1, T2, T3 nebo T4).
ClearTimer(T1); // nulovani casovace T1
Práce s časovačem
Stejně jako hodnoty snímané senzorem, můžeme i hodnotu časovače (časový úsek) získávat, popřípadě ukládat do proměnných. Slouží nám k tomu tři pole hodnot. Jedná se o time1[], time10[], time100[]. Rozdíl mezi nimi je pouze v jednotkách, které vrací. První vrací hodnotu časovače vyjádřenou v jednotkách milisekund, druhé v desíkách a třetí ve stovkách. Krátký příklad můžete vidět o něco níže. Nejprve vynulujeme časovač T1. Následně si nadeklarujeme proměnnou cas datového typu integer, do které se hodnota časovače bude ukládat. Do ní následně uložíme hodnotu časovače vyjádřenou v jednotkách milisekund.
ClearTimer(T1); // nuluje citac int cas; // promenna pro ulozeni hodnoty cas = time1[T1];
Časovač slouží hlavně k přesnému řízení určitých úkonů robota. Ukážeme si tedy jeho činnost na krátkém příkladu. Budeme chtít, aby se motor otáčel 5 vteřin a poté aby se zastavil. Čas bude řízen časovačem. Jak jsme uvedli v úvodu, před každým použitím musí být časovač vynulován. Zde tomu nebude jinak. Použijeme tedy nejprve příkaz ClearTimer(). Následně chceme zařídit, aby se motor otáčel, dokud nebude hodnota časovače rovna 5 sekund. Použijeme tedy cyklus s podmínkou na začátku while(). Jeho podmínkou bude time10[T1] < 500 - prováděj, dokud časovač nebude roven 500 milisekund = 5 sekund. Do těla cyklu umístíme příkaz pro ovládání motoru. Jakmile časovač dosáhne hodnoty 5 sekund, motor se zastaví.
ClearTimer(T1); while(time10[T1] < 500) { motor[motorB] = 50; } motor[motorB] = 0;
ODDÁLENÍ VYKONÁVÁNÍ PŘÍKAZU
U některých úkonů, které bude robot vykonávat potřebujeme, aby trvaly pouze určitou dobu. Naším cílem tedy bude zajistit, aby se další příkaz vykonával až s určitým časovým odstupem. Může se jednat například o popojetí o určitý úsek, který víme, že robot vykoná například za 2 vteřiny. Oddálení vykonávání dalšího příkazu zajišťují v programovacím prostředí RobotC dva příkazy. Jsou jimi wait1Msec() a wait10Msec(). Jak již jejich název napovídá, rozdíl mezi nimi je v jednotkách, se kterými pracují. Prvně jmenovaný má jako parametr uvedený v závorce číslo, které vyjadřuje jednotky milisekund, kdežto druhý desítky milisekund.
wait1Msec(1mSec); // oddali vykonavani dalsiho prikazu o jednotky milisekund wait10Msec(10mSec); // oddali vykonavani dalsiho prikazu o desitky milisekund
Praktický příklad využití můžete vidět zde:
motor[motorA] = 100; // Motor je pripojen k portu A a otaci se smerem vpred s maximalnim vykonem. wait1Msec(4000); // Otaceni motoru je provadeno 4 sekundy, po kterych je pohyb ukoncen a program pokracuje dale. motor[motorA] = 0; // Vykon motoru je nastaven na nulu.