Korzystanie z mikrofonu z Arduino

18

EDYCJA : Badałem ten problem od dłuższego czasu. Okazuje się, że jest to znacznie trudniejszy projekt niż myślałem, a nie coś dla początkujących. Wymaga to drogiego sprzętu (mikrofonu i wzmacniacza) oraz zaawansowanej analizy dźwięku na mikrokontrolerze. Nawet kompletny mikrofon z obwodem wzmacniacza nie zapewnia pożądanych rezultatów (zgodnie z komentarzami do tego produktu)


Jestem zupełnie nowy w Arduino (ale znam się na programowaniu). Aby zbudować miernik VU , chcę podłączyć mikrofon do analogowego styku 0 Arduino i wyświetlić wartość poprzez połączenie szeregowe.

Poszukałem go i znalazłem ten obwód:

Prosty przedwzmacniacz audio

... i próbowałem zbudować go z tym wynikiem:

(Teraz używam obwodu sugerowanego przez Oli Glaser w jego odpowiedzi)

Wartości na monitorze szeregowym nie zmieniają się w zależności od głośności muzyki.

Jaki jest najprostszy sposób pomiaru głośności na wejściu analogowym Arduino?

Mam też TDA2822M , ale nie wiem, czy jest to pomocne w tym projekcie. Napis na mikrofonie brzmi XF-18D .

Edycja: Mój kod Arduino:

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

void loop() {
  Serial.println(analogRead(0));
  delay(300);
}

Wyjście szeregowe: 1023 1022 1022 1022 1022 1023 1022 i tak dalej

Jak mogę sprawdzić, czy mikrofon w ogóle działa? Czy to jest kierunkowe?

Edycja: Używam teraz tranzystora S9014. ADC i połączenie szeregowe działają (testowałem je potencjometrem).

Wyjście szeregowe wynosi teraz około 57.

Nie mam też multimetru ani oscyloskopu. Mam teraz multimetr.

Toast
źródło
Czy sprawdziłeś za pomocą lunety, że na wyjściu obwodu widzisz przebieg audio?
HikeOnPast
Whoa, dlaczego zwarcie styków 3V3 i 5V na schemacie? To może być problem.
Connor Wolf,
Nie, po prostu nie narysowałem poprawnie schematu.
Toast

Odpowiedzi:

14

„Najprostszym” sposobem jest po prostu zastosowanie sygnału i próbki za pomocą ADC. Zapisz wyniki w buforze, a następnie wyświetl zgodnie z życzeniem (w twoim przypadku wyślij do komputera przez RS232)
Jeśli chcesz poziom RMS sygnału, musisz to obliczyć w pewnym momencie, przed wysłaniem do komputera lub później.

Twój obwód wzmacniający, jak pokazano, nie jest idealny, ale powinien działać rozsądnie dla podstawowego miernika VU. EDYCJA - Właśnie zauważyłem C2, usuń to, ponieważ będzie blokować napięcie DC z tranzystora, a sygnał przesunie się pod ziemią.

EDYCJA - oto lepszy obwód tranzystora wzmacniającego:

Wzmacniacz elektretowy

To nie powinno zbytnio obchodzić zastosowanego tranzystora, napięcie wyjściowe powinno wynosić około 2,5 V.
Dokładne wartości dzielnika wejściowego (R3 i R4) nie są zbyt ważne, tym bardziej stosunek 1: 4. Możesz więc użyć np. 400k i 100k lub 40k i 10k itp. (Postaraj się nie przekraczać tych wartości). C2 powinna wynosić> 10uF. C1 powinno być> 1uF (zastępuje C1 na schemacie)
R1 i R2 muszą być jednak tymi wartościami.
Wystarczy elektret z rezystorem polaryzacji (R1 na schemacie)

Jednym z powodów do niepokoju jest to, że linie Arduino 3,3 V i 5 V wydają się być ze sobą powiązane - zakładam, że jest to błąd schematyczny, ale jeśli tak jest w rzeczywistym obwodzie, to nie zadziała i może coś uszkodzić.
Aby wskazać problem (y), lepiej byłoby zobaczyć twój kod i to, co widzisz po stronie komputera. Jakiego tranzystora używasz?

Jeśli masz oscyloskop, możesz sprawdzić, czy mikrofon / tranzystor działają poprawnie. Jeśli nie, to można użyć multimetru do wykonania bardziej podstawowych testów (np. Potwierdź obecność + 5V, potwierdź, że podstawa tranzystora wynosi ~ 0,6V, sprawdź kolektor, aby upewnić się, że nie jest on podłączony do +5V lub masy bez sygnału)

Musisz także upewnić się, że RS232 działa poprawnie, więc dobrym pomysłem byłoby napisanie prostego kodu, aby wysłać wartości testowe.

Jeśli możesz podać wymagane informacje i dać nam znać, jakie masz dostępne narzędzia, możesz udzielić bardziej szczegółowej pomocy.

EDYCJA - jeśli próbujesz tak wolno, będziesz potrzebować obwodu wykrywania szczytów takiego:

Wykrywanie szczytu

Umieściłbyś ten obwód między tranzystorem a stykiem Arduino (minus C2)

Dioda może być prawie dowolną diodą. Wartości nasadki i rezystora są jedynie wytycznymi, można je nieco zmienić. Ich wartości określają, jak długo napięcie będzie się zmieniać wraz z poziomem sygnału. Możesz to obliczyć za pomocą stałej RC (tj. R * C - w powyższym przykładzie stała RC wynosi 1e-6 * 10e3 = 10 ms. Napięcie zajmie około 2,3 stałej czasowej, aby spaść o 90% swojej pierwotnej wartości, więc w powyższym przykładzie, jeśli napięcie zacznie się od 1 V i usuniesz sygnał, spadnie do 0,1 V około 23 ms później.

EDYCJA - okej, myślę, że znalazłem poważny problem. Twój S9012 tranzystor to tranzystor PNP (jak to ma miejsce S9015), potrzebny jest tranzystor NPN dla tego obwodu. S9014 jest tranzystor NPN, więc trzeba będzie korzystać z tego jeden.

Kondensatory oznaczone „104” są prawie na pewno ceramicznymi kondensatorami 0,1 uF. Wartość (w pF) to pierwsze 2 liczby, po których następuje liczba zer ustawionych przez ostatnią liczbę. Tak więc dla 104 wartość wynosi 10 + 4 zer lub 100 000 pF. 100 000 pF to 100 nF lub 0,1 uF.

EDYCJA - Brak lunety lub multimetru bardzo utrudnia życie (powinieneś zdobyć jeden lub oba tak szybko, jak to możliwe).
Istnieją jednak podstawowe oscyloskopy z kartami dźwiękowymi, które można wykorzystać do przetestowania obwodu elektretowego / tranzystorowego. Visual Analyzer jest całkiem dobrym przykładem:

Visual Analyzer

Jeśli zastąpisz C2 (nie jest to absolutnie konieczne, ale dobry pomysł), powinieneś być w stanie podać sygnał bezpośrednio do komputera i obserwować w oprogramowaniu, czy mikrofon i wzmacniacz działają poprawnie. Jeśli twój komputer ma w użyciu linię, ale wejście mikrofonu jest zwykle dobre dla 2 V IIRC. Możesz także przetestować elektret bezpośrednio - wystarczy usunąć bit tranzystora i zachować R1 i C1, odebrać sygnał z drugiej strony C1.
Zauważ, że ta metoda nie będzie testować poziomów DC, tylko AC (z powodu ograniczenia blokującego DC na wejściu sounarda), ale sygnał AC (audio) jest tym, czym jesteś zainteresowany.

Jeśli spróbujesz, opublikuj zrzuty ekranu, abyśmy mogli dowiedzieć się, co się dzieje.

Oli Glaser
źródło
3,3 V i 5 V nie są ze sobą powiązane. Po raz pierwszy używam tego oprogramowania - przepraszam. Zadam mój kod w pytaniu, ale nie ma w tym nic złego. Ponadto zrobiłem dzisiaj projekt, który wykorzystuje fotorezystor i wyświetla wartość na sześciu diodach LED, tak jak chcę, aby mój miernik vu wyglądał i przetestowałem połączenie szeregowe z tym. Nie mam ani oscyloskopu, ani multimetru. Tranzystor ma podpis „S9012 H 331”. Mam też „S9014 C 331” i S9015.
Toast
@Toast - zobacz edycję o C2, usuń to i połącz bezpośrednio.
Oli Glaser
Usunąłem C2 i dodałem części tak, jak opisał to Kristoffon w swojej odpowiedzi. Nadal te same wyniki.
Toast
1
Jeśli masz potencjometr lub źródło o zmiennym napięciu, możesz zastosować wejście 0-5 V na wejściu ADC, aby przetestować kod, niezależnie od obwodu wejściowego. Próbujesz debugować dwie rzeczy naraz - odizoluj obwód i sprawdź jego zachowanie za pomocą oscyloskopu i / lub izoluj swój kod i zapewnij przewidywalne, ale zmienne dane wejściowe do sprawdzenia poprawności kodu.
HikeOnPast
1
@OliGlaser Jestem zdezorientowany przez obwód. „Elektret” to mikrofon? Gdzie idzie drugi przewód mikrofonu, GND lub VCC? Czy podłączam 5 lub 3,3 V do tego obwodu? Czy możesz w jakiś sposób usunąć EDITbloki i edytować je, aby można je było zrozumieć bez czytania wątku komentarza? Jestem również początkującym i nie rozumiem, w jaki sposób problem został rozwiązany i czy mogę korzystać z obwodu, który opublikowałeś w obecnej postaci.
Tomáš Zato - Przywróć Monikę
4

Zakładając, że twój obwód działa, sygnał audio jest w zakresie kHz, podczas gdy Arduino ma ADC przystosowany do poziomów DC. Składowa prądu stałego w twoim sygnale wynosi zero, co oznacza, że ​​unosi się nad stałym napięciem. Jest to stałe napięcie, które odczytuje ADC.

Aby to naprawić, należy umieścić szeregowo diodę z wyjściem podłączonym do ADC oraz do kondensatora i rezystora.

Osłona naładuje się do wartości szczytowej otrzymywanej, podczas gdy rezystor rozładuje nasadkę, gdy sygnał zaniknie.

--|>|---*---- adc
        *---- resistor -----*----ground
        \----- capacitor ---/

Edycja: Wejście ADC jest tak naprawdę pływające, ponieważ nie ma żadnych stronniczości z powodu kondensatora szeregowego. Jeśli masz zamiar wypróbować moje rozwiązanie, usuń C2.

Kristoffon
źródło
Ok, dodałem to do obwodu, a sygnał na monitorze szeregowym wynosi teraz 458 (ale nadal nie zmienia się, gdy pojawia się szum).
Toast
Wymieniłem tranzystor z „S9012 H 331” na „S9014 C 331”, a jego wartość wynosi 56.
Toast
1
Arduino ADC może próbkować wystarczająco szybko, aby uzyskać dźwięk. Nie używam ich, ale myślę, że 10ksps (tak do 5 kHz) jest możliwe dzięki funkcjom biblioteki, co jest dobre w przypadku rzeczy lo-fi (jestem prawie pewien, że rzeczywista ATMega może próbkować szybciej, jeśli jest używana normalnie)
Oli Glaser
@Toast - jak szybko próbujesz? Jeśli jest bardzo powoli, dobrym pomysłem jest detektor pików. Możesz to jednak zrobić w oprogramowaniu.
Oli Glaser
2
@Kristoffon - Nie z Arduino nie, ale użyłem podobnych 8-bitowych mikr (np. PIC16F, 18F itp.) Do próbkowania i odtwarzania dźwięku wiele razy. 10ksps jest łatwo wykonalne. Cytując ten dokument AVR ADC :When using single-ended mode, the ADC bandwidth is limited by the ADC clock speed. Since one conversion takes 13 ADC clock cycles, a maximum ADC clock of 1 MHz means approximately 77k samples per second. This limits the bandwidth in single-ended mode to 38.5 kHz, according to the Nyquist sampling theorem.
Oli Glaser
4

Twoje odczyty 1022, 1023 są w zasadzie pełną skalą na ADC Arduino. Zakładając, że zainstalowałeś nieuszkodzony szeregowy kondensator, jak pokazano na schemacie, ten poziom nie może pochodzić z zbudowanego przez ciebie obwodu mikrofonu, ponieważ może on jedynie sprzęgać zmieniające się napięcia (tj. Prąd przemienny).

W rezultacie podejrzewam, że odczytujesz prąd upływowy w samej ATMEGA - prawdopodobnie uzyskałbyś ten sam wynik na dowolnym (niepodłączonym) pinie analogowym.

Spróbuj wykonać bardzo „lekki” dzielnik napięcia z niektórymi rezystorami o wysokiej wartości (od 10 K do 100 K) i użyj go do przesunięcia wejścia analogowego do połowy napięcia odniesienia (możesz również użyć potencjometru, który daje dodatkowe możliwości testowania). Zatem twój odczyt bez wkładu powinien znajdować się w sąsiedztwie 512.

Gdy masz odpowiednio tendencyjne wejście ADC, możesz zacząć pracować, sprawdzając, czy dostaniesz przez to zmienność. Być może niektóre z nich nie wykorzystują swojego pasma, co oznacza, że ​​uzyskasz aliasing komponentów wysokiej częstotliwości, ale jeśli wszystko, co próbujesz zrobić, to oszacować ogólną głośność, nie powinno to stanowić większego problemu.

Chris Stratton
źródło
Brzmi dobrze, myślę, że jest przeciążony. OP, czy pomyślałeś o podłączeniu małego głośnika do debugowania linii analogowej podczas czytania. Kiedy wykonałem miernik vu, wziąłem linie z gniazda słuchawkowego, w zasadzie prosto do AnalogRead i zmapowałem wynikowy.
Hellonearthis,