Úvod

Chování robota neovlivňuje pouze program, ale také některé ze vstupních modulů v podobě senzorů. Pomocí snímání hodnot ze svého okolí v kombinaci s programem je poté možné řídit robotův pohyb.

V úvodním článku s názvem Ultrazvukovým senzor je popsán první z nich. Tento senzor je někdy také nazýván oči robota. Pomocí vysílání vysokofrekvenční akustické vlny totiž dokáže rozeznat, jestli v blízkosti robota není nějaká překážka.

Reagovat na zvukové podněty ze svého okolí nebo orientovat se na základě intenzity zvuku se robot dokáže pomocí zvukového senzoru. Jeho využití při programování a práci s ním v obou programových prostředích popisuje článek Zvukový senzor.

Světelný senzor, který je popsaný ve stejnojmenném článku, funguje na podobném principu jako zvukový. Reaguje ovšem místo zvuku na intenzitu světla ve svém okolí. S jeho pomocí tak můžeme například docílit toho, že se robot bude pohybovat po vytyčené dráze na základě orientace podle barvy podkladu.

Posledním ze skupiny základních vstupních senzorů je dotykový senzor. V některých případech se také můžeme setkat s názvem tlakový senzor či tlačítko. Jediná možnost snímání je stiskem či uvolněním tlačítka na jeho čelní straně. Možnosti práce s ním a jeho programování se dozvíte v článku Dotykový senzor.

KURZ: Základní vstupní moduly

Seznam článků kapitoly

  1. Ultrazvukový senzor
  2. Zvukový senzor
  3. Světelný senzor
  4. Dotykový senzor

Úvod

Chování robota neovlivňuje pouze program, ale také některé ze vstupních modulů v podobě senzorů. Pomocí snímání hodnot ze svého okolí v kombinaci s programem je poté možné řídit robotův pohyb.

V úvodním článku s názvem Ultrazvukový senzor je popsán první z nich. Tento senzor je někdy také nazýván oči robota. Pomocí vysílání vysokofrekvenční akustické vlny totiž dokáže rozeznat, jestli v blízkosti robota není nějaká překážka.

Reagovat na zvukové podněty ze svého okolí nebo orientovat se na základě intenzity zvuku se robot dokáže pomocí zvukového senzoru. Jeho využití při programování a práci s ním v obou programovacích prostředích popisuje článek Zvukový senzor.

Světelný senzor, který je popsaný ve stejnojmenném článku, funguje na podobném principu jako zvukový. Reaguje ovšem místo zvuku na intenzitu světla ve svém okolí. S jeho pomocí tak můžeme například docílit toho, že se robot bude pohybovat po vytyčené dráze na základě orientace podle barvy podkladu.

Posledním ze skupiny základních vstupních senzorů je dotykový senzor. V některých případech se také můžeme setkat s názvem tlakový senzor či tlačítko. Jediná možnost snímání je stiskem či uvolněním tlačítka na jeho čelní straně. Možnosti práce s ním a jeho použití v programu se dozvíte v článku Dotykový senzor.

1 1 1 1 1 1 1 1 1 1 Hodnocení 2.67 (3 hodnocení)

KURZ: Ultrazvukový senzor

Ultrazvukový senzor umožňuje robotům orientovat se v prostoru. Senzor vysílá vysokofrekvenční akustickou vlnu, která se odrazí od předmětu umístěného před senzorem. Podle doby, za kterou se signál vrátí zpět do senzoru se vypočítá, v jaké vzdálenosti se předmět nachází. Díky tomuto zařízení je robot schopný detekovat překážky, měřit vzdálenosti k překážce či zaznamenávat pohyb. Rozsah ultrazvukového senzoru je od 0 do 255 centimetrů.

Použití v programovacích prostředích

NXT-G

Blok pro ovládání motoru

Rozcestník


Umístění bloku

Programový blok DistanceSensorDraggedUltrasonic Sensor je v programovacím prostředí NXT-G umístěn v paletě icon completeCompleteSensorHilight Sensor.

NXTG UltrasonicBlock rozbaleny

 

Popis bloku

Blok DistanceSensorDraggedUltrasonic Sensor umožňuje k propojení s dalšími programovými bloky využít pět konektorů:

Port Port - určuje, ke kterému ze čtyř vstupních portů je senzor připojen (1-4).

TriggerPoint TriggerPoint - značí nastavenou vstupní vzdálenost, kterou lze porovnávat s hodnotou snímanou senzorem. 

GreaterLessGreater / Less - hodnota logického datového typu sloužící pro srovnání dvou hodnot (větší nebo menší).

Boolean Yes / No - hodnota logického datového typu vyjadřující výsledek porovnání fixní zadané vzdálenosti a hodnoty naměřené senzorem.

Distance050 Distance - číselná hodnota vyjadřující vzdálenost zaznamenaného předmětu od senzoru. Vzdálenost je vyjádřena buďto v centimetrech na stupnici od 0 do 255 cm nebo v palcích od 0 do 100 in.

Aktuální nastavení senzoru vyjadřuje pouze číslo v pravém horním rohu, které udává, ke kterému ze vstupních portů je senzor připojen a poté ikonka Distance050, která značí hodnotu fixně nastavené vzdálenosti.

 

Parametry bloku 

NXTG UltrasonicSensor

Port: zvolením jedné ze čtyř možností udáváme, ke kterému vstupnímu portu je senzor připojen.

Compare: sekce sloužící k zadání fixní hodnoty určené pro porovnávání s hodnotou snímanou senzorem. Tažítkem nebo ručním zadáním je možné nastavit vzdálenost kratší či delší než je vzdálenost naměřená ultrazvukovým senzorem.

Show: umožňuje nastavit jednotky, ve kterých bude vzdálenost vyjádřena. Na výběr jsou buďto centimetry nebo palce.

RobotC

Příkazy pro ovládání ultrazvukového senzoru

Ultrazvukový senzor vyhodnocuje vzdálenost od překážky, a tak hlavní práce s ním se skládá ze zpracování těchto informací. Pro jeho bezproblémový chod je důležité správné nastavení.

Rozcestník


Nastavení senzoru

Ještě než začneme v programovacím prostředí RobotC pracovat s ultrazvukovým senzorem, je nutné ho nakonfigurovat. Zápis konfigurace je uveden na příkladu. 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 Sensor. Další parametr označuje, do jakého portu řídící jednotky je senzor připojen (S3 = port 3). Následuje volitelný název senzoru (ultrazvukovy). Posledním parametrem je druh senzoru (sensorSONAR = ultrazvukový senzor). Tato deklarace je v úvodu každého programu, kde budeme pracovat se senzory nezbytná.

 
#pragma config(Sensor, S3, ultrazvukovy, sensorSONAR) // 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ů.


Nastavení vzdálenosti od senzoru

Ultrazvukový senzor dokáže vracet údaj o vzdálenosti k nejbližšímu předmětu, který se před ním nachází. Tyto údaje je poté možné programově porovnávat a ovlivňovat tak pohyb a chování robota. Příkaz, který pracuje s hodnotou vyjadřující vzdálenost překážky od ultrazvukového senzoru je SensorValue[]. V závorce udáváme zvolený název senzoru, který je zadán v úvodu programu. Rozsah hodnot je určen pomocí porovnávacích znamének. Ultrazvukový senzor dokáže určit vzdálenost v rozmezí 0-255 centimetrů. Narozdíl od programového prostředí NXT-G, se v RobotC využívá pouze vyjádření v centimetrech, nikoliv v palcích.

 
SensorValue[sensorSONAR] < 20; // Senzorem prectena vzdalenost je kratsi nez 20 cm.
SensorValue[sensorSONAR] > 20; // Senzorem prectena vzdalenost je delsi nez 20 cm.
SensorValue[sensorSONAR] = 20; // Senzorem prectena vzdalenost je 20 cm. 
 

Pro doplnění přikládáme jednoduchý příklad nastavení vzdálenosti pomocí nadeklarované proměnné.

 
int vzdalenost_v_cm = 20; // Vytvori promennou "vzdalenost_v_cm" a nastavi jeji hodnotu na 20.
SensorValue[sensorSONAR] > vzdalenost_v_cm; // Senzorem prectena vzdalenost je delsi nez 20 cm. 
 

EV3

Blok pro práci s ultrazvukovým senzorem

Rozcestník


Umístění bloku pro práci s ultrazvukovým senzorem

Programový blok Ultrasonic Sensor je umístěn v paletě Sensor Sensor.

UMISTENI ULTRAZVUKOVY


Změna režimu

Programový blok Ultrasonic 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).

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

WIRED


Režimy programového bloku

Measure - Advanced - Centimetres

Režim, ve kterém senzor měří vzdálenost vyjádřenou v centimetrech. Snímání je možné realizovat ve dvou režimech. Programový blok obsahuje jeden vstupní a jeden výstupní port.

 MEASURE ADVANCED

 Measuring Mode (režim měření vzdálenosti):

Identification 368 MeasuringMode Ping Ping - režim, ve kterém jsou zasílány jednotlivé ultrazvukové signály.

Identification 369 MeasuringMode Continuous Continuous - režim, ve kterém je zasílán konstantní, nepřerušovaný ultrazvukový signál.

Identification 052 DistanceCM Distance in Centimetres - výstupní port jehož návratovou hodnotou je naměřená vzdálenost v centimetrech.

 

 

Measure - Advanced - Inches

Režim, ve kterém senzor měří vzdálenost vyjádřenou v palcích. Snímání je možné realizovat ve dvou režimech. Programový blok obsahuje jeden vstupní a jeden výstupní port.

MEASURE ADVANCED INCH

 Measuring Mode (režim měření vzdálenosti):

Identification 368 MeasuringMode Ping Ping - režim, ve kterém jsou zasílány jednotlivé ultrazvukové signály.

Identification 369 MeasuringMode Continuous Continuous - režim, ve kterém je zasílán konstantní, nepřerušovaný ultrazvukový signál.

Identification 052 DistanceCM Distance in Centimetres - výstupní port jehož návratovou hodnotou je naměřená vzdálenost v centimetrech. 

Poznámka: Režimy Measure - Distance - Centimetres (měření vzdálenosti v centimetrech) a Measure - Distance - Inches (měření vzdálenosti v palcích) fungují naprosto stejným způsobem, jen neobsahují možnost změny režimu vysílání ultrazvukového signálu.

 

 

Measure - Presence

Režim, ve kterém ultrazvukový senzor pouze zjišťuje, zda detekoval ultrazvukový signál či nikoliv. V tomto režimu máme k dispozici jediný výstupní port.

MEASURE PRESENCE

Identification 535 UltrasoundDetected Ultrasound Detected - výstupní port, jehož návratová hodnota je logického datového typu. Pokud je signál detekován, je výsledkem hodnota True (pravda) v opačném případě False (nepravda).

 

 

Compare - Distance Centimetres

Režim sloužící k porovnání naměřené hodnoty s prahovou hodnotou v centimetrech. Programový blok obsahuje dva vstupní a dva výstupní porty.

COMPARE CM

Identification 034 ComparisonType LessThan Compare Type - výběr způsobu porovnání zjištěné hodnoty s prahovou. Vybíráme, zda chceme zjistit, jestli je naměřená vzdálenost menší, větší nebo rovna prahové. 

Identification 412 Threshold Less 0Threshold Value - prahová hodnota, s kterou porovnáváme naměřenou vzdálenost.

Identification 030 ComparisonType EqualCompare Result - výstupní port vracející logickou návratovou hodnotu v závislosti na tom, zda zjištěná hodnota byla v námi ověřované vzdálenosti (True) či nikoliv (False).

Identification 052 DistanceCM Distance in Centimetres - návratovou hodnotou výstupního portu je naměřená vzdálenost v centimetrech.

 

 

Compare - Distance Inches

Režim sloužící k porovnání naměřené hodnoty s prahovou hodnotou v palcích. Programový blok obsahuje dva vstupní a dva výstupní porty.

COMPARE INCH

 Identification 034 ComparisonType LessThan Compare Type - výběr způsobu porovnání zjištěné hodnoty s prahovou. Vybíráme, zda chceme zjistit, jestli je naměřená vzdálenost menší, větší nebo rovna prahové.

Identification 412 Threshold Less 0Threshold Value - prahová hodnota, s kterou porovnáváme naměřenou vzdálenost.

Identification 030 ComparisonType EqualCompare Result - výstupní port vracející logickou návratovou hodnotu v závislosti na tom, zda zjištěná hodnota byla v námi ověřované vzdálenosti (True) či nikoliv (False).

Identification 053 DistanceInches Distance in Inches- návratovou hodnotou výstupního portu je naměřená vzdálenost v palcích.

 

 

Compare - Presence/Listen

Funkce režimu je totožná s režimem Measure - Presence.

COMPARE LISTEN

 


MOŽNOSTI PRAKTICKÉHO VYUŽITÍ

Ultrazvukový senzor uplatníme v příkladech, ve kterých budeme potřebovat, aby se robot pohyboval v prostoru. Díky ultrazvukovému senzoru může detekovat překážky a určovat vzdálenost k předmětům ve svém okolí. Můžeme tak předejít možným srážkám a kolizím při projetí určité dráhy. Pohyb robota zde můžeme přirovnat k letu netopýra. Ten se také pomocí vysílání a přijímání ultrazvukových vln orientuje v prostoru. Určuje tak za letu vzdálenost k nejbližší překážce.

Využití ultrazvukového senzoru

Princip fungování ultrazvukového senzoru si ukážeme na příkladu, ve kterém budeme simulovat situaci, která může vzniknout v běžném silničním provozu. Představme si, že automobil jede po pozemní komunikaci. Aby nedošlo ke srážce s vozidlem jedoucím před ním, měl by od něj dodržovat dostatečnou vzdálenost. Náš robot tedy bude mít ve své přední části umístěný ultrazvukový senzor. Ten bude snímat vzdálenost od překážky před ním. Jakmile bude robot od této překážky 65 centimetrů, začne plynule zpomalovat. Snižování rychlosti bude tak plynulé, aby se robot zastavil 15 centimetrů od překážky a zůstal stát. Vzdálenost 15 centimetrů bude naše pomyslná bezpečná vzdálenost. V případě, že by se předmět po zastavení robota začal přibližovat, začne robot couvat. Pomocí tohoto programu by tak měl robot vždy v dostatečném předstihu začít zpomalovat, aby nedošlo ke srážce a nikdy by neměl překročit bezpečnou vzdálenost.

NXT-G

Ovládání robota s ultrazvukovým senzorem

Pro správné vyřešení příkladu v programovacím prostředí NXT-G si musíme rozmyslet, jaké situace potřebujeme v programu ošetřit. Je nutné si uvědomit, že robot musí poznat, že je ve vzdálenosti 65 centimetrů před překážkou a podle toho se zachovat. Chceme také, aby se dokázal zachovat v situaci, že se překážka před ním začne přibližovat a vzdálenost se v tu chvíli zmenší pod 15 centimetrů.

Krok 1 - Deklarace proměnné

Při vytváření programu budeme ve všech částech vyhodnocovat vzdálenost od překážky, kterou zjistí ultrazvukový senzor. Tuto hodnotu bude potřeba ukládat. Musíme si proto vytvořit proměnnou. My jsme ji v našem programu nazvali vzdalenost. Proměnná bude typu number (číslo), protože se do ní bude ukládat číselná hodnota.

Podrobný popis vytváření proměnné v programovém prostředí NXT-G naleznete v kapitole Vytváření proměnné nebo kontanty.

 
Krok 2 - Zjištění vzdálenosti

V první části programu musí robot zjistit, jak daleko od překážky se nachází. Docílíme toho pomocí bloku  DistanceSensorDraggedUltrasonic Sensor (ultrazvukový senzor), jehož hodnotu uložíme do proměnné díky propojení příslušných bloků. Pro zjištění, zda je hodnota nižší či vyšší než 65 centimetrů použijeme blok NumericComparisonDragged Compare. Na jeho vstup přivedeme hodnotu ze senzoru a jako výpočetní operaci nastavíme zda je přivedený vstup < 65. Pro vyhodnocení tohoto výrazu použijeme blok podmíněného vykonávání Switch. Pokud tedy robot zjistí, že je ve vzdálenosti větší než 65 cm, bude se vykonávat část podmínky označená jako False (Nepravda). V tomto případě se nic dít nebude a robot bude pokračovat v pohybu vpřed stále stejnou rychlostí. Umístíme sem tedy pouze blok MotorDragged Motor, ve kterém budou definovány zapojené motory, rychlost otáčení, směr vpřed a nekonečné vykonávání pohybu vpřed.

zjisteni vzdalenosti

 

Krok 3 - Určení výkonu motorů pro zpomalování

Při splnění předešlé podmínky bude následovat poněkud složitější část programu. Bude-li totiž vzdálenost nižší než 65, tedy splněna naše podmínka, musíme vytvořit část programu v sekci True (pravda) bloku Switch.

Jelikož jsme si na začátku programu vytyčili, že chceme, aby robot zareagoval i v případě, že se k němu bude překážka přibližovat, musíme znovu zjistit, v jaké pozici se nachází. Ověříme tedy, zda hodnota aktuálně uložená v proměnné vzdalenost je nižší než 15 centimetrů či nikoliv. Vzdálenost 15 centimetrů jsme si zvolili jako maximální povolenou vzdálenost od překážky. Jakmile pomocí bloku  NumericComparisonDragged Compare přivedeme na vstup bloku Switch hodnotu, která bude vyšší než 15, bude vyhodnocena jako nesplnění podmínky a bude se vykonávat kód v sekci False. Pro připomenutí uvádíme, že se v této situaci robot nachází ve vzdálenosti menší než 65 centimetrů, ale větší než 15 cm. Měl by proto začít zpomalovat, aby zastavil v povolené vzdálenosti od překážky. Vzorec pro výpočet hodnoty intenzity otáčení motoru je následující. Použijeme hodnotu uloženou v proměnné vzdalenost, odečteme od ní vzdálenost v jaké chceme zastavit, tedy 15 cm, a výsledek vynásobíme dvěma. Pro výpočetní operace použijeme blok  FPNumericOperationsDragged MathHodnotu z proměnné přivedeme na jeho vstup. V tomto bloku budeme odečítat hodnotu 15. Výsledek přivedeme na vstup dalšího bloku  FPNumericOperationsDraggedMath, ve kterém se hodnota bude násobit dvěma. Výsledek následně přivedeme na vstupní konektor bloku MotorDragged Motor s názvem Power. Tím jsme motorům přiřadili průběžně vypočítávanou hodnotu otáčení.

Nyní přistoupíme k druhé části bloku Switch. Zde se bude vykonávat program pro situaci, že se překážka k robotovi začne přibližovat. Výpočet intenzity otáčení bude naprosto totožný, ovšem s drobnou změnou. Pokud se překážka bude přibližovat, bude potřeba, aby robot couval. V nastavení bloku  MotorDragged Motor tedy navolíme, aby se v tomto případě motory otáčely směrem vzad.

Pro úspěšné dokončení ještě celý program vložíme do cyklu c010 loop large Loop, u nějž nastavíme nekonečné provádění.

switch vzdalenost

 

Program ke stažení

Stažení ve formátu .rbt

RobotC

Ovládání robota s ultrazvukovým senzorem

Pro úspěšné vyřešení příkladu bude nutné správně nadeklarovat ultrazvukový senzor. Musíme si také uvědomit, že potřebujeme, aby byla vzdálenost do překážky snímána neustále a správně vyhodnocována. Podstatnou částí je také určení průběžné rychlosti během zpomalení tak, aby zpomalení bylo plynulé a aby v požadované vzdálenosti od překážky byla rychlost nulová.

Krok 1 - Deklarace senzoru

Pokaždé, než začneme pracovat v programovacím prostředí RobotC s kterýmkoliv senzorem, musíme provést jeho deklaraci. Její podrobný popis naleznete v teoretické části této kapitoly. Zápis deklarace můžete vidět o něco níže. V závorce se nacházejí 4 parametry. Určení, že se jedná o senzor. Druhý parametr je určení portu, ke kterému je připojen. Třetí parametr je volitený a jedná se o název senzoru. Poslední parametr je standardizovaný název senzoru.

 
// Kod automaticky generovany konfiguraci senzoru.
#pragma config(Sensor, S1, ultrazvukovy, sensorSONAR)
 
 
Krok 2 - Deklarace proměnných

V programu budeme dynamicky pracovat se vzdáleností od překážky v závislosti na poloze robota. Při zpomalování se bude také měnit výkon otáčení motoru. Budeme tedy potřebovat tyto hodnoty někam ukládat. K tomuto účelu slouží v programování proměnné (více v kapitole Práce s proměnnými). Nadeklarujeme si tedy v úvodu dvě proměnné datového typu integer. Jedna se bude jmenovat vzdalenost a bude se do ní ukládat hodnota zjištěná ultrazvukovým senzorem. Druhá proměnná se bude nazývat vykon a bude v ní uložena hodnota, která se bude zasílat oběma motorům a bude vyjadřovat hodnotu rychlosti otáčení motorů. Obě proměnné na úvod programu inicializujeme tak, že do obou přiřadíme hodnotu 0.

 
int vzdalenost = 0;
int vykon = 0;
 
 
Krok 3 - Zjištění vzdálenosti od překážky

V následujícím kroku chceme zajistit, aby se hodnota snímaná senzorem ukládala do proměnné vzdalenost. Vykonáním tohoto kroku si hodnotu připravíme pro další využití v programu. Použijeme tedy proměnnou vzdalenost, do které přiřadíme hodnotu ze senzoru pomocí příkazu SensorValue(). Jeho parametrem v závorce je název senzoru z úvodní deklarace. Zjišťování, zda se robot nenachází příliš blízko k překážce, nelze provést pouze jednou. Potřebujeme, aby se provádělo neustále. Umístíme tak tento příkaz do nekonečného cyklu while(). Ten nám zajistí, že snímání senzorem bude probíhat neustále a hodnota bude dynamicky ukládána do proměnné.

 
while(true)
{
 vzdalenost = SensorValue(sensorSONAR);
}
 
 
Krok 4 - Určení výkonu motorů pro zpomalování

Poslední část programu zajišťuje postupné zpomalování robota ve chvíli, kdy se bude nacházet ve vzdálenosti 65 cm před překážkou. Na následujících 50 cm chceme, aby plynule zpomaloval, až zastaví 15 cm před překážkou. Pokud se bude robot nacházet ve vzdálenosti větší než 65 cm od překážky, chceme, aby jel stále stejnou rychlostí, kterou si zvolíme na 80% výkonu motorů. Použijeme tedy podmínku if(). Jejím parametrem bude výraz vzdalenost > 65. V těle podmínky poté chceme zajistit, aby robot za těchto podmínek jel rychlostí 80%. Do proměnné vykon tedy přiřadíme hodnotu 80. Následně chceme, aby tato hodnota byla přiřazena oběma motorům. Využijeme proto 2x příkaz motor[] do nějž přiřadíme proměnnou vykon.

Ve druhé části podmínky musíme zajistit postupné zpomalování a následné zastavení. Aby zastavení bylo plynulé, musí být výkon motoru dvojnásobkem vzdálenosti od překážky snížené o bezpečnou vzdálenost, kterou chceme dodržet (15 cm). Do proměnné vykon tedy přiřadíme výraz 2 * (vzdalenost - 15). Následně hodnotu uloženou v proměnné vykon přiřadíme oběma motorů. Pro kontrolu správnosti programu si můžeme dosazením do vzorce ověřit, zda robot ve vzdálenosti 15 cm od překážky skutečně bude stát. Pokud za proměnnou vzdalenost dosadíme 15, výsledkem výrazu bude 0. Oběma motorům tak bude přiřazen výkon 0.

V případě, že by se překážka před kterou robot zastavil, k němu začala přibližovat, bude hodnota v proměnné vykon záporná. Jakmile se přiřadí do příkazu motor[] záporná hodnota, motory se začnou otáčet reverzivně. Robot tak před překážkou začne couvat.

 
while(true)
{
vzdalenost = SensorValue(sensorSONAR);
 
if(vzdalenost > 65)
{
 vykon = 80;
 motor[motorB] = vykon;
 motor[motorC] = vykon;
}
else
{
 vykon = 2 * (vzdalenost - 15);
 motor[motorB] = vykon;
 motor[motorC] = vykon;
}
}
 
 
Výsledný program
 
// Kod automaticky generovany konfiguraci senzoru.
#pragma config(Sensor, S1, ultrazvukovy, sensorSONAR)
 
task main()
{
 int vzdalenost = 0;
 int vykon = 0;
 
while(true)
{
 vzdalenost = SensorValue(sensorSONAR);
 
if(vzdalenost > 65)
{
 vykon = 80;
 motor[motorB] = vykon;
 motor[motorC] = vykon;
}
else
{
 vykon = 2 * (vzdalenost - 15);
 motor[motorB] = vykon;
 motor[motorC] = vykon;
}
}
}
 

 

Program ke stažení

Stažení ve formátu .c

1 1 1 1 1 1 1 1 1 1 Hodnocení 4.50 (4 hodnocení)

KURZ: Zvukový senzor

Hlavní funkcí zvukového senzoru je detekovat úroveň hluku svého okolí. Tuto hodnotu dokáže změřit a vyjádřit buďto v jednotkách dB nebo dBA. Jednotky dB vyjadřují všechny zvuky vysokých i nízkých frekvencí. Oproti tomu dBA je vyjádření zvuků slyšitelných člověkem, jejichž úroveň hlasitosti je vyjádřena v procentech (maximum 100% = přibližně 90 dB). Hodnoty, které senzor naměří, je možné programově porovnávat s fixně nastavenými hodnotami v programu. Zvukový senzor je k řídící jednotce připojen pomocí kabelu do jednoho ze zvolených vstupních portů (1-4).

Použití v programovacích prostředích

NXT-G

BLOK PRO OVLÁDÁNÍ MOTORU

Rozcestník


Umístění bloku

Programový blok SoundSensorDraggedSound Sensor nalezneme v programovacím prostředí NXT-G v paletě icon completeCompleteSensorHilight Sensor.

NXTG SoundBlock rozbaleny

 

Popis bloku

Pro využití bloku zvukového senzoru v programu je k dispozici sedm konektorů pro propojení s dalšími programovými bloky:

Port Port - vyjadřuje, ke kterému ze čtyř vstupních portů je senzor připojen (1-4).

TriggerPoint Trigger Point- značí nastavenou vstupní hodnotu hlasitosti zvuku, která je porovnávána s hodnotou snímanou senzorem.

GreaterLessGreater / Less - hodnota logického datového typu sloužící pro srovnání dvou hodnot (větší nebo menší).

DBA dBA - konektor určující, v jakých jednotkách je vyjádřena naměřená hlasitost zvuku. Je logického datového typu. Pro hodnotu True (Pravda) nabývá hodnoty dBA, pro False (Nepravda) dB.

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

Volume075 Sound Level - vyjadřuje hodnotu získanou ze zvukového senzoru v rozpětí 0-100%. 

RawValue Raw Value - udává čistou hodnotu hlasitosti zvuku snímanou senzorem na stupnici 0-1024.

Aktuální nastavení programového bloku označuje ikona intensity075, která vyjadřuje, na jak vysokou úroveň hlasitosti zvuku je nastaven Triger Point. V pravém horním rohu bloku se nachází číslo označující port, ke kterému je senzor připojen.

 

Parametry bloku

NXTG SoundSensor

Port: vybráním jedné ze čtyř možností označujeme, ke kterému vstupnímu portu řídící jednotky je zvukový senzor připojen.

Compare: část programového bloku sloužící k nastavení fixní úrovně hlasitosti zvuku, která bude porovnávána s hodnotou snímanou senzorem. Hodnotu je možné nastavit pomocí tažítka či ručně zadáním hodnoty. Volby po stranách slouží k určení, zda chceme porovnávat zvuky o hlasitosti nižší, či vyšší než je zadaná hodnota. Stejnou funkci má i volba znamének větší a menší.

Během chodu programu se v levé části programového bloku dynamicky mění hodnota úrovně hlasitosti zvuku snímaná senzorem (na obrázku vyjádřena číslem  29) na stupnici od 0 do 100%. 

RobotC

Příkazy pro ovládání zvukového senzoru

Správné použití zvukového senzoru spočívá nejprve v nastavení. Jeho další využití spočívá hlavně ve zpracování snímané hodnoty z okolí a její vyhodnocování.

Rozcestník


Nastavení senzoru

Ještě než začneme v programovacím prostředí RobotC pracovat se zvukovým senzorem, je nutné ho nakonfigurovat. U zvukového senzoru je možné volit mezi dvěma možnostmi na základě toho, s kterým druhem zvukového senzoru chceme pracovat (sensor pracující s jednotkami dB nebo dBA). Zápis konfigurace je uveden na obrázku. 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 Sensor. Další parametr označuje, do jakého portu řídící jednotky je senzor připojen (S1 = port 1 a S2 = port 2 atd.). Následuje volitelný název senzoru (zvukovy). Posledním parametrem je druh senzoru (sensorSoundDB nebo sensorSoundDBA). Tato deklarace je v úvodu každého programu, kde budeme pracovat se senzory nezbytná.

 
#pragma config(Sensor, S1, zvukovy, sensorSoundDB) // Kod je automaticky generovan pruvodcem konfiguraci RobotC.
#pragma config(Sensor, S2, zvukovy2, sensorSoundDBA) // 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ů.


Nastavení úrovně hlasitosti zvuku

Během vytváření programu, ve kterém se bude vyskytovat zvukový senzor může nastat situace, kdy budeme potřebovat porovnat snímané hodnoty s hodnotami pevně zadanými. Příkazem SensorValue[] je možné vyjádřit rozsah úrovně hlasitosti zvuku, která by se poté dala porovnávat se skutečně naměřenou hodnotou senzorem. Rozsah číselné hodnoty je zadáván pomocí porovnávacích znamének, která značí hodnotu větší, menší nebo rovnu zadané hodnotě (>, < nebo =). Hodnota je vyjadřována na stupnici 0 - 100.

 
SensorValue[Zvukovy] < 60; // Uroven hlasitosti zvuku je nizsi nez 60.
SensorValue[Zvukovy] > 60; // Uroven hlasitosti zvuku je vyssi nez 60.
SensorValue[Zvukovy] = 60; // Uroven hlasitosti zvuku je rovna 60. 
 

Využití hodnoty úrovně hlasitosti v RAW

Při práci s naměřenými hodnotami lze využít jejich klasické vyjádření hodnoty na stupnici od 0 do 100 nebo vyjádření v raw neboli čisté, neškálované podobě. Pro práci s touto hodnotou je určen příkaz SensorRaw[], který vyjadřuje, že hodnota přečtená ze senzoru, jehož název je uveden v závorce, bude používána jako raw a tedy v rozsahu od 0 do 1023. Rozsah číselné hodnoty je zadáván pomocí porovnávacích znamének, která značí rozsah hodnot větší, menší nebo roven zadané hodnotě (>, < nebo =).

 
SensorRaw[Zvukovy] < 512; // Uroven hlasitosti zvuku v RAW je nizsi nez 512.
SensorRaw[Zvukovy] > 512; // Uroven hlasitosti zvuku v RAW je vyssi nez 512.
SensorRaw[Zvukovy] = 512; // Uroven hlasitosti zvuku v RAW je rovna 512. 
 

EV3

Blok pro práci se zvukovým senzorem 

Rozcestník

  • Umístění bloku
  • Změna režimu
  • Přidání vstupního portu
  • Režimy programového bloku

 

 

SOUND UMISTENI

 

SOUND REZIMY

 

SOUND WIRED

 

SOUND MEASURE DB

 

SOUND MEASURE DBA

 

SOUND COMPARE DB

 

SOUND COMPARE DBA

 

SOUND CALIBRATE MIN

 

SOUND CALIBRATE MAX

 

 

SOUND CALIBRATE RESET

 

 

 

 


MOŽNOSTI PRAKTICKÉHO VYUŽITÍ

Využití zvukového senzoru při sestavování robota je velice specifické. Senzor reaguje na veškeré zvukové podněty ve svém okolí a musíme tak jeho využití a funkci v modelu pečlivě zvážit. Při správném použití nám ovšem nabízí další možnosti pro ovládání a chování robota. Důležité je například i umístění na pohyblivém modelu robota, který je opatřen servomotory. Doporučená vzdálenost umístění od motoru se udává kolem 30 cm z toho důvodu, aby senzor nesnímal zvuk, který motor vydává. Mohlo by tak docházet ke zkreslování zjištěných hodnot.

VYUŽITÍ ZVUKOVÉHO SENZORU

Zvukový senzor se velmi často používá k přímému ovládání robota. První možností je zpracovávání a vyhodnocování všech zvukových podnětů z okolí. Častěji je robot ovládán například pomocí hlasu, tlesknutí nebo specifických zvukových signálů. Tvorba takovéhoto programu již vyžaduje větší zkušenosti. Zvukový senzor je možné využít i u statických modelů. Jednou z možností je sestavení ručního hlukoměru, který zjišťuje a následně například výpisem na displej informuje uživatele o úrovni hluku v okolí.

Na praktickém příkladu si ukážeme, jak je možné ovládat robota pomocí tlesknutí. Bude se jednat o krátký program, na jehož základě se robot nejprve po tlesknutí rozjede a následně bude čekat na další podnět v podobě tlesknutí, po jehož vyhodnocení se zastaví. Takovýto jednoduchý konstrukt se následně může stát základem pro složitější programy k ovládání robota pomocí hlasu či jiných zvuků.

NXT-G

Rozjetí a zastavení na tlesknutí

Při realizaci programu, během kterého se má robot nejprve na tlesknutí rozjet a následně zastavit musíme programově ošetřit tři situace. Nejprve rozjezd po vyhodnocení zvukového signálu, následně zastavení po opětovném tlesknutí a na závěr ošetřit správné vyhodnocování zvuku.

Krok 1 - Rozjezd

Prvním krokem pro úspěšnou realizaci programu bude rozjezd robota po tlesknutí. Ve chvíli, kdy se bude vyhodnocovat úvoreň zvuku, musí již být program spuštěný a pouze čekat, jaká hodnota úrovně zvuku se objeví na vstupu. První blok, který použijeme, tedy bude blok WaitForSoundDrag Wait. Tento blok bude řízen hodnotou zjištěnou zvukovým senzorem. V jeho sekci Control tedy zvolíme možnost Sensor a dále typ senzoru - Sound Sensor.

Nyní si musíme zvolit hodnotu, kterou budeme porovnávat s hodnotou naměřenou senzorem. Při jejím překročení bude motorům vyslán signál ke spuštění. Aby se nestalo, že motory budou spuštěny poté, co zvukový senzor zaregistruje nějaký parazitní zvuk z okolí, zvolili jsme tuto hodnotu pro jistotu vyšší. Hodnotu k porovnání jsme tedy nastavili na 80.

Robot tedy čeká, až hodnota zvuku v okolí překročí hodnotu 80, což by mělo důrazné tlesknutí s přehledem překročit. Po splnění této podmínky je vyslán signál připojeným motorům A a B a ty se dají do pohybu. K ovládání motorů použijeme blok MovePaletteDragged Move, v jehož nastavení zvolíme příslušné motory A a B, směr vpřed, rychlost (doporučujeme nastavit ne příliš vysokou rychlost) a nekonečné konání pohybu (Unlimited).

Rozjezd

 
Krok 2 - Zastavení

V prvním kroku jsme zrealizovali rozjetí robota po tlesknutí. Jeho zastavení bude totožnou operací, ovšem po splnění podmínky se motorům vyšle signál k zastavení. Opět tedy použijeme blok WaitForSoundDrag Wait, který bude čekat na to, až hodnota zjištěná zvukovým senzorem překročí hranici 80. Následně se motorům připojeným k portům A a B a ovládaných blokem  MovePaletteDragged Move vyšle signál k zastavení.

Zastaveni

 

Krok 3 - Dokončení programu

Naučili jsme se, jak zajistit, aby se robot po tlesknutí rozjel a aby se po dalším tlesknutí zastavil. Program sestavený pouze z těchto dvou kroků by ovšem nefungoval. Mezi jednotlivými kroky musíme dát řídící jednotce NXT možnost, aby zjištěnou hodnotu intenzity zvuku správně vyhodnotila a rozhodla, zda má být realizováno rozjetí či nikoliv. Mezi oba kroky proto vložíme blok WaitForSoundDrag Wait, jehož řízení nastavíme na čas (Time) a nastavíme čekání alespoň 1 vteřinu. Po zjištění, zda hodnota zvuku překročila námi nastavenou mez, tak budou mít motory dostatek času na to, aby se rozjely. Následně se přejde k opětovnému čekání na signál v podobě tlesknutí, po kterém se motory zastaví.

 

Výsledný program

Na obrázku můžete vidět výsledný programový konstrukt, díky kterému se robot opatřený dvěma motory nejprve po tlesknutí rozjede a následně po dalším tlesknutí zastaví.

Sound priklad komplet

 

Program ke stažení

Stažení ve formátu .rbt

 

Rozšiřující příklad

Jak jsme si vysvětlili v úvodu, příklad měl pouze ukázat možnosti ovládání robota hlasem. Můžete se pokusit sestavit robota, který bude reagovat na povely jako "Jeď!", "Stůj!", "Zatoč vlevo!" nebo "Zatoč vpravo!". Tento příklad je z kategorie pokročilých. Vzorové řešení spolu s popisem v angličtině naleznete ZDE

RobotC

ROZJETÍ A ZASTAVENÍ NA TLESKNUTÍ

Vytvoření programu, díky kterému se robot nejprve na tlesknutí rozjede a na další tlesknutí zastaví, si vyžaduje dokonalé rozmyšlení, co se bude v jakou chvíli vyhodnocovat. Robot musí nejprve čekat, až hodnota zvuku překročí prahovou hodnotu, následně se rozjede a opět bude čekat na tlesknutí, tedy překonání prahové hodnoty.

Krok 1 - Rozjezd

První krok, který musíme k úspěšnému vytvoření programu zrealizovat, je rozjezd robota na tlesknutí. Než se ale robot rozjede, musí nejprve po spuštění programu čekat na signál v podobě tlesknutí. Jak tedy robota uvedeme do pomyslné pohotovosti? Robot musí čekat, až hodnota intenzity zvuku v okolí překročí 80. Použijeme tedy cyklus s podmínkou na začátku while(). Podmínka bude, že dokud hodnota nepřekročí 80, budou oba motory v nečinnosti. Aby se program opravdu zastavil u této podmínky a čekal na její splnění, musíme před ní umístit ještě příkaz wait1Msec(). Jeho hodnotu postačí nastavit na 0,5 s. Tím se oddálí vykonávání dalšího příkazu a řídící jednotka stihne vyhodnotit, jak vysoká je intenzita zvuku.

 
while(SensorValue(zvukovy) <= 80) 
 {
   motor[motorA] = 0; 
   motor[motorB] = 0; 
 }
 

Nyní tedy robot čeká na tlesknutí, po kterém vyrazí kupředu. Použijeme tedy neprve podmínku if(), jejímž parametrem bude, pokud hodnota překročí 80. Následně musíme zadat, co se v tomto případě stane. Potřebujeme, aby se robot rozjel a jel dokud neprovedeme další tlesknutí. Bude se tedy pohybovat, dokud hodnota zvuku opět nepřekročí 80. Použijeme znovu cyklus s podmínkou na začátku while(). Aby řídící jednotka stihla 2x rychle po sobě vyhodnotit úroveň zvuku, musíme mezi podmínku a cyklus umístit příkaz wait1Msec(), který na malý časový úsek (0,2 s) oddálí vykonávání dalšího příkazu.

 
if (SensorValue(zvukovy) > 80) 
 {
 wait1Msec(200); 
 while(SensorValue(zvukovy) <= 80) 
 { 
   motor[motorA] = 50; 
   motor[motorB] = 50; 
 }
 }
 
 
Krok 2 - Zastavení

Robot se tedy po tlesknutí rozjel a je v pohybu vpřed. Jako poslední musíme přidat příkaz, který správně vyhodnotí tlesknutí a robot se zastaví. Jinými slovy musí být vyhodnoceno, zda hodnota zvuku, zatímco se robot pohybuje vpřed, nepřekročila 80. Jakmile se tak stane, motory se zastaví. Použijeme proto příkaz podmíněného vykonávání if(), jehož podmínka bude, že hodnota zvuku je větší než 80.

if (SensorValue(zvukovy) > 80) 
 {
   motor[motorA] = 0; 
   motor[motorB] = 0; 
 }
 

 

Výsledný program

Po správném sestavení jednotlivých kroků dostaneme následující program, který může být základem pro složitější programové konstrukty.

 
// deklarace zvukoveho senzoru
#pragma config(Sensor, S1, zvukovy, sensorSoundDB)
 
task main()
{
 wait1Msec(500);
// dokud je zvuk < 80, robot stoji 
 while(SensorValue(zvukovy) <= 80) 
 {
   motor[motorA] = 0; 
   motor[motorB] = 0; 
 }
// jakmile je zvuk > 80, rozjede se
 if (SensorValue(zvukovy) > 80) 
 {
   wait1Msec(200); 
   while(SensorValue(zvukovy) <= 80) 
    { 
      motor[motorA] = 50; 
      motor[motorB] = 50; 
    }
 }
// kdyz je zvuk > 80 zastavi se
 if (SensorValue(zvukovy) > 80) 
 {
   motor[motorA] = 0; 
   motor[motorB] = 0; 
 }
}
 

 

Program ke stažení

Stažení ve formátu .c

 

Rozšiřující příklad

Jak jsme si vysvětlili v úvodu, příklad měl pouze ukázat možnosti ovládání robota hlasem. Můžete se pokusit sestavit robota, který bude reagovat na povely jako "Jeď!", "Stůj!", "Zatoč vlevo!" nebo "Zatoč vpravo!". Tento příklad je z kategorie pokročilých. Vzorové řešení spolu s popisem v angličtině naleznete ZDE

1 1 1 1 1 1 1 1 1 1 Hodnocení 3.00 (2 hodnocení)

KURZ: Světelný senzor

Světelný senzor je vstupní zařízení sloužící pro orientaci robota. Mezi jeho hlavní funkce patří rozeznávání světla a tmy a také měření intenzity světla. Jeho hlavní uplatnění je pro navigaci robota. Díky použití světelného senzoru může robot sledovat například dráhu nakreslenou na podkladu, která je dostatečně kontrastní s okolím plochy. Senzor se k řídící jednotce NXT připojuje standardně pomocí kabelu do jednoho ze čtyř vstupních portů (1-4).

U stavebnice LEGO Mindstorms EV3 kombinuje tyto funce barevný senzor (colour senzor), který dokáže měřit intenzitu světla v okolí, intenzitu odraženého světla a zároveň rozeznávat barvy, z čehož je odvozen také jeho název.

Použití v programovacích prostředích

NXT-G

BLOK PRO OVLÁDÁNÍ MOTORU

Rozcestník


Umístění bloku

Blok LightSensorDragged Light Sensor pro ovládání světelného senzoru nalezneme v programovacím prostředí NXT-G v paletě icon completeCompleteSensorHilight Sensor.

NXTG LightSenzor rozbaleny

 

Popis bloku

Programový blok LightSensorDragged Light Sensor obsahuje celkem sedm různých konektorů pro propojení s dalšími bloky programu:

Port Port - určuje, ke kterému ze čtyř vstupních portů je senzor připojen (1-4).

TriggerPoint TriggerPoint- značí nastavenou vstupní hodnotu intenzity světla, která je srovnávána s hodnotou snímanou senzorem. 

GreaterLessGreater / Less - hodnota logického datového typu sloužící pro srovnání dvou hodnot (větší nebo menší).

Floodlight Generate Light - určuje, zda během snímání hodnot svítí LED dioda senzoru.

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

Intensity Intensity - udává hodnotu intenzity světla snímanou senzorem na stupnici (0-100).

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

Aktuální nastavení bloku vyjadřují tři ikonky. První je číslo, které se nachází vpravo nahoře a označuje vstupní port, ke kterému je senzor připojen. Níže se poté zobrazuje, zda LED dioda generuje světlo Floodlight a také úroveň intensity světla Intensity.

 

Parametry bloku

NXTG LightSenzor

Programový blok světelného senzoru umožňuje nastavit následující parametry:

Port: slouží k určení vstupního portu řídící jednotky, ke kterému je senzor připojen.

Compare: sekce slouží k nastavení vstupních dat určených ke srovnání. Pomocí tažítka je možné nastavit intenzitu světla. Volby na obou koncích tažítka umožňují nastavit, jestli chceme zjišťovat, zda světlo snímané senzorem je tmavší než nastavená hodnota intenzity či světlejší. Znaménko větší či menší lze volit i o krok níže a stejně tak zadávat ručně hodnotu intenzity.

Function: zaškrtnutím volby Generate light (generovat světlo) udělujeme příkaz k rozsvícení vláknové žárovky na čelní straně senzoru.

Po spuštění programu začne světelný senzor snímat hodnotu intenzity světla ve svém okolí. Zjištěná hodnota se průběžně zobrazuje ve žlutém poli na levé straně programového bloku (na obrázku hodnota 34).

RobotC

Příkazy pro ovládání světelného senzoru

Světelný senzor obsahuje vláknovou žárovku, jejíž svit lze programově ovládat. Před každým použití jej musíme správně nakonfigurovat a zajistit tak bezproblémový chod. Snímané hodnoty lze zpracovávat ve dvou režimech. První je klasický a druhý ve formátu RAW.

Rozcestník


Nastavení senzoru

Ještě než začneme v programovacím prostředí RobotC pracovat se světelný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 (S2 = port 2). Následuje volitelný název senzoru (svetelny). Posledním parametrem je druh senzoru (sensorLightActive = světelný senzor). Tato deklarace je v úvodu každého programu, kde budeme pracovat se senzory nezbytná.

 
#pragma config(Sensor, S2, svetelny, sensorLightActive) // 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ů.


Generování světla žárovkou

Snímání intenzity světla světelným senzorem může být doprovázeno světlem z žárovky umístěné na přední části senzoru. Parametr, který vyjadřuje činnost či nečinnost žárovky se nazývá sensorLightActive nebo sensorLightInactive. Tento parametr se používá ve spojení s příkazem SensorType[], u kterého je nutné v závorce zadat název daného senzoru, který jsme si nadefinovali v úvodu programu.

 
SensorType[Svetelny] = sensorLightActive; // LED dioda senzoru generuje po celou dobu chodu programu svetlo.
SensorType[Svetelny] = sensorLightInactive; // LED dioda senzoru je neaktivni, negeneruje svetlo. 
 

Nastavení hodnoty intenzity světla v procentech

Volitelná hodnota intenzity světla, která je určena k programovému zpracování a porovnání s hodnotou snímanou senzorem se nastavuje pomocí příkazu SensorValue[]. V závorce je nutné uvést název senzoru, který jsme si nadeklarovali v úvodu programu. Rozsah číselné hodnoty je zadáván pomocí porovnávacích znamének, která značí hodnotu větší, menší nebo rovnu zadané hodnotě (>, < nebo =).

 
SensorValue[Svetelny] < 45; // Hodnota intenzity svetla je nizsi nez 45.
SensorValue[Svetelny] > 45; // Hodnota intenzity svetla je vyssi nez 45.
SensorValue[Svetelny] = 45; // Hodnota intenzity svetla je rovna 45.
 

Využití hodnoty intenzity světla v RAW

Hodnota udávaná jako raw, je vyjádření hodnoty přečtené senzorem v čisté, neškálované podobě. Lze s ní pracovat v rozmezí od 0 do 1023. Pro vyjádření této hodnoty slouží příkaz SensorRaw[]. V závorce je nutné uvést název senzoru, který jsme si nadeklarovali v úvodu programu. Stejně jako tomu bylo u předchozího vyjádření hodnot v procentech, je možné i zde ovlivnit rozsah hodnot pomocí porovnávacích znamének.

 
SensorRaw[Svetelny] < 512; // Hodnota intenzity svetla v RAW je nizsi nez 512. 
SensorRaw[Svetelny] > 512; // Hodnota intenzity svetla v RAW je vyssi nez 512.
SensorRaw[Svetelny] = 512; // Hodnota intenzity svetla v RAW je rovna 512.
 

EV3

Blok pro práci s barevným senzorem 

Rozcestník


Umístění bloku pro práci s barevným senzorem

Programový blok Colour Sensor je umístěn v paletě Sensor Sensor.

UMISTENI BAREVNY


Změna režimu

Programový blok Colour Sensor můžeme využívat ve třech 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).

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

WIRED


Režimy programového bloku

Measure - Colour (měření barvy)

Režim sloužící k identifikaci barvy snímaného povrchu. Programový blok obsahuje v tomto režimu jediný výstupní port, který vrací číselnou návratovou hodnotu odpovídající zjištěné barvě.

MEASURE COLOR

Identification 501 MeasuredColorColour - výstupní port vracející číselnou návratovou hodnotu odpovídající zjištěné barvě. Návratové hodnoty mohou být následující:

  • 0 = žádná barva
  • 1 = černá
  • 2 = modrá
  • 3 = zelená 
  • 4 = žlutá 
  • 5 = červená
  • 6 = bílá
  • 7 = hnědá 

 

 

Measure - Reflected Light Intensity

Režim sloužící k měření intenzity světla odraženého od aktuálně snímaného povrchu. Programový blok obsahuje v tomto režimu jediný výstupní port.

REFLECTED LIGHT

Identification 502 MeasuredLight Light - návratovou hodnotou výstupního portu je číselná hodnota odpovídající intenzitě odráženého světla snímaného povrchu.

 

 

Measure - Ambient Light Intensity

Režim sloužící k měření intenzity světla v okolí. Programový blok obsahuje v tomto režimu jediný výstupní port.

AMBIENT LIGHT

Identification 502 MeasuredLightLight - návratovou hodnotou výstupního portu je číselná hodnota odpovídající intenzitě světla snímaného z okolního prostředí. 

 

 

Compare - Colour

Režim sloužící k ověření, zda barva snímaného povrchu odpovídá zadané/ým barvě/ám. Programový blok obsahuje v tomto režimu jeden vstupní a dva výstupní porty.

COMPARE COLOR

Identification 019 Color NoColor Set of Colours - vstupní port sloužící k zadání jedné či více barev. Při snímání se bude zjišťovat, zda snímaný povrch odpovídá zadané barvě/ám.

Identification 030 ComparisonType EqualCompare Result - výstupní port vracející logickou návratovou hodnotu podle toho, zda byla zadaná barva/y detekována/y (True) nebo nikoliv (False).

Identification 501 MeasuredColorColour - výstupní port vracející číselnou návratovou hodnotu odpovídající zjištěné barvě.

 

 

Compare - Reflected Light Intensity

Režim sloužící k porování zjištěné intenzity odraženého světla se zadanou prahovou hodnotou. Programový blok obsahuje v tomto režimu dva vstupní a dva výstupní porty.

COMPARE REFLECTED

Identification 034 ComparisonType LessThan Compare Type - výběr způsobu porovnání zjištěné hodnoty s prahovou. Vybíráme, zda chceme zjistit, jestli je snímaná hodnota menší, větší nebo rovna prahové. 

Identification 412 Threshold Less 0Threshold Value - prahová hodnota, s kterou se porovnává intenzita odraženého světla zjištěná senzorem.

Identification 030 ComparisonType EqualCompare Result - výstupní port vracející logickou návratovou hodnotu v závislosti na tom, zda zjištěná hodnota byla v námi požadované intenzitě vůči prahové (True) či nikoliv (False).

Identification 502 MeasuredLightLight - návratovou hodnotou výstupního portu je číselná hodnota odpovídající intenzitě světla odraženého od snímaného povrchu. 

 

 

Compare - Ambient Light Intensity

Režim sloužící k porování zjištěné intenzity světla v okolí se zadanou prahovou hodnotou. Programový blok obsahuje v tomto režimu dva vstupní a dva výstupní porty.

COMPARE AMBIENT

 Identification 034 ComparisonType LessThan Compare Type - výběr způsobu porovnání zjištěné hodnoty s prahovou. Vybíráme, zda chceme zjistit, jestli je snímaná hodnota menší, větší nebo rovna prahové. 

Identification 412 Threshold Less 0Threshold Value - prahová hodnota, s kterou se porovnává intenzita snímaného světla z okolí zjištěná senzorem.

Identification 030 ComparisonType EqualCompare Result - výstupní port vracející logickou návratovou hodnotu v závislosti na tom, zda zjištěná hodnota byla v námi požadované intenzitě vůči prahové (True) či nikoliv (False).

Identification 502 MeasuredLightLight - návratovou hodnotou výstupního portu je číselná hodnota odpovídající intenzitě snímaného světla v okolí senzoru. 

 

 

Calibrate Reflected Light Intensity - Minimum

Režim sloužící pro kalibraci senzoru, díky kterému nastavíme prahovou hodnotu, která bude senzorem dále vyhodnocována jako minimální a bude tedy označována jako 0. Programový blok v tomto režimu obsahuje jeden vstupní port.

MINIMUM

Identification 502 MeasuredLightValue - hodnota zadávaná při kalibraci senzoru. Dále bude při snímání chápána jako minimum.

 

 

Calibrate Reflected Light Intensity - Maximum

Režim sloužící pro kalibraci senzoru, díky kterému nastavíme prahovou hodnotu, která bude senzorem dále vyhodnocována jako maximální a bude tedy označována jako 100. Programový blok v tomto režimu obsahuje jeden vstupní port.

MAXIMUM

 Identification 502 MeasuredLightValue - hodnota zadávaná při kalibraci senzoru. Dále bude při snímání chápána jako maximum.

 

 

Calibrate Reflected Light Intensity - Reset

Režim sloužící ke zrušení všech změn provedených při kalibraci a tudíž navrácení senzoru opět do výchozího nastavení.

RESET


MOŽNOSTI PRAKTICKÉHO VYUŽITÍ

Světelný senzor snímá veličiny ve svém okolí. Chování robota tak může být ovlivněno určitou hodnotou. Může být reagováno na nízkou či vysokou intenzitu světla. Následkem může být kupříkladu rozsvícení signalizačních diod, výpis na displej, či jiná reakce robota.
Druhou možností využití je světelného senzoru je při pohybu robota. Může totiž snímat povrch po kterém se pohybuje a vyhodnocovat intenzitu odráženého světla od různě barevných povrchů. Využívá se toho například v úlohách, ve kterých se robot pohybuje po předem vytyčené dráze, která má podobu různě zakřivené černé čáry na světlém porchu. Robot se tedy musí pohybovat kupředu a přitom neustále zjištovat, zda se stále nachází nad černou čárou či nikoliv.

VYUŽITÍ Světelného SENZORU

Praktické využití světelného senzoru si ukážeme právě na příkladu, ve kterém se robot pohybuje po černé čáře. Program by měl být univerzální, aby šel použít na různé dráhy. Použijeme tedy robota, jehož řízení bude zajištěno dvěma motory pohánějícími přední kola. V přední části robota bude umístěn světelný senzor namířený směrem dolů, který bude zjišťovat intenzitu odráženého světla od povrchu dráhy.


NXT-G

Pohyb robota po černé čáře

Během realizace programu budeme muset ošetřit několik situací. Nejprve musíme určit mez intenzity světla, při které se bude měnit chování robota. Robot musí neustále zjišťovat, zda se nachází na černé čáře. Bude tedy provádět jakýsi kmitavý pohyb od jedné strany čáry ke druhé. Jakmile zjistí, že je v místě, kde je okraj černé čáry, vnější kolo zrychlí a robot zamíří zároveň vpřed, ale také ke druhému okraji čáry. Musíme si také uvědomit co vrací světelný senzor při snímání černého a světlého povrchu. Pokud snímá intenzitu světla na světlém povrchu, je hodnota podstatně vyšší, než pokud senzor namíříme na černý povrch.

Krok 1 - Rozlišení intenzity světla

Robot musí při průjezdu vytyčenou dráhou zjišťovat, zda se stále nachází nad černou čárou nebo zda náhodou nevyjel mimo. Toto chování bude rozlišeno intenzitou odráženého světla. Pro rozlišení těchto hodnot použijeme blok podmíněného vykonání Blok Switch Switch. Podmínka bude řízena hodnotou ze senzoru, proto v sekci Control zvolíme možnost Sensor. Typ senzoru bude LightSensorDragged Light Sensor (světelný senzor). Zvolíme příslušný port, ke kterému je připojen a přejdeme k nastavení hodnot. V našem příkladu jsme zvolili jako mezní hodnotu 30%. To znamená, že robot bude zjišťovat, zda je snímaná barva tmavší než 30% či nikoliv (0 = nejtmavší, 100 = nejsvětlejší). Mezní hodnotu můžete nastavit i jinou. Záleží na tom, po jakém povrchu se robot pohybuje. Na lesklejších površích může senzor vracet pro stejný barevný odstín jiné hodnoty než na povrchu matném. Kompletní nastavení podmínky vidíte na obrázku.

Sledovac switch blok

Doporučení: před vytvářením programu si nejprve zjistěte intenzitu odráženého světla povrchů, po kterých se bude robot pohybovat. Použijte světelný senzor a hodnou si vypisujte například na displej řídící jednotky. Snáze tak určíte mezní hodnotu.

 

Krok 2 - Pohyb po čáře

Po zjištění, jaký povrch se nachází pod senzorem je nutné nastavit další chování robota. Robot nyní bude provádět kmitavý pohyb od jedné strany čáry ke druhé. Naším úkolem je zde pouze přiřadit do každé části podmínky přesně opačné chování. Jestliže tedy bude intenzita světla nižší jak 30%, budeme chtít, aby se motor B zastavil a naopak motor C prudce vyrazil vpřed. Použili jsme výkon 75%. Díky tomu robot popojede mírně šikmo vpřed a dojede k okraji čáry. Nyní ale chceme, aby nevyjel mimo, ale natočil se opačně a rozjel se k druhému okraji čáry. Do druhé části podmínky tedy vložíme znovu dva bloky MotorDragged Motor a nastavíme jim opačné chování než v první části podmínky. Motor C se nyní zastaví a motor B vyrazí prudce vpřed. Díky tomu bychom měli zaručit, že robot bude kmitavým pohybem neustále pokračovat v jízdě po čáře, kterou neopustí.

 

Krok 3 - Dokončení programu

Potřebujeme, aby se program vykonával neustále dokola, proto celou podmínku umístíme do nekonečného cyklu LoopBig Loop.

 

Výsledný program

Tento styl řešení průjezdu bludištěm po čáře pomocí světelného senzoru patří k těm nejjednodušším. Na obrázku můžete vidět kompletní program.

Sledovac cary komplet

 

Program ke stažení

Stažení ve formátu .rbt

RobotC

POHYB ROBOTA PO ČERNÉ ČÁŘE

Realizace příkladu projetí robota po černé čáře v programovém prostředí RobotC není příliš náročná. Musíme si uvědomit, jak požadujeme, aby se robot v různých situacích choval a na čem jeho chování závisí.

Krok 1 - Deklarace senzoru

Jelikož v programu využijeme světelný senzor, musíme si jej, jako v každém příkladu, kde senzory používáme, nadeklarovat. Deklaraci provedeme pomocí průvodce deklarací v sekci Robot > Motors and Sensors Setup. Výsledný zápis deklarace vidíte níže.

 
#pragma config(Sensor, S1, svetelny, sensorLightActive)
 
 
Krok 2 - Rozlišení intenzity odráženého světla

Robot se při průjezdu po čáře bude orientovat na základě hodnoty zjištěné intenzity světla odrážené od podložky. Bude se jinak chovat pokud zjistí, že je nižší než nastavená mez a jinak pokud bude vyšší. Jako pomyslnou mez jsme si pro potřeby našeho programu zvolili hodnotu 30%. Světelný senzor vrací hodnotu v rozmezí 0 - 100. Hodnota 0 odpovídá černé barvě a 100 bílé barvě. Robot tedy nejprve zjistí, na porvchu jaké barvy se nachází a následně udělá šikmý pohyb vpřed až narazí na okraj čáry. Zde zjistí, že je na okraji, kde už se nachází podklad jiné barvy, a tak vykoná šikmý pohy na opačnou stranu. Tímto kmitavým pohybem ze strany na stanu projede po celé délce čáry.

Doporučení: před vytvářením programu si nejprve zjistěte intenzitu odráženého světla povrchů, po kterých se bude robot pohybovat. Použijte světelný senzor a hodnou si vypisujte například na displej řídící jednotky. Snáze tak určíte mezní hodnotu.

 
Krok 3 - Pohyb po čáře

Nyní již přejdeme k samotnému zápisu kódu. Potřebujeme ošetřit dvě nastalé situace. Použijeme tedy podmínku if(). Jejím parametrem bude skutečnost, kdy hodnota zjištěná světelným senzorem bude nižší než 30. Hodnotu ze senzoru vyjadřujeme příkazem SensorValue(). Zápis tedy bude vypadat takto: SensorValue(svetelny) < 30. V těle podmínky se bude vykonávat samotný pohyb robota. Použijeme tedy příkaz motor[]. Jednomu z motorů nastavíme, aby stál (výkon = 0) a druhý se musí pohybovat vpřed (výkon = 75). Tím jsme ošetřili první možnost, kdy je hodnota intenzity nižší, než je stanovená mez. Zbývá vyřešit druhou možnost. Za podmínku tedy napíšeme slovo else (jinak - druhá možnost podmíněného vykonávání) a doplníme opět příkazy pro ovládání motorů, ovšem s přesně opačnými hodnotami výkonu. Díky tomu zajistíme kmitavý pohyb robota i v opačném směru.

 
 if(SensorValue(svetelny) < 30)
 {
   motor[motorB] = 0;
   motor[motorC] = 75;
 } 
 else
 {
   motor[motorB] = 75;
   motor[motorC] = 0;
 }
 
 
Krok 4 - Dokončení programu

Program by byl takto vykonán pouze jednou a skončil by. Musíme zajistit jeho neustále provádění. Celý programový zápis tedy umístíme do nekonečného cyklu while().

 
Výsledný program
 
#pragma config(Sensor, S1, svetelny, sensorLightActive)
 
task main()
{
while(true)
{
 if(SensorValue(svetelny) < 30)
 {
   motor[motorB] = 0;
   motor[motorC] = 75;
 }
 else
 {
   motor[motorB] = 75;
   motor[motorC] = 0;
 }
}
 
}
 

 

Program ke stažení

Stažení ve formátu .c

1 1 1 1 1 1 1 1 1 1 Hodnocení 2.50 (2 hodnocení)

KURZ: Dotykový senzor

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