Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Sound Spectrum Visualizer com Arduino Nano 33 BLE

Componentes e suprimentos

Arduino Nano 33 BLE
× 1
Amplificador de microfone de eletreto Max9814
× 1
Tela OLED I2C de 0,91 polegadas de 128 x 32 pixels
× 1
Capacitor 4.7 nF
Dependendo do filtro passa-baixo RC e da frequência de corte selecionada
× 1
Capacitor 470 µF
× 1
Resistor 2K
Dependendo do filtro passa-baixo RC e da frequência de corte selecionada
× 1

Aplicativos e serviços online

Arduino IDE

Sobre este projeto





Introdução


Veja como um gráfico de barras responde à música e ao som em um pequeno display OLED. Frequências mais baixas na extremidade esquerda do gráfico, frequências mais altas na direita.





Construção






Conexões
  • Conecte o Mic GAIN dependendo da sensibilidade que melhor se adequa ao seu sistema: VCC para o microfone GAIN para 40dB, baixa sensibilidade, GND para o microfone GAIN para 50dB, sensibilidade média ou deixe flutuar o microfone GAIN para 60dB, alta sensibilidade.
  • Conecte o pino analógico 0 A0 para amplificador de microfone OUT
  • Conecte 3,3 V , GND , SDA (ou analógico 4 A4 ) e SCL (analógico 5 A5 ) para I2C SSD1306
  • conecte um capacitor 470 uF entre VCC e GND no barramento de força

Obtendo ruído de baixa frequência?

O ruído vem de quaisquer dispositivos elétricos próximos ao seu sistema de medição que estejam funcionando. Todos os dispositivos eletrônicos funcionam com frequência fixa e tensão de corrente alternativa (CA) com frequência de 50 Hz ou 60 Hz é a frequência da rede elétrica em seu país. Você pode usar uma gaiola de faraday para eliminar o ruído facilmente. Coloque seu circuito dentro de uma caixa e conecte a caixa ao aterramento. Aterre bem o circuito.

Pinagem do Arduino Nano 33 BLE

Usando o AnalogRead do núcleo do arduino e o Arduino Nano 33 BLE, podemos obter apenas cerca de 35.000 amostras por segundo, portanto não podemos usar FFT para frequências acima de 17,5 Khz, pois temos que ler o relógio e fazer várias comparações em um loop de espera ocupado. vai ser cauteloso e ter um limite superior de 8 kHz. Portanto, podemos usar um filtro passa-baixo RC simples para evitar soluções irritantes além dessa frequência.

R =180Ω C =0,1uF para uma frequência de corte fc =8842 [Hz]

Aqui, usando um resistor de 2K Ohm e um capacitor de 4,7 nF para uma frequência de corte fc =17000 [Hz]





Cálculo aproximado da taxa de amostragem máxima


Usar a função analogRead () normal do Arduino é muito lento para a amostragem de áudio, então vamos calcular a taxa de amostragem máxima.

Vamos estimar quantas amostras podemos obter usando o núcleo do arduino AnalogRead e o Arduino Nano 33 BLE.

Vamos rodar este pequeno programa para fazer uma estimativa.
  / * 
* Cálculo aproximado da taxa de amostragem máxima com AnalogRead
* /

#define ANALOG_PIN A0

#define AMOSTRAS 1000000.0
int newTime;
int analogValue;
configuração vazia () {

Serial.begin (9600);
Serial.println ("Amostragem. .. por favor, espere. ");
}

void loop () {
// coloque seu código principal aqui, para executar repetidamente:
newTime =micros ();

// 1 milhão de amostras
para (int i =0; i <(int) AMOSTRAS; i ++) {
analogValue =analogRead (ANALOG_PIN);
}
float elapsedTimePerSampleUs =(micros () - newTime) / SAMPLES;
Serial.print ("Tempo por amostra (nos):");
Serial.println (elapsedTimePerSampleUs);
Serial.print ("Max sampling freq (hz):");
Serial.println (pow (10,6) / elapsedTimePerSampleUs);
}

Usando o Arduino core AnalogRead e o Arduino Nano 33 BLE, podemos obter apenas cerca de 35.000 amostras por segundo. O requisito de taxa aproximadamente dupla, consequência do teorema de Nyquist, limitará nosso visualizador de espectro a frequências abaixo de 17 kHz. Podemos usar um filtro passa-baixo para pular as frequências acima desse limite.

Temos que ler o relógio e fazer várias comparações em um loop de espera ocupado, vamos ser cautelosos e usar um limite superior de 8 kHz.
  // pegar amostras 
para (int i =0; i unsigned long newTime =micros ();
int value =analogRead (ANALOG_PIN );
vReal [i] =valor;
vImag [i] =0;
while (micros () <(newTime + sampling_period_us)) {
yield ();
}
}





A interface do usuário


A tela é dividida em onze zonas de frequência e você em uma escala logarítmica agrupando frequências semelhantes à forma como o ouvido humano as percebe.

Os humanos podem detectar sons em uma faixa de frequência de cerca de 20 Hz a 20 kHz. (Bebês humanos podem realmente ouvir frequências um pouco mais altas do que 20 kHz, mas perdem alguma sensibilidade de alta frequência à medida que amadurecem; o limite superior em adultos médios é frequentemente próximo a 15–17 kHz.)

Usará as zonas 3 a 13 (11 zonas) para nossa representação.

Cada barra representa o valor máximo na banda com linhas espaçadas e o valor médio na banda com um retângulo preenchido.

Os valores são apresentados em decibéis com uma referência pré-selecionada obtida de forma heurística.





Como funciona?


As amostras de áudio são convertidas em um espectro de frequência usando uma transformada rápida de Fourier ou FFT.

Em seguida, o espectro é dividido e agrupado em 14 zonas e apenas 11 zonas são representadas em dB.





Sobre o módulo de microfone


Microfone de eletreto

O eletreto é um dielétrico quase permanentemente carregado. É feito aquecendo um material cerâmico, colocando-o em um campo magnético e permitindo que ele resfrie ainda no campo magnético. É o equivalente eletrostático de um ímã permanente. Em um microfone de eletreto, uma fatia desse material é usada como parte do dielétrico de um capacitor no qual o diafragma do microfone forma uma placa. A pressão do som move o diafragma. O movimento da placa varia a capacitância de acordo com a pressão sonora. Dada a carga fixa embutida do dielétrico, a tensão no capacitor também irá variar. O capacitor de eletreto é conectado à entrada de um amplificador FET embutido. Microfones de eletreto são pequenos, têm excelente sensibilidade, uma ampla resposta de frequência e geralmente um custo muito baixo.

Amplificador de microfone MAX9814

O MAX9814 é um amplificador de microfone com controle automático de ganho (AGC) e polarização de microfone de baixo ruído e tem algumas opções que você pode configurar com o breakout.

O módulo MAX9814 tem três configurações de amplificador (40dB, 50dB, 60dB). O padrão é 60dB, mas pode ser definido para 40dB ou 50dB por jumper do pino de ganho para VCC ou terra.

Polarização do microfone interno de baixo ruído 1,25 V, 2 Vpp. A saída do amplificador é de cerca de 2 Vpp máx em uma polarização de 1,25 V CC, portanto, pode ser facilmente usado com qualquer conversor analógico / digital que tenha até 3,3 V de entrada.

A proporção de ataque / liberação também pode ser modificada, do padrão 1:4000 para 1:2000 ou 1:500.

Para conectar diretamente a uma entrada de linha, você precisa de um capacitor de bloqueio / capacitor de acoplamento para bloquear o componente CC. Você pode usar um capacitor de bloqueio em série acima de 1uF, depende do seu sistema, em caso de dúvida tente de 33 uF a 100uF. Um circuito de acoplamento permite que os sinais CA fluam de uma parte para outra, enquanto bloqueia os componentes CC. Em circuitos de áudio, isso é feito para evitar que os componentes DC distorçam a saída de áudio. A eficácia de um capacitor de acoplamento depende de uma ampla gama de parâmetros dependentes da frequência, incluindo perda de inserção, resistência de série equivalente e frequência de ressonância em série.

Fonte de alimentação:2,7 V a 5,5 V

Sensibilidade

Sensibilidade , a proporção da tensão de saída analógica ou valor de saída digital para a pressão de entrada, é uma especificação chave de qualquer microfone. O mapeamento de unidades no domínio acústico para unidades no domínio elétrico determina a magnitude do sinal de saída do microfone, dada uma entrada conhecida.

A sensibilidade de um microfone é a resposta elétrica em sua saída para uma determinada entrada acústica padrão. O sinal de entrada de referência padrão para medições de sensibilidade do microfone é uma onda senoidal de 1 kHz a 94 dB de nível de pressão sonora (SPL) ou 1 pascal (Pa, uma medição de pressão). Um microfone com um valor de sensibilidade mais alto tem uma saída de nível mais alto para uma entrada acústica fixa do que um microfone com um valor de sensibilidade mais baixo. A sensibilidade do microfone em decibéis (dB) é normalmente um número negativo; portanto, uma sensibilidade mais alta é um valor absoluto menor.

Para microfones analógicos, a sensibilidade é normalmente especificada em unidades de dBV, ou seja, decibéis com referência a 1,0 V rms.

Nível de referência e resposta de frequência

A resposta de frequência de um microfone descreve seu nível de saída em todo o espectro de frequência. Os limites de alta e baixa frequência são descritos como os pontos nos quais a resposta do microfone está 3 dB abaixo do nível de saída de referência em 1 kHz. O nível de referência em 1 kHz é normalmente normalizado para 0 dB.





Tela OLED I2C de 0,91 polegadas de 128 x 32 pixels


Este é um display pequeno, com apenas cerca de 1 "na diagonal. É feito de pixels OLED brancos individuais de 128x32, cada um é ligado ou desligado pelo chip do controlador. Nenhuma luz de fundo é necessária. Isso reduz a energia necessária para executar o OLED.

O modelo que estamos usando aqui tem apenas quatro pinos e se comunica com o Arduino usando o protocolo de comunicação I2C. Este modelo não possui pino RESET. Você só precisa se conectar aos pinos I2C do Arduino Uno:
  • Arduino Nano:SDA (A4); SCL (A5);

Para controlar o display OLED, você precisa das bibliotecas adafruit_SSD1306.h e adafruit_GFX.h. Siga as próximas instruções para instalar essas bibliotecas.

Estamos usando bibliotecas Adafruit. Lembre-se de que você pode comprar algo da Adafruit para apoiá-los.

Próximas etapas

O Arduino Nano 33 BLE usa um pode fazer melhor ao obter leituras analógicas. Na próxima versão, usarei FFT e entrada analógica otimizada para o nrf52840.

Código

  • Visualizador de espectro de som para Arduino Nano 33 BLE
Visualizador de espectro de som para Arduino Nano 33 BLE Arduino
Sound Spectrum Visualizer para Arduino Nano 33 BLE
usa arduinoFFT https://github.com/kosme/arduinoFFT
usa Adafruit_GFX https://github.com/adafruit/Adafruit-GFX-Library
usa Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306
/* Visualizador de espectro de som para Arduino Nano 33 BLE Visualizador de som baseado em Arduino @author Enrique Albertos Requisitos de hardware:- Arduino ou placas compatíveis com Arduino. - ssd1306 display I2C 128x32 oled - Amplificador de microfone de eletreto com max9814 - Opcional:bateria para uso portátil (caso contrário, alimentação por USB) Requisitos de software:- arduinoFFT https://github.com/kosme/arduinoFFT - Adafruit_GFX https://github.com / adafruit / Adafruit-GFX-Library - Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 Conexões:- Mic GAIN:* VCC para mic GAIN para 40dB * GND para mic GAIN para 50dB * MIC GAIN para 60dB - Pino analógico 0 para saída de amplificador de microfone - + 3,3 V, GND, SDA (ou analógico 4) e SCL (analógico 5) para I2C SSD1306 @uses arduinoFFT https://github.com/kosme/arduinoFFT @uses Adafruit_GFX https:// github. com / adafruit / Adafruit-GFX-Library @uses Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 Este programa é um software livre:você pode redistribuí-lo e / ou modificá-lo nos termos da GNU General Public License publicada por a Free Software Foundation, seja a versão 3 da Licença ou (conforme sua opção) qualquer versão posterior. Este programa é distribuído na esperança de que seja útil, mas SEM NENHUMA GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM. Consulte a GNU General Public License para obter mais detalhes. * / # Include "arduinoFFT.h" #include  #include  #define SAMPLES 1024 // potência de 2 # define SAMPLING_FREQ 24000 // 12 kHz Fmax =sampleF / 2 #define AMPLITUDE 100 // sensibilidade # define FREQUENCY_BANDS 14 # define SCREEN_WIDTH 128 // Largura do display OLED, em pixels # define SCREEN_HEIGHT 32 // Altura do display OLED, em pixels # define BARWIDTH 11 # define BARS 11 # define ANALOG_PIN A0 // Declaração para um display SSD1306 conectado a I2C (SDA, pinos SCL) #define OLED_RESET -1 // Reset pin # (ou -1 se compartilhando Arduino reset pin) Adafruit_SSD1306 display (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); double vImag [SAMPLES]; double vReal [SAMPLES]; unsigned long sampling_period_us; arduinoFFT fft =arduinoFFT (vReal, vImag, SAMPLES, SAMPLING_FREQ); // ajustar a referência para remover o ruído de fundo noisefloat reference =log10 (50.0); double coutoffFrequencies [double coutoffFrequencies] FREQUENCY_BANDS]; void setup () {// SSD1306_SWITCHCAPVCC =gerar display v oltage de 3,3 V internamente if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Endereço 0x3C para 128x32 para (;;); // Não continue, faça um loop para sempre} // Configurar display display.clearDisplay (); display.display (); display.setRotation (0); display.invertDisplay (false); amostragem_período_us =(1,0 / AMOSTRAGEM_FREQ) * pow (10,0, 6); // Calcula as frequências de corte, meça uma escala logarítmica base POt double basePot =pow (SAMPLING_FREQ / 2.0, 1.0 / FREQUENCY_BANDS); coutoffFrequencies [0] =basePot; para (int i =1; i  max [índice]) {max [índice] =vReal [i]; } if (hz> coutoffFrequencies [índice]) {mediana [índice] =soma / contagem; soma =0,0; contagem =0; index ++; máx [índice] =0; mediana [índice] =0; } hz + =hzPerSample; } // calcula a mediana e o máximo por banda de frequência if (soma> 0,0) {mediana [índice] =soma / contagem; if (mediana [índice]> maxinband) {maxinband =mediana [índice]; }} barra interna =0; para (int i =FREQUENCY_BANDS - 1; i> =3; i--) {int newHeight =0; int newMax =0; // calcula decibéis reais if (mediana [i]> 0 &&max [i]> 0) {newHeight =20,0 * (log10 (mediana [i]) - referência); newMax =20,0 * (log10 (max [i]) - referência); } // ajusta os níveis mínimo e máximo if (newHeight <0 || newMax <0) {newHeight =1; newMax =1; } if (newHeight> =SCREEN_HEIGHT - 2) {newHeight =SCREEN_HEIGHT - 3; } if (newMax> =SCREEN_HEIGHT - 2) {newMax =SCREEN_HEIGHT - 3; } int barX =bar * BARWIDTH + 5; // remove a mediana do nível antigo if (oldHeight [i]> newHeight) {display.fillRect (barX, newHeight + 1, 7, oldHeight [i], SSD1306_BLACK); } // remover nível máximo antigo if (oldMax [i]> newHeight) {for (int j =oldMax [i]; j> newHeight; j - =2) {display.drawFastHLine (barX, j, 7, SSD1306_BLACK); }} // pintar novo nível máximo para (int j =newMax; j> newHeight; j - =2) {display.drawFastHLine (barX, j, 7, SSD1306_WHITE); } // pinta o novo nível mediano display.fillRect (barX, 1, 7, newHeight, SSD1306_WHITE); oldMax [i] =newMax; oldHeight [i] =newHeight; bar ++; } display.drawFastHLine (0, SCREEN_HEIGHT - 1, SCREEN_WIDTH, SSD1306_WHITE); display.display ();} 

Esquemas

soundpectrumvisualizer_qLzRsVPVlc.fzz

Processo de manufatura

  1. Jogo Arduino Pong - Tela OLED
  2. Monitoramento de CO2 com Sensor K30
  3. Comunicação para surdos-cegos com 1Sheeld / Arduino
  4. Aceitar moeda de controle com Arduino
  5. Arduino com Bluetooth para controlar um LED!
  6. Arduino Nano:Controle 2 motores de passo com joystick
  7. Enviar dados com som
  8. Contador Geiger portátil com Arduino Nano
  9. Medindo a radiação solar com Arduino
  10. Faça um Robô Comer Com Arduino Nano | Parafuso de ouro