Usando um microfone com um Arduino


18

Edição : Estou investigando esse problema há algum tempo. Acabou sendo um projeto muito mais difícil do que eu pensava e não para iniciantes. Isso requer hardware caro (microfone e amplificador) e algumas análises sofisticadas de áudio no microcontrolador. Mesmo um microfone completo com circuito mais amplo não fornece os resultados desejados (de acordo com os comentários sobre este produto)


Eu sou inteiramente novo no Arduino (mas estou familiarizado com programação). Para construir um medidor VU , quero colocar um microfone no pino 0 analógico do Arduino e exibir o valor através da conexão serial.

Eu pesquisei e encontrei este circuito:

Pré-amplificador de áudio simples

... e tentei construí-lo com este resultado:

(Agora estou usando o circuito sugerido por Oli Glaser em sua resposta)

Os valores no monitor serial não mudam dependendo do volume da música.

Qual é a maneira mais fácil de medir o volume na entrada analógica do Arduino?

Além disso, tenho um TDA2822M , mas não sei se é útil para este projeto. A legenda no microfone diz XF-18D .

Edit: Meu código do arduino:

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

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

A saída serial: 1023 1022 1022 1022 1022 1023 1022 e assim por diante

Como posso verificar se o microfone funciona? É direcional?

Edit: Agora estou usando um transistor S9014. O ADC e a conexão serial funcionam (eu os testei com um potenciômetro).

A saída serial é agora em torno de 57.

Além disso, eu não tenho um multímetro ou osciloscópio. Eu tenho um multímetro agora.


Você verificou com um escopo que pode ver uma forma de onda de áudio na saída do seu circuito?
HikeOnPast

Whoa, por que os pinos de 3V3 e 5V estão em curto no esquema? Isso pode ser um problema.
Connor Lobo

Não, eu simplesmente não desenhei o esquema adequadamente.
Brinde

Respostas:


14

A maneira "mais fácil" é simplesmente aplicar o sinal e a amostra no ADC. Armazene os resultados em um buffer e exiba conforme desejado (no seu caso, envie para o PC via RS232).
Se você deseja o nível RMS do sinal, precisará calculá-lo em algum momento, antes de enviar para o PC ou depois.

Seu circuito de amplificação, como mostrado, não é o ideal, mas deve funcionar razoavelmente para um medidor VU básico. EDIT - Acabei de notar C2, remova-o, pois ele bloqueará a polarização DC do transistor, e o sinal irá balançar abaixo do solo.

EDIT - aqui está um circuito melhor para o transistor de amplificação:

Amplificador de eletreto

Isso não deve se importar muito com o transistor usado, o viés de saída deve estar em torno de 2,5V.
Os valores exatos para o divisor de entrada (R3 e R4) não são muito importantes, é a proporção de 1: 4 que é mais. Assim, você pode usar, por exemplo, 400k e 100k, ou 40k e 10k, etc (tente não exceder ou abaixo desses valores respectivos). C2 deve ser> 10uF. C1 deve ser> 1uF (substitui C1 em seu esquema)
R1 e R2 precisam ser esses valores.
Tudo o que você precisa é do eletreto com seu resistor de polarização (R1 no seu esquema)

Um ponto de preocupação é que as linhas do Arduino 3.3V e 5V parecem estar interligadas - presumo que este seja um erro esquemático, mas se esse for o caso no circuito real, ele não funcionará e pode danificar algo.
Para identificar o (s) problema (s), seria útil ver seu código e o que você está vendo no lado do PC. Também qual transistor você está usando?

Se você possui um osciloscópio, pode verificar se o seu mic / transistor está funcionando corretamente. Caso contrário, um multímetro pode ser usado para realizar alguns testes mais básicos (por exemplo, confirmar + 5V presente, confirmar que a base do transistor está em ~ 0,6V, coletor de teste para garantir que não esteja preso a + 5V ou aterrar sem sinal presente)

Além disso, você precisa garantir que o RS232 esteja funcionando corretamente; portanto, escrever um código simples para enviar alguns valores de teste seria uma boa idéia.

Se você puder fornecer as informações solicitadas, informe-nos quais ferramentas você tem disponível, ajuda mais específica.

EDIT - se você estiver amostrando tão lentamente, precisará de um circuito de detecção de pico como este:

Detecção de Pico

Você colocaria esse circuito entre o transistor e o pino do Arduino (menos C2)

O diodo pode ser praticamente qualquer diodo. Os valores de tampa e resistor são apenas uma orientação, eles podem ser alterados um pouco. Seus valores determinam quanto tempo a tensão levará para mudar com o nível do sinal. Você pode calcular isso usando a constante RC (ou seja, R * C - no exemplo acima, a constante RC é 1e-6 * 10e3 = 10ms. A tensão levará cerca de 2,3 vezes a constante do tempo para cair em 90% do valor original, portanto no exemplo acima, se a tensão começar em 1V e você remover o sinal, ela caiu para 0,1V em torno de 23ms depois.

EDIT - ok, acho que encontrei um grande problema. Seu transistor S9012 é um transistor PNP (como o S9015), você precisa de um transistor NPN para este circuito. O S9014 é um transistor NPN, então você terá que usá-lo.

Os capacitores marcados com "104" são quase certamente capacitores de cerâmica de 0,1uF. O valor (em pF) são os 2 primeiros números seguidos por um número de zeros definido pelo último número. Portanto, para 104, o valor é 10 + 4 zeros, ou 100.000pF. 100.000pF é 100nF ou 0,1uF.

EDIT - Não ter um escopo ou multímetro torna a vida muito difícil aqui (você deve se apossar de um ou de ambos o mais rápido possível)
No entanto, existem alguns osciloscópios básicos para placas de som de PC que podem ser usados ​​para testar seu circuito de eletreto / transistor. O Visual Analyzer é um bom exemplo:

Analisador Visual

Se você substituir C2 (não estritamente necessário, mas é uma boa idéia), poderá alimentar o sinal diretamente no PC e observar no software para ver se o microfone e a amplificação estão funcionando corretamente. Se o seu PC tiver uma linha em uso, mas a entrada do microfone geralmente é boa para até 2V IIRC. Você também pode testar o eletreto diretamente - basta remover o bit do transistor e manter R1 e C1, receber sinal do outro lado de C1.
Observe que esse método não testará os níveis de CC, apenas a CA (devido a um limite de bloqueio de CC na entrada do cartão de memória), mas o sinal CA (áudio) é o que você está interessado aqui.

Se você tentar isso, publique as capturas de tela para que possamos ter uma idéia do que está acontecendo.


3.3V e 5V não estão ligados. É a primeira vez que estou usando este software - desculpe. Vou colocar meu código na pergunta, mas não há nada que possa dar errado com ele. Além disso, eu fiz um projeto hoje que usa um fotorresistor e exibe o valor em seis leds, como eu quero que meu medidor vu pareça e testei a conexão serial com isso. Não tenho osciloscópio nem multímetro. O transistor possui a legenda "S9012 H 331". Também tenho "S9014 C 331" e S9015.
29712 Brinde

@ Toast - veja a edição sobre C2, remova-a e conecte-se diretamente.
Oli Glaser

Eu removi o C2 e adicionei as peças como Kristoffon descreveu em sua resposta. Ainda os mesmos resultados.
Brinde

11
Se você possui um potenciômetro ou uma fonte de tensão variável, pode aplicar uma entrada de 0-5V à entrada do ADC para testar seu código, independentemente do seu circuito de entrada. Você está tentando depurar duas coisas ao mesmo tempo - isolar o circuito e verificar seu comportamento usando um osciloscópio e / ou isolar seu código e fornecer uma entrada previsível, mas variável, para validar seu código.
HikeOnPast

11
@OliGlaser Estou confuso com o circuito. O "eletreto" é um microfone? Para onde vai o outro fio do microfone, GND ou VCC? Eu conecto 5 ou 3.3V a esse circuito? Você poderia, de alguma forma, remover os EDITblocos e editá-los para que possam ser entendidos sem ler o tópico do comentário? Também sou iniciante e não entendo como o problema foi resolvido e se posso usar o circuito que você postou como está.
Tomáš Zato - Restabelece Monica

4

Supondo que seu circuito funcione, o sinal de áudio está na faixa de kHz enquanto o Arduino possui um ADC adequado para os níveis de corrente contínua. O componente DC no seu sinal é zero, ou seja, flutua sobre uma tensão fixa. É essa tensão fixa que o seu ADC está lendo.

Para corrigir isso, você colocaria um diodo em série com sua saída conectada ao ADC e a um capacitor e resistor.

A tampa cobrará o valor de pico recebido enquanto o resistor descarregará a tampa quando o sinal diminuir.

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

Edit: A entrada ADC está realmente flutuando, pois não possui viés devido ao capacitor em série. Se você estiver tentando minha solução, exclua C2.


Ok, eu adicionei isso ao circuito e o sinal no monitor serial agora é 458 (mas ainda não muda quando há ruído).
29712 Toast

Troquei o transistor de "S9012 H 331" para "S9014 C 331" e o valor é 56.
Toast

11
O Arduino ADC é capaz de amostrar rápido o suficiente para áudio. Não os uso, mas acho que 10ksps (com largura de banda de até 5kHz) é possível com as funções da biblioteca, o que é bom para coisas de lo-fi (tenho certeza de que o ATMega real pode obter amostras mais rapidamente se usado normalmente)
Oli Glaser

@ Toast - quão rápido você está amostrando? Se for muito lento, o detector de pico é uma boa ideia. Você pode fazer isso no software.
Oli Glaser

2
@ Kristoffon - Não com um Arduino não, mas usei micros de 8 bits semelhantes (por exemplo, PIC16F, 18F, etc) para amostragem e reprodução de áudio várias vezes. 10kps é facilmente factível. Para citar este documento do 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

Suas leituras de 1022, 1023 são basicamente em escala completa no ADC do Arduino. Supondo que você tenha instalado um capacitor em série não defeituoso, como mostrado no diagrama, esse nível não pode ser proveniente do circuito do microfone que você construiu, pois isso pode apenas acoplar tensões variáveis ​​(ou seja, CA).

Como resultado, suspeito que você esteja lendo a corrente de fuga no próprio ATMEGA - provavelmente obteria o mesmo resultado em qualquer um dos outros pinos analógicos (não conectados).

Tente fazer um divisor de tensão muito "leve" com alguns resistores de alto valor (entre 10K e 100K) e use isso para desviar a entrada analógica para metade da tensão de referência (você também pode usar um potenciômetro, que oferece uma capacidade extra de teste). Em seguida, sua leitura sem entrada deve estar na faixa de 512.

Depois de ter a entrada do ADC adequadamente enviesada, você pode começar a trabalhar tentando ver se obtém variação através dela. Você pode estar subamostrando um pouco a largura de banda, o que significa que você obterá o alias dos componentes de alta frequência, mas se tudo o que você está tentando fazer é estimar o volume geral que não deve ser um problema.


Parece certo, acho que está sobrecarregado. OP você pensou em conectar um alto-falante pequeno para depurar essa linha analógica na sua leitura. Quando fiz um vu meter, peguei as linhas de um fone de ouvido, basicamente direto para o AnalogRead e mapeei o resultado.
Hellonearthis
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.