Úvod

Základní sadu robotické stavebnice Lego Mindstorm NXT tvoří několik výstupních modulů sloužící k signalizaci různých jevů, které při programování nastanou. Asi nejpotřebnějším pro realizaci pohyblivých částí robotů je krokový motor. Pohání otáčivé části robotů či nápravy aut sestavených ze stavebnice. Více o jeho funkci a práci s ním v programovacích prostředích se dozvíte v článku Motor a jeho pohyb.

V závislosti na něm se v článku Synchronizace pohybu dvou motorů věnujeme možnostem programového využití spolupráce více motorů, čehož se využívá pro pohyb robota ve více směrech.

Hlavně během práce se senzory a také pro signalizaci různých jevů během programu budeme využívat funkci displeje jako výstupního zařízení. V článku Práce s displejem se dozvíte jak se s displejem v programovacích prostředích pracuje a k čemu všemu se dá výstup na displej v programu využít.

Výstup na displej upozorní uživatele pouze vypsáním či vykreslením. Signalizace nebo zvukové výstrahy je možné realizovat pomocí zvukového výstupu řídící jednotky. Její ovládání je realizováno přes programovací prostředí. Možnostem práce se zvuky a tóny a jejich využití v programu se věnuje článek Zvukový výstup.

V posledním článku nazvaném Světelné kostky se zabýváme posledním ze výstupních zařízení, které se využívá pro vnější signalizaci. Světelné kostky mohou díky barvám, které reprezentují, sloužit například jako světelná výstraha při různých úkonech, které robot vykonává.

 

 

Základní výstupní moduly (zasílání dat pro řízení modulů, řízení pohybu, praktické použití)
• krokové motory,
• práce s displejem,
• zvukový výstup,
• světelné diody.

KURZ: Světelné kostky a signalizace tlačítek řídící jednotky

Základní sada stavebnice LEGO MINDSTORMS NXT obsahuje světelné kostky, které jsou opatřeny vláknovou žárovkou. Kostky jsou napájeny 9V a jejich stálý odběr je 30mA. Jedná se o výstupní zařízení a tudíž jsou k řídící jednotce připojeny pomocí jednoho ze vstupních portů (A, B nebo C). Připojují se pomocí redukčního kabelu RCX, který zajišťuje kompatibilitu mezi starší a novější verzí rozhraní pro připojení senzorů.

Novější stavebnicí LEGO Mindstorms EV3 již nejsou světelné kostky podporovány. Tento typ signalizace byl nahrazen a nově obsahuje řídící jednotka podsvícení svých tlačítek, které je možné využít jako vnější světelnou signalizaci. Ovládání podsvícení je možné pomocí příslušného bloku v programovacím prostředí EV3. V záložce EV3 níže se tak již nevěnujeme světelným kostkám, ale popisujeme práci se světelnou signalizací řídící jednotky v tomto programovacím prostředí.

Práce se světelnými kostkami v programovacích prostředích

NXT-G

BLOK PRO OVLÁDÁNÍ světelných kostek

Rozcestník


Umístění bloku

Blok LightDragged Lamp pro ovládání světelných kostek se nachází v paletě icon complete Complete > ActionHilight Action.

Kostky rozbaleny

 

Popis bloku

Programový blok LightDragged Lamp obsahuje šest konektorů pro připojení dalších bloků:

Port Port - značí výstupní port, ke kterému je kostka připojena.

Action Action - vyjadřuje, zda je žárovka kostky rozsvícena či nikoliv.

Intensity Intensity - udává hodnotu intensity světla (0 - 100).

Aktuální nastavení bloku udávají tři ikonky. Vpravo nahoře je zobrazen port, ke kterému je kostka připojena (A, B nebo C). Ve spodní části poté signalizace, zda je kostka rozsvícena či není (On nebo Off). Poslední, umístěná vpravo dole udává nastavenou intenzitu světla.

 

Parametry bloku

Kostky blok

Port: označuje, ke kterému výstupnímu portu je kostka připojena (A, B nebo C).

Action: nastavení, zda je LED dioda umístěná na kostce rozsvícena (On) nebo zhasnuta (Off).

Intensity: tažítkem nastavitelná hodnota intensity světla LED diody (0 - 100). 

RobotC

Příkazy pro práci se světelnými kostkami

Světelné kostky opatřené vláknovou žárovkou nenabízí příliš mnoho funkcí, jelikož jejich hlavní určení je spíše v podobě signalizátoru nějakého jevu. Při jejich ovládání tedy pracujeme hlavně s nastavením intenzity svitu a dobou po kterou žárovka svítí.

Rozcestník


Nastavení intenzity svitu kostek

Ovládání světelných kostek v programovacím prostředí RobotC se provádí obdobným způsobem, jako ovládání chodu motoru. K nastavení intenzity světla slouží příkaz motor[], u nějž v závorce definujeme, k jakému výstupnímu portu kostky, ho pomocí RCX kabelu připojujeme. Číselnou hodnotou na stupnici 0 - 100 poté udáváme samotnou intenzitu světla.

 
motor[motorB] = 100; // Kostka je pripojena k portu B a sviti s maximalni intenzitou.
 

Ovládání doby svitu kostek

U světelné kostky je možné ovládat dobu, po kterou je její žárovka rozsvícena či zhasnuta. K načasování podobných jevů slouží příkaz wait1Msec(). Jeho pomocí můžeme v milisekundách určit dobu, po kterou se daný úkon bude provádět. Tímto způsobem je možné přesně nastavit sekvence, po které bude světlo svítit či bude zhasnuto nebo dosáhnout rozblikání diody.

 
motor[motorA] = 100; // Kostka je pripojena k portu A a sviti s maximalni intenzitou svetla.
wait1Msec(4000); // Doba svitu kostky je ctyri sekundy.
motor[motorA] = 0; // Po ctyrech sekundach dioda kostky zhasne.
wait1Msec(4000); // Po dobu ctyr sekund je dioda kostky zhasnuta.
motor[motorA] = 100; // Po uplynuti doby ctyr sekund po ktere byla dioda kostky zhasnuta se opet rozsviti s maximalni intenzitou.
wait1Msec(4000); // Dioda svetelne kostky bude opet svitit po dobu ctyr sekund a pote zhasne.
 

EV3

Blok pro práci se světelnou signalizací řídící jednotky

Rozcestník


Umístění bloku pro světelnou signalizaci řídící jednotky

Programový blok Brick Status Light je umístěn v paletě Action Action

UMISTENI LIGHT


Změna režimu programového bloku

Programový blok Brick Status Light můžeme využívat ve tř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).

STATUS LIGHT REZIMY


Režimy programového bloku

Off (vypnuto)

Režim, pomocí kterého je možné vypnout aktivní světelnou signalizaci řídící jednotky.

STATUS LIGHT OFF

 

 

On (zapnuto)

Režim pro zapnutí světelné signalizace řídící jednotky. Programový blok obsahuje v tomto režimu dva vstupní porty.

STATUS LIGHT ON

Identification 017 Color Yellow Colour - výběr barvy světelné signalizace. Na výběr máme ze tříbarev (viz obrázek níže).

STATUS LIGHT BARVY

Identification 516 Pulse Pulse - pokud je hodnota nastavena na True (pravda) světlo pulzuje, v opačném případě nikoliv.

 

 

Reset (resetování)

Režim, který znovu aktivuje výchozí světelnou signalizaci chodu programu (zelené blikající světlo).

STATUS LIGHT RESET


Možnosti praktického využití

Světelné kostky můžeme považovat spíše za doplňkovou komponentu LEGO MINDSTORMS NXT. Dají se využít u různých zařízení pro signalizaci nastálého děje. U ultrasonického senzoru se dají využít jako světelný signalizátor pro překročení povolené vzdálenosti od překážky. U dotykového senzoru mohou signalizovat stisknutí jeho tlačítka a podobně.

Využití světelných kostek pro sestrojení jednoduchého semaforu

Použití a ovládání světelných kostek si ukážeme na jednoduchém modelu semaforu, který můžete vidět na obrázku. Skládá se ze tří světelných kostek, které symbolizují všechny tři barvy semaforu (zelená, oranžová a červená). Pomocí speciálních vodičů jsou připojeny k řídící jednotce. Diody se rozsvicují a zhasínají stejně tak, jako na opravdovém semaforu. Nejprve svítí zelená, ke které se následně rozsvítí také oranžová. Ve chvíli, kdy obě tato světla zhasnou, se rozsvítí červená. K červené se po chvíli rozsvítí oranžová a po jejich současném zhasnutí se opět rozsvítí zelená. Tento děj se opakuje, stejně tak jako na křižovatce, stále dokola.

 

NXT-G

OVLÁDÁNÍ SEMAFORU ZE SVĚTELNÝCH KOSTEK

Pro ovládání semaforu složeného ze světelných kostek budeme v programovacím prostředí NXT-G využívat blok LightDragged Lamp, který je k jejich ovládání určený. Na následujícím příkladu si vysvětlíme, jako ho správně používat a jak docílit správného chodu improvizovaného dopravního semaforu.

Krok 1 - Rozsvícení zelené diody

Jako první se pokusíme na semaforu rozsvítit zelenou diodu tak, aby svítila po dobu 4 sekund. Použijeme tedy blok LightDragged Lamp. V jeho nastavení musíme zvolit port, ke kterému je kostka připojena. Chceme aby kostka svítila, musíme tudíž v sekci Action zvolit možnost On. Svit s maximální intenzitou zajistíme zadáním maximální hodnoty 100 v sekci Intensity.

lamp blok

Nyní jsme nastavili vše tak, jak potřebujeme. Musíme ovšem ještě zajistit, aby žárovka svítila po dobu 4 sekund. K tomu použijeme cyklus s pevným počtem průchodů LoopBig Loop, do kterého blok umístíme. V jeho nastavení musíme zvolit kontrolu pomocí času (Time) a nastavit dobu provádění cyklu na 4 sekundy.

cyklus1

Výsledný cyklus bude vypadat následovně:

cyklus zelena

 
Krok 2 - Svit zelené a oranžové diody

Než se na semaforu rozsvítí červené světlo, krátký časový úsek svítí zelené a oranžové světlo současně. My budeme v našem programu chtít, aby se tak dělo po dobu 2 sekund. Postup ke správnému řešení je obdobný jako v předchozím kroku. Budeme potřebovat dva bloky pro ovládání světelných kostek. Zvolíme správné porty, ke kterým jsou zelená a oranžová dioda připojeny. Vybereme, že chceme aby svítily (volba On) a navolíme maximální intezitu svitu (100). Oba bloky umístíme do cyklu s pevným počtem průchodů tak, jak můžete vidět na obrázku. V nastavení bloku opět zvolíme provádění na základě času (Time) a zadáme požadované 2 vteřiny.

cyklus zelena oranzova

 
Krok 3 - Zhasnutí svítících diod

V okamžiku, kdy se rozsvítí červené světlo semaforu, musí zelená a oranžová kostka zhasnout. Musíme tedy nyní zhasnutí zrealizovat. Jedná se o opačný proces než při rozsvícení světla. Do programu si umístíme dva bloky, které reprezentují kostky připojené k příslušným portům jako zelené a oranžové světlo a v sekci Action jejich nastavení zvolíme možnost Off. Tímto docílíme toho, že po provedení přechozího kroku, kdy budou obě diody svítit 2 vteřiny, zhasnou.

 
Krok 4 - Rozsvícení červené diody

Přesně v okamžiku, kdy zhasne zelená a oranžová kostka budeme potřebovat, aby se rozsvítila kostka červená. Stejně jako tomu bylo u zelené, tak i zde budeme chtít, aby svítila 4 vteřiny. Nastavení tedy bude naprosto stejné jako u rozsvícení zelené kostky. U bloku pro zelenou kostku navolíme správný port, akci On a maximální intezitu a umístíme ho do cyklu, který se bude provádět po dobu 4 sekund.

 
Krok 5 - Zajištění neustálého střídání barev na semaforu

Zbývá nám poslední kombinace barev semaforu. Než se rozsvítí opět zelené světlo, musí nejprve po dobu 2 vteřin svítit červená a oranžová kostka zároveň, jako tomu bylo při přechodu ze zelené barvy na červenou. Postup realizace je opět totožný jako v kroku 2. Důležité je zda dbát hlavně na zadávání správných označení portů, abychom si nespletli diody a nerozsvítili je chybně. Oba bloky musí být opět umístěny v cyklu. Za oba dva znovu umístíme bloky, které po průchodu cyklem červené a oranžové světlo zhasnou.

Stejně jako u opravdového semaforu, který řídí dopravní křižovatku, budeme i u našeho chtít, aby se na něm barvy střídaly stále dokola. Musíme tak celou posloupnost příkazů, kterou jsme si popsali v předchozích krocích umístit do cyklu s pevným počtem průchodů LoopBig Loop. V jeho nastavení musíme provést jediné. V sekci Control zvolit možnost Forever, čímž zajistíme nekonečné provádění celé posloupnosti příkazů.

forever

 

Program ke stažení

Stažení ve formátu .rbt

RobotC

Ovládání semaforu ze světelných kostek

Jak jsme si již ukázali v teoretické části této kapitoly, tak rozsvícení a zhasnutí diod světelných kostek se ovládá pomocí stejného příkazu jako ovládání motoru, tedy motor[]. V našem příkladu jde pouze o to, abychom správně sesynchronizovali příkazy tak, aby svítili vždy pouze kostky, které chceme aby svítili. Nakonec budeme požadovat, aby se celý cyklus chodu semaforu opakoval stále dokola.

Krok 1 - Rozsvícení zelené kostky

Jako první se na semaforu pokusíme rozsvítit zelenou kostku, která na křižovatkách symbolizuje možnost volného průjezdu vozidel. Budeme chtít, aby svítila 4 sekundy, protože následně se k ní ještě rozsvítí kostka oranžová a po jejich zhasnutí se rozsvítí kostka červená. Zelenou kostku rozsvítíme pomocí příkazu motor[]. Chceme aby svítila s maximální intenzitou, takže nastavíme hodnotu příkazu na 100. V parametru příkazu musíme správně zadat port, ke kterému je světelná kostka připojena. Nyní musíme zajistit, aby svítila 4 sekundy. Docílíme toho příkazem wait1Msec(). Jako parametr nastavíme 4000 milisekund (4 sekundy). Tímto docílíme oddálení provádění dalšího příkazu o 4 sekundy a tedy svitu zelené kostky po tuto dobu.

 
 // Rozsviceni zelene diody po dobu 4s.
 motor[motorA] = 100;
 wait1Msec(4000);
 
 
Krok 2 - Svit zelené a oranžové kostky současně

Než se na semaforu rozsvítí červené světlo, svítí nejprve krátký časový úsek zelené a oranžové světlo zároveň. My v našem příkladě chceme, aby světla svítila současně po dobu 2 sekund. Jak rozsvítit kostku po určitou dobu jsme si již ukázali. Nyní pouze přidáme oranžovou kostku.

 
 // Usek 2 vterin, behem kterych sviti zelena a oranzova dioda.
 motor[motorA] = 100;
 motor[motorB] = 100;
 wait1Msec(2000);
 
 
Krok 3 - Zhasnutí svítících diod

Ve stejný okamžik, kdy se na semaforu rozsvítí červené světlo, zhasne světlo zelené a oranžové. Zhasnutí docílíme opačným postupem než rozsvícení. Do příkazu motor[] zadáme nulovou hodnotu intenzity světla.

 
 // Zhasnuti zelene a oranzove diody.
 motor[motorA] = 0;
 motor[motorB] = 0;
 
 
Krok 4 - Rozsvícení červené diody

Jakmile zhasne zelené a červené světlo, rozsvítí se na semaforu červené. Pro jeho rozsvícení stačí opět použít příkaz motor[]. Zadat maximální intenzitu svitu a uvést správně příslušný port.

 
 // Rozviceni cervene diody na dobu 4s.
 motor[motorC] = 100;
 wait1Msec(4000);
 
 
Krok 5 - Zajištění neustálého střídání barev na semaforu

Nyní známe všechny kroky, pomocí kterých naprogramujeme i zbývající dva. Prvním z nich bude současný svit červené a oranžové barvy po dobu 2 sekund, po jejichž zhasnutí se rozsvítí zelené světlo. Na každém dopravním semaforu se ale toto střídání barev děje neustále dokola, neprobíhá pouze jednou. Musíme tedy zajistit ještě jejich střídání stále dokola. Docílíme toho umístěním veškerých příkazů pro střídání barev do nekonečného cyklu while(). Jak poté bude výsledný program vypadat můžete vidět níže.

Výsledný program pro semafor
 
task main()
{
// Nekonecny cyklus zajistujici neustale opakovani.
while(1 == 1) 
{
 // Rozsviceni zelene diody po dobu 4s.
 motor[motorA] = 100;
 wait1Msec(4000);
 
 // Usek 2 vterin, behem kterych sviti zelena a oranzova dioda.
 motor[motorA] = 100;
 motor[motorB] = 100;
 wait1Msec(2000);
 
 // Zhasnuti zelene a oranzove diody.
 motor[motorA] = 0;
 motor[motorB] = 0;
 
 // Rozviceni cervene diody na dobu 4s.
 motor[motorC] = 100;
 wait1Msec(4000);
 
 // Usek 2 vterin, behem kterych sviti cervena a oranzova dioda.
 motor[motorB] = 100;
 motor[motorC] = 100;
 wait1Msec(2000);
 
 // Zhasnuti cervene a oranzove diody.
 motor[motorB] = 0;
 motor[motorC] = 0;
}
}
 
Popis programu

V programu je pomocí příkazu motor[] zajištěno vždy rozsvícení příslušné kostky na maximum (100%). Pokud svítí pouze zelená nebo pouze červená kostka, je doba svitu nastavena na 4 sekundy. Přechodný stav, kdy se rozsvicuje při přechodu ze zelené na červenou a opačně také oranžová dioda jsme zkrátili na 2 sekundy. Neustálé opakování chodu semaforu zajišťuje nekonečný cyklus while().

 

Program ke stažení

Stažení ve formátu .c

1 1 1 1 1 1 1 1 1 1 Hodnocení 1.50 (2 hodnocení)

KURZ: Základní výstupní moduly

Seznam článků kapitoly

  1. Motor a jeho pohyb
  2. Synchronizace pohybů dvou motorů
  3. Práce s displejem
  4. Zvukový výstup
  5. Světelné kostky

Úvod

Základní sadu robotických stavebnic Lego Mindstorm NXT a EV3 tvoří několik výstupních modulů sloužících k signalizaci různých jevů, které při programování nastanou. Asi nejpotřebnějším pro realizaci pohyblivých částí robotů je krokový motor. Pohání otáčivé části robotů či nápravy aut sestavených ze stavebnice. Robotická stavebnice EV3 navíc obsahuje lineární motor, který je vhodný zejména k pohánění ozubených kol a jiných převodových částí. Více o jejich funkci a práci s nimi v programovacích prostředích se dozvíte v článku Motor a jeho pohyb.

V závislosti na něm se v článku Synchronizace pohybu dvou motorů věnujeme možnostem programového využití spolupráce více motorů, čehož se využívá pro pohyb robota ve více směrech.

Hlavně během práce se senzory a také pro signalizaci různých jevů během programu budeme využívat funkci displeje jako výstupního zařízení. V článku Práce s displejem se dozvíte, jak se s displejem v programovacích prostředích pracuje a k čemu všemu se dá výstup na displej v programu využít.

Signalizace nebo zvukové výstrahy je možné realizovat pomocí zvukového výstupu řídící jednotky. Jeho ovládání je realizováno přes programovací prostředí. Možnostem práce se zvuky a tóny a jejich využití v programu se věnuje článek Zvukový výstup.

V posledním článku nazvaném Světelné kostky se věnujeme poslednímu z výstupních zařízení, které se využívá pro vnější signalizaci. Světelné kostky mohou díky barvám, které reprezentují, sloužit například jako světelná výstraha při různých úkonech, které robot vykonává. Jejich využití v programovacím prostředí EV3 již není možné. Robotická stavebnice EV3 ovšem přináší novou možnost vnější signalizace a to pomocí podsvícení tlačítek řídící jednotky, kterému se v této kapitole také věnujeme.

 

1 1 1 1 1 1 1 1 1 1 Hodnocení 5.00 (2 hodnocení)

KURZ: Zvukový výstup

Ří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 SoundDragged Sound, který se nachází v paletě icon complete Completeicon commonCommon (na obrázku s rozbaleným Data Hub pro připojení dalších modulů).

NXTG BlokSound rozbaleny 

 

Popis bloku

Programový blok SoundDragged Sound obsahuje šest konektorů pro připojení dalších bloků:

Action Action - označuje typ zvukové signalizace (zvukový soubor nebo tón).

Filename Filename - název přehrávaného zvukového souboru.

Tone Tone Frequency - frekvence přehrávaného zvuku v hertzích.

SoundMode Control - vyjadřuje aktuální stav (play nebo stop).

Volume Volume - úroveň hlasitosti přehrávaného zvuku.

Duration Duration - doba trvání přehrávání zvuku.

Samotný modul SoundDragged Sound zobrazuje aktuální nastavení pomocí tří ikonek umístěných pod vyobrazením reproduktoru (popisovány zleva doprava):

  • SoundFile typ zvuku (zvukový soubor nebo tón),
  • Play nebo Stop soundvyjádření, zda modul v dané situaci reprezentuje zapnutí nebo vypnutí zvukové signalizace,
  • Volume075úroveň hlasitosti zvuku.

 

Parametry bloku

NXTG sound soundfile

NXTG sound tone

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 SoundDragged 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 Action

SOUND UMISTENI


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

SOUND REZIM 


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.

 SOUND VSTUPNI PORT

Tento port s názvem Identification 528 FileName File Name slouží k odeslání zvukového souboru k přehrání.

SOUND WIRED


Režimy programového bloku

Stop (zastavení)

Režim programového bloku sloužící k zastavení aktuálně přehrávaného zvuku.

SOUND STOP

 

 

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.

SOUND PLAY FILE

Identification 264 Volume 100 Volume Control - hlasitost přehrávaného zvuku udávaná na stupnici od 0 do 100.

Identification 512 PlayType WaitForCompletion Play Type - způsob přehrání zvoleného zvukového souboru.

Přehrání je možné realizovat třemi způsoby:

  • Identification 512 PlayType WaitForCompletion Wait for Completion - zvuk je jedenkrát přehrán a program pokračuje až po dokončení přehrávání.
  • Identification 510 PlayType PlayOnce Play Once - zvuk je jedenkrát přehrán a program okamžitě pokračuje dále.
  • Identification 511 PlayType Repeat 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).

 SOUND PLAY FILE VYBER

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.

SOUND MENU

 

 

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.

SOUND PLAY TONE

Identification 058 Hz Frequency - frekvence zvoleného zvuku v herzích (možné rozpětí hodnot je od 300 do 10 000). 

Identification 240 Time Duration - délka přehrávaného zvuku ve vteřinách.

Identification 264 Volume 100 Volume Control - hlasitost přehrávaného zvuku udávaná na stupnici od 0 do 100.

Identification 512 PlayType WaitForCompletion Play Type - způsob přehrání zvoleného zvuku.
Přehrání je možné realizovat třemi způsoby:

  • Identification 512 PlayType WaitForCompletion Wait for Completion - zvuk je jedenkrát přehrán a program pokračuje až po dokončení přehrávání.
  • Identification 510 PlayType PlayOnce Play Once - zvuk je jedenkrát přehrán a program okamžitě pokračuje dále.
  • Identification 511 PlayType Repeat 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.

SOUND PLAY NOTE

 Identification 525 Note Note - výběr zvukového tónu.

Identification 240 Time Duration - délka přehrávaného tónu ve vteřinách.

 Identification 264 Volume 100 Volume Control - hlasitost přehrávaného tónu udávaná na stupnici od 0 do 100.

Identification 512 PlayType WaitForCompletion Play Type - způsob přehrání zvoleného tónu.
Přehrání je možné realizovat třemi způsoby:

  • Identification 512 PlayType WaitForCompletion Wait for Completion - tón je jedenkrát přehrán a program pokračuje až po dokončení přehrávání.
  • Identification 510 PlayType PlayOnce Play Once - tón je jedenkrát přehrán a program okamžitě pokračuje dále.
  • Identification 511 PlayType Repeat 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.

draha couvani

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

pohyb vpred

 
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 

MotorDragged 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).

natoceni motorB

natoceni motorC

 
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 MovePaletteDragged 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 MovePaletteDragged 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 SoundDragged 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  SoundDragged 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í.

zvukova signalizace

pohyb vzad

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í

Stažení ve formátu .rbt

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

 

Program ke stažení

Stažení ve formátu .c

1 1 1 1 1 1 1 1 1 1 Hodnocení 4.33 (3 hodnocení)

KURZ: Motor a jeho pohyb

Pro pohyb a natáčení robotů a jejich jednotlivých částí můžeme využít Interaktivní servomotor. Tento motor je kombinací motoru zajišťujícího otáčení a senzoru měřícího míru natočení.

Vlastnosti motoru

Nejdůležitější vlastností motoru je výkon, směr a port, ke kterému je motor připojen.

Výkon motoru: udává intenzitu (rychlost) motoru jakou se motor otáčí. Hodnotu výkonu lze nastavit v procentech, kde 100 % je maximální výkon.

Směr: určuje směr otáčení motoru (vpřed, vzad či zastavení).

Port: udává port řídící jednotky (A, B, C) ke kterému je motor připojen.

Určení míry natočení

Otáčení motoru zaznamenávají optická čidla poskytující zpětnou vazbu. Tuto hodnotu lze pomocí programu načíst, ale je též automaticky využívána k vykonání různých pohybových sekvencí. Pohyb lze realizovat čtyřmi různými způsoby:

Stupně

Nastavením stupňů v rozsahu 0 až 360° motoru udáváme, o kolik stupňů se má otočit. Úhel natočení je motorem zjišťován a korigován zpětně přes počitadlo otáček. Protože se nejedná o krokový motor, není pohyb zcela přesný a je tak nutné počítat s určitou odchylkou v řádu jednotek. V případě zadání malého natočení pak i s případným rozmitáním motoru.

Rotace

Vyjádření míry natočení pomocí rotace motoru udává, kolik otočení kolem své osy má být k danému pohybu vykonáno. Jedna rotace motoru odpovídá 360°. Natočení pomocí rotace využijeme pro pohyb po delší trase známé délky.

Sekundy

Sekundy určují, po jakou dobu se má provádět otáčení motoru. Chceme-li tímto způsobem stanovit délku dráhy po které se robot bude pohybovat, musíme počítat také s nastaveným výkonem motoru. Během stejného časového úseku totiž motor s menším výkonem provede méně otáček. Vyjádření míry natočení pomocí času tedy není pro potřeby přesného stanovení délky dráhy příliš přesné.

Neomezeně

Poslední možností nastavení míry natočení je neomezený pohyb motoru. Jak již název naznačuje, nejedná se o časově ani parametrově omezený pohyb. Vykonávání je prováděno po celou dobu chodu programu. Tento způsob tedy neskýtá možnost jakkoliv ovlivnit dobu či míru natočení.

Použití motoru v programovacím prostředí

NXT-G

Blok pro ovládání motoru

Rozcestník


Umístění bloku

Programový blok MotorDragged Motor je umístěn v paletě icon completeCompleteAction Action.

NXTG Motor rozbaleny

 

Popis bloku

Blok MotorDragged Motor obsahuje celkem osm konektorů sloužících k propojení s dalšími programovými bloky:

Port Port - vyjadřuje, ke kterému výstupnímu portu (A, B, C) je motor připojen.

Direction Direction - označuje směr otáčení motoru (vpřed či vzad).

Action Action - nastavený typ ovládání akcelerace motoru.

Power Power - intenzita otáčení motoru.

SoundMode Control Motor Power - regulace výkonu motoru.

Goal Duration - délka trvání pohybu.

Wait Wait for Completion - ukončení činnosti před dalším krokem programu.

StopAfter Next Action - vyjadřuje, zda bude po ukončení akce motor pokračovat v činnosti či nikoliv.

Direction Direction out - řízení pohybu motoru během provádění činnosti bloků.

Degreesout Degrees out - vyjadřuje, o kolik stupňů se motor otočí během provádění činnosti bloků.

Aktuální nastavení bloku označují tři ikony v jeho dolní části. První označuje směr otáčení Forward, druhá intenzitu otáčení motoru Power a třetí značí délku trvání pohybu Infinity. Číslo v horní části bloku označuje, ke kterému výstupnímu portu je motor připojen.

 

Parametry bloku

motor single

Port: udává port řídící jednotky (A, B, C) ke kterému je motor připojen.

Direction: určuje směr otáčení motoru (vpřed, vzad či zastavení).

Action: umožňuje třemi způsoby ovládat akceleraci motoru.

  • Ramp Up - pomalé zvyšování rychlosti dokud není dosaženo nastavené intenzity otáčení motoru (power).
  • Ramp Down - pomalé snižování intenzity otáčení motoru, dokud není dosaženo nulové hodnoty.
  • Constant - plného výkonu je dosaženo ihned. Zastavení je dosaženo buď setrvačností motoru nebo dalším nastavením (Next Action).

Power: intenzita (rychlost) otáčení motoru nastavitelná v procentech (100% je maximum).

Control: zapnutí regulace výkonu motoru.

Duration: možnost nastavení délky trvání pohybu. Skýtá čtyři možnosti nastavení:

  • míra natočení ve stupních (Degrees),
  • míra natočení vyjádřená pomocí otáček motoru (Rotations),
  • doba chodu motoru při daném výkonu v sekundách (Seconds),
  • neomezený běh motoru po dobu průběhu programu (Unlimited).

Wait: vybráním této možnosti dáváme motoru pokyn ukončit svoji činnost ještě před dalším krokem programu.

Next Action: udává, zda se má po ukončení akce motor zastavit (Brake) nebo pokračovat v chodu (Coast).

RobotC

Příkazy a metody

V programu RobotC se ovládání motoru provádí v podstatě pomocí jediného příkazu. Další chování ovlivňují zadané hodnoty a proměnné.

Rozcestník


Nastavení a ovládání motoru

Veškeré ovládání motoru v programovacím prostředí RobotC je prováděno pomocí příkazu motor[]. V tomto příkazu označujeme jak port, ke kterému je motor připojen, tak i intenzitu jeho otáčení a směr otáčení

Port: výraz v závorce označuje, ke kterému portu (motorA, motorB nebo motorC) řídící jednotky je motor připojen.

 
motor[motorA] = 100; // Motor je pripojen k portu A a otaci se smerem vpred s maximalnim vykonem.
 

 

Intenzita otáčení motoru: udává na stupnici od 0 do 100% výkon motoru.

 
motor[motorA] = 75; // Motor je pripojen k portu A a otaci se smerem vpred s vykonem 75%.
 

 

Směr otáčení motoru: je určen znaménkem před hodnotou určující výkon motoru. Kladné číslo vyjadřuje otáčení vpřed, záporné vzad.

 
motor[motorA] = -100; // Motor je pripojen k portu A a otaci se smerem vzad s maximalnim vykonem.
 

Ovlivnění doby otáčení motoru

Délka trvání pohybu je nastavována v milisekundách pomocí příkazu wait1Msec() nebo v desítkách milisekund příkazem wait10Msec().

 
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.
 

Možnosti natočení motoru

Natočení motoru je možné provádět příkazem bMotorReflected[], díky němuž se motor pootočí o 180 stupňů. Nabývá hodnot true nebo false.

 
bMotorReflected[motorA] = true;  // Motor A se pootoci o 180 stupnu.
bMotorReflected[motorA] = false; // Motor A se nepootoci o 180 stupnu.
 

Druhou možností, která umožňuje oproti předchozímu příkazu libovolné natočení, je pomocí čítače otáček motoru. Čítač zaznamenává, o kolik stupňů (0 - 360) se motor pootočil. Pracuje se s ním pomocí příkazu nMotorEncoder[]. Na příkladu můžete vidět, jak pomocí čítače pootočit motor o 360 stupňů.

 
nMotorEncoder[motorB] = 0; // Nulovani citace motoru B.
while(nMotorEncoder[motorB] < 360) // Nastavení podminky cyklu (dokud citac motoru B nedosahne 360 stupnu...).
{
   motor[motorB] = 75; // ...tak se motor B otaci s vykonem 75%. 
}
motor[motorB] = 0; // Nastaveni vykonu motoru B na 0.
 

EV3

BLOK PRO OVLÁDÁNÍ SERVOMOTORU

Rozcestník

Blok pro ovládání lineárního motoru

Rozcestník


Umístění bloku

Programový blok Large Motor je umístěn v paletě Action Action.

UMISTENI LARGE


Výběr výstupního portu

Před započetím práce s motorem je nejprve nutné zvolit výstupní port (A, B, C nebo D) řídící jednotky, ke kterému je motor připojen (červeně zvýrazněno).

LARGE REZIMY


Změna režimu

Programový blok Large Motor můžeme využívat v pěti režimech. Přepínání mezi nimi se provádí pomocí tlačítka v levé spodní části (červeně zvýrazněno).

 LARGE REZIMY


Přidání vstupního portu

Po kliknutí do pole pro výběr výstupních portů pro řízení motorů je možné vybrat první možnost Wired, po které se do programového bloku přidá vstupní port Identification 515 Port Port (červeně zvýrazněno).

LARGE WIRED


Režimy programového bloku

Off (vypnuto)

Vypnutí chodu motoru. V tomto řežimu  je aktivní pouze jediný vstupní port.

LARGE OFF

Identification 508 BrakeAtEnd BrakeBreak at End - způsob zastavení motoru. Okamžité zastavení (Break) reprezentuje logická hodnota True a pozvolné dojetí (Coast) hodnota False.

 

 

On (Zapnuto)

Neomezený běh motoru po dobu průběhu programu. V tomto řežimu  je aktivní pouze jediný vstupní port.

LARGE ON

Identification 203 Speed Plus75 Power - rychlost otáčení motoru udávaná v procentech na stupnici od 100 (vpřed) do -100 (vzad).

 

 

On for seconds (otáčení po zadaný časový úsek)

Ovlivnění chodu motoru pomocí času. V tomto režimu máme k dispozici tři vstupní porty.

LARGE SECONDS

Identification 203 Speed Plus75 Power - rychlost otáčení motoru udávaná v procentech na stupnici od 100 (vpřed) do -100 (vzad).

Identification 240 Time Seconds - doba otáčení motoru udávaná ve vteřinách.

Identification 508 BrakeAtEnd BrakeBreak at End - způsob zastavení motoru. Okamžité zastavení (Break) reprezentuje logická hodnota True a pozvolné dojetí (Coast) hodnota False.


 

 

On for Degrees (otočení o zadaný úhel)

Ovlivnění chodu motoru pomocí úhlových stupňů. V tomto režimu máme k dispozici tři vstupní porty.

LARGE DEGREES

Identification 203 Speed Plus75 Power - rychlost otáčení motoru udávaná v procentech na stupnici od 100 (vpřed) do -100 (vzad).

Identification 288 DegreesAngle Plus360 Degrees - míra natočení zadávaná v úhlových stupních od 0 do 360°.

Identification 508 BrakeAtEnd BrakeBreak at End - způsob zastavení motoru. Okamžité zastavení (Break) reprezentuje logická hodnota True a pozvolné dojetí (Coast) hodnota False.

 

 

On for Rotations (otočení o počet otáček)

Ovlivnění chodu motoru pomocí počtu nastavených otáček. V tomto režimu máme k dispozici tři vstupní porty.

LARGE ROTATIONS

Identification 203 Speed Plus75 Power - rychlost otáčení motoru udávaná v procentech na stupnici od 100 (vpřed) do -100 (vzad).

Identification 503 NumberRotations Rotations - počet prováděných otáček motoru.

Identification 508 BrakeAtEnd BrakeBreak at End - způsob zastavení motoru. Okamžité zastavení (Break) reprezentuje logická hodnota True a pozvolné dojetí (Coast) hodnota False.

 

 



Umístění bloku

Programový blok Medium Motor je umístěn na paletě Action Action.

UMISTENI MIDDLE 


Výběr výstupního portu

Před započetím práce s motorem je nejprve nutné zvolit výstupní port (A, B, C nebo D) řídící jednotky, ke kterému je motor připojen (červeně zvýrazněno).

MIDDLE PORT


Změna režimu

Programový blok Medium Motor můžeme využívat v pěti režimech. Přepínání mezi nimi se provádí pomocí tlačítka v levé spodní části (červeně zvýrazněno).

MIDDLE REZIMY


Přidání vstupního portu

Po kliknutí do pole pro výběr výstupních portů pro řízení motorů je možné vybrat první možnost Wired, po které se do programového bloku přidá vstupní port Identification 515 Port Port (červeně zvýrazněno).

MEDIUM WIRED


Režimy programového bloku

Off (Vypnuto)

Vypnutí chodu motoru. V tomto řežimu  je aktivní pouze jediný vstupní port.

MIDDLE OFF

Identification 508 BrakeAtEnd BrakeBreak at End - způsob zastavení motoru. Okamžité zastavení (Break) reprezentuje logická hodnota True a pozvolné dojetí (Coast) hodnota False.

 

 

On (zapnuto)

Neomezený běh motoru po dobu průběhu programu. V tomto řežimu  je aktivní pouze jediný vstupní port.

MIDDLE ON

Identification 203 Speed Plus75 Power - rychlost otáčení motoru udávaná v procentech na stupnici od 100 (vpřed) do -100 (vzad).

 

 

On for Seconds (otáčení po zadaný časový úsek)

Ovlivnění chodu motoru pomocí času. V tomto režimu máme k dispozici tři vstupní porty.

MIDDLE SECONDS

Identification 203 Speed Plus75 Power - rychlost otáčení motoru udávaná v procentech na stupnici od 100 (vpřed) do -100 (vzad).

Identification 240 Time Seconds - doba otáčení motoru udávaná ve vteřinách.

Identification 508 BrakeAtEnd BrakeBreak at End - způsob zastavení motoru. Okamžité zastavení (Break) reprezentuje logická hodnota True a pozvolné dojetí (Coast) hodnota False.

 

 

On for Degrees (otočení o zadaný úhel)

Ovlivnění chodu motoru pomocí úhlových stupňů. V tomto režimu máme k dispozici tři vstupní porty.

MIDDLE DEGREES

Identification 203 Speed Plus75 Power - rychlost otáčení motoru udávaná v procentech na stupnici od 100 (vpřed) do -100 (vzad).

Identification 288 DegreesAngle Plus360 Degrees - míra natočení zadávaná v úhlových stupních od 0 do 360°.

Identification 508 BrakeAtEnd BrakeBreak at End - způsob zastavení motoru. Okamžité zastavení (Break) reprezentuje logická hodnota True a pozvolné dojetí (Coast) hodnota False.

 

 

On for Rotations (otočení o určitý počet otáček)

 Ovlivnění chodu motoru pomocí počtu nastavených otáček. V tomto režimu máme k dispozici tři vstupní porty.

MIDDLE ROTATIONS

Identification 203 Speed Plus75 Power - rychlost otáčení motoru udávaná v procentech na stupnici od 100 (vpřed) do -100 (vzad).

Identification 503 NumberRotations Rotations - počet prováděných otáček motoru.

Identification 508 BrakeAtEnd BrakeBreak at End - způsob zastavení motoru. Okamžité zastavení (Break) reprezentuje logická hodnota True a pozvolné dojetí (Coast) hodnota False.

  


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í)

KURZ: Synchronizace pohybu dvou motorů

Pokud vytváříme pohyblivá autíčka, vozítka nebo mechanismy vyžadující řízení, použijeme kombinaci dvou motorů. Při jejich využití můžeme libovolně zasílat příkazy každému z nich zvlášť a dosahovat tak požadovaného pohybu robota. Pro práci s více motory využijeme znalosti získané v předchozí kapitole s názvem Motor a jeho pohyb.

Synchronizace dvou motorů v programovacím prostředí

NXT-G

BLOK PRO OVLÁDÁNÍ MOTORU

Rozcestník


Umístění bloku

Programový blok MovePaletteDragged Move je umístěn v paletě icon completeComplete >icon commonCommon.

NXTG Move rozbaleny

 

Popis bloku

Blok MovePaletteDragged Move obsahuje po rozbalení osm konektorů pro propojení s dalšími  programovými bloky.

LeftMotor Left Motor - označuje, ke kterému vstupnímu portu je připojen levý motor (A, B, C).

RightMotor Right Motor - označuje, ke kterému vstupnímu portu je připojen pravý motor (A, B, C).

OtherMotor Other Motor - označuje, ke kterému vstupnímu portu je připojen další (třetí) motor (A, B, C).

Direction Direction - hodnota logického datového typu, která vyjadřuje směr otáčení (True = vpřed, False = vzad).

Steering Steering - konektor pro řízení, který označuje, kterým z motorů bude řízen pohyb (pokud bude nastavené řízení < 0 - řízeno levým motorem, pokud > 0 - řízeno pravým motorem).

Power075 Power - označuje intenzitu otáčení motoru na stupnici od 0 do 100.

Goal Duration - hodnota označující délku trvání pohybu (udávána ve stupních, otáčkách motoru, sekundách nebo jako neomezené otáčení).

StopAfter Next Action - vyjadřuje, zda bude po ukončení akce motor pokračovat v činnosti či nikoliv.

 

Parametry bloku

Při sychronizaci pohybu více motorů využijeme MovePaletteDragged blok Move. Tento blok dokáže synchronizovat kombinaci až tří motorů.

move

Port: udává porty řídící jednotky (A, B, C), ke kterým jsou motory připojeny.

Direction: určuje směr otáčení motorů (vpřed, vzad či zastavení).

Steering: udává, kterým motorem je řízen pohyb. Pokud je tažítko uprostřed, zabírají oba motory současně. Mírným přetažením posuvníku do strany dosáhneme zakřiveného pohybu, protože otáčivá síla bude více přenesena na zvolený motor. Pokud přetáhneme posuvník na maximum, robot se bude otáčet na místě. Řízení lze využít pouze při připojení dvou motorů.

Power: intenzita (rychlost) otáčení motoru nastavitelná v procentech (100% je maximum).

Duration: možnost nastavení délky trvání pohybu. Skýtá čtyři možnosti nastavení:

  • míra natočení ve stupních (Degrees),
  • míra natočení vyjádřená pomocí otáček motoru (Rotations),
  • doba chodu motoru při daném výkonu v sekundách (Seconds),
  • neomezený běh motoru po dobu průběhu programu (Unlimited).

Next Action: udává, zda se má po ukončení akce motor zastavit (Brake) nebo pokračovat v chodu (Coast).

RobotC

PŘÍKAZY A METODY pro sychronizaci dvou motorů

Synchronizace dvou a více motorů v programovacím prostředí RobotC je realizována na podobných principech jako ovládání pohybu jednoho motoru, které jsme si popsali v kapitole Motor a jeho pohyb. Musíme dbát na to, abychom správně označovali v příkazech příslušné motory, aby naše zařízení pracovalo tak, jak potřebujeme.

Rozcestník


NASTAVENÍ A OVLÁDÁNÍ MOTORů

Veškeré ovládání motorů, ať už určení portu, vyjádření směru otáčení nebo určení intenzity otáčení, se provádí pomocí příkazu motor[].

Port: určení portů, ke kterým jsou motory připojeny je vyjádřeno výrazem v závorce (motorA, motorB, motorC).

 
motor[motorC] = 100; // Motor C je v pohybu smerem vpred s maximalnim vykonem.
motor[motorB] = 100; // Motor B je v pohybu smerem vpred s maximalnim vykonem.
 

Směr otáčení: vyjádření, kterým směrem se jednotlivé motory otáčí, je udáno znaménkem před číslem udávajícím intenzitu otáčení motoru.

 
motor[motorC] = 100; // Motor C je v pohybu smerem vpred s maximalnim vykonem.
motor[motorB] = -100; // Motor B je v pohybu smerem vzad s maximalnim vykonem.
 

Při použití dvou motorů k pohybu autíček, vozítek a pohyblivých strojů se nejčastěji využívá otáčení motorů stejným směrem. Pokud by se motory využili každý s opačným směrem otáčení jako v předchozím případě, otáčelo by se vozítko dokola. Rozdílný směr otáčení je využitelný v případech, že každý motor pohání jinou část stroje.

 

Intenzita otáčení motorů: číslo udávající výkon motoru na stupnici od 0 do 100 (%).

 
motor[motorC] = 100; // Motor C je v pohybu smerem vpred s maximalnim vykonem.
motor[motorB] = -75; // Motor B je v pohybu smerem vzad s vykonem 75%.
 

OVLIVNĚNÍ DOBY OTÁČENÍ MOTORU

Doba trvání otáčení je ovlivňována píkazem wait1Msec(), u kterého se délka trvání udává v milisekundách nebo příkazem wait10Msec(), u nějž je udávána v desítkách milisekund.

 
motor[motorC] = 100; // Motor C je v pohybu smerem vpred s maximalnim vykonem.
motor[motorB] = 100; // Motor B je v pohybu smerem vpred s maximalnim vykonem.
wait1Msec(4000); // Otaceni motoru je provadeno 4 sekundy, po kterych je pohyb ukoncen a program pokracuje dale.
 

MOŽNOSTI NATOČENÍ MOTORU

V programovacím prostředí RobotC máme možnost natáčet motory o 180 stupňů nebo o libovolný úhel. Pro tyto potřeby využijeme příkazy bMotorReflected[]nMotorEncoderTarget[].

Natočení motoru o 180 stupňů: provádí se příkazem bMotorReflected[], který nabývá hodnot true a false.

 
bMotorReflected[motorA] = true; // Motor A se pootoci o 180 stupnu.
bMotorReflected[motorB] = false; // Motor B se nepootoci o 180 stupnu.
 

 

Natočení motoru o libovolný úhel: je možné jej ovlivnit pomocí příkazu nMotorEncoderTarget[]. V následujícím příkladu je proveden pohyb robota vpřed o úsek, který se rovná 180 stupňům natočení čítače otáček motoru.

 
task main()
{
 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] = 30; // Nastaveni rychlosti otaceni motoru B na 30%.
 motor[motorC] = 30; // Nastaveni rychlosti otaceni motoru C na 30%.
 
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.
}
 

EV3

BLOK PRO Řízení dvou MOTORů

Rozcestník

Blok pro řízení pásového vozidla

Rozcestník


UMÍSTĚNÍ BLOKU pro řízení dvou motorů

 Programový blok Move Steering je umístěn v paletě Action Action.

UMISTENI STEERING


Výběr výstupního portu

Před započetím práce s motory je nejprve nutné zvolit kombinaci výstupních portů (A, B, C, D) řídící jednotky, ke kterým jsou motory připojeny (červeně zvýrazněno).

STEERING PORT


Změna režimu

Programový blok Move Steering můžeme využívat v pěti režimech. Přepínání mezi nimi se provádí pomocí tlačítka v levé spodní části (červeně zvýrazněno).

STEERING REZIMY


Přidání vstupního portu

Po kliknutí do pole pro výběr výstupních portů pro řízení motorů je možné vybrat první možnost Wired, po které se do programového bloku přidá vstupní port Identification 515 Port Port (červeně zvýrazněno).

STEERING WIRED


Režimy programového bloku

Off (Vypnuto)

Vypnutí chodu obou motorů. V tomto řežimu  je aktivní pouze jediný vstupní port.

STEERING OFF

Identification 508 BrakeAtEnd BrakeBreak at End - způsob zastavení motoru. Okamžité zastavení (Break) reprezentuje logická hodnota True a pozvolné dojetí (Coast) hodnota False

 

 

On (Zapnuto)

Neomezený běh motorů zadanou rychlostí a směrech po dobu průběhu programu. V tomto řežimu jsou aktivní dva vstupní porty.

STEERING ON

Identification 220 Steering Straight ForwardSteering - řížení směru natáčení robota.

Identification 203 Speed Plus75 Power - rychlost otáčení motorů udávaná v procentech na stupnici od 100 (vpřed) do -100 (vzad).

 

 

On for Seconds (otáčení po zvolený časový úsek)

Ovlivnění chodu motorů pomocí času. V tomto režimu máme k dispozici čtyři vstupní porty.

STEERING SECONDS

 Identification 220 Steering Straight ForwardSteering - řížení směru natáčení robota.

Identification 203 Speed Plus75 Power - rychlost otáčení motorů udávaná v procentech na stupnici od 100 (vpřed) do -100 (vzad).

Identification 240 Time Seconds - doba otáčení motorů udávaná ve vteřinách.

Identification 508 BrakeAtEnd BrakeBreak at End - způsob zastavení motorů. Okamžité zastavení (Break) reprezentuje logická hodnota True a pozvolné dojetí (Coast) hodnota False

 

 

On for Degrees (otočení o zadaný úhel)

Ovlivnění chodu motorů pomocí úhlových stupňů. V tomto režimu máme k dispozici čtyři vstupní porty.

STEERING DEGREES

 Identification 220 Steering Straight ForwardSteering - řížení směru natáčení robota.

Identification 203 Speed Plus75 Power - rychlost otáčení motorů udávaná v procentech na stupnici od 100 (vpřed) do -100 (vzad).

Identification 288 DegreesAngle Plus360 Degrees - míra natočení motorů zadávaná v úhlových stupních od 0 do 360°.

Identification 508 BrakeAtEnd BrakeBreak at End - způsob zastavení motorů. Okamžité zastavení (Break) reprezentuje logická hodnota True a pozvolné dojetí (Coast) hodnota False

 

 

On for Rotations (otočení o určitý počet otáček)

Ovlivnění chodu motorů pomocí počtu nastavených otáček. V tomto režimu máme k dispozici čtyři vstupní porty.

 STEERING ROTATIONS

 Identification 220 Steering Straight ForwardSteering - řížení směru natáčení robota.

Identification 203 Speed Plus75 Power - rychlost otáčení motorů udávaná v procentech na stupnici od 100 (vpřed) do -100 (vzad).

Identification 503 NumberRotations Rotations - počet prováděných otáček motorů.

Identification 508 BrakeAtEnd BrakeBreak at End - způsob zastavení motorů. Okamžité zastavení (Break) reprezentuje logická hodnota True a pozvolné dojetí (Coast) hodnota False

 

 



Umístění bloku pro řízení pásového vozidla

 Programový blok Move Tank je umístěn v paletě Action Action.

UMISTENI TANK


Výběr výstupního portu

Před započetím práce s motory je nejprve nutné zvolit kombinaci výstupních portů (A, B, C, D) řídící jednotky, ke kterým jsou motory připojeny (červeně zvýrazněno). Řízení pomocí pásů je specifické tím, že každý motor (pás) ovládáme individuálně a nastavujeme tak každému vlastní rychlost otáčení v závislosti na požadovaném směru pohybu.

TANK PORT


Změna režimu

Programový blok Move Tank můžeme využívat v pěti režimech. Přepínání mezi nimi se provádí pomocí tlačítka v levé spodní části (červeně zvýrazněno).

TANK REZIMY


Přidání vstupního portu

Po kliknutí do pole pro výběr výstupních portů pro řízení motorů je možné vybrat první možnost Wired, po které se do programového bloku přidá vstupní port Identification 515 Port Port (červeně zvýrazněno).

TANK WIRED


Režimy programového bloku

Off (Vypnuto)

Vypnutí chodu obou motorů. V tomto řežimu  je aktivní pouze jediný vstupní port.

TANK OFF

Identification 508 BrakeAtEnd BrakeBreak at End - způsob zastavení motorů. Okamžité zastavení (Break) reprezentuje logická hodnota True a pozvolné dojetí (Coast) hodnota False.

 

 

On (Zapnuto)

Neomezený běh obou motorů po dobu průběhu programu. V tomto řežimu  jsou aktivní dva vstupní porty.

 TANK ON

 2x Identification 203 Speed Plus75 Power - rychlost otáčení motorů udávaná v procentech na stupnici od 100 (vpřed) do -100 (vzad). Při zadání stejných hodnot se pásové vozidlo pohybuje v před, snížením nebo zvýšením některé z hodnot docílíme natáčení.


 

 

On for Seconds (otáčení po zvolený časový úsek)

Ovlivnění chodu motorů pohánějících pásy pomocí času. V tomto režimu máme k dispozici čtyři vstupní porty.

TANK SECONDS

2x Identification 203 Speed Plus75 Power - rychlost otáčení motorů udávaná v procentech na stupnici od 100 (vpřed) do -100 (vzad).

Identification 240 Time Seconds - doba otáčení motorů udávaná ve vteřinách.

Identification 508 BrakeAtEnd BrakeBreak at End - způsob zastavení motorů. Okamžité zastavení (Break) reprezentuje logická hodnota True a pozvolné dojetí (Coast) hodnota False.

 

 

On for Degrees (otočení o zadaný úhel)

Ovlivnění chodu motorů pohánějících pásy pomocí úhlových stupňů. V tomto režimu máme k dispozici čtyři vstupní porty.

 TANK DEGREES

2x Identification 203 Speed Plus75 Power - rychlost otáčení motorů udávaná v procentech na stupnici od 100 (vpřed) do -100 (vzad).

Identification 288 DegreesAngle Plus360 Degrees - míra natočení motorů zadávaná v úhlových stupních od 0 do 360°.

Identification 508 BrakeAtEnd BrakeBreak at End - způsob zastavení motorů. Okamžité zastavení (Break) reprezentuje logická hodnota True a pozvolné dojetí (Coast) hodnota False

 

 

On for Rotations (otočení o počet otáček)

Ovlivnění chodu motorů pohánějících pásy pomocí počtu nastavených otáček. V tomto režimu máme k dispozici čtyři vstupní porty.

TANK ROTATIONS

 2x Identification 203 Speed Plus75 Power - rychlost otáčení motorů udávaná v procentech na stupnici od 100 (vpřed) do -100 (vzad).

Identification 503 NumberRotations Rotations - počet prováděných otáček motorů.

Identification 508 BrakeAtEnd BrakeBreak at End - způsob zastavení motorů. Okamžité zastavení (Break) reprezentuje logická hodnota True a pozvolné dojetí (Coast) hodnota False

 

 


Možnosti praktického využití

Kombinace dvou a více motorů se v praxi využívá hlavně pro pohon pohyblivých zařízení. Mohou to být různá autíčka, vozítka, roboti a pohyblivé stroje.

Využití více motorů pro pohon zařízení

Na praktickém příkladu vysvětlíme, jak vytvořit program, který bude ovládat autíčko poháněné dvěma servomotory jehož úkolem bude projet vytyčenou dráhou, kterou můžete vidět na obrázku.

draha

NXT-G

OVLÁDÁNÍ ROBOTA PŘI PROJETÍ VYTYČENOU DRÁHOU

Prohlédneme-li si dráhu, kterou musí robot pro projetí bludištěm urazit, tak zjistíme, že budeme využívat tři druhy pohybu. Jako první pohyb vpřed, následně zatočení vpravo a nakonec zatočení vlevo. V následujícím příkladě si tedy ukážeme, jak tyto činnosti robota sjednotit k úspěšnému projetí výše znázorněné dráhy v programovacím prostředí NXT-G.

Krok 1 - Pohyb vpřed

Jako první se musí robot při projetí dráhy urazit rovný úsek. V teoretické části jsme si vysvětlili, že pohyb dvou motorů vpřed je realizován pomocí bloku MovePaletteDragged Move. V nastavení bloku si zvolíme motory, které mají pohyb vpřed vykonávat (v našem příkladu máme k řídící kostce připojeny motory B a C). Vybereme směr otáčení vpřed. V poli Steering nic měnit nebudeme, protože nechceme, aby se naše motory odkláněly od přímého směru. Pro lepší přesnost průjezdu bludištěm jsme zvolili kratší rovné úseky, které robot úrazí. Je tedy zvolena rychlost 25% po dobu tří sekundy. V poli Next Action ponecháme také defaultně zvolené Brake, protože chceme, aby se motor po ujetí úseku zastavil. Jak dlouho má pohyb robota trvat, musíme buďto změřit, nebo k výsledku dojít postupným zkoušením. Otáčení po dobu 3 sekund je pouze optimální hodnota pro projetí pomyslného bludiště v našem příkladě.

priklad pohyb vpred

 
Krok 2 - Natočení vpravo

Po projetí prvního rovného úseku se robot musí natočit doprava. Natočení je možné realizovat více způsoby. My jsme zvolili pro otočení o 90° takové řešení, kdy se nejprve motor C otočí 1,54 sekundy vpřed. Aby bylo dosaženo přesného otočení o požadovaný úhel, musí se motor B otočit o poloviční úsek směrem vzad. Stěžejní nastavení obou bloků pro ovládání motorů vidíte na obrázcích. Nižší hodnoty byly voleny pro získání co největší přesnosti při průjezdu a co nejpřesnější natočení o 90°.

motorC

motorB

 
Krok 3 - Průjezd první polovinou dráhy

Pokud se podíváme na dráhu, kterou má robot urazit uvidíme, že v první polovině se mají 2x zopakovat dvě totožné sekvence pohybů. Robot urazí rovný úsek a natočí se doprava. Následně ujede totožný rovný úsek a opět se natočí doprava. Jak oba kroky realizovat jsme si již řekli, a tak zbývá pouze dát je oba dohromady. Jelikož se pohyb vpřed a natočení opakují 2x, vložili jsme oba kroky do cyklu s pevným počtem průchodů LoopBig Loop, u kterého jsme nastavili dvojí opakování celé akce (realizace cyklu viz. obrázek).

prujezd prvni cast

 
Krok 4 - Průjezd druhou polovinou dráhy

Jestliže se v první části dráhy 2x opakovala sekvence dvou stejných kroků, je tomu v druhé části stejně tak, pouze v opačném směru natáčení. Robot musí nyní 2x projet rovný úsek a na konci každého tohoto úseku se natočit vlevo. Pohyb vpřed bude realizován stejně jako o krok dříve. Pouze v natočení budou hrát motory opačnou roli. Motor C nyní bude konat pohyb vzad a motor B vzad tak, jak je tomu na ilustračních obrázcích níže. Stejně jako v kroku 3 umístíme blok zajišťující pohyb vpřed a oba bloky pro natočení robota do cyklu s pevným počtem průchodů LoopBig Loop, který se bude vykonávat 2x.

motorC cast2

motorB cast2

 
Krok 5 - Dojezd do cíle

Ukázali jsme si tedy, jak úspěšně projet bludiště. Zbývá nám vykonat poslední krok a tím je dojezd do cíle. Jedná se o pohyb vpřed a tak pouze nastavíme pro oba motory přímý směr otáčení stejnou rychlostí jako doposud. Dojezdová dráha je o něco delší než rovné úseky v předchozích částech dráhy, můžeme proto nastavit dobu otáčení o vteřinu delší, aby robot zdárně dorazil až do cíle.

 
Program ke stažení

Stáhnout ve formátu .rbt

 

ROZŠIŘUJÍCÍ ÚKOL

Vytvořte program, jehož pomocí robot projede následující dráhou.

draha uhel

RobotC

Ovládání robota při projetí vytyčenou dráhou

Při pohledu na dráhu, kterou by měl za pomoci námi vytvořeného programu robot projet, zjistíme, že si zde vystačíme se třemi typy pohybu. Bude to jízda rovně, zatočení vpravo a zatočení vlevo. Naším úkolem tedy bude správně sesynchronizovat tyto činnosti k úspěšnému výsledku.

Krok 1 - Deklarace konstant

V příkladu pro projetí bludiště budeme opakovaně pracovat se stejnými hodnotami. Bude to rychlost otáčení motorů, doba jejich otáčení a podobně. Pokud se hodnoty nemění, je dobré si je v úvodu programu nadeklarovat jako konstanty. Stejné hodnoty budeme používat v několika případech, a tak budeme jako parametr zadávat pouze název přislušné konstanty. Navíc pokud bychom potřebovali některou z hodnot změnit, učiníme tak pouze v její deklaraci a nemusíme ji měnit ve zdrojovém kódu několikrát (více o proměnných a práci s nimi v kapitole Práce s proměnnými).

 
const int zpozdeni_otoceni = 770; // Cas potrebny pro otoceni o 90 stupnu.
const int zpozdeni_vpred = 3000; // Cas potrebny pro ujeti vzdalenosti na rovnych usecich.
const int vykon_otoceni = 25; // Vykon pro otaceni.
const int vykon = 25; // Vykon pro pohyb vpred.
 
 
Krok 2 - Nulování čítače otáček

Oba motory používají k počítání otáček motoru takzvaný čítač otáček. Ten detekuje počet otáček motoru. Ještě předtím, než začneme robotovi zadávat příkazy k průjezdu bludištěm, je dobré vynulovat čítač otáček jednotlivých motorů. Docílíme tak toho, že otáčky motoru budou čítány od nuly.

 
nMotorEncoder[motorB] = 0; // Nulovani encoderu motoru B.
nMotorEncoder[motorC] = 0; // Nulovani encoderu motoru C.
 
 
Krok 3 - Pohyb vpřed

Na několika úsecích vytyčené dráhy budeme potřebovat, aby se robot pohyboval vpřed a to pouze po určenou dobu z důvodu, aby ujel pouze dráhu, kterou potřebujeme. Příkaz pro pohyb vpřed se nazývá motor[ ]. V závorce je uvedeno, který z motorů tímto příkazem ovládáme. Dobu, po kterou je pohyb vpřed prováděn ovlivníme příkazem wait1Msec( ). Tento příkaz vyjadřuje dobu, po kterou se čeká na provádění dalšího příkazu, kterým je v našem případě opětovné zastavení motorů. Jak již název příkazu napovídá, doba se udává v milisekundách.

Doporučení: Po provedení každého typu pohybu robota uveďte opět motory do klidu příkazem motor[ ], kterému přiřaďte hodnotu 0.

 
motor[motorB] = vykon; // Pohyb vpred
motor[motorC] = vykon; // Pohyb vpred
wait1Msec(zpozdeni_vpred); // Doba trvani pohybu vpred
motor[motorB] = 0; // Motor B je uveden do klidu.
motor[motorC] = 0; // Motor C je uveden do klidu.
 
 
Krok 4 - Zatočení vpravo

Zatočení vpravo provedeme tak, že jeden motor se bude pohybovat vpřed (v našem případě motor C) a druhý současně vzad (motor B). Opět musíme pro tento pohyb volit vhodnou dobu, aby se robot otočil přesně o 90 stupňů.

 
motor[motorC] = vykon_otoceni; // Motor C je v pohybu smerem vpred.
motor[motorB] = -vykon_otoceni; // Motor B je v pohybu smerem vzad.
wait1Msec(zpozdeni_otoceni); // Doba trvani zatoceni vpravo.
motor[motorB] = 0; // Motor B je uveden do klidu.
motor[motorC] = 0; // Motor C je uveden do klidu.
 
 
Krok 5 - Zatočení vlevo

Otočení vlevo o 90 stupňů se provádí stejným způsobem, ovšem s opačným směrem otáčení motorů.

 
motor[motorC] = -vykon_otoceni; // Motor C je v pohybu smerem vzad.
motor[motorB] = vykon_otoceni; // Motor B je v pohybu smerem vpred.
wait1Msec(zpozdeni_otoceni); // Doba trvani zatoceni vlevo.
motor[motorB] = 0; // Motor B je uveden do klidu.
motor[motorC] = 0; // Motor C je uveden do klidu.
 
 
Výsledný program pro průjezd bludištěm

Pokud správně použijeme všechny součásti popsané v předchozích krocích, měli bychom docílit úspěšného projetí robota bludištěm za pomoci tohoto programu.

 
task main()
{
 // deklarace konstant
 const int zpozdeni_otoceni = 770;
 const int zpozdeni_vpred = 3000;
 const int vykon_otoceni = 25;
 const int vykon = 25;
 
 // nulovani obou encoderu
 nMotorEncoder[motorB] = 0;
 nMotorEncoder[motorC] = 0;
 
 // pohyb vpred
 motor[motorB] = vykon;
 motor[motorC] = vykon;
 wait1Msec(zpozdeni_vpred);
 motor[motorB] = 0;
 motor[motorC] = 0;
 
 // natoceni vpravo
 motor[motorC] = vykon_otoceni;
 motor[motorB] = -vykon_otoceni;
 wait1Msec(zpozdeni_otoceni);
 motor[motorB] = 0;
 motor[motorC] = 0;
 
 // pohyb vpred
 motor[motorB] = vykon;
 motor[motorC] = vykon;
 wait1Msec(zpozdeni_vpred);
 motor[motorB] = 0;
 motor[motorC] = 0;
 
 // natoceni vpravo
 motor[motorC] = vykon_otoceni;
 motor[motorB] = -vykon_otoceni;
 wait1Msec(zpozdeni_otoceni);
 motor[motorB] = 0;
 motor[motorC] = 0;
 
 // pohyb vpred
 motor[motorB] = vykon;
 motor[motorC] = vykon;
 wait1Msec(zpozdeni_vpred);
 motor[motorB] = 0;
 motor[motorC] = 0;
 
 // natoceni vlevo
 motor[motorC] = -vykon_otoceni;
 motor[motorB] = vykon_otoceni;
 wait1Msec(zpozdeni_otoceni);
 motor[motorB] = 0;
 motor[motorC] = 0;
 
 // pohyb vpred
 motor[motorB] = vykon;
 motor[motorC] = vykon;
 wait1Msec(zpozdeni_vpred);
 motor[motorB] = 0;
 motor[motorC] = 0;
 
 // natoceni vlevo
 motor[motorC] = -vykon_otoceni;
 motor[motorB] = vykon_otoceni;
 wait1Msec(zpozdeni_otoceni);
 motor[motorB] = 0;
 motor[motorC] = 0;
 
 // pohyb vpred
 motor[motorB] = vykon;
 motor[motorC] = vykon;
 wait1Msec(zpozdeni_vpred);
 motor[motorB] = 0;
 motor[motorC] = 0;
}
 

Poznámka: Použitím programu můžeme získat různé výsledky. Pohyb robota je ovlivněn typem povrchu, po kterém se pohybuje. V případě, že pro pohyb použijeme delší časové intervaly a robot tak bude překonávat při průjezdu bludištěm delší vzdálenosti, je možné, že se objeví menší nepřesnosti při natáčení.

 

Program ke stažení

Stáhnout ve formátu .c

 

Rozšiřující úkol

Vytvořte program, jehož pomocí robot projede následující dráhou.

 draha uhel

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

Další články...

  1. KURZ: Práce s displejem