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

KAPITOLY

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.