Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Visualizador de espectro de sonido con Arduino Nano 33 BLE

Componentes y suministros

Arduino Nano 33 BLE
× 1
Amplificador de micrófono Electret Max9814
× 1
Pantalla OLED I2C de 0,91 pulgadas de 128 x 32 píxeles
× 1
Condensador 4.7 nF
Dependiendo de su filtro de paso bajo RC y su frecuencia de corte seleccionada
× 1
Condensador 470 µF
× 1
Resistencia 2K
Dependiendo de su filtro de paso bajo RC y su frecuencia de corte seleccionada
× 1

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto

Introducción

Vea cómo un gráfico de barras responde a la música y al sonido en una pequeña pantalla OLED. Las frecuencias más bajas hacia el extremo izquierdo del gráfico, las frecuencias más altas hacia la derecha.

Construcción

Conexiones

  • Conecte Mic GAIN según la sensibilidad que mejor se adapte a su sistema: VCC al micrófono GAIN para 40dB, baja sensibilidad, GND al micrófono GAIN para 50dB, sensibilidad media o dejar flotar el micrófono GAIN para 60dB, alta sensibilidad.
  • Conecta el pin analógico 0 A0 al amplificador de micrófono OUT
  • Conecte 3.3V , GND , SDA (o analógico 4 A4 ) y SCL (analógico 5 A5 ) a I2C SSD1306
  • conecte un capacitor de 470 uF entre VCC y GND en el bus de energía

¿Obtienes ruido de baja frecuencia?

El ruido proviene de cualquier dispositivo eléctrico cerca de su sistema de medición que esté funcionando. Todos los dispositivos electrónicos funcionan con una frecuencia fija y un voltaje de corriente alternativa (CA) con una frecuencia de 50 Hz o 60 Hz es la frecuencia de la línea eléctrica en su país. Puede utilizar una jaula de faraday para eliminar el ruido fácilmente. Coloque su circuito dentro de una caja y conecte la caja a tierra. Conecte a tierra bien el circuito.

Pinout de Arduino Nano 33 BLE

Usando Arduino Core AnalogRead y Arduino Nano 33 BLE solo podemos obtener alrededor de 35,000 muestras por segundo, por lo que no podemos usar FFT para frecuencias superiores a 17.5 Khz, ya que tenemos que leer el reloj y hacer varias comparaciones en un bucle de espera ocupado. va a ser cauteloso y tomar un límite superior de 8 kHz. Por lo tanto, podemos usar un filtro de paso bajo RC simple para evitar soluciones molestas más allá de esa frecuencia.

R =180Ω C =0.1uF para una frecuencia de corte fc =8842 [Hz]

Aquí, usando una resistencia de 2K Ohm y un capacitor de 4.7 nF para una frecuencia de corte fc =17000 [Hz]

Cálculo aproximado de la frecuencia de muestreo máxima

El uso de la función analógicaRead () de Arduino normal es demasiado lento para muestrear audio, así que calculemos la frecuencia de muestreo máxima.

Vamos a estimar cuántas muestras podemos obtener usando Arduino Core AnalogRead y Arduino Nano 33 BLE.

Ejecutemos este pequeño programa para tener una estimación.

  / * 
* Cálculo aproximado de la frecuencia de muestreo máxima con AnalogRead
* /

#define ANALOG_PIN A0

#define SAMPLES 1000000.0
int newTime;
int analogValue;
void setup () {

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

void loop () {
// ponga su código principal aquí, para que se ejecute repetidamente:
newTime =micros ();

// 1 millón de muestras
para (int i =0; i <(int) SAMPLES; i ++) {
analogValue =analogRead (ANALOG_PIN);
}
float elapsedTimePerSampleUs =(micros () - newTime) / SAMPLES;
Serial.print ("Tiempo por muestra (us):");
Serial.println (elapsedTimePerSampleUs);
Serial.print ("Frecuencia máxima de muestreo (hz):");
Serial.println (pow (10,6) / elapsedTimePerSampleUs);
}

Usando Arduino Core AnalogRead y Arduino Nano 33 BLE solo podemos obtener alrededor de 35, 000 muestras por segundo. El requisito de aproximadamente el doble de velocidad, consecuencia del teorema de Nyquist, limitará nuestro visualizador de espectro a frecuencias por debajo de 17 kHz. Podemos usar un filtro de paso bajo para omitir frecuencias por encima de ese límite.

Tenemos que leer el reloj y hacer varias comparaciones en un bucle de espera ocupado, vamos a ser cautelosos y tomar un límite superior de 8 kHz.

  // tomar muestras 
para (int i =0; i unsigned long newTime =micros ();
int value =analogRead (ANALOG_PIN );
vReal [i] =valor;
vImag [i] =0;
while (micros () <(newTime + sample_period_us)) {
rendimiento ();
}
}

La interfaz de usuario

La pantalla está dividida en once zonas de frecuencia y una escala logarítmica agrupa las frecuencias similares a cómo las percibe el oído humano.

Los seres humanos pueden detectar sonidos en un rango de frecuencia de aproximadamente 20 Hz a 20 kHz. (Los bebés humanos en realidad pueden escuchar frecuencias ligeramente superiores a 20 kHz, pero pierden algo de sensibilidad de alta frecuencia a medida que maduran; el límite superior en los adultos promedio suele estar más cerca de los 15-17 kHz).

Usaremos las zonas 3 a 13 (11 zonas) para nuestra representación.

Cada barra representa el valor máximo en la banda con líneas espaciadas y el valor medio en la banda con un rectángulo relleno.

Los valores se muestran en decibelios con una referencia preseleccionada obtenida de forma heurística.

¿Cómo funciona?

Las muestras de audio se convierten en un espectro de frecuencia utilizando una transformada rápida de Fourier o FFT.

Luego, el espectro se divide y agrupa en 14 zonas y solo 11 zonas se representan en dB.

Acerca del módulo de micrófono

Micrófono electret

Electret es un dieléctrico de carga casi permanente. Se fabrica calentando un material cerámico, colocándolo en un campo magnético y luego dejándolo enfriar mientras aún está en el campo magnético. Es el equivalente electrostático de un imán permanente. En un micrófono electret se utiliza una rodaja de este material como parte del dieléctrico de un condensador en el que el diafragma del micrófono forma una placa. La presión del sonido mueve el diafragma. El movimiento de la placa varía la capacitancia de acuerdo con la presión sonora. Dada la carga fija incorporada del dieléctrico, el voltaje a través del capacitor también variará. El condensador electret está conectado a la entrada de un amplificador FET integrado. Los micrófonos electret son pequeños, tienen una sensibilidad excelente, una respuesta de frecuencia amplia y, en general, un costo muy bajo.

Amplificador de micrófono MAX9814

El MAX9814 es un amplificador de micrófono con control automático de ganancia (AGC) y polarización de micrófono de bajo ruido y tiene algunas opciones que puede configurar con el breakout.

El módulo MAX9814 tiene tres configuraciones de amplificador (40dB, 50dB, 60dB). El valor predeterminado es 60dB, pero se puede configurar en 40dB o 50dB conectando el pin Gain a VCC o tierra.

Polarización interna del micrófono de bajo ruido 1,25 V, 2 Vpp. La salida del amplificador es de aproximadamente 2 Vpp como máximo en una polarización de 1.25 V CC, por lo que se puede usar fácilmente con cualquier convertidor analógico / digital que tenga una entrada de hasta 3.3 V.

La relación Ataque / Liberación también se puede modificar, desde el valor predeterminado 1:4000 a 1:2000 o 1:500.

Para conectarse directamente a una entrada de línea, necesita un condensador de bloqueo / condensador de acoplamiento para bloquear el componente de CC. Puede utilizar un condensador de bloqueo en serie por encima de 1uF, depende de su sistema, en caso de duda intente desde 33 uF a 100uF. Un circuito de acoplamiento permite que las señales de CA fluyan de una parte a otra mientras bloquea los componentes de CC. En los circuitos de audio, esto se hace para evitar que los componentes de CC distorsionen la salida de audio. La eficacia de un condensador de acoplamiento depende de una amplia gama de parámetros dependientes de la frecuencia, incluida la pérdida de inserción, la resistencia en serie equivalente y la frecuencia de resonancia en serie.

Fuente de alimentación:2,7 V a 5,5 V

Sensibilidad

Sensibilidad , la relación entre el voltaje de salida analógica o el valor de salida digital y la presión de entrada, es una especificación clave de cualquier micrófono. La asignación de unidades en el dominio acústico a unidades en el dominio eléctrico determina la magnitud de la señal de salida del micrófono, dada una entrada conocida.

La sensibilidad de un micrófono es la respuesta eléctrica en su salida a una entrada acústica estándar dada. La señal de entrada de referencia estándar para las mediciones de sensibilidad del micrófono es una onda sinusoidal de 1 kHz a un nivel de presión sonora (SPL) de 94 dB, o 1 pascal (Pa, una medida de presión). Un micrófono con un valor de sensibilidad más alto tiene una salida de nivel más alto para una entrada acústica fija que un micrófono con un valor de sensibilidad más bajo. La sensibilidad del micrófono en decibelios (dB) suele ser un número negativo; por lo tanto, una sensibilidad más alta es un valor absoluto más pequeño.

Para micrófonos analógicos, la sensibilidad se especifica típicamente en unidades de dBV, es decir, decibeles con referencia a 1.0 V rms.

Nivel de referencia y respuesta en frecuencia

La respuesta de frecuencia de un micrófono describe su nivel de salida en todo el espectro de frecuencias. Los límites de frecuencia alta y baja se describen como los puntos en los que la respuesta del micrófono está 3 dB por debajo del nivel de salida de referencia a 1 kHz. El nivel de referencia a 1 kHz se normaliza habitualmente a 0 dB.

Pantalla OLED I2C de 0,91 pulgadas de 128 x 32 píxeles

Esta es una pantalla pequeña, de solo 1 "en diagonal. Está hecha de 128x32 píxeles OLED blancos individuales, cada uno se enciende o apaga mediante el chip controlador. No se requiere luz de fondo. Esto reduce la energía requerida para ejecutar el OLED.

El modelo que estamos usando aquí tiene solo cuatro pines y se comunica con Arduino usando el protocolo de comunicación I2C. Este modelo no tiene pin RESET. Solo necesita conectarse a los pines Arduino Uno I2C:

  • Arduino Nano:SDA (A4); SCL (A5);

Para controlar la pantalla OLED, necesita las bibliotecas adafruit_SSD1306.hy adafruit_GFX.h. Siga las siguientes instrucciones para instalar esas bibliotecas.

Estamos usando bibliotecas Adafruit. Recuerde que puede comprar algo de Adafruit para apoyarlos.

Pasos siguientes

Arduino Nano 33 BLE usa una lata puede ser mejor para obtener lecturas analógicas. En la próxima versión usaré FFT y entrada analógica optimizada para el nrf52840.

Código

  • Visualizador de espectro de sonido para Arduino Nano 33 BLE
Visualizador de espectro de sonido para Arduino Nano 33 BLE Arduino
Visualizador de espectro de sonido 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
/* Sound Spectrum Visualizer para Arduino Nano 33 BLE Visualizador de sonido basado en Arduino @author Enrique Albertos Requisitos de hardware:- Placas compatibles con Arduino o Arduino. - Pantalla ssd1306 oled I2C 128x32 - Amplificador de micrófono Electret con max9814 - Opcional:batería para uso portátil (si no, alimentación a través de 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 Conexiones:- MIC GAIN:* VCC a micrófono GAIN para 40dB * GND a micrófono GAIN para 50dB * micrófono flotante GAIN para 60dB - Pin analógico 0 a salida de amplificador de micrófono - + 3.3V, GND, SDA (o analógico 4) y SCL (analógico 5) a I2C SSD1306 @ usa arduinoFFT https://github.com/kosme/arduinoFFT @ usa Adafruit_GFX https:// github. com / adafruit / Adafruit-GFX-Library @uses Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 Este programa es software libre:puede redistribuirlo y / o modificarlo bajo los términos de la Licencia Pública General GNU publicada por Free Software Foundation, ya sea la versión 3 de la Licencia o (a su elección) cualquier versión posterior. Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la Licencia pública general GNU para obtener más detalles. * / # Include "arduinoFFT.h" #include  #include  #define SAMPLES 1024 // potencia de 2 # define SAMPLING_FREQ 24000 // 12 kHz Fmax =muestraF / 2 #define AMPLITUDE 100 // sensibilidad # define FREQUENCY_BANDS 14 # define SCREEN_WIDTH 128 // Ancho de pantalla OLED, en píxeles # define SCREEN_HEIGHT 32 // Altura de pantalla OLED, en píxeles # define BARWIDTH 11 # define BARS 11 # define ANALOG_PIN A0 // Declaración para una pantalla SSD1306 conectada a I2C (pines SDA, SCL) #define OLED_RESET -1 // Restablecer el pin # (o -1 si se comparte el pin de restablecimiento de Arduino) Pantalla Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); double vImag [SAMPLES]; double vReal [SAMPLES]; unsigned long sample_period_us; arduinoFFT fft =arduinoFFT (vReal, vImag, SAMPLES, SAMPLING_FREQ); // ajustar la referencia para eliminar el ruido de fondo noisefloat reference =log10 (50.0); double coutoffFrequencies [ FREQUENCY_BANDS]; configuración vacía () {// SSD1306_SWITCHCAPVCC =generar visualización v voltaje de 3.3V internamente if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Dirección 0x3C para 128x32 para (;;); // No continúes, repite para siempre} // Configurar display display.clearDisplay (); display.display (); display.setRotation (0); display.invertDisplay (falso); período_de_muestreo_us =(1.0 / MUESTREO_FREQ) * pow (10.0, 6); // Calcular frecuencias de corte, obtener una escala logarítmica basePOt 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] =suma / recuento; suma =0.0; cuenta =0; índice ++; max [índice] =0; mediana [índice] =0; } hz + =hzPerSample; } // calcula la mediana y el máximo por banda de frecuencia si (suma> 0.0) {mediana [índice] =suma / recuento; if (mediana [índice]> maxinband) {maxinband =mediana [índice]; }} int bar =0; para (int i =FREQUENCY_BANDS - 1; i> =3; i--) {int newHeight =0; int newMax =0; // calcula los decibelios reales if (mediana [i]> 0 &&max [i]> 0) {newHeight =20.0 * (log10 (mediana [i]) - referencia); newMax =20.0 * (log10 (max [i]) - referencia); } // ajusta los niveles mínimo y máximo if (newHeight <0 || newMax <0) {newHeight =1; newMax =1; } if (altura nueva> =ALTURA_PANTALLA - 2) {altura nueva =ALTURA_PANTALLA - 3; } if (newMax> =SCREEN_HEIGHT - 2) {newMax =SCREEN_HEIGHT - 3; } int barX =bar * ANCHO DE BARRA + 5; // eliminar la mediana del nivel anterior if (oldHeight [i]> newHeight) {display.fillRect (barX, newHeight + 1, 7, oldHeight [i], SSD1306_BLACK); } // eliminar el nivel máximo antiguo if (oldMax [i]> newHeight) {for (int j =oldMax [i]; j> newHeight; j - =2) {display.drawFastHLine (barX, j, 7, SSD1306_BLACK); }} // pintar un nuevo nivel máximo para (int j =newMax; j> newHeight; j - =2) {display.drawFastHLine (barX, j, 7, SSD1306_WHITE); } // pinta el display.fillRect de la mediana del nuevo nivel (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

Proceso de manufactura

  1. Juego Arduino Pong - Pantalla OLED
  2. Monitoreo de CO2 con sensor K30
  3. Comunicación para personas sordociegas con 1Sheeld / Arduino
  4. Controlar el aceptador de monedas con Arduino
  5. ¡Arduino con Bluetooth para controlar un LED!
  6. Arduino Nano:Controla 2 motores paso a paso con joystick
  7. Enviar datos con sonido
  8. Contador Geiger de mano con Arduino Nano
  9. Medición de la radiación solar con Arduino
  10. Crea un robot para comer con Arduino Nano | Tornillo dorado
  11. Pantalla de temperatura OLED de Arduino con reloj en tiempo real