KURZ: Dotykový senzor - Možnosti praktického využití

KAPITOLY

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 & 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;
 }
 }
 
}
 

 

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

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