KURZ: Zvukový senzor

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

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