KURZ: Časovače

  • Vytisknout

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 TimerDragged Timer, který nalezneme v programovacím prostředí NXT-G v paletě icon completeComplete > SensorHilight Sensor.

 

Timer blok

 

Blok  TimerDragged Timer obsahuje celkem šest konektorů, pomocí kterých jej můžeme propojit s dalšími bloky:

TimerSelection Timer - konektor vyjadřující, který ze tří dostupných časovačů je používán (1-3).

TriggerPoint Trigger Point - vyjadřuje hodnotu, která je určena k porovnání se vstupem.

GreaterLess Greater/Less - hodnota logického datového typu sloužící pro srovnání dvou hodnot (větší nebo menší).

ResetA Reset - logický vstup sloužící k nulování časovače (True - vynulovat, False - nevynulovat).

Boolean YES/NO - hodnota logického datového typu vyjadřující výsledek porovnání.

Timer Timer Value - hodnota časovače vyjádřená v milisekundách.

 

Timer

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 WaitForTimeDrag Wait umístěného v paletě Paleta Complete Complete > Easy Common.

WaitForTimeDrag

Blok WaitForTimeDrag 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  WaitForTimeDrag Wait.

Wait time

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ě.

Wait sensor

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.
 

1 1 1 1 1 1 1 1 1 1 Hodnocení 0.00 (0 hodnocení)