KURZ: Synchronizace pohybu dvou motorů - Možnosti praktického využití
- Podrobnosti
- Mgr. Jan Baťko
- Aktualizováno: 06.09.2017
- Zobrazení: 14889
KAPITOLY
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.
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 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ě.
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°.
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ů Loop, u kterého jsme nastavili dvojí opakování celé akce (realizace cyklu viz. obrázek).
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ů Loop, který se bude vykonávat 2x.
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í
ROZŠIŘUJÍCÍ ÚKOL
Vytvořte program, jehož pomocí robot projede následující dráhou.
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í
Rozšiřující úkol
Vytvořte program, jehož pomocí robot projede následující dráhou.