Presnejší pohyb a dotykový senzor
V minulej lekcii sme sa naučili ako spustiť motor: motor.run( speed ).
To ale nemusí byť vždy najlepší spôsob ako posunúť robota. Skúsme si na robotovi
spustiť nasledujúci jednoduchý program:
Keď zastavíme alebo len spomalíme točiace sa koleso, jednoducho sa otočí o toľko menej. Podobne, ak bude na zemi nejaká prekážka, či len iný povrch, môže sa robot správať inak a posunúť sa o menej či viac než keď sme naposledy náš program skúšali. Čo sa s tým dá robiť?
Presnejší pohyb
Ukážeme si novú dôležitú metódu motor.run_angle:
"angle" znamená po anglicky "uhol", takto vieme pootočiť motor presne o určený uhol. Prvý parameter je rýchlosť, znovu v stupňoch za sekundu. Druhý parameter je uhol v stupňoch, o ktorý sa motor pootočí. Keďže kruh má 360 stupňov, motor sa otočí o dve celé rotácie. Aj ak skúsime koleso na robotovi zachytiť, po jeho pustení sa dotočí tak, aby nakoniec tie dve rotácie vykonalo.
Poznámka
Všimnime si, že už nemusíme volať motor.stop(). Motor po dosiahnutí
svojho cieľa zastaví.
To je pre nás dobrá správa, že takéto metóda triedy Motor existuje. Poďme
ju využiť a posunúť sa s celým robotom vpred, nie len jednou stranou.
A nastal problém. Takto sa robot neposunie vpred rovno, ale najprv jedným
kolesom, potom druhým. Je to preto, že run_angle má ešte ďalší, prednastavený
(default) parameter: wait. Ak ho neuvedieme medzi argumentami pri volaní
metódy, je nastavený na True, čo znamená, že robot čaká, pokým sa tento
príkaz pootočenia motora nevykoná do konca. Keď ho nastavíme na False,
čakať nebude, ale hneď bude pokračovať nasledujúcim riadkom, teda spustí oba
motory (skoro, no je to zanedbateľný rozdiel v čase) naraz. Koniec nášho
programu teraz vyzerá:
Program už funguje ako má, hurá! Pri right_motor sme už nenastavili wait
na False, lebo naopak chceme počkať, pokým sa tento motor dotočí.
Predpokladáme, že vtedy už aj left_motor je na správnej pozícii, keď sa majú
otočiť oba tou istou rýchlosťou o ten istý úsek.
Naozaj presný pohyb
Toto je už trochu pokročilejšie. No môže sa stať, že left_motor ešte
nebude dotočený (napr. ho blokuje nejaká prekážka). Preto je lepšie počkať,
pokým kontrolér riadiaci tento motor nebude hlásiť, že je už všetko
v poriadku. To vieme zistiť cez motor.control.done(). Dobré je si
pripraviť takúto pomocnú funkciu na začiatku programu, ktorú je možné ďalej
využívať a nepísať zakaždým v programe celý kód znovu:
Ďalší prednastavený parameter
V skutočnosti má run_angle ešte jeden default parameter: then.
Určuje, akým spôsobom motor na konci zastaví. Sú tri možnosti:
Stop.COASTplynule nechá motor dôjsť zotrvačnosťou.Stop.BRAKEzastaví motor hneď.Stop.HOLDudržuje motor v konečnej pozícii. To znamená, že ak by niečo pootočilo koleso, robot sa bude snažiť vrátiť ho do pôvodnej pozície.
Prednastavená hodnota je then=Stop.HOLD.
Jednoduchá úloha
Skúste upraviť program tak, aby sa robot raz otočil na mieste a skončil (čo najviac) presne tak ako na začiatku.
Ťažšia úloha
Napíšte program, ktorým robot pôjde do tvaru štvorca. Využite informáciu
z predchádzajúcej úlohy, kde ste už zistili ako sa otočiť o celú rotáciu,
teraz potrebujete len o štvrť rotácie. Používajte vždy metódy
run_angle.
Úloha na zamyslenie
Možno ste na minulú úlohu použili veľa zavolaní run_angle. Ak áno, skúste
svoj program skrátiť použitím for ... in ... cyklu a/alebo
zadefinovaním si svojej pomocnej funkcie.
Riešenie
Ukážeme si ako napríklad by sa dala úloha vyriešiť:
Štvorec sme rozdelili na štyri rovnaké úseky: najprv sa robot pohne dopredu a potom sa otočí o 90°. V kóde vidíme dve nové veci:
- Definícia vlastnej funkcie s default parametrami. Píšeme ich vždy na koniec a pomocou znaku = prednastavíme hodnotu.
for _ in range( 4 ):Namiesto_by sme rovnako mohli napísať napr.i, ako sme zvyknutí, ale ak túto premennú vnútri cyklu nevyužijeme (čo je tento prípad), tak je zvykom nazvať ju jednoducho_.
Dotykový senzor
Na robota teraz pridáme dotykový senzor. Tak bude dostávať aj spätnú väzbu z okolia, čo je pre robotov veľmi dôležité. Podľa toho môže zmeniť správanie. Napr. pri narazení do steny dotykovým senzorom, robot náraz detekuje, otočí sa a bude hľadať cestu iným smerom. Návod je tu.

V návode ste si určite všimli, že kábel od dotykového senzoru je zapojený na druhej strane ako káble od motorov. Zariadenia, ktoré pripájame k EV3-kocke, môžeme rozdeliť na dva typy:
- vstupné -- To sú senzory. Ich porty sú označené číslami 1 - 4. Senzory snímajú rôzne hodnoty z okolia (napr. teplotu, vzdialenosť od objektu vpredu, intenzitu svetla, dotyk, ...) a posielajú ich do EV3-kocky, ktorá následne hodnoty spracuje a robot zmení podľa toho správanie. Je to našou úlohou, programátorov, zvoliť tie správne reakcie na hodnoty z okolia.
- výstupné -- Cez ne robot mení správanie. Napr. pohybom pomocou motorov. Alebo začne blikať svetelnými diódami, vykreslí niečo na displeji, či vydá zvuky, môže dokonca napodobniť ľudskú reč.
Ako pracovať s dotykovým senzorom v Pythone
Balíček pybricks ponúka modul ev3devices, kde sa okrem triedy Motor
nachádza aj trieda TouchSensor. Na jeho objektoch zavoláme metódu pressed,
ktorá vráti hodnotu True alebo False podľa toho, či je spínač
stlačený.
Príklad
Poďme si to vyskúšať na jednoduchom príklade. Stlačením senzoru budeme posúvať robota vpred, keď senzor stlačený nebude, robot zostane stáť.
while True: vytvorí nekonečný cyklus, v ktorom sa zakaždým spýtame
dotykového senzoru, či je stlačený, a podľa toho určíme motorom rýchlosť.
Tu je ďalší spôsob ako zastaviť motory -- nastaviť im rýchlosť na nulu.
Úloha 1
Upravte program pohybu robota do štvorca tak, aby na začiatku robot stál na mieste a čakal na stlačenie tlačidla. Potom prejde štvorec, znovu čaká na mieste na stlačenie tlačidla, a tak stále dokola.
Úloha 2
Napíšte program, kde robot pôjde pomaly rovno dopredu, pokým nenarazí do prekážky dotykovým senzorom. Vtedy zastane, trochu cúvne, otočí sa (približne) o 90° a pôjde znovu pred až pokým nenarazí opäť. Toto správanie sa bude opakovať donekonečna.
Úloha 3
Teraz využijete program z predchádzajúcej úlohy, len sa zmení prostredie. Postavte robota na stôl a upravte ho tak, aby bol dotykový senzor otočený smerom k zemi a dotýkal sa jej tak, že je stlačený. Ak robot príde na okraj stola, namiesto narazenia do prekážky ako v minulej úlohe, dotykový senzor sa už nebude opierať o stôl a tlačidlo sa uvoľní. Vtedy robot vykoná rovnaký manéver ako v minulej úlohe. Budete teda potrebovať aj program mierne upraviť. Pri testovaní pozor! Nech robot nespadne zo stola, aj pri dobre napísanom programe sa to môže stať. trochu upraviť program.