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:
... 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.
źródło
Odpowiedzi:
„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:
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:
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:
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.
źródło
EDIT
bloki 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.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.
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.
źródło
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.
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.
źródło