Zvukový senzor MAX9814

pokornja
Příspěvky: 25
Registrován: 09 led 2023, 13:50
Reputation: 0

Zvukový senzor MAX9814

Příspěvek od pokornja » 25 úno 2023, 19:25

Dobrý večer přeji,
chtěl bych poprosit o radu s modulem mikrofonu se zesilovačem MAX9814 (https://www.laskakit.cz/max9814-cma-454 ... m-max9814/). Jsem úplný arduino nováček a snažím se popasovat s následující myšlenkou. Potřebuji použít zmíněný zvukový modul, který má pro mé účely, jak jsem zjistil, dostatečnou citlivost, ke snímání hlasitosti různých zvuků. Jakmile hlasitost překročí stanovenou mez, potřebuji sepnout piezo bzučák, který bude indikovat překročení hlasitosti pípáním. Snažil jsem se to nějakým způsobem zprovoznit tak, že dle intenzity signálu analogového vstupu mi to zapíná tři různě barevné LEDky, přičemž při překročení meze se rozsvítí červená LED a zapne bzučák. V praxi to vypadá takto: https://youtu.be/6JQn1JbIzPc
A kód vypadá následovně:

Kód: Vybrat vše

int zvuk = A0;
int LED_G = 2;
int LED_Y = 4;
int LED_R = 6;
int bzucak = 12;
int hlasitost;

void setup() {
  // put your setup code here, to run once:

pinMode (zvuk, INPUT) ;
pinMode (LED_G, OUTPUT) ;
pinMode (LED_Y, OUTPUT) ;
pinMode (LED_R, OUTPUT) ;
pinMode (bzucak, OUTPUT) ;
Serial.begin (9600);

}


void loop() {
  // put your main code here, to run repeatedly:

hlasitost = analogRead(zvuk);
Serial.println(hlasitost);


if (hlasitost > 380){
  digitalWrite (LED_G, HIGH);
  digitalWrite (LED_Y, HIGH);
  digitalWrite (LED_R, HIGH);
  digitalWrite (bzucak, HIGH);
  delay (200);
  
}

else if (hlasitost > 340){
  digitalWrite (LED_G, HIGH);
  digitalWrite (LED_Y, HIGH);
   
}

else if (hlasitost > 290){
  digitalWrite (LED_G, HIGH);
   
}

else {
  digitalWrite (LED_G, LOW);
  digitalWrite (LED_Y, LOW);
  digitalWrite (LED_R, LOW);
  digitalWrite (bzucak, LOW);
  
}

delay(1);
}
Co mi ale není jasné je to, jakou a zda nastavit pauzu po provedení všech příkazů (momentálně tam mám delay 1 ms) a zda to mám takto vlastně celé správně. Můj záměr je totiž takový, že by to mělo reagovat pouze na konkrétní zvuky typu dupání/běhání a spínat bzučák. Ideálně bych potřeboval jiné zvuky odfiltrovat, tzn. aby to jindy nespínalo. Známý mi radil, že budu muset jít přes komparátor, protože je nutné ten audiosignál nějak zpracovat, ale z toho nejsem vůbec chytrý... Další věc je ta, že někdy to sepne, ale někdy ne. Přijde mi, že tam jsou nějaké mikroprodlevy, když jsou dva zvuky rychle za sebou. Poradíte prosím, jakou cestou se vydat? Moc děkuji!

Uživatelský avatar
Caster
Příspěvky: 380
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: Zvukový senzor MAX9814

Příspěvek od Caster » 25 úno 2023, 20:45

To zpoždění 1 ms tam myslím nemusíš vůbec dávat. Podívej se na projekt Interfacing MAX9814 Electret Microphone Amplifier Module with Arduino, který ti na sériové lince (plotter) bude vypisovat, jak vypadá signál tvých zvuků. Pak bych řešil, jak případně tvůj program upravit.

Vyzkoušel bych také nastavení různé citlivosti mikrofonu. Defaultně je 60 dB. propojením pinu "Gain" se zemí 50 dB, "Gain" s Vdd 40 dB.

V popisu* Electret Microphone Amplifier - MAX9814 with Auto Gain Control uvádí, že lze také nastavit dobu náběhu kompresoru do stavu snížení zesílení a času pro opětné vrácení do výchozí pozice (*You can also change the Attack/Release ratio, from the default 1:4000 to 1:2000 or 1:500.). Jak to udělat bude asi popsáno v manuálu k MAX9814.

pokornja
Příspěvky: 25
Registrován: 09 led 2023, 13:50
Reputation: 0

Re: Zvukový senzor MAX9814

Příspěvek od pokornja » 25 úno 2023, 22:36

Děkuju za tipy, pročtu to. O těch různých citlivostech dle připojeného pinu vím, akorát to teď zkouším, jak se to chová. Jen teda pořád nemůžu najít v Serial Plotteru nějakou možnost, aby to tak rychle furt neutíkalo ten graf. Letí to jak blázen pořád dál a dál. Dá se to nějak zpomalit? Já už fakt nevím, co s tím :D

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Zvukový senzor MAX9814

Příspěvek od kiRRow » 26 úno 2023, 10:22

Komparátor bys použil, pokud bys chtěl z analogového signálu udělat digitální. Pokud chceš odstranit určitou část zvuku, potřebuješ filtr. Pokud chceš třeba jen basové zvuky, použiješ dolní propust https://cs.wikipedia.org/wiki/Doln%C3%AD_propust
Filtry jsou i aktivní a stejně jako komparátor používají operační zesilovač. Možná zde se vzal ten nápad s kompartátorem.

pokornja
Příspěvky: 25
Registrován: 09 led 2023, 13:50
Reputation: 0

Re: Zvukový senzor MAX9814

Příspěvek od pokornja » 26 úno 2023, 10:55

Díky za vysvětlení, zrovna studuju vše možné kolem toho po zahraničních fórech. Abych pravdu řekl, tak vlastně nevím, co přesně potřebuju, protože do toho vůbec nevidím. Napadlo mě teď akorát to, jestli by se ten audiosignál neměl třeba prohnat přes FFT, abych dostal nějaké frekvenční spektrum, na základě kterého bych pak zkoumal přítomnost nízké frekvence (= dupání). Pokud by tam byla, tak by to vykonalo příkaz. Jestli potřebuju z analogového signálu udělat digitální, to nevím. Přemýšlel jsem nad tím ještě tak, jestli by třeba nešlo ten analogový signál nějak převést do "absolutní hodnoty", tzn. tu sinusovku nějak narovnat, aby měla jen dolní baselinu a všechno šlo pouze směrem nahoru, podle toho bych pak možná mohl říct, zda je takový modifikovaný signál už dostatečně "hlasitý" (tzn. stanovil mez) a na základě toho by se vykonal příkaz. To mě přišlo tak jakoby logické, ale přemýšlím nad tím jako úplný laik :)

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Zvukový senzor MAX9814

Příspěvek od kiRRow » 26 úno 2023, 11:22

Potřebuješ výstup z toho mikrofonu prohnat přes filtr dolní propust. V podstatě potřebuješ reproduktorovou výhybku pro basový reproduktor. Hodnoty pak musíš upravit tak, aby ti odfiltrovaly to co potřebuješ. Když si to dupnutí nahraješ na MP3 do počítače, můžeš se pak podívat pomocí nějakého programu (např Goldwave), která frekvence je nejvýraznější a dle toho navrhnout filtr. Výpočty vypadají složitě, ale jsou na to i kalkulačky https://www.digikey.cz/en/resources/con ... ass-filter

pokornja
Příspěvky: 25
Registrován: 09 led 2023, 13:50
Reputation: 0

Re: Zvukový senzor MAX9814

Příspěvek od pokornja » 26 úno 2023, 11:38

Dobře, děkuju, mrknu na to. Teď mi ještě vlastně došlo, co přesně bych do startu potřeboval - aby se to chovalo jako hlukoměr, tzn. ideálně bych z toho mikrofonního výstupu potřeboval dostat něco jako je na obrázku v příloze. Tak jsem myslel tu "absolutní hodnotu". Tohle by mi možná do začátku stačilo a pak bych se zabýval tím, jestli to potřebuju nějak filtrovat. Pravděpodobně ano, dokážu si představit, že by to třeba na dupání dělalo jeden úkon a na jiný ruch jiný úkon, to by byla paráda, ale hlukoměr by mi teď úplně stačil, abych zjistil, zda to bude fungovat ;)
Přílohy
hlukomer.png

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Zvukový senzor MAX9814

Příspěvek od kiRRow » 26 úno 2023, 12:39

Mrkni se na to jak funguje "barevná hudba" ... Hudební signál je pomocí filtrů rozdělen na 3 pásma, každé pásmo je vyhodnocováno komparátorem (to ti dělá to arduino) a dle toho rozsvěcuje světla.

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Zvukový senzor MAX9814

Příspěvek od kiRRow » 26 úno 2023, 12:54

Pokud chceš dostat z hudebního signálu pouze kladnou vlnu, stačí jedna dioda. Pokud chceš tu zápornou vlnu převést na kladnou, potřebuješ usměrňovací můstek https://cs.wikipedia.org/wiki/Usm%C4%9B ... %C5%AFstek

pokornja
Příspěvky: 25
Registrován: 09 led 2023, 13:50
Reputation: 0

Re: Zvukový senzor MAX9814

Příspěvek od pokornja » 26 úno 2023, 13:00

Trošku jsem zagooglil a našel jsem tohle: https://iotprojectsideas.com/arduino-ba ... nd-sensor/
Tak jsem to hodil do mého kódu, to by mohlo fungovat, ne?

Kód: Vybrat vše

const int sampleWindow = 50;                              // Sample window width in mS (50 mS = 20Hz)
unsigned int sample;

int zvuk = A0;
int LED_G = 2;
int LED_Y = 4;
int LED_R = 6;


void setup() {
  // put your setup code here, to run once:

pinMode (zvuk, INPUT) ;
pinMode (LED_G, OUTPUT) ;
pinMode (LED_Y, OUTPUT) ;
pinMode (LED_R, OUTPUT) ;
Serial.begin (19200);

}

void loop() {
  // put your main code here, to run repeatedly:


unsigned long startMillis= millis();                   // Start of sample window
   float peakToPeak = 0;                                  // peak-to-peak level
 
   unsigned int signalMax = 0;                            //minimum value
   unsigned int signalMin = 1024;                         //maximum value
 
                                                          // collect data for 50 mS
   while (millis() - startMillis < sampleWindow)
   {
      sample = analogRead(zvuk);                    //get reading from microphone
      if (sample < 1024)                                  // toss out spurious readings
      {
         if (sample > signalMax)
         {
            signalMax = sample;                           // save just the max levels
         }
         else if (sample < signalMin)
         {
            signalMin = sample;                           // save just the min levels
         }
      }
   }
 
   peakToPeak = signalMax - signalMin;                    // max - min = peak-peak amplitude
   int db = map(peakToPeak,20,900,49.5,90);             //calibrate for deciBels
 
 Serial.print(48);
 Serial.print(" ");
 Serial.print(80);
 Serial.print(" ");
 Serial.println(db);
  

  if (db <= 55){
  digitalWrite (LED_G, HIGH);
  digitalWrite (LED_Y, LOW);
  digitalWrite (LED_R, LOW);
  }

  else if (db > 55 && db < 60){
  digitalWrite (LED_G, HIGH);
  digitalWrite (LED_Y, HIGH);
  digitalWrite (LED_R, LOW);
  }

  else if (db >= 60){
  digitalWrite (LED_G, HIGH);
  digitalWrite (LED_Y, HIGH);
  digitalWrite (LED_R, HIGH);
  }
   
}

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 10 hostů