Akustický spínač

Akustický spínač bývá u prodejců zařazen mezi výrobky pro Arduino, nicméně je podobně jako většina jednoduchých senzorů univerzálně použitelný i pro jiné mikrokontroléry respektive jednoduché řídící systémy a počítače. Co od něj můžeme čekat?

Modul má včetně vystupujícího elektretového mikrofonu na jednom konci a kontaktů konektoru na druhém rozměry 42x15x14 mm (udávané rozměry 32x17x8 mm příliš nesouhlasí s realitou). Na desce jsou dvě miniaturní červené LED, ta vedle integrovaného obvodu (operačního zesilovače) signalizuje přítomnost napájecího napětí 4 – 6 V, ta vedle trimru se rozsvítí při vybuzení zvukem.

IMGP2278bModul má dva výstupy. DO (digital output) poskytuje logický signál v úrovních blízkých rozsahu napájecího napětí, v klidu je v úrovni L. AO (analog output) má v klidu stejnosměrnou úroveň napětí ½ napájecího napětí, objevuje se na něm zesílený analogový signál z mikrofonu.

hantek566_1

Žlutá stopa – analogový výstup, modrá stopa – digitální výstup (záznam tlesknutí na vzdálenost 0,5 m)

Bylo by možné čekat, že na analogovém výstupu najdeme napětí odpovídající intenzitě zvuku (obálky) a na digitálním jediný pulz od počátku detekce dostatečně intenzivního zvuku až do jeho konce. Není to tak. Obálka se nedetekuje, na analogovém výstupu jsou všechny kmity, které mikrofon přijal, často i něco víc. Podobně na digitálním jsou tytéž kmity tvarované komparátorem s velmi malou hysterezí. Například při zapískání najdeme na výstupech harmonické kmity (včetně zákmitů) a tvarované pulzy. Spínač neobsahuje omezení frekvence dolní propustí, která by odstranila zákmity kolem průchodu signálu nulou.

hantek566_3

Výstupy při zapískání

hantek567_1

Výstupy při cinknutí šroubováku o šroubovák

Je-li zvuk dostatečně silný a dlouhý, můžeme opravdu na výstupu najít jeho kmity, při slabším zvuku se ale spínač chová nečekaně. Na výstupu se objeví vybuzené kmity s frekvencí kolem 2 MHz a série trvají různě, třeba jen 12 μs. Tento signál může mikrokontrolér (náhodně) zaregistrovat, ale při periodickém vzorkování stavu programem k tomu pravděpodobně nedojde.

Nastavení moduu je jednoduché. V tichu (při intenzitě pozadí, která má být ignorována) otáčíme trimerem tak dlouho, až indikační LED zhasne těsně u meze detekce. Je vhodné nechat spínač před nastavením běžet asi 10 minut, během nich se mírně posouvá práh sepnutí.

Co se týká citlivosti, v tichu je schopen spínač v interiéru detekovat tlesknutí nebo zapískání na píšťalku na vzdálenost asi 5 m, běžně se ale používá na vzdálenost do 2 m.

Při zpracování signálu mikrokontrolérem je nutné počítat s tím, že akustický spínač odešle na jeden zvukový podnět často stovky (až statisíce) krátkých impulzů, které mohou, ale nemusí odpovídat zvukové frekvenci. Ovládací zvuk by měl být krátký a intenzivní (například tlesknutí). Program musí po přečtení prvního pulzu počkat tak dlouho, až ovládací zvuk spolehlivě odezní. U delších zvuků se musí programem kontrolovat utichnutí na určenou dobu. Pokud jde o to zachytit zvuk spolehlivě, i když trvá krátce nebo je slabý, je třeba připojit digitální výstup senzoru na interrupt a detekovat náběžnou hranu na něm.


 

Následující příklad ukazuje, jak využít Arduino UNO k ovládání lampičky (LED na výstupu D13). Při prvním tlesknutí se LED rozsvítí, při dalším zhasne, digitální výstup ze senzoru je připojen na vstup A0. Pokud je zvuk trvalý, bude LED blikat. Testování přítomnosti signálu (úrovně H) je jednoduchou (co nejrychlejší) programovou smyčkou.

// LED na D13 ovladana akustickym spinacem
// digitálni vystup senzoru je na vstupu A0
boolean stav = false;        // promenna pro ulozeni stavu
void setup() {
  pinMode(13, OUTPUT);       // ovladana LED
  pinMode(A0, INPUT);        // signal od akustickeho spinace
}

void loop() {
  do {} while (digitalRead(A0) == 0); // rychle cteni vstupu
  stav = !stav;              // invertuj stav
  if (stav)
  {
    digitalWrite (13, HIGH); // rozsvit
  }
  else
  {
    digitalWrite (13, LOW);  // zhasni
  }
  delay(500);                // nereaguj 0.5 s
}

Tento program s programovým sledováním vstupu pracuje dobře a relativně spolehlivě, ale cenou za to je, že prakticky nestíhá dělat nic jiného. Čím řidší bude testování vstupu, tím je větší pravděpodobnost, že podnět od akustického spínače Arduinu „uteče“. Abychom se tomu vyhnuli a program se mohl zabývat jinými věcmi, v druhém pokusu zapojíme výstup z akustického čidla na pin 2 (INT 0) a využijeme interrupt k zaznamenání požadavku na změnu stavu světla.

// LED na D13 ovladana akustickym spinacem
// digitálni vystup senzoru je na vstupu D2
// s vyuzitim interruptu
volatile boolean stav = false;           // promenna pro ulozeni stavu
void setup() {
  pinMode(13, OUTPUT);                   // ovladana LED
  pinMode(2, INPUT);                     // signal od akustickeho spinace
  attachInterrupt(0, zmena, RISING);     // interrupt 0 pri vzestupne hrane
}

void loop() {
  delay(500);                            // program se venuje jine cinnosti
  if (stav) {
    digitalWrite(13, !digitalRead(13));  // zmena stavu LED
    stav = false;                        // dalsi zmena az po INT
  }
}

void zmena()                             // obsluha interruptu 0
{
  stav = true;
}

Změna stavu LED může nastat s malým zpožděním, nicméně takto reaguje i na velmi krátké a slabé podněty, což se projevuje jako zvýšení dosahu i spolehlivosti.