Vier microfoons MAX9814

IDE gerelateerde berichten
Berichten: 5
Geregistreerd: 04 Okt 2019, 21:49

Vier microfoons MAX9814

Berichtdoor Vw181 » 05 Okt 2019, 08:52

Ik wil graag vier microfoons uitlezen om te bepalen waar het geluid vandaan komt.
Het lijkt met een microfoon goed te werken maar als ik de code probeer aan te passen voor vier microfoons niet.

Het vreemde is als ik een microfoon aansluit en drie los laat liggen krijg ik toch vier waardes?

Dit is de code:

Heeft iemand een tip voor me??

/****************************************
Example Sound Level Sketch for the
Adafruit Microphone Amplifier
****************************************/

const int sampleWindow = 50; // Sample window width in mS (50 mS = 20Hz)
const int BovenWaarde = 2;
unsigned int LinksVoor;
unsigned int RechtsVoor;
unsigned int LinksAchter;
unsigned int RechtsAchter;

void setup()
{
Serial.begin(9600);
}


void loop()
{
unsigned long startMillis= millis(); // Start of sample window
unsigned int peakToPeakLV = 0; // peak-to-peak level
unsigned int signalMaxLV = 0;
unsigned int signalMinLV = 1024;

unsigned int peakToPeakRV = 0; // peak-to-peak level
unsigned int signalMaxRV = 0;
unsigned int signalMinRV = 1024;

unsigned int peakToPeakLA = 0; // peak-to-peak level
unsigned int signalMaxLA = 0;
unsigned int signalMinLA = 1024;

unsigned int peakToPeakRA = 0; // peak-to-peak level
unsigned int signalMaxRA = 0;
unsigned int signalMinRA = 1024;

// collect data for 50 mS
while (millis() - startMillis < sampleWindow)
{
LinksVoor = analogRead(0);
if (LinksVoor < 1024) // toss out spurious readings
{
if (LinksVoor > signalMaxLV)
{
signalMaxLV = LinksVoor; // save just the max levels
}
else if (LinksVoor < signalMinLV)
{
signalMinLV = LinksVoor; // save just the min levels
}
}


{
RechtsVoor = analogRead(1);
if (RechtsVoor < 1024) // toss out spurious readings
{
if (RechtsVoor > signalMaxRV)
{
signalMaxRV = RechtsVoor; // save just the max levels
}
else if (RechtsVoor < signalMinRV)
{
signalMinRV = RechtsVoor; // save just the min levels
}
}
}


{
LinksAchter = analogRead(2);
if (LinksAchter < 1024) // toss out spurious readings
{
if (LinksAchter > signalMaxLA)
{
signalMaxLA = LinksAchter; // save just the max levels
}
else if (LinksAchter < signalMinLA)
{
signalMinLA = LinksAchter; // save just the min levels
}
}
}

{
RechtsAchter = analogRead(3);
if (RechtsAchter < 1024) // toss out spurious readings
{
if (RechtsAchter > signalMaxRA)
{
signalMaxRA = RechtsAchter; // save just the max levels
}
else if (RechtsAchter < signalMinRA)
{
signalMinRA = RechtsAchter; // save just the min levels
}
}
}
}
peakToPeakLV = signalMaxLV - signalMinLV; // max - min = peak-peak amplitude
double voltsLV = (peakToPeakLV * 5.0) / 1024; // convert to volts

peakToPeakRV = signalMaxRV - signalMinRV; // max - min = peak-peak amplitude
double voltsRV = (peakToPeakRV * 5.0) / 1024; // convert to volts

peakToPeakLA = signalMaxLA - signalMinLA; // max - min = peak-peak amplitude
double voltsLA = (peakToPeakLA * 5.0) / 1024; // convert to volts

peakToPeakRA = signalMaxRA - signalMinRA; // max - min = peak-peak amplitude
double voltsRA = (peakToPeakRA * 5.0) / 1024; // convert to volts



if (voltsLV > BovenWaarde)
{
Serial.print ("LV");
Serial.println(voltsLV);
}


if (voltsRV > BovenWaarde)
{
Serial.print ("RV");
Serial.println(voltsRV);
}


if (voltsLA > BovenWaarde)
{
Serial.print ("LA");
Serial.println(voltsLA);
}


if (voltsRA > BovenWaarde)
{
Serial.print ("RA");
Serial.println(voltsRA);
}

}

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Vier microfoons MAX9814

Berichtdoor Koepel » 06 Okt 2019, 06:18

Ik betwijfel of dit gaat lukken.

Wat voor geluid is het ?
Menselijke spraak, of iets dat in het hoorbare gebied ligt ?
Voor menselijke spraak is het nodig om het in te lezen met 16kHz, soms is 8kHz al voldoende (analoge telefoon kwaliteit).
Het hoorbare gebied is 20Hz tot 20kHz, daar is 44.1 kHz voor nodig (CD kwaliteit) of 48kHz (wordt door veel computers gebruikt).
Een Arduino Uno kan een ledje laten knipperen, en is niet geschikt voor het verwerken van audio.

Dan zou je eigenlijk een chip met DSP nodig hebben. Sommige Teensy boards hebben DSP mogelijkheden: https://www.pjrc.com/teensy/.

Kun je bij het schrijven van een bericht op dit forum de knop "Code" gebruiken om je sketch tussen code-tags te zetten ?

Als je een voorbeeld gebruikt, dan kun je er een link naar toe geven.
Dit is de bron die je gebruikt: https://learn.adafruit.com/adafruit-microphone-amplifier-breakout/measuring-sound-levels.

De microfoon-module die je gebruikt heeft een auto-gain, een automatische versterking. Dus je weet nooit hoe hard een geluid is. Je kunt dus ook niet bepalen of de ene microfoon een harder geluid ontvangt dan de andere. De richting van het geluid bepalen lukt op die manier niet.
Kijken of iets boven een bepaalde waarde komt heeft weinig betekenis met die auto-gain.

Een audio versterker heeft bijvoorbeeld een ingang van 10 kΩ. Als je er niets op aansluit, dan is er geen geluid. Misschien een heel klein beetje ruis.
Een ingang van de Arduino heeft een zeer hoge impedantie. Als je er niets op aansluit, dan heb je een zwevende ingang en dan komt er storing binnen. Dat kan van alles zijn, iedere waarde van 0 tot 1023. Hou je vinger maar in de buurt of blaas er tegen, alles wat je doet kan die storing beïnvloeden.

Voorbeeld: De impedantie van een digitale ingang is misschien honderden Giga Ohm. Als een pin los hangt, dan gaat die pin soms mee met het signaal van de pin er naast ! Dan lijkt het net alsof die pin de waarde van de pin er naast kan "aanvoelen". Dat levert soms vreemde problemen op bij het zoeken naar een fout.

Nog een stapje verder: Die impedantie van honderden Giga Ohm is géén ingangweerstand naar GND. De gelijkstroom-weerstand van een digitale ingang is een impedantie naar "iets". Dus zelfs die honderden Giga Ohm is niet de juiste beschrijving.
Een analoge ingang van een Arduino board is iets anders, die heeft een beetje elektrische lading nodig om het analoge signaal in te lezen.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Vier microfoons MAX9814

Berichtdoor shooter » 06 Okt 2019, 14:23

ja je idee is best goed, die while moet dan gedurende 50 ms lopen maar dan wel 4 sensoren en niet 1 dus je haakje moet op een andere plaats.
verder kun je die tests beter pas doen als de 50 ms klaar zijn dus eerst opslaan in een stukje array van 4 kanalen. dat is sneller.
en ja koepel heeft wel gelijk, maar probeer het eerst maar even zo.
paul deelen
shooter@home.nl

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Vier microfoons MAX9814

Berichtdoor shooter » 06 Okt 2019, 14:23

oja vergeten wellicht is het handig om snel te kijken naar de waardes, en dan de waardes vergelijken in tijd.
paul deelen
shooter@home.nl

Berichten: 5
Geregistreerd: 04 Okt 2019, 21:49

Re: Vier microfoons MAX9814

Berichtdoor Vw181 » 07 Okt 2019, 16:13

Bedankt voor jullie snelle en uitgebreide informatie, helemaal top.

Ik heb afgelopen weekend nog wel het een en ander geprobeerd maar het werkt allemaal niet echt.
Ik heb de vier printjes nu in een vierkant gezet en op de microfoontjes een hoorntjes gemaakt. Ik zit er nu aan te denken om een vierkant schuimblok te maken met vier kanalen.
Aan het eind van ieder kanaal komt dan een microfoon. Het idee hierachter is om het geluid mechanisch te filteren zodat het geluid veel sterker en eerder binnen komt van één richting.
Als dit niet lukt moet ik Koepel helaas gelijk geven.

Zijn er nog meer mogelijkheden om richting van geluid te meten? Ik ben geïnspireerd door Vector van Anki en nu probeer ik een vergelijkbaar iets te bouwen.

https://www.youtube.com/watch?v=Qy2Z2TWAt6A

In ongeveer 1:56 van het filmpje zie je wat er allemaal in zit en daar zijn ook de vier microfoons te zien.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Vier microfoons MAX9814

Berichtdoor Koepel » 07 Okt 2019, 20:12

Die Vector robot gebruikt een microfoon-array met 4 microfoons, en dat wordt doorgegeven aan Alexa.
Het ligt voor de hand dat ze een chip gebruiken voor de 4 microfoons.

Dit is iets heel eenvoudigs: https://www.kiwi-electronics.nl/respeaker-4-mic-array-for-raspberry-pi.
Daar zit een chip op die wel DSP mogelijkheden heeft, maar het lijkt er op dat er geen audio-processing plaats vind om de 4 microfoons te combineren. Misschien is het de bedoeling dat de Raspberry Pi de 4 signalen gaat verwerken.

Met een Arduino kun je een ledje laten knipperen, of duizend ledjes.
Helaas zijn de Arduino functies zoals analogRead() nogal traag.
Een Arduino Zero of Arduino MKR heeft een SAMD21 processor, dat is een ARM Cortex M0+. Die schijnt heel eenvoudige DSP mogelijkheden te hebben.
De Teensy boards hebben processors die meer DSP mogelijkheden hebben.

De afgelopen jaren heb ik genoeg projecten voorbij zien komen die de richting van geluid willen bepalen. Bijvoorbeeld met 4 piezo microfoons onder een tafel. Ik weet niet of een van die projecten een succes was.

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten