KURZ: Dotykový senzor
- Podrobnosti
- Mgr. Jan Baťko
- Aktualizováno: 07.09.2017
- Zobrazení: 13264
- Vytisknout
Dotykový senzor je prostředek, který jak v robotické stavebnici LEGO MINDSTORMS NXT tak i v EV3 plní funkci tlačítka. Jeho hlavní funkcí je vracet pomocí stisku tlačítka logickou hodnotu True nebo False (Pravda nebo Nepravda). K řídící jednotce je senzor připojen kabelem do libovolného vstupního portu (1-4). Senzor je někdy také nazýván tlakový. Dokáže ovšem pouze zjišťovat, zda je tlačítko stisknuto či nikoliv. Úroveň stlačení rozeznat nedokáže.
Použití v programovacích prostředích
NXT-G
BLOK PRO práci s dotykovým senzorem
Rozcestník
Umístění bloku
Programový blok, který umožňuje nastavení a ovládání dotykového senzoru nalezneme pod názvem Touch Sensor v paletě
Complete > Sensor
Popis bloku
Při práci s programovým blokem dotykového senzoru máme k dispozici pět následujících konektorů:
Port - určuje, ke kterému ze čtyř vstupních portů je senzor připojen (1-4).
Action - volba značící, která ze tří možností akce dotykového senzoru je zvolena.
Yes/No - hodnota logického datového typu vyjadřující výsledek porovnání.
Raw Value - udává čistou, neškálovanou hodnotu snímanou senzorem na stupnici (0-1023).
Logical Number - výstupní hodnota logického datového typu.
Číslo v pravém horním rohu bloku značí, ke kterému vstupnímu portu je momentálně senzor připojen. Ikonka signalizuje jakou akci aktuálně dotykový senzor detekuje (v příkladu na obrázku - stisknutí a opětovné uvolnění tlačítka).
Parametry bloku
Jelikož možnosti dotykového senzoru jsou značně omezené, obsahuje jeho blok pouze dva parametry.
Port: udává, ke kterému vstupnímu portu je senzor připojen (1-4).
Action: umožňuje volit ze tří možných akcí, které mohou být s tlačítkem dotykového senzoru provedeny.
Jedná se o následující možnosti:
Pressed - stisknutí tlačítka senzoru,
Released - uvolnění stisknutého tlačítka senzoru,
Bumped - stiknutí a opětovné uvolnění tlačítka senzoru.
RobotC
Příkazy pro ovládání dotykového senzoru
Při ovládání dotykového senzoru budeme nejčastěji používat příkazy pro rozlišení stisku či uvolnění tlačítka senzoru. Před každým použitím budeme muset senzor nakonfigurovat. V programovacím prostředí RobotC je také možné pracovat s hodnotou senzoru nazývanou RAW.
Rozcestník
Nastavení senzoru
Ještě než začneme v programovacím prostředí RobotC pracovat s dotykovým senzorem, je nutné ho nakonfigurovat. Zápis konfigurace je uveden níže. Skládá se z klíčového slova #pragma a příkazu config(), který obsahuje čtyři parametry. První parametr značí, o jaký druh zařízení se jedná. V našem případě je to senzor (Sensor). Další parametr označuje, do jakého portu řídící jednotky je senzor připojen (S1 = port 1). Následuje volitelný název senzoru (dotykovy). Posledním parametrem je druh senzoru (sensorTouch = dotykový senzor). Tato deklarace je v úvodu každého programu, kde budeme pracovat se senzory nezbytná.
#pragma config(Sensor, S1, dotykovy, sensorTouch) // Kod je automaticky generovan pruvodcem konfiguraci RobotC
Poznámka: Konfiguraci lze provést ručním zapsáním deklarace v příkladu nebo v menu programovacího prostředí RobotC. Postup konfigurace je uveden v kapitole Konfigurace motorů a senzorů.
Detekce stisku tlacitka
Při práci s dotykovým senzorem budeme nejčastěji používat příkaz, který vyjadřuje, zda je tlačítko senzoru stisknuté či není. S touto logickou hodnotou pracuje příkaz SensorValue(). Používá se v situacích, kdy v závislosti na stisku tlačítka následuje nějaká akce. Jestliže je hodnota vyjadřovaná příkazem rovna 0, jedná se o nestisknuté tlačítko. Pokud je rovna 1, jedná se o situaci, kdy je tlačítko stisknuté.
SensorValue(dotykovy) == 0; // Vyjadruje nestisknute tlaciko dotykoveho senzoru. SensorValue(dotykovy) == 1; // Vyjadruje stisknuti tlacitka dotykoveho senzoru.
Možnosti využití hodnoty RAW
K vyjádření stavu tlačítka dotykového senzoru lze použít také hodnotu vyjádřenou jako RAW, což je neškálovaná hodnota přečtená senzorem. Jelikož ale dotykový senzor rozlišuje pouze dva stavy, musí být rozsah hodnoty v RAW rozdělen na polovinu. Můžeme tedy proces stisku tlačítka vyjádřit jako hodnotu větší než 512 a uvolnění tlačítka jako hodnotu menší než 512 pomocí příkazu SensorRaw[], jehož parametrem je typ název senzoru.
SensorRaw[dotykovy] < 512; // Hodnota ve formatu RAW mensi nez 512 vyjadruje uvolneni tlacitka. SensorRaw[dotykovy] > 512; // Hodnota ve formatu RAW vetsi nez 512 vyjadruje stisknuti tlacitka.
EV3
Blok pro práci s dotykovým senzorem
Rozcestník
Umístění bloku pro práci s dotykovým senzorem
Programový blok Touch Sensor je umístěn v paletě Sensor.
Změna režimu
Programový blok Touch Sensor můžeme využívat ve dvou základních režimech. Přepínání mezi nimi se provádí pomocí tlačítka v levé spodní části bloku (červeně zvýrazněno).
Přidání vstupního portu
Kliknutím do pole pro výběr vstupního portu 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 Port (červeně zvýrazněno).
Režimy programového bloku
Measure State (zjištění stavu)
Režim, který slouží k zjištění toho, zda je tlačítko dotykového senzoru stisknuté či nikoliv. Programový blok v tomto režimu obsahuje jeden výstupní port.
State - výstupní hodnotou tohoto portu je True v případě, že je tlačítko stisknuto, v opačném případě je návratová hodnota rovna False.
Compare State (testování stavu senzoru)
Režim sloužící ke zjištění, jaký úkon byl s tlačítkem senzoru proveden. Programový blok obsahuje v tomto režimu jeden vstupní a dva výstupní porty.
State - vstupní port sloužící je zjištění, zda bylo tlačítko dotykového senzoru uvolněno (návratová hodnota 0), stisknuto (návratová hodnota 1) nebo stisknuto a uvolněno (návratová hodnota 2).
Compare Result - výstupní port vracející logickou návratovou hodnotu podle toho, zda byl testovaný stav detekován (True) nebo nikoliv (False).
Measured Value - výstupní port vracející návratovou hodnotu v závislosti na tom, jakého stavu senzoru bylo dosaženo (0 uvolněno, 1 stisknuto, 2 stisknuto a uvolněno).
MOŽNOSTI PRAKTICKÉHO VYUŽITÍ
Využití dotykového senzoru při programování robotické stavebnice může být různorodé. Pomocí jeho stisknutí můžeme odstartovat určitou činnost programu nebo chod programu ovlivňovat. Zajímavé využití může mít také využití úrovní stisknutí. Uživatel může naplánovat určitou akci na stisk tlačítka, jinou na uvolnění a nebo na stisknutí a uvolnění. Vše závisí pouze na vhodnosti použití v konkrétním programu.
Využití dotykového senzoru
Konkrétní použití dotykového senzoru si představíme na ovládání pohybu robota pomocí stisku tlačítek dvou dotykových senzorů připojených pomocí dlouhých kabelů k řídící kostce.
Princip ovládání bude následující:
- obě tlačítka stisknuta - robot se pohybuje vpřed,
- obě tlačítka nestisknuta - robot se nepohybuje,
- pouze levé tlačítko stisknuto - robot se natáčí vlevo,
- pouze pravé tlačítko stisknuto - robot se natáčí vpravo.
NXT-G
OVLÁDÁNÍ ROBOTA pomocí dotykových senzorů
Při řešení programu v programovacím prostředí NXT-G si musíme na úvod rozmyslet, které stavy tlačítek (stisknuto či nikoliv) budeme muset ověřovat. Na základě toho budeme robotovi přiřazovat příkazy, které budou ovlivňovat jeho pohyb.
Krok 1 - Ověření stisku levého tlačítka
V ověřování stisku tlačítek budeme postupovat krok po kroku. Nejprve zjistíme, zda bylo stisknuto levé tlačítko připojené k portu 1. Použijeme k tomu blok podmíněného vykonávání Switch. Blok bude řízen hodnotou z dotykového senzoru a bude zjišťovat, zda bylo stisknuto tlačítko (Pressed) dotykového senzoru. Detailní nastavení bloku vidíte na obrázku.
Krok 2 - Ověření stisku obou tlačítek
V dalším kroku se přesuneme do horní sekce bloku Switch. Zde je umístěn programový kód, který je vykonáván v případě, že je levé tlačítko stisknuto. Nyní ovšem musíme ještě zjistit, zda je současně s levým, stiknuto také pravé tlačítko. Jedná se o stejnou situaci jako v předešlém kroku, proto znovu použijeme blok
Switch. Jediné co se v nastavení změní, je to, že budeme ověřovat, zda bylo stisknuto tlačítko senzoru připojeného k portu 2.
Nyní již začneme určovat chování robota v těchto situacích. Pokud bude zjištěno, že je stisknuto levé tlačítko a zároveň také pravé, budeme požadovat, aby se robot pohyboval vpřed. Použijeme tedy blok Move pro pohon motorů, u kterého nastavíme příslušné porty, ke kterým jsou motory připojeny a směr pohybu vpřed. Pro pohyb vpřed jsme zvolili rychlost 50%, aby se robot dal dobře ovládat a nepohyboval se příliš rychle.
Pokud bude zjištěno, že bylo stisknuto levé tlačítko, ale pravé nikoliv, budeme chtít, aby se robot natáčel doleva, ale zároveň se pořád pohyboval kupředu. Použijeme tedy dva bloky Motor. Aby se robot natáčel vlevo, musí jet motor umístěný vpravo podstatně rychleji než levý. Levému motoru (motor B) jsme tedy nastavili výkon 30% a pravému (motor C) 50%.
Krok 3 - Ověření stisku pravého tlačítka
V přechozím kroku jsme vyřešili, co se bude dít v případě, že bude stisknuto levé tlačítko. Nyní ošetříme situace, které nastanou při nesplnění podmínky (levé tlačítko nebude stisknuto) z kroku 1. Musíme opět zjistit, zda náhodou nebylo stisknuto pravé tlačítko. Pokud ano, měl by se robot natáčet doprava. Jedná se o inverzní operaci popsanou v předchozím kroku. Pouze hodnoty výkonu motorů nastavíme opačně. Pravý motor (motor C) se bude otáček pomaleji (30%) a levý o něco rychleji (50%).
Zbývá poslední situace. Případ, kdy nebude stisknuto ani jedno tlačítko. V tomto případě chceme, aby robot stál. Umístíme proto do podmínky blok Move. V jeho nastavení pouze zvolíme v sekci Direction třetí možnost, která reprezentuje příkaz stůj.
Dokončení programu
Na obrázku můžete vidět kompletní strukturu podmínek, které ověřují jednotlivé situace popsané v předchozích krocích. Aby byl program funkční, musíme celý tento konstrukt umístit do cyklu s nekonečným počtem opakování Loop. Díky tomu se bude program provádět stále dokola a my tak budeme moci podle libosti pomocí tlačítek ovládat robota.
Program ke stažení
RobotC
OVLÁDÁNÍ ROBOTA POMOCÍ DOTYKOVÝCH SENZORŮ
Pro úspěšnou realizaci úlohy si musíme uvědomit, jaké pohyby potřebujeme, aby robot vykonával. Dopředu je dobré si rozvrhnout kombinace stisků tlačítek, které budeme potřebovat. Samotná realizace poté bude snazší. Důležité bude také nezaměnit označení jednotlivých tlačítek a motorů.
Krok 1 - Deklarace senzorů
Než začneme v kterémkoliv programu používat některý ze senzorů, je nutné jej nadeklarovat. Podrobný popis deklarace se nachází v teoretické části této kapitoly. Zápis deklarace vyjadřuje, zda se jedná o motor či senzor (v našem případě senzor - Sensor), k jakému portu je připojen (S1 - port1 a S4 - port 4), jeho volitelný (dotykL a dotykP) a standardizovaný (sensorTouch) název. Na ukázce níže můžete vidět oba nadeklarované senzory, pomocí nichž budeme robota ovládat.
// deklarace senzoru #pragma config(Sensor, S1, dotykL, sensorTouch) #pragma config(Sensor, S4, dotykP, sensorTouch)
Krok 2 - Pohyb vpřed
Jako první se v programu pokusíme zrealizovat pohyb robota vpřed. Bude se tak dít, pokud budou stisknuta a držena stisknutá obě tlačítka. Chceme, aby se motory otáčely tak dlouho, dokud budou tlačítka stisknuta. Budeme tedy potřebovat použít cyklus s podmínkou na začátku while(). Ten vyjadřuje, že se vykonávají příkazy v těle cyklu, dokud je splněna podmínka uvedená v závorce. Podmínkou jsou v našem případě stisknutá tlačítka. Tuto událost vyjádříme pomocí příkazu SensorValue(). Jeho parametrem v závorce bude název příslušného senzoru. Přiřazení hodnoty 1 do tohoto příkazu vyjadřujeme, že je tlačítko stisknuto, přiřazení čísla 0 vyjadřuje opačný jev. Kompletní zápis podmínky tedy bude následující - SensorValue(dotykL) == 1 & SensorValue(dotykP) == 1. Do těla cyklu musíme poté umístit příkazy pro pohyb obou motorů vpřed. Použijeme tedy příkaz motor[]. Jako parametr do závorky zadáme označení příslušných motorů. Rychlost pohybu robota vpřed jsme zvolili 50% z toho důvodu, aby se robot nepohyboval příliš rychle.
// pri stisknuti obou tlacitek se robot pohybuje primo vpred while(SensorValue(dotykL) == 1 & SensorValue(dotykP) == 1) { motor[motorB]=50; motor[motorC]=50; }
Krok 3 - Zastavení
Zastavení robota nebo také neaktivita v případě, že není stisknuté žádné tlačítko, je vlastně opačným jevem než jsme si popsali v předchozím kroku. Musíme si tedy uvědomit, že i podmínka vykonávání cyklu musí být opačná než v kroku 1. Pokud tedy bude hodnota zjištěná senzorem 0 (nestisknuto), chceme, aby motory stály. Do příkazu motor[] tedy také přiřadíme nulový výkon.
// pokud neni stisknuto zadne tlacitko, robot se nepohybuje while(SensorValue(dotykL) == 0 & SensorValue(dotykP) == 0) { motor[motorB]=0; motor[motorC]=0; }
Krok 4 - Natočení vlevo
Nyní si vysvětlíme jak realizovat natočení robota do stran. Začneme natočením vlevo. Chceme, aby při stisku levého tlačítka robot stále pokračoval v pohybu vpřed, ale současně se začal natáčet vlevo. Opět použijeme cyklus s podmínkou na začátku while(). Nejprve musíme správně zformulovat podmínku, která musí být splněna. Požadujeme, aby se motor natočil vlevo pokud bude stisknuté levé tlačítko. Logická hodnota jím zjištěná tedy musí být 1 a u druhého tlačítka 0. Formulace podmínky bude SensorValue(dotykL) == 1 & SensorValue(dotykP) == 0. Nyní zbývá správně zapsat ovládání motorů v těle cyklu. Aby se robot začal natáčet vlevo, ponecháme hodnotu výkonu u pravého motoru na 50% a hodnotu druhého motoru snížíme na 30%. Robot tak bude stále v pohybu vpřed, ale bude se natáčet vlevo.
// stisknutim leveho tlacitka se robot nataci vlevo while(SensorValue(dotykL) == 1 & SensorValue(dotykP) == 0) { motor[motorB]=30; motor[motorC]=50; }
Krok 5 - Natočení vpravo
Natáčení robota na pravou stranu je opět pouze opačným řešením předchozího kroku. Musíme tedy změnit logické hodnoty stisku u tlačítek v podmínce cyklu. Vyžadujeme, aby se natáčení provedlo při stisknutí pouze pravého tlačítka. Opačné hodnoty musíme zadat i v příkazech ovládajících motory. Tentokrát bude potřeba, aby levý motor pokračoval v pohybu vpřed stejnou rychlostí a pravý se otáčel nižší rychlostí. Dojde tak k natáčení směrem vlevo.
while(SensorValue(dotykL) == 0 & SensorValue(dotykP) == 1) { motor[motorB]=50; motor[motorC]=30; }
Pokud správně sestavíme jednotlivé kroky, měli bychom dojít ke zdárnému řešení programu. Potřebujeme ovšem ještě, aby se program vykonával pořád dokola a my tak mohli libovolně dlouho robota ovládat. Musíme proto veškeré výše uvedené kroky (kromě deklarace senzorů) umístit do nekonečného cyklu while(). Kompletní program poté bude vypadat následovně:
Výsledný program
// deklarace senzoru #pragma config(Sensor, S1, dotykL, sensorTouch) #pragma config(Sensor, S4, dotykP, sensorTouch) task main() { while(true) { // pri stisknuti obou tlacitek se robot pohybuje primo vpred while(SensorValue(dotykL) == 1 & SensorValue(dotykP) == 1) { motor[motorB]=50; motor[motorC]=50; } // pokud neni stisknuto zadne tlacitko, robot se nepohybuje while(SensorValue(dotykL) == 0 & SensorValue(dotykP) == 0) { motor[motorB]=0; motor[motorC]=0; } // stisknutim leveho tlacitka se robot nataci vlevo while(SensorValue(dotykL) == 1 & SensorValue(dotykP) == 0) { motor[motorB]=30; motor[motorC]=50; } // stisknutim praveho tlacitka se robot nataci vpravo while(SensorValue(dotykL) == 0 & SensorValue(dotykP) == 1) { motor[motorB]=50; motor[motorC]=30; } } }