Використання мікрофона з Arduino


18

EDIT : Я досить довго розслідував цю проблему. Це виявляється набагато складнішим проектом, ніж я думав, і не для початківців. Для цього потрібне дороге обладнання (мікрофон і підсилювач) і деякий складний аудіо-аналіз на мікроконтролері. Навіть повний мікрофон із схемою підсилювача не дає бажаних результатів (відповідно до коментарів до цього товару)


Я абсолютно новий в Arduino (але я знайомий з програмуванням). Для того щоб побудувати ВУ-метр , я хочу поставити мікрофон на аналоговий 0-контактний Arduino і відобразити значення через послідовне з'єднання.

Я гуглив і знайшов цю схему:

Простий аудіо попередній підсилювач

... і я намагався створити це з таким результатом:

(Я зараз використовую схему, запропоновану Олі Глазер у своїй відповіді)

Значення на послідовному моніторі не змінюються залежно від гучності музики.

Який найпростіший спосіб вимірювання гучності на аналоговому вході Arduino?

Також у мене є TDA2822M , але я не знаю, чи це корисно для цього проекту. Напис на мікрофоні читає XF-18D .

Редагувати: Мій ардуїно-код:

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

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

Серійний вихід: 1023 1022 1022 1022 1022 1023 1022 тощо

Як я можу перевірити, чи працює мікрофон взагалі? Це спрямованість?

Редагувати: Зараз я використовую транзистор S9014. АЦП та послідовне підключення працюють (я протестував їх за допомогою потенціометра).

Зараз серійний вихід складає близько 57.

Крім того, у мене немає мультиметра або осцилографа. У мене зараз є мультиметр.


Чи підтвердили ви, що ви можете бачити аудіосигнал на виході схеми?
HikeOnPast

Хоча, чому в схемі короткий штифт 3V3 і 5V? Це може бути проблемою.
Коннор Вольф

Ні, я просто не намалював схему належним чином.
Тост

Відповіді:


14

"Найпростіший" спосіб - просто застосувати сигнал та вибірку за допомогою АЦП. Зберігайте результати в буфері, а потім відображайте за бажанням (у вашому випадку надсилайте на ПК через RS232)
Якщо ви хочете рівень сигналу RMS, то вам потрібно буде обчислити це в якийсь момент, перед тим як надсилати на ПК або після цього.

Ваша підсилювальна схема, як показано, не є ідеальною, але повинна працювати розумно для базового вимірювача ВУ. EDIT - Я щойно помітив C2, видаліть це, оскільки він заблокує зміщення постійного струму від транзистора, і сигнал буде хитатися нижче землі.

EDIT - ось краща схема для транзистора, що підсилює:

Електричний підсилювач

Це не повинно перейматися занадто великим транзистором, що використовується, вихідний зміщення має бути близько 2,5 В.
Точні значення для вхідного дільника (R3 і R4) не надто важливі, це співвідношення 1: 4. Таким чином, ви можете використовувати, наприклад, 400k і 100k, або 40k і 10k, і т. Д. (Намагайтеся не перевищувати ці нижче цих значень). C2 повинен бути> 10uF. C1 має бути> 1uF (замінює C1 у вашій схемі),
хоча R1 і R2 повинні бути такими значеннями.
Все, що вам потрібно, це електрет з його резистором зміщення (R1 у вашій схемі)

Одним із питань, що викликає занепокоєння, є лінії Arduino 3.3V і 5V, схоже, пов'язані між собою - я припускаю, що це схематична помилка, але якщо це так у фактичній схемі, вона не спрацює і може щось пошкодити.
Визначити проблему, це допоможе побачити ваш код та те, що ви бачите на ПК. Також який транзистор ви використовуєте?

Якщо у вас осцилоскоп, ви можете перевірити, чи працює ваш мікрофон / транзистор. Якщо ні, то мультиметр можна використовувати для виконання ще декількох базових випробувань (наприклад, підтвердження присутності + 5 В, підтвердження наявності транзистора на рівні ~ 0,6 В, тестовий колектор, щоб переконатися, що він не зафіксований на + 5 В або заземлений без сигналу)

Крім того, вам потрібно переконатися, що RS232 працює правильно, тому, щоб написати простий код для надсилання тестових значень було б гарною ідеєю.

Якщо ви можете надати запитувану інформацію та повідомити нам, які інструменти у вас є, можна отримати більш конкретну допомогу.

EDIT - якщо ви берете вибірку так повільно, вам знадобиться пікова схема виявлення, як це:

Виявлення піку

Ви поставите цю ланцюг між транзистором і штифтом Arduino (мінус C2)

Діод може бути майже будь-яким діодом. Значення ковпачка та резистора - лише орієнтир, їх можна трохи змінити. Їх значення диктують, скільки часу буде потрібно напруга для зміни рівня сигналу. Ви можете обчислити це, використовуючи постійну RC (тобто R * C - у наведеному вище прикладі, постійна RC дорівнює 1e-6 * 10e3 = 10 мс. Напруга займе приблизно 2,3 часової постійної, щоб впасти на 90% від її початкового значення, так у наведеному вище прикладі, якщо напруга починається на рівні 1 В, і ви знімете сигнал, він знизиться до 0,1 В приблизно через 23 мс пізніше.

EDIT - добре, думаю, я знайшов головну проблему. Ваш транзистор S9012 - це транзистор PNP (як і S9015), для цього ланцюга вам потрібен транзистор NPN. S9014 являє собою транзистор NPN, так що вам доведеться використовувати цей.

Конденсатори з позначкою "104" майже напевно є керамічними конденсаторами 0,1uF. Значення (в pF) - це перші 2 числа, а потім число нулів, встановлене останнім числом. Так для 104 значення становить 10 + 4 нулі, або 100 000 пФ. 100,000pF - 100nF або 0,1uF.

EDIT - Немає сфери чи мультиметра ускладнює життя тут (вам слід скористатися одним або обома, як тільки зможете).
Однак є деякі основні осцилоскопи звукової карти ПК, які можна використати для тестування вашого електричного / транзисторного кола. Візуальний аналізатор - досить хороший приклад:

Візуальний аналізатор

Якщо ви замінюєте C2 (не суворо необхідна, але гарна ідея), ви повинні мати можливість подавати сигнал безпосередньо на ПК та спостерігати в програмному забезпеченні, щоб перевірити, чи працюють мікрофон та посилення. Якщо на вашому ПК використовується така лінія, але вхід мікрофона, як правило, хороший для 2V IIRC. Ви також можете перевірити електрет безпосередньо - просто вийміть транзисторний біт і утримуйте R1 і C1, приймайте сигнал з іншого боку C1.
Зауважте, що цей метод не перевірятиме рівні постійного струму, тут вас цікавлять лише зміна струму (через кришку блокування постійного струму на вході іграшки), але сигнал змінного струму (звук).

Якщо ви спробуєте це, опублікуйте скріншоти, щоб ми могли зрозуміти, що відбувається.


3.3V і 5V не пов'язані між собою. Я вперше використовую це програмне забезпечення - вибачте. Я поставлю свій код у запитання, але немає нічого, що могло б піти не так. Крім того, я сьогодні зробив проект, який використовує фоторезистор і відображає значення на шістьох світлодіодах, як я хочу, щоб мій вуч-метр виглядав, і я перевірив послідовний зв'язок з цим. У мене немає ні осцилографа, ні мультиметра. У транзистора є надпис "S9012 H 331", у мене є "S9014 C 331" і S9015.
Тост

@Toast - перегляньте редагування про C2, видаліть це та підключіться безпосередньо.
Олі Глазер

Я зняв С2 і додав частини, як Крістоффон описав це у своїй відповіді. Ще ті ж результати.
Тост

1
Якщо у вас є потенціометр або джерело змінної напруги, ви можете застосувати вхід 0-5В до входу АЦП, щоб перевірити свій код, незалежно від вхідної схеми. Ви намагаєтесь налагодити відразу дві речі - ізолювати ланцюг та перевірити його поведінку за допомогою осцилографа та / або ізолювати код та надати передбачуваний, але змінний ввід для перевірки вашого коду.
HikeOnPast

1
@OliGlaser Мене бентежить ланцюг. "Електрет" - це мікрофон? Куди йде інший провід мікрофона, GND чи VCC? Я підключую до цього ланцюга 5 або 3,3 В? Не могли б ви якось видалити EDITблоки та відредагувати їх, щоб їх можна було зрозуміти, не читаючи нитки коментарів? Я також новачок, і я не розумію, як вирішувалася проблема і чи можу я використовувати схему, яку ви розмістили як є.
Томаш Зато - Відновити Моніку

4

Якщо припустити, що ваша схема працює, звуковий сигнал знаходиться в діапазоні кГц, тоді як у Arduino є АЦП, призначений для рівнів постійного струму. Компонент постійного струму на вашому сигналі дорівнює нулю, це означає, що він плаває над фіксованою напругою. Саме фіксовану напругу читає ваш АЦП.

Щоб виправити, що ви поставили б діод послідовно, а ваш вихід підключається до АЦП та до конденсатора та резистора.

Ковпак заряджатиметься до пікового значення, яке отримується, тоді як резистор розряджатиме ковпачок, коли сигнал згасає.

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

Редагувати: Вхід АЦП насправді плаває, оскільки він не має ніякого зміщення через конденсатор серії. Якщо ви збираєтеся спробувати моє рішення, видаліть C2.


Добре, я додав це до ланцюга, і сигнал на послідовному моніторі зараз 458 (але все ще не змінюється, коли є шум).
Тост

Я обміняв транзистор з "S9012 H 331" на "S9014 C 331" і значення - 56.
Тост

1
АЦП Arduino здатний відбирати вибірки досить швидко для звуку. Я не використовую їх, але я думаю, що 10xps (так що пропускна здатність до 5 кГц) можливі за допомогою функцій бібліотеки, що добре для файлів lo-fi (я впевнений, що фактичний ATMega може випробовувати швидше при нормальному використанні)
Олі Глазер

@Toast - як швидко ти займаєшся вибіркою? Якщо це дуже повільно, то піковий детектор - хороша ідея. Це можна зробити і в програмному забезпеченні.
Олі Глазер

2
@ Kristoffon - не з Arduino ні, але я багато разів використовував подібні 8-бітні мікросистеми (наприклад, PIC16F, 18F тощо) для відбору проб і відтворення аудіо. 10ksps легко виконати. Цитуючи цей документ 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.
Олі Глазер

4

Ваші показання 1022, 1023 в основному є повномасштабними на АЦП Ардуїно. Якщо припустити, що ви встановили несправний серійний конденсатор, як показано на вашій схемі, цей рівень не може надходити від побудованої мікрофонної ланцюга, оскільки це може парувати зміну напруги (тобто змінного струму).

Як результат, я підозрюю, що ви читаєте струм витоку в самій ATMEGA - ви, ймовірно, отримаєте такий же результат на будь-якому з інших (непоєднаних) аналогових штифтів.

Спробуйте зробити дуже "легкий" дільник напруги з деякими резисторами високого значення (між 10 К і 100 К) і використовуйте це для зміщення аналогового входу на половину опорного напруги (ви також можете використовувати потенціометр, який дає додаткові можливості тестування). Тоді ваше читання без жодного введення повинно знаходитись поблизу 512.

Після того, як вхід АЦП буде належним чином упереджений, ви можете почати працювати, намагаючись зрозуміти, чи отримуєте ви його зміни. Ви можете дещо підкреслити свою пропускну здатність, це означає, що ви отримаєте згладжування високочастотних компонентів, але якщо все, що ви намагаєтеся зробити, це оцінити загальний об'єм, який не повинен бути занадто великим проблемою.


Це звучить правильно, я думаю, що це перевантажено. OP Ви думали про підключення невеликого динаміка до налагодження цієї аналогової лінії читання. Коли я зробив метр ву, я взяв лінії від гнізда для навушників, в основному прямо в AnalogRead, і намалював отримане.
Хеллонеартіс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.