KURZ: Dotykový senzor

  • 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 BumperDragged Touch Sensor v paletě icon complete Complete > Sensor Sensor

NXTG TouchSenzor rozbaleny

 

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 Port - určuje, ke kterému ze čtyř vstupních portů je senzor připojen (1-4).

Mode Action - volba značící, která ze tří možností akce dotykového senzoru je zvolena.

BooleanYes/No - hodnota logického datového typu vyjadřující výsledek porovnání.

RawValue Raw Value - udává čistou, neškálovanou hodnotu snímanou senzorem na stupnici (0-1023).

Number 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 Bumped signalizuje jakou akci aktuálně dotykový senzor detekuje (v příkladu na obrázku - stisknutí a opětovné uvolnění tlačítka).

 

Parametry bloku

NXTG TouchSenzor

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 Pressed - stisknutí tlačítka senzoru,
  • Released Released - uvolnění stisknutého tlačítka senzoru,
  • Bumped 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 Sensor.

UMISTENI DOTYKOVY


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

 TOUCH REZIMY


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 Identification 515 Port Port (červeně zvýrazněno).

TOUCH WIRED


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.

MEASURE STATE

Identification 350 Touch 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.

COMPARE STATE

Identification 351 TouchState Pressed 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).

Identification 030 ComparisonType EqualCompare Result - výstupní port vracející logickou návratovou hodnotu podle toho, zda byl testovaný stav detekován (True) nebo nikoliv (False).

Identification 350 Touch 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í Blok Switch 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. 

switch blok

 

Krok 2 - Ověření stisku obou tlačítek

V dalším kroku se přesuneme do horní sekce bloku Blok Switch 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 Blok Switch 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 MovePaletteDragged 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 MotorDragged 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%.

prave tlacitko stisk

 

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 MovePaletteDragged Move. V jeho nastavení pouze zvolíme v sekci Direction třetí možnost, která reprezentuje příkaz stůj.

prave tlacitko stisk2

 

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í LoopBig 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.

tlacitka final

 

Program ke stažení

Stažení ve formátu .rbt 

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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; SensorValue(dotykP) == 1) 
 {
 motor[motorB]=50;
 motor[motorC]=50;
 }
// pokud neni stisknuto zadne tlacitko, robot se nepohybuje
while(SensorValue(dotykL) == 0 &amp; SensorValue(dotykP) == 0) 
 {
 motor[motorB]=0;
 motor[motorC]=0;
 }
// stisknutim leveho tlacitka se robot nataci vlevo
while(SensorValue(dotykL) == 1 &amp; SensorValue(dotykP) == 0) 
 {
 motor[motorB]=30;
 motor[motorC]=50;
 }
// stisknutim praveho tlacitka se robot nataci vpravo
while(SensorValue(dotykL) == 0 &amp; SensorValue(dotykP) == 1) 
 {
 motor[motorB]=50;
 motor[motorC]=30;
 }
 }
 
}
 

 

Program ke stažení

Stažení ve formátu .c

1 1 1 1 1 1 1 1 1 1 Hodnocení 3.33 (3 hodnocení)