KURZ: Zvukový senzor
- Podrobnosti
- Mgr. Jan Baťko
- Aktualizováno: 08.09.2017
- Zobrazení: 14572
KAPITOLY
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 Sound Sensor nalezneme v programovacím prostředí NXT-G v paletě Complete > Sensor.
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 - vyjadřuje, ke kterému ze čtyř vstupních portů je senzor připojen (1-4).
Trigger Point- značí nastavenou vstupní hodnotu hlasitosti zvuku, která je porovnávána s hodnotou snímanou senzorem.
Greater / Less - hodnota logického datového typu sloužící pro srovnání dvou hodnot (větší nebo menší).
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.
Yes / No - hodnota logického datového typu vyjadřující výsledek porovnání.
Sound Level - vyjadřuje hodnotu získanou ze zvukového senzoru v rozpětí 0-100%.
Raw Value - udává čistou hodnotu hlasitosti zvuku snímanou senzorem na stupnici 0-1024.
Aktuální nastavení programového bloku označuje ikona , 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
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
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 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 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).
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 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 Move vyšle signál k zastavení.
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 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í.
Program ke stažení
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í
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.