Наконец-то сподобился опробовать полученные тут советы касательно АЦП.
Пока что попробовал сделать следующее:
Сначала, не мудрствуя лукаво, подцепил микрофон прям на аналоговый вход Дуни. Вход притянул к земле. Результат УГ - в полной тишине serial monitor показывает значения в районе 600, на звуки не реагирует, на постукивание по микрофону реагирует еле-еле (в пределах 10 единиц).
Если я правильно понял, для начала нужно было попробовать аппаратно изъять эти 2 с фигом вольта (600 единиц на АЦП) перед тем, как заводить микрофон на вход.
Подключил микрофон, как показано на этой схеме (только C1 поставил керамический):
ОК, стал получать на мониторе значения в интервале примерно [0-10].
Нагуглил, что Ардуина позволяет менять опорное напряжение АЦП. Программно доступны 1.1 в, 2.5 в, и 5 в, так что установил 1.1 в.
Код анализа громкости:
- Код: Выделить всё • Развернуть
const int sampleWindow = 50; // Sample window width in mS (50 mS = 20Hz)
unsigned int sample;
void setup()
{
Serial.begin(9600);
}
void loop()
{
unsigned long startMillis= millis(); // Start of sample window
unsigned int peakToPeak = 0; // peak-to-peak level
unsigned int signalMax = 0;
unsigned int signalMin = 1024;
// collect data for 50 mS
while (millis() - startMillis < sampleWindow)
{
sample = analogRead(0);
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
double volts = (peakToPeak * 1.1) / 1024; // convert to volts
Serial.println(volts);
}
В итоге, при громких хлопках стал получать значения от 0 до 0.03 вольт (~0-30 единиц из 1024 на serial monitor, если не конвертить в вольты).
Проблема в том, что система вообще не реагирует на источники звука, находящиеся более чем в 2 метрах от неё, а на более близком растоянии реагирует только на очень громкие звуки. Короче, всё-таки, сигнал ещё слишком слаб, чтобы можно было говорить о нормальной программной обработке. Мне почему-то кажется, что и 20-кратное усиление АЦП, упомянутое выше, тут не поможет - усиливать надо раз эдак в 100.
Возможно,я где-то фундаментально накосячил - буду признателен, если ткнёте носом