KURZ: Zvukový výstup
- Podrobnosti
- Mgr. Jan Baťko
- Aktualizováno: 06.09.2017
- Zobrazení: 10831
KAPITOLY
Řídící jednotka stavebnice Lego Mindstorm NXT obsahuje 8bitový zvukový výstup s reproduktorem. Díky tomu umožňuje využívat v programu zvukové výstrahy a signály. Zvukové tóny jsou obsaženy ve standardním firmware. Základní sadu zvuků lze ale rozšířit a naimportovat si vlastní.
V obou prostředích je možné využívat v programech zvukový doprovod. Signalizace se využívá například pro kontrolu jednotlivých průchodů programem, jako varovný signál pro změnu směru pohybu robota a v dalších vhodných situacích.
Práce se zvukem v programovacích prostředích
NXT-G
Blok pro práci se zvukem
Rozcestník
Umístění bloku
Zvukový výstup řídící jednotky je v programovém kódu řízen blokem Sound, který se nachází v paletě Complete > Common (na obrázku s rozbaleným Data Hub pro připojení dalších modulů).
Popis bloku
Programový blok Sound obsahuje šest konektorů pro připojení dalších bloků:
Action - označuje typ zvukové signalizace (zvukový soubor nebo tón).
Filename - název přehrávaného zvukového souboru.
Tone Frequency - frekvence přehrávaného zvuku v hertzích.
Control - vyjadřuje aktuální stav (play nebo stop).
Volume - úroveň hlasitosti přehrávaného zvuku.
Duration - doba trvání přehrávání zvuku.
Samotný modul Sound zobrazuje aktuální nastavení pomocí tří ikonek umístěných pod vyobrazením reproduktoru (popisovány zleva doprava):
- typ zvuku (zvukový soubor nebo tón),
- nebo vyjádření, zda modul v dané situaci reprezentuje zapnutí nebo vypnutí zvukové signalizace,
- úroveň hlasitosti zvuku.
Parametry bloku
Action: vyjadřuje, zda bude pro zvukovou signalizaci použit zvukový soubor nebo tón. Na prvním obrázku je zvolena možnost Sound File (zvukový soubor), proto se v pravé části bloku zobrazuje výběrové okno se seznamem dostupných zvuků. Na druhém obrázku je vybrána možnost Tone (tón). V tomto případě se v pravé části bloku nastavuje označení tónu a délka jeho trvání ve vteřinách.
Control: udává, zda má blok funkci spustit nebo zastavit daný zvukový soubor nebo tón.
Volume: vyjadřuje nastavenou úroveň hlasitosti zvuku (maximum je 100%).
Function: zaškrnutím volby Repeat (opakování) nastavíme opakování zvuku po celou dobu dané části nebo celého programu (pokud je vybrána tato možnost, není možné nastavit funkci Wait).
Wait: zaškrtnutím volby Wait for Completion (počkat na dokončení) docílíme toho, že zvukový soubor bude celý přehrán a až poté bude program pokračovat dále. V opačném případě se pokračuje ve vykonávání programu. Pokud jako další následuje opět blok Sound, je přehrávání zvuku prvního bloku ukončeno a započne přehrávání zvuku bloku druhého.
RobotC
Příkazy pro práci se zvukem
Při používání zvukových signálů potřebujeme využívat několik příkazů. Je potřeba definovat používaný zvuk nebo zvukový soubor, ovládat hlasitost zvuku a dobu trvání přehrávání.
Rozcestník
Ztlumení a zapnutí zvuku
Příkaz MuteSound() ztlumí všechny zvuky v dalších příkazech. UnmuteSound() má opačnout funkci, tudíž umožní od dalšího příkazu přehrávání audio souborů.
MuteSound(); // Vypne vsechny nasledujici zvuky. UnmuteSound(); // Znovu umozni prehravani nasledujicich zvuku.
Volba audio souboru
Při přehrávání zvuků je možné volit mezi zvukovými soubory a tóny. Pro každou z těchto kategorií se v jazyce RobotC používá zvláštní příkaz. Pro tóny je to příkaz PlaySound() a pro zvukové soubory PlaySoundFile().
PlaySound(soundBeepBeep); // Prehraje ton s nazvem soundBeepBeep. PlaySoundFile("Woops.rso"); // Prehraje audio soubor s nazvem Woops.rso.
Nastavení úrovně hlasitosti
Udává se v rozsahu 0-4 pomocí příkazu nVolume[]. Pro použití při programování se doporučuje využívat hodnotu 1, protože vyšší mohou být poměrně hlasité a působit nepříjemně.
nVolume = 1; // Nastavi uroven hlasitosti na 1 (pro cloveka prijatelna uroven).
Délka trvání tónu
Ovlivnění doby trvání tónu je možné pomocí dvou příkazů. Příkaz PlayTone(frequency, durationIn10MsecTicks) se využívá při práci s konstatními tóny. Oproti tomu PlayImmediateTone(frequency, durationIn10MsecTicks) se využívá při přehrání tónů upozorňujících na okamžitou změnu v programu nebo probíhající proces. Oba příkazy mají dva parametry. První je frekvence přehrávaného tónu v hertzích a druhý doba trvání udávaná v desítkách milisekund.
PlayTone(784, 15); // Prehrava ton frekvenci 784 Hz po dobu 150 milisekund. PlayImmediateTone(80, 50); // Prehrava ton frekvenci 80 Hz po dobu 500 milisekund.
EV3
Blok pro práci se zvukovým výstupem
Rozcestník
Umístění bloku pro práci se zvukovým výstupem
Programový blok Sound je umístěn v paletě Action.
Změna režimu
Programový blok Sound můžeme využívat ve čtyřech základních režimech. Přepínání mezi nimi se provádí pomocí tlačítka v levé spodní části bloku (červeně zvýrazněno).
Přidání vstupního portu
Kliknutím do bílého pole v pravém horním rohu programového bloku a vybráním možnosti Wired přidáme do programového bloku nový vstupní port.
Tento port s názvem File Name slouží k odeslání zvukového souboru k přehrání.
Režimy programového bloku
Stop (zastavení)
Režim programového bloku sloužící k zastavení aktuálně přehrávaného zvuku.
Play File (přehrání souboru)
Režim sloužící k přehrání zvoleného zvukového souboru z paměti řídící jednotky. V tomto režimu máme k dispozici dva vstupní porty programového bloku.
Volume Control - hlasitost přehrávaného zvuku udávaná na stupnici od 0 do 100.
Play Type - způsob přehrání zvoleného zvukového souboru.
Přehrání je možné realizovat třemi způsoby:
- Wait for Completion - zvuk je jedenkrát přehrán a program pokračuje až po dokončení přehrávání.
- Play Once - zvuk je jedenkrát přehrán a program okamžitě pokračuje dále.
- Repeat - zvuk je přehráván stále dokola, dokud není přerušen jiným blokem Sound a program okamžitě pokračuje dále.
Výběr zvukového souboru z paměti řídící jednotky
Výběr zvukového souboru z paměti v paměti řídící jednotky se provádí pomocí bílého pole v pravém horním rohu programovacího bloku (červeně zvýrazněno).
Na výběr máme předpřipravené zvuky LEGO Sound Files nebo vlastní zvuky importované do projektu a umístěné ve složce Project Sounds.
Play zvuku (přehrání zvuku)
Režim sloužící k přehrání zvukového tónu libovolné frekvence, hlasitosti a délky. Programový blok obsahuje v tomto režimu čtyři vstupní porty.
Frequency - frekvence zvoleného zvuku v herzích (možné rozpětí hodnot je od 300 do 10 000).
Duration - délka přehrávaného zvuku ve vteřinách.
Volume Control - hlasitost přehrávaného zvuku udávaná na stupnici od 0 do 100.
Play Type - způsob přehrání zvoleného zvuku.
Přehrání je možné realizovat třemi způsoby:
- Wait for Completion - zvuk je jedenkrát přehrán a program pokračuje až po dokončení přehrávání.
- Play Once - zvuk je jedenkrát přehrán a program okamžitě pokračuje dále.
- Repeat - zvuk je přehráván stále dokola, dokud není přerušen jiným blokem Sound a program okamžitě pokračuje dále.
Play Note (přehrání tónu)
Režim umožňující přehrání tónu určité délky a hlasitosti. Programový blok obsahuje v tomto režimu čtyři vstupní porty.
Note - výběr zvukového tónu.
Duration - délka přehrávaného tónu ve vteřinách.
Volume Control - hlasitost přehrávaného tónu udávaná na stupnici od 0 do 100.
Play Type - způsob přehrání zvoleného tónu.
Přehrání je možné realizovat třemi způsoby:
- Wait for Completion - tón je jedenkrát přehrán a program pokračuje až po dokončení přehrávání.
- Play Once - tón je jedenkrát přehrán a program okamžitě pokračuje dále.
- Repeat - tón je přehráván stále dokola, dokud není přerušen jiným blokem Sound a program okamžitě pokračuje dále.
Možnosti praktického využití
Zvukový výstup řídící jednotky LEGO MINDSTORMS NXT můžeme považovat za doplňkové zařízení. S jeho pomocí můžeme zdůrazňovat některé pasáže vytvářených programů, doplňovat pohyb námi vytvořeného robota zvuky, výstražnými signály a podobně. Vše lze realizovat poměrně jednoduše, ve většině případů pouze jedním příkazem (více v teoretické části tohoto článku).
Využití zvukového výstupu
Použití doprovodné zvukové kulisy si představíme na jednoduchém příkladu. Představme si robustní nákladní automobil, který bude představovat námi vytvořený robot. Tento nákladní automobil bude potřebovat zacouvat do postranní uličky. Mnoho z vás si již určitě všimlo toho, že při couvání některých typů větších automobilů se při couvání začne ozývat výstražný tón, který couvání oznamuje. My se nyní pokusíme tuto situaci nasimulovat. Na obrázku vidíte dráhu, kterou by měl náš robot urazit. Jeho úkolem je projet rovný úsek, na jeho konci se natočit vpravo a zacouvat do cíle. Po celou dobu couvání se bude ozývat výstražný signál.
NXT-G
OVLÁDÁNÍ ROBOTA PŘI PROJETÍ DRÁHOU
Při projetí vytyčenou drahou bude důležité správně používat označování příslušných motorů tak, aby nedošlo k jejich záměně. Stěžejní částí bude závěrečná část programu, kdy se pokusíme zaručit, aby robot při couvání současně couval a vydával výstražný zvuk.
Krok 1 - Pohyb vpřed
Na začátku průjezdu bludištěm musí náš robot urazit rovný úsek. Pro pohyb vpřed, do kterého budou zapojeny oba motory, tedy využijeme blok Move (více o synchronzaci dvou a více motorů v kapitole Pohyb dvou motorů). Zvolíme příslušné porty, ke kterým jsou motory připojeny a směr otáčení vpřed. Pro potřeby programu jsme zvolili rychlost otáčení motorů 25% po dobu 5 sekund. Tento úkon není v programu rozhodující a není proto nutné, aby robot urazil příliš dlouhý úsek.
Krok 2 - Natočení o 90 stupňů
Poté, co robot urazí rovný úsek, budeme chtít, aby se natočil o 90 stupňů tak, že bude stát svojí zadní částí směrem k pomyslné garáži. Bude potřeba, aby se motory otočily o 180 stupňů, ale každý jiným směrem. Použijeme proto blok
Motor. Pro pohyb zvolíme stejnou rychlost jako pro pohyb vpřed, tedy 25%. U obou motorů nastavíme trvání pohybu ve stupních (Degrees) a ručně zadáme hodnotu 180 stupňů. Důležité je hlavně správné nastavení opačných směrů otáčení u jednotlivých motorů. Detailní nastavení obou motorů můžete vidět na obrázku. U prvního motoru musíme odškrtnout volbu Wait for Completion. Pokud bychom tak neučinili, natočil by se nejprve první motor a až po provedení pohybu by se natočil druhý motor. Nezvolením této volby ovšem první motor (v našem případě motor B) nečeká až se dokončí příkaz pro jeho ovládání, ale umožní okamžité provádění dalšího příkazu (natočení motoru C).
Krok 3 - Couvání se zvukovou signalizací
Nyní se dostáváme ke stěžejnímu kroku našeho příkladu. Robot musí zacouvat do garáže a po vzoru těžkých nákladních automobilů bude během couvání vydávat výstražný tón. Využití zvuků jsme si popsali v teoretické části.
Chceme, aby řídící kostka vydávala konstantní tón, a proto v sekci Action vybereme volbu Tone. Aby nebyl zvuk příliš hlasitý, zvolili jsme hlasitost 75%. Otázkou nyní je, jak zaručit, aby se tón přehrával po celou dobu couvání robota. Pohyb robota vzad provedeme stejně jako pohyb vpřed pomocí bloku Move. V jeho nastavení si zvolíme příslušné porty, ke kterým jsou motory připojeny, směr vzad a rychlost otáčení 20%. Zbývá zařídit, aby se přehrávání tónu a pohyb vzad prováděli stejně dlouho a oba zároveň. Řekněme si tedy, že budeme chtít, aby se couvání provádělo po dobu 5 sekund. U bloku Move tedy v sekci Duration zvolíme možnost měření v sekundách a zadáme hodnotu 5. Stejnou hodnotu musíme zadat i v bloku Sound. V sekci Note zvolíme označení tónu, který se bude přehrávat a zadáme dobu přehrávání 5 sekund. Nyní již zbývá pouze zařídit, aby se oba úkony prováděly současně. Postup je stejný jako v předchozím kroku, kde jsme chtěli, aby se oba motory natáčely současně. U prvně umístěného bloku (v našem případě blok Sound) odškrtneme volbu Wait for Completion. Díky tomu se nebude čekat na dokončení tohoto příkazu a okamžitě na začátku jeho provádění se začne vykonávat i příkaz další, tedy couvání.
Pokud správně sestavíme jednotlivé kroky za sebou, měli bychom dojít ke zdárnému řešení programu.
Program ke stažení
RobotC
Ovládání robota při projetí dráhou
Pro úspěšné projetí vytyčené trasy musí robot nejprve urazit rovný úsek, poté se natočit zadní částí směrem k cíly a zacouvat do koncového bodu. Právě při závěrečném couvání budeme chtít, aby zněl varovný signál. Využijeme tedy příkazy pro synchronizaci pohybu dvou motorů (více v kapitole Pohyb dvou motorů) a dále příkaz pro zaznění zvukového signálu.
Krok 1 - Deklarace konstant
Během vytváření programu budeme opakovaně používat stejné hodnoty. Pro pohyb vpřed budeme potřebovat hodnotu, která bude vyjadřovat délku jeho trvání. Musíme také zadefinovat rychlost otáčení motorů. Každé vozidlo couvá nižší rychlostí, než se pohybuje směrem vpřed. Potřebujeme tedy také definovat hodnotu rychlosti otáčení motorů směrem vzad. Hodnoty, které si nadeklarujeme v úvodu programu a poté se na ně pouze odkazujeme pomocí jejich názvu, nazýváme konstanty.
const int doba_pohybu = 5000; // Cas potrebny pro pohyb vpred. const int vykon = 25; // Vykon pro pohyb vpred. const int vykon_couvani = 10; // Vykon pro pohyb vzad.
Doporučení: Aby robot neprováděl jednotlivé úkony příliš rychle za sebou a také abychom předešli nepřesnostem, je dobré si nadeklarovat ještě jednu konstantu. Bude vyjadřovat krátký časový úsek, který bude plnit funkci čekání před změnou pohybu (natáčení po pohybu vpřed a před začátkem pohybu vzad).
const int cekani = 2000; // Cekani 2 vteriny pred zapocetim dalsiho ukonu.
Krok 2 - Pohyb vpřed
Na úvod projetí vytyčenou dráhou musí robot urazit rovný úsek. Představme si, že náš vytyčený přímý úsek robot rychlostí otáčení motorů 25% urazí za 5 vteřin. Pro pohon motorů použijeme příkaz motor[]. Výkon motorů pro pohyb vpřed jsme si již nadeklarovali jako konstantu výkon. Použijeme ji tedy nyní a přiřadíme její název do příkazu motor[]. Nyní musíme zařídit, aby se motory otáčely vpřed pouze 5 sekund. Docílíme toho příkazem wait1Msec(), který dokáže oddálit provádění dalších příkazů. Jako jeho parametr uvedeme konstantu doba_pohybu, jejíž hodnota je právě 5 sekund. Na konci rovného úseku musíme motory opět uvést do klidu pomocí příkazu motor[], do kterého jako hodnotu přiřadíme 0.
// Pohyb vpred po dobu 5 sekund. motor[motorB] = vykon; motor[motorC] = vykon; wait1Msec(doba_pohybu); motor[motorB] = 0; motor[motorC] = 0;
Krok 3 - Nulování čítače otáček
Motory robotické stavebnice používají snímač otáček sloužící k čítání otáček motoru. To nám umožňuje snáze určovat polohu robota. Pokaždé než začneme se snímačem pracovat, je nutné jej vynulovat, aby otáčky čítal vždy od nuly.
nMotorEncoder[motorB] = 0; // Nulovani snimace otacek motoru B. nMotorEncoder[motorC] = 0; // Nulovani snimace otacek motoru C.
Krok 4 - Natočení o 180 stupňů
Robot urazil rovný úsek bludiště a nyní se musí otočit o 180 stupňů tak, aby stál zadní částí směrem k cíli a mohl tak na závěr do cíle zacouvat. Pro otočení je možné použít několik možností. My použijeme tu, která by nám měla zaručit co nejpřesnější výsledek. Využijeme přitom čítač otáček motoru. Přiřazením hodnoty 180 do příkazu nMotorEncoderTarget[] nastavíme, aby se motory pootočili o 180 stupňů. Nyní musíme přidat příkaz, kterým určíme směr otáčení a výkon s jakým se budou motory otáčet. Použijeme opět příkaz motor[], do kterého přiřadíme již dříve nadefinovanou konstantu výkon, čímž zajistíme otáčení rychlostí 25%. Aby se ale robot natočil pouze o 180 stupňů, musí se jeden motor otáčet směrem vpřed a druhý směrem vzad. Inverzní otáčení motoru B zajistí znaménko minus.
Jako poslední musíme zajistit, aby další příkazy byly prováděny až poté co bude robot skutečně natočen o požadovaný úhel. Pro tento účel použijeme cyklus s podmínkou na začátku while(). Do podmínky vložíme příkaz nMotorRunState[motorB] != runStateIdle. Tím v programu zajistíme, že jakýkoliv příkaz, který bychom vložili do těla cyklu bude proveden až poté, co bude dokončen příkaz pro chod motoru B. Jelikož ale chceme, aby tomu tak bylo u obou motorů, použijeme znaménko ||, které v syntaxi RobotC vyjadřuje slučovací poměr (AND) a připojíme obdobný příkaz i pro motor C. V případě našeho programu nechceme, aby se vykonával žádný příkaz a tak do těla cyklu nebudeme umisťovat nic. Na závěr natáčení opět uvedeme motory do klidu.
nMotorEncoderTarget[motorB] = 180; // Nastaveni cilove pozice motoru B (otoceni o 180 stupnu). nMotorEncoderTarget[motorC] = 180; // Nastaveni cilove pozice motoru C (otoceni o 180 stupnu). motor[motorB] = -vykon; // Nastaveni rychlosti otaceni motoru B na 25%. motor[motorC] = vykon; // Nastaveni rychlosti otaceni motoru C na 25%. while (nMotorRunState[motorB] != runStateIdle || nMotorRunState[motorC] != runStateIdle) { // Tento cyklus ceka na to, az je dokonceno natoceni encoderu o pozadovany uhel. // Neprovadi se zadny dalsi prikaz. } motor[motorB] = 0; // Uvedeni motoru B do klidu. motor[motorC] = 0; // Uvedeni motoru C do klidu.
Krok 5 - Couvání do cíle
Nacházíme se před poslední částí programu pro ovládání robota. Chceme, aby nyní pomalu zacouval do cíle. Jako u každého pohybu motorů i nyní použijeme příkaz motor[]. Pro pohyb vzad jsme si v úvodu nadeklarovi konstantu vykon_couvani, která vyjadruje výkon 10%, s kterým se má robot pohybovat. Jelikož nyní požadujeme, aby robot couval, musíme u proměnné pro výkon použít záporné znaménko. Potřebujeme ještě zajistit, aby se robot pohyboval pouze do cíle a poté zastavil. K určení doby couvání použijeme příkaz wait1Msec(). Jako jeho parametr použijeme poslední z nadeklarovaných konstant doba_pohybu, díky čemuž bude robot couvat pouze 5 sekund. Následně uvedeme motory do klidu.
motor[motorB] = -vykon_couvani; // Reverzivni otaceni motoru B potrebne pro couvani. motor[motorC] = -vykon_couvani; // Reverzivni otaceni motoru C potrebne pro couvani. wait1Msec(doba_pohybu); // Nastaveni doby couvani na 5 sekund. motor[motorB] = 0; // Uvedeni motoru B do klidu. motor[motorC] = 0; // Uvedeni motoru C do klidu.
Krok 6 - Přehrávání tónu během couvání
V našem příkladu ale nechceme pouze to, aby robot zacouval do cíle. Stěžejní částí této kapitoly je využití zvuků. Budeme tedy nyní chtít, aby byl po celou dobu couvání přehráván tón, který utichne jakmile dorazí robot co cíle a zastaví. Jako první musíme nastavit hlasitost tónu, který se bude přehrávat pomocí příkazu nVolume. Pro dostatečně slyšitelnou úroveň zvuku použijeme hodnotu 5. Nyní musíme nastavit samotné přehvávání tónu. Přehrávání konstantních tónů je realizováno příkazem PlayTone(). V prvním jeho parametru jsme použili frekvenci 784 Hz a ve druhém dobu přehrávání 5 sekund. Oba příkazy umístíme hned za příkaz pro couvání robota. Jakmile se nyní začne robot pohybovat, začne znít zvukový tón. Jelikož doba couvání je stejná jako doba, po kterou se bude přehrávat tón, tak po ukončení pohybu bude ukončena také výstražná signalizace.
motor[motorB] = -vykon_couvani; // Reverzivni otaceni motoru B potrebne pro couvani. motor[motorC] = -vykon_couvani; // Reverzivni otaceni motoru C potrebne pro couvani. nVolume = 5; // Nastaveni urovne hlasitosti prehravaneho zvukoveho signalu. PlayTone(784, 500); // Nastaveni prehravani tonu o frekvenci 784 Hz po dobu 5 sekund. wait1Msec(doba_pohybu); // Nastaveni doby couvani na 5 sekund. motor[motorB] = 0; // Uvedeni motoru B do klidu. motor[motorC] = 0; // Uvedeni motoru C do klidu.
Poznámka: Pro couvání by bylo možné využít jakýkoliv jiný zvuk, či audiosoubor. Klasický tón byl zvolen pouze jako vhodná pomůcka pro potřeby tohoto příkladu.
Výsledný program
Po správném provedení všech úkonů bude výsledný program vypadat takto:
task main() { const int doba_pohybu = 5000; const int vykon = 25; const int vykon_couvani = 10; const int cekani = 2000; // Pohyb vpred po dobu 5 sekund. motor[motorB] = vykon; motor[motorC] = vykon; wait1Msec(doba_pohybu); motor[motorB] = 0; motor[motorC] = 0; wait1Msec(cekani); // Cekani pred zapocetim nataceni. nMotorEncoder[motorB] = 0; // Nulovani encoderu motoru B. nMotorEncoder[motorC] = 0; // Nulovani encoderu motoru C. nMotorEncoderTarget[motorB] = 180; // Nastaveni cilove pozice motoru B (otoceni o 180 stupnu). nMotorEncoderTarget[motorC] = 180; // Nastaveni cilove pozice motoru C (otoceni o 180 stupnu). motor[motorB] = -vykon; // Nastaveni rychlosti otaceni motoru B na 25%. motor[motorC] = vykon; // Nastaveni rychlosti otaceni motoru C na 25%. while (nMotorRunState[motorB] != runStateIdle || nMotorRunState[motorC] != runStateIdle) { // Tento cyklus ceka na to, az je dokonceno natoceni encoderu o pozadovany uhel. // Neprovadi se zadny dalsi prikaz. } motor[motorB] = 0; // Uvedeni motoru B do klidu. motor[motorC] = 0; // Uvedeni motoru C do klidu. wait1Msec(cekani); // Cekani pred zapocetim couvani. motor[motorB] = -vykon_couvani; // Reverzivni otaceni motoru B potrebne pro couvani. motor[motorC] = -vykon_couvani; // Reverzivni otaceni motoru C potrebne pro couvani. nVolume = 5; // Nastaveni urovne hlasitosti prehravaneho zvukoveho signalu. PlayTone(784, 500); // Nastaveni prehravani tonu o frekvenci 784 Hz po dobu 5 sekund. wait1Msec(doba_pohybu); // Nastaveni doby couvani na 5 sekund. motor[motorB] = 0; // Uvedeni motoru B do klidu. motor[motorC] = 0; // Uvedeni motoru C do klidu. }