Como usar o MAX9814
Em muitos projetos de eletrônica de aplicação sonora, é necessário o uso de um sensor de som, o MAX9814 é uma ótima opção para esses casos, o mesmo pode ser utilizado em dispositivos como: Fones de ouvido Bluetooth, Karaokês, gravadores portáteis, câmeras digitais, telefones IP, comunicadores bidirecionais, entre outros. Esse tutorial será dividido nos seguintes tópicos, clique em algum título para ir ao trecho correspondente.
Materiais para teste do módulo Sensor Max9814
Sensor MAX9814
O Sensor MAX9814 é uma placa que conta com um microfone de eletredo de 20-20KHz, sendo que o módulo é projetado com um CI destinado a amplificação, o Max9814, agindo em conformidade com a onda sonora.
De forma mais detalhada, o circuito integrado garante ao módulo controle automático de ganho (AGC) para equilibrar o valor lido na entrada, sendo que quando o som detectado é excessivamente alto, o controle o abaixa para que não haja uma sobrecarga no amplificador, e em caso contrário, em que a onda sonora está muito baixa, o amplificador aumenta para que seja realizada a perfeita leitura.
Além disso, é possível configurar o ganho máximo por decibéis, o módulo é pré-configurado para 60dB, mas esse valor pode ser modificado para 50dB ou 40dB, veremos isso na prática mais adiante, outrossim, ainda existe a opção de alterar a proporção de attack/release, de 1:4000 (padrão), para 1:2000 ou 1:5000.
No CI do módulo, ocorrem três amplificações, o pré amplificador de baixo ruído (LNA) tem um ganho fixo de 12dB, enquanto que no segundo amplificador, o ganho VGA se ajusta automaticamente de 0dB a 20dB, de acordo com o limite do AGC, e o amplificador de saída oferece ganhos variáveis de 8dB, 18dB e 28dB, de acordo com a configuração do Gain.
Segue diagrama de blocos do CI, retirado do seu respectivo datasheet.
Um dispositivo sem o AGC apresenta cortes no sinal de saída quando muito ganho é aplicado à entrada, sendo que o AGC impede esse corte, identificando quando o sinal excede o limite predefinido, o ganho do ACG é então reduzido para realizar essa correção e não prejudicar a amostragem obtida graficamente.
Essa imagem retirada do datasheet do CI ilustra a diferença de um sensor sem o AGC e com o AGC, note que com o uso do AGC não há corrupção do sinal gerado.
Informações sobre o módulo:
- Tensão de alimentação: 2,7 a 5,5VDC;
- Ganho total: 40dB, 50dB e 60dB;
- Ganho do pré-amplificador: 12dB;
- Ganho VGA: 20dB a 0dB;
- Ganho do amplificador de saída: 8dB/ 18Db/28dB;
- Temperatura de operação: -40°C a 85°C;
- Densidade de ruído: 30nV/ (baixa);
- THD: 0,04% de ponta;
- Polarização interna do microfone: 2V (baixo ruído);
- Tempo de espera do AGC: 30ms;
Para mais informações, confira o datasheet do CI e do módulo.
Agora que você já conheceu o sensor de forma teórica, partiremos para a análise prática do seu funcionamento.
Materiais para teste do Módulo Sensor Max9814
01- Arduino Uno Compatível com Cabo USB;
01- Sensor de Som - Eletredo AGC- MAX9814;
01- Kit de Jumpers macho-macho
Teste do MAX9814
Com todos os materiais em mãos, iniciaremos a montagem conforme imagem abaixo, não é necessário o uso de um resistor para diminuir a tensão encima do LED, pois a tensão em OUT será de aproximadamente 1,2~2V.
Com o circuito montado, faremos a programação para teste de funcionamento.
Primeiramente declararemos as nossas variáveis e constantes, a constante inteira “janeladeamostra” será de 1000ms (1s) e equivale ao intervalo entre cada exibição de dados coletados pelo sensor, o tempo pode ser alterado mediante a necessidade.
const int janeladeamostra = 1000;
unsigned int amostra;
No void setup definiremos o baud rate do nosso monitor serial, mas primeiramente eu darei uma breve definição do que é o Baud rate.
Segundo o livro IBM Personal Computers and the Michigan Terminal System, a taxa de transmissão de dados normalmente é medida em Baud (Baud rate), que por sua vez, corresponde à taxa de bits transmitidos por segundo, sendo que a taxa de transmissão de caracteres é de um décimo da taxa de Baud.
Agora que já temos uma noção do que é Baud rate, veja o trecho da programação em que é feita essa definição.
void setup ()
{
Serial.begin(115200);
}
Em seguida abriremos o laço de repetição, o Void loop, esse laço será responsável por realizar todas as leituras do sensor, primeiro faremos as declarações necessárias para isso.
void loop ()/*laço de repetição */
{
unsigned long iniciaMs= millis();
unsigned int PicoaPico = 0;
unsigned int sinalMax = 0;
unsigned int sinalMin = 1024;
A princípio pode parecer confuso o envio de 0 para o sinalMax e 1024 para o sinalMin, mas isso já será explicado com o restante da programação.
while (millis() - iniciaMs < janeladeamostra)
{
amostra = analogRead(0);
if (amostra < 1024)
{
if (amostra > sinalMax)
{
sinalMax = amostra;
}
else if (amostra < sinalMin)
{
sinalMin = amostra;
}
}
}
Este trecho demarcado corresponde a leitura do sensor, eu defini que essa leitura fosse repetida diversas vezes no período de 1s, vamos dissecar essa etapa:
Supondo que temos uma leitura de 200 no A0, isso corresponde a nossa amostra.
Então temos que
if (amostra < 1024)
{
Nesse trecho estamos perguntando se a amostra é menor que 1024, no caso do exemplo é 200, então partiremos para a próxima parte do programa.
if (amostra > sinalMax)
{
Se 200 for maior que o sinalMax, que é 0, seguimos.
Note que ambas as perguntas sempre serão afirmativas, pois a medição nunca será maior do que 1024 e menor do que 0, mas continuaremos para que você entenda o propósito.
Confirmado os dois fatores, definimos que o valor de sinalMax será o sinal da amostra, ou seja, o 0 agora será 200.
sinalMax = amostra;
Continuando, se a amostra for menor que o sinalMin (1024), vamos para a linha seguinte.
else if (amostra < sinalMin)
{
Então o sinalMin será igual ao valor de amostra, que no caso é 200.
sinalM
in = amostra;
Esse procedimento é repetido durante 1s, com os novos valores de sinalMax e sinalMin.
sinalMax = 200
sinalMin = 200
Agora vamos supor que a próxima amostra lida é de 205:
amostra = analogRead(0);
if (amostra < 1024) /* se amostra(205) é menor do que 1024 √ */
{
if (amostra > sinalMax) /* se amostra(205) é maior do que sinalMax(200) √ */
{
sinalMax = amostra; /* o valor de sinalMax vai de 200 ->205 */
}
else if (amostra < sinalMin) /* amostra (205) é menor do que sinalMin(200) x */
Como nessa última linha a suposição não é afirmativa, então o programa não vai para a próxima e encerra esse ciclo com:
sinalMax= 205
sinalMin = 200
E dessa forma esses valores vão sendo renovados durante 1s, sendo que ao término é feita a seguinte operação para apresentar o valor em volts no nosso monitor serial.
Primeiro é definido o valor de pico a pico através da subtração (sinalMax-sinalMin).
PicoaPico = sinalMax - sinalMin;
E em seguida aplicamos a fórmula para a conversão do valor análogico na sua representação em volts
double volts = (PicoaPico * 5.0) / 1024;
E por fim printamos na tela com o seguinte comando:
Serial.println(volts);
O programa completo está disponível abaixo, basta copiar, colar na IDE, selecionar a sua placa, porta e carregar.
/******************************************************
Exemplo do site Adafruit
Comentários e modificações de autoria da Curto Circuito
******************************************************/
const int janeladeamostra = 1000; /* constante inteira "janeladeamostra" é de 1000 (1s para cada medição) */
unsigned int amostra; /* variável inteira de nome "amostra" */
void setup ()/* laço de configuração */
{
Serial.begin(115200); /* Baud rate de 115200 */
}
void loop() /* laço de repetição */
{
unsigned long iniciaMs= millis(); /* Inicio da janela de amostra */
unsigned int PicoaPico = 0; /* Nível de pico a pico */
unsigned int sinalMax = 0; /* declara sinalMax com valor 0 */
unsigned int sinalMin = 1024; /* declara sinalMin com valor 1024 */
/* coleta dados por 1000ms (1s) */
while (millis() - iniciaMs < janeladeamostra)
{
amostra = analogRead(0); /* a amostra é equivalente ao valor lido pelo analógico em A0 */
if (amostra < 1024) /* se a amostra é menor do que */
{
if (amostra > sinalMax) /* se a amostra é maior que 0 */
{
sinalMax = amostra; /* o valor de sinalMax vai de 0 -> amostra */
}
else if (amostra < sinalMin) /* se a amostra é menor que 1024 */
{
sinalMin = amostra; /* amostra -> 1024 */
}
}
}
PicoaPico = sinalMax - sinalMin; /* sinalMax - sinalMin = amplitude de pico a pico */
double volts = (PicoaPico * 5.0) / 1024; /* converte para volts */
Serial.println(volts); /* printa volts no monitor serial */
}
Agora analisaremos o funcionamento do nosso sensor.
Conforme pode ser visto no gif, o led acende quando o dedo é estalado, esse teste também pode ser feito com o uso de uma música, o led acenderá no mesmo ritmo da música, é um teste que demonstra a variação da tensão de saída em concordância com a altitude do som, sendo diretamente proporcional.
Além da forma de visualização através do Led, podemos ver no monitor serial a variação aproximada da tensão, lembre de ajustar o baud rate no canto inferior direito do seu monitor para 115200.
E a variação da onda em Ferramentas> Plotter Serial, mas para isso é necessário fechar o monitor serial antes.
Eu também medi a saída com o auxílio de um osciloscópio, a imagem gerada com a medição de um som ritmado foi a seguinte:
Ajuste de Ganho
Um outro ponto importante sobre o sensor, mencionado no início do tutorial, é a presença do pino Gain, que corresponde aos ganhos em decibéis(dB), é possível visualizar essa variação mais claramente no osciloscópio, sendo que Gain corresponde ao nível de amplificação da onda.
Se nada é ligado ao pino Gain, você terá um ganho de 60dB, se liga esse pino ao GND, o seu ganho será de 50dB, e se liga ao VDD o seu ganho será o equivalente a 40dB. Note essa pequena variação nas imagens abaixo:
Gain em Float: 60dB
Gain em GND: 50dB
Gain em VDD: 40dB
O Attack (Ataque), é a ação do AGC sobre a tensão de entrada, então o tempo de ataque é o tempo que o AGC precisa para agir e realizar a redução, a atenuação de ganho durante o período de ataque é exponencial e definido como uma constante única, sendo essa:
2400 x CCT * (segundos)
*CCT corresponde ao capacitor de temporização externo.
É recomendado o uso de um curto tempo de ataque para o AGC reagir rapidamente a sinais transitórios como breves batidas musicais, e um tempo maior para que o AGC ignore picos de curta duração e apenas reduzam o ganho com a percepção do aumento de volume.
O Release (Liberação) corresponde a liberação do sinal, ou seja, o tempo de liberação é o tempo para que o ganho AGC volte ao seu nível normal depois do pico. Para esse caso, é recomendado o uso de uma proporção pequena para maximizar a velocidade do AGC, e uma proporção grande para o efeito contrário.
Acompanhe a tabela abaixo caso queira fazer essa alteração no tempo de Attack e Release do seu módulo.
Sem o uso do capacitor, temos as seguintes pré-configurações.
Conclusão
Dado o exposto, é possível concluir que o sensor em questão é uma ótima opção para inúmeros projetos que exigem uma percepção sonora, mostrando-se ajustável e sensível na detecção do som, além de contar com a variação automática da amplitude, que é extremamente útil e evita alterações no sinal de saída. Espero que esse tutorial tenha sido esclarecedor, para qualquer dúvida ou sugestão, deixe nos comentários abaixo.
Abraços, Curto Circuito :)
Livro supracitado:
CARNAHAN, Brice. The IBM Personal Computers and the Michigan Terminal System. 1.ed. College of Engineering,
University of Michigan, 1984. 365p.
Quanto a sua dúvida, você pode utilizar o mesmo sensor, no entanto, será necessário aplicar a transformada rápida de Fourier no sinail para conseguir distinguir as frequências.
Primeiramente, parabéns pelo post! Achei que ficou incrivelmente didático, profissional e esclarecedor, exatamente como bons arrigos científicos devem ser.
Fiquei com uma dúvida, vou escrever o que eu entendi, e me corrija, por favor, pois ao final explicarei a aplicação que vou dar a este módulo e a qualidade do som é importantíssimo pra mim, mas o Atack Time também: no datasheet fala que o Atack Time (A), como você explicou, é proporcional ao valor do capacitor (em milisegundos, dado pela fórmula: Valor do Capacitor X 2400, porém, há um adendo, logo nas primeiras linhas da página 9, do lado direito: lembrando do Release (R) time, que é o tempo que leva para "desligar" o Atack Time, fala que devemos maximizar a relação (A)/(R) para um (A) rápido (como já sabemos), no entanto, em seguida, fala que isso tem influência na qualidade do som, ou seja, no final das contas, a qualidade do som também é proporcional ao valor do capacitor.
Eis que temos um impasse: quanto mais rápido e responsivo o Atack Time, menor a qualidade do som, mas necessito de ambos, pois vou utilizar esse componente em um projeto de gravação e reconhecimento de canto de aves, utilizando uma ESP32-A1S (ninguém vende no Brasil, importei ano passado, e tem pouquíssimo material a respeito, é uma Esp32 com um audio codec embarcado através da pinagem I2S, desenvolvida para aplicações de Inteligência Artificial de áudio) segue datasheet dessa board: https://www.google.com/url?sa=t&source=web&rct=j&url=https://docs.ai-thinker.com/_media/esp32-a1s_v2.3_specification.pdf&ved=2ahUKEwjigMa4t7v1AhVIrpUCHWm4C-8QFnoECCwQAQ&usg=AOvVaw3tdp_MkrtxvTCaw-iYByLz
Se o link nao funcionar, é só buscar por Esp32-A1S, é da AI Thinker.
Então, o que você acha? Devo utilizar um capacitor de 1uF pra maximizar qualidade de som ou ficar no meio do caminho e utilizar um de 470nF?
Tudo bem?
Vamos lá, quando temos um sinal sonoro com picos, esse sinal passa por um processo de compreensão, nesse processo a altura da onda é reduzida de acordo com os limites definidos pelo receptor sonoro, por exemplo -16dB, com a redução de picos temos um sinal com maior constância e linearidade. O Attack time se refere ao tempo em que essa onda precisa estar em pico para haver a interferência do compreensor, ou seja, um curto Attack Time será útil para a redução de ruídos, pois qualquer pico será rapidamente reduzido, independente do comprimento dessa onda. O Release, por sua vez, corresponde ao tempo em que o compressor continuará agindo mesmo depois da diminuição do pico da entrada do sinal. Como a sua ideia para projeto é de um dispositivo de gravação e análise do canto dos pássaros, eu sugiro que você utilize um tempo de Attack Time elevado, pois assim você poderá captar os picos com breves oscilações do canto dos pássaros, pelo que eu entendi você não quer um som estável e sem desafinações, você quer o som próximo ao real, certo?
Espero ter ajudado e muito obrigada pelos elogios, é muito gratificante ler isso.
Abraços e boa sorte com o projeto! :)
estou querendo fazer um projeto para testar a saida de som do lado esquerdo e do lado direito individualmente da tv.
no caso seria a captura do som. É possivel usar esse sensor para esse tipo de teste?
Com o sensor você pode realizar medições sonoras através da variação de tensão, se a sua intenção é realizar essas leituras em sua televisão, o sensor é compatível com o projeto.
Abraços. :)