KURZ: Ultrazvukový senzor

KAPITOLY

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

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