KURZ: Synchronizace pohybu dvou motorů

KAPITOLY

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

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