KURZ: Motor a jeho pohyb - Možnosti praktického využití

KAPITOLY

Možnosti praktického využití

Motor se používá u konstrukcí, ve kterých je potřeba využí jeho hnací sílu. Narozdíl od zařízení, která se pohybují na kolech do různých směrů, jejichž využití jsme popsali v kapitole Pohyb dvou motorů, se zde jedná o pohyb většinou statických konstruktů. Je u nich možné využít pouze jeden motor. Jako příklad můžeme uvést použití motoru pro pohánění simulace třídící linky nebo pásového dopravníku.

Využití motoru pro pohon zařízení

Možnost využití jednoho motoru ukážeme na praktické ukázce. Na obrázku můžete vidět jednoduchý model časovače. Jedná se o zařízení, které slouží ke změření předem zadaného času. Kostru tvoří pomyslný ciferník s hodinovou ručičkou, která je poháněna motorem stavebnice LEGO MINDSTORMS NXT, který je napojen na řídící jednotku.

casovac foto

NXT-G

OVLÁDÁNÍ ČASOVAČE POHÁNĚNÉHO MOTOREM

V následujícím příkladu představíme vytváření programu pro ovládání jednoduchého časovače v programovacím prostředí NXT-G. Bude se jednat o jednoduchý konstrukt s využitím jednoho motoru, který zde bude sloužit jako ovládací zařízení. Princip zařízení bude prostý. Po uplynutí 15 vteřin se ručička přesune o 90 stupňů po směru hodinových ručiček. Kolik 15 vteřinových úseků bude měřeno, musí být také programově ošetřeno. Pomocí tohoto zařízení tak budeme moci například odměřit jednu minutu nebo stopovat také delší časové úseky.

 
Krok 1 - Natočení o 90 stupňů

Pokaždé když uplyne 15 vteřin budeme chtít, aby se pomyslná hodinová ručička pootočila o 90 stupňů, tedy o čtvrt hodiny. Jelikož tento úkon budeme vykonávat pomocí motoru, využijeme tedy blok  MotorDragged Motor. Zvolíme si příslušný port pro připojení a směr tak, aby se ručička otáčela ve směru hodinových ručiček. Abychom zaručili co nejvyšší přesnost měření, zvolili jsme sílu motoru 40%. V případě, že se ale ručička otáčí vyšší rychlostí na krátký úsek, jako v tomto případě, musíme počítat s tím, že po skončení měření můžeme zaregistrovat odchylku v její konečné pozici (nebude umístěna přesně ve výchozí pozici). Tento jev je následkem prudkého zastavování servomotoru z vyšší rychlosti na krátkém úseku. Projeví se hlavně v případě, že budeme měřit delší časový úsek. Při měření krátkých úseků, jako například jedna minuta, nebude odchylka znatelná. Poslední volbou, kterou musíme učinit je nastavení trvání pohybu. Použijeme možnost měření otáčení ve stupních (Degrees) a zadáme hodnotu 90.

motor

 
Krok 2 - Provádění po 15 vteřinách

V dalším kroku potřebujeme zajistit, aby se ručička nenatáčela okamžitě, ale až po uplynutí 15 vteřin. Potřebujeme tedy použít blok, který oddálí provádění dalšího příkazu. Tímto blokem je v programovacím prostředí NXT-G blok WaitForTimeDrag Wait. V sekci Control musíme zvolit, že chceme využít řízení časem. Jako hodnotu pro čekání poté zvolíme požadovaných 15 sekund a blok umístíme před blok MotorDragged Motor. Nyní se tedy po spuštění programu vyčká 15 vteřin a poté se ručička pootočí o 90 stupňů.

wait

 
Krok 3 - Zajištění opakovaného provádění

V současné podobě programu by se pouze jednou čekalo 15 vteřin a poté by se provedlo jedno natočení ručičky. My ale chceme, aby se měřil tak dlouhý časový úsek, jak si uživatel navolí. Pokud chceme provést opakované provádění jednoho nebo několika příkazů, použijeme v programovacím prostředí NXT-G blok LoopBig Loop. Do něj musíme umístit oba příkazy z předchozích kroků. V sekci Control cyklu poté musíme zvolit řízení pomocí čítače (Count). V příkladu jsme zvolili demonstraci měření minutového časového úseku. Do pole Count tedy musíme zadat měření čtyř patnáctivteřinových úseků. Díky tomu se provedou příkazy umístěné v cyklu 4x a časovač tedy odměří jednu minutu.

 loop

 
Výsledný program

Při správném provedení jednotlivých kroků a umístění bloků bude poté výsledný program vypadat následovně:

hotovy program

 
Program ke stažení

Stáhnout ve formátu .rbt

 

Rozšiřující úkol

Zařiďte, aby po každém přesunutí ručičky časovače o devadesátistupňový úsek zaznělo z řídící kostky pípnutí či jiná zvuková signalizace. Jiný a výraznější signál použijte pro oznámení konce odpočítávání.

RobotC

Ovládání časovače poháněného motorem

Funkci časovače budeme demonstrovat na příkladu, ve kterém se budeme pokoušet odměřit předem zadaný časový úsek. Uživatel v úvodní deklaraci konstant zadá jak dlouhou dobu chce změřit a po spuštění programu započne odpočítávání. Po každých 15 vteřinách se vteřinová ručička posune o čtvrtinu ciferníku (čtvrt, půl, třičtvrtě a celá).

 
Krok 1 - Deklarace konstant

Při vytváření programu budeme využívat dvě hodnoty. První bude doba, po jejímž uplynutí ručička urazí čtvrtinu obvodu ciferníku. Ta bude pokaždé 15 vteřin. Druhá hodnota, která bude volitelná, určuje, jak dlouhou dobu budeme pomocí časovače měřit. Jedná se o počet patnáctivteřinových úseků.

Hodnoty, které nadeklarujeme v úvodu programu a pak na ně pouze odkazujeme pomocí jejich názvu, nazýváme konstanty. Pro potřeby našeho programu si tedy nadeklarujeme konstantu doba_otoceni jejíž hodnota bude 15 sekund a doba_mereni do níž se bude zadávat jak dlouho se bude pomocí čítače měřit.

 
 const int doba_otoceni = 15000; // Deklarovany 15 vterinovy usek, po kterem se rucicka otoci o  ctvrtinu ciferniku.
 const int doba_mereni = 4; // Pocet 15 vterinovych useku, ktere maji byt zmereny (cislo 4 odpovida jedne minute).
 
 
Krok 2 - Otočení ručičky o 90 stupňů

Než začneme měřit konkrétní časové úseky, musíme zajistit, aby se ručička otáčela po čtvrtinách ciferníku, tedy pokaždé o 90 stupňů. Při takto přesném otočení použijeme snímač otáček motoru. Jako pokaždé, když s ním začínáme pracovat, musíme snímač vynulovat pomocí příkazu nMotorEncoder[], do kterého přiřadíme číslo 0. Dále potřebujeme, aby se ručička začala otáčet a zastavila se až ve chvíli, kdy dosáhne motor natočení o 90 stupňů. Použijeme tedy cyklus s podmínkou na začátku while(). Příslušná podmínka tedy bude obsahovat výraz vyjadřující, že se bude motor otáčet, dokud hodnota snímače nebude rovna 90 stupňům (nMotorEncoder[motorA] < 90). Tělo cyklu poté musí obsahovat příkaz, který samotný motor rozpohybuje. Ovládání motorů je možné pomocí příkazu motor[], do nějž přiřadíme rychlost otáčení v procentech. V našem případě jsme zvolili hodnotu 15%, která by mohla být pro chod hodinové ručičky optimální.

Ručička v našem programu funguje jako signalizátor, který se otočí po uplynutí 15 vteřin. Musíme tedy tento časový úsek nastavit. Potřebujeme proto oddálit provádění cyklu. K tomuto účelu slouží příkaz wait1Msec(), jehož parametrem bude konstanta doba_otoceni, jejíž hodnota je příslušných 15 vteřin.

 
 nMotorEncoder[motorA] = 0; // Nulovani snímače otáček pri kazdem pruchodu cyklem.
 wait1Msec(doba_otoceni); // 15 vterin po kterych je provedeno otoceni rucicky.
 while(nMotorEncoder[motorA] < 90) // Cyklus zajistujici otoceni rucicky o 90 stupnu.
 {
 motor[motorA] = 15;
 }
 
 
Krok 3 - Zajištění měření času

Poslední věcí, kterou musíme pro celkovou funkčnost programu zajistit, je provádění předchozího kroku tolikrát, kolikrát si v úvodní deklaraci zvolíme. Časovač bude měřit přesně tolik patnáctivteřinových úseků, kolik jich bude nadeklarováno v konstantě s názvem doba_mereni. Pokud bychom použili konstrukci, kterou jsme vytvořili v předchozím kroku, 15 vteřin by se čekalo na provedení dalších příkazů, poté by se ručička otočila o 90 stupňů a tím by program skončil bez ohledu na hodnotu proměnné doba_mereni.

Jelikož počet natočení bude vždy pevně daný, použijeme pro jeho realizaci cyklus s pevným počtem průchodů for(). Cyklus obsahuje tři části. Nejprve musíme nastavit inicializační proměnnou. Zvolíme si tedy proměnou s názvem i, která bude datového typu integer, do níž přiřadíme hodnotu 0 (int i = 0;). Druhá část obsahuje podmínku, která musí být splněna. V našem programu chceme, aby se měření provádělo tak dlouho, jak je nadeklarováno v konstantě doba_mereni. To znamená, že se cyklus bude provádět, dokud bude hodnota proměnné i nižší než hodnota proměnné doba_mereni (i < doba_mereni). Třetí částí cyklu je krok provádění. Do naší proměnné i se bude ukládat počet průchodů cyklem. Při každém provedení se tedy její hodnota zvýší o jedničku. Inkrementace, neboli zvýšení hodnoty o 1 se v RobotC zapisuje následovně - i++. Do těla takto vytvořeného cyklu poté umístíme všechny příkazy z předchozího kroku. Kompletní podobu cyklu můžete vidět níže.

Pro zajištění správného chodu motoru je dobré uvést motor po každém průchodu cyklem do klidu. Docílíme toho příkazem motor[], do nějž přiřadíme hodnotu 0.

 
for (int i = 0; i<doba_mereni; i++) // Cyklus pro mereni casu.
{
 nMotorEncoder[motorA] = 0; // Nulovani encoderu pri kazdem pruchodu cyklem.
 wait1Msec(doba_otoceni); // 15 vterin po kterych je provedeno otoceni rucicky.
 while(nMotorEncoder[motorA] < 90) // Cyklus zajistujici otoceni rucicky o 90 stupnu.
 {
 motor[motorA] = 15;
 }
 motor[motorA] = 0;
}
 
 
Výsledný program pro časovač
 
task main()
{
 const int doba_otoceni = 15000; // Deklarovany 15 vterinovy usek, po kterem se rucicka otoci o ctvrtinu ciferniku.
 const int doba_mereni = 4; // Pocet 15 vterinovych useku, ktere maji byt zmereny (cislo 4 odpovida jedne minute).
 
for (int i = 0; i<doba_mereni; i++) // Cyklus pro mereni casu.
{
 nMotorEncoder[motorA] = 0; // Nulovani encoderu pri kazdem pruchodu cyklem.
 wait1Msec(doba_otoceni); // 15 vterin po kterych je provedeno otoceni rucicky.
 while(nMotorEncoder[motorA] < 90) // Cyklus zajistujici otoceni rucicky o 90 stupnu.
 {
 motor[motorA] = 15;
 }
 motor[motorA] = 0;
}
}
 

Poznámka: Zvýšení rychlosti otáčení motoru na hodnotu vyšší než 15% může mít za následek přetočení motoru o úhel větší než 90 stupňů. Důvodem je pomalé zastavení servomotoru z vyšší rychlosti na krátkém úseku.

 
Program ke stažení

Stáhnout ve formátu .c

 

Rozšiřující úkol

Zařiďte, aby po každém přesunutí ručičky časovače o devadesátistupňový úsek zaznělo z řídící kostky pípnutí či jiná zvuková signalizace. Jiný a výraznější signál použijte pro oznámení konce odpočítávání.

1 1 1 1 1 1 1 1 1 1 Hodnocení 3.00 (2 hodnocení)

Nemáte oprávnění přidat komentář.
Komentáře mohou přidávat pouze registrovaní uživatelé, kteří neporušují pravidla diskuze.