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

KAPITOLY

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í 1.00 (1 hodnocení)

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