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 audio RGB de 32 bandas

Componentes y suministros

Arduino Nano R3
× 1
WS2812B 8x32 RGB LED MATRIX
× 1
Resistencia de 4,75 k ohmios
× 3
Resistencia 100k ohm
× 2
Resistencia de 10k ohmios
× 1
Resistencia de orificio pasante, 390 ohmios
× 1
Condensador 100 nF
× 2
Condensador 1000 µF
× 1
Interruptor de botón SparkFun de 12 mm
× 1
Tablero protototipo de 4 x 6 cm con múltiples orificios
× 1

Herramientas y máquinas necesarias

Soldador (genérico)
Cable divisor jack de 3,5 mm

Acerca de este proyecto

El Proyecto

Este proyecto es para hacer un visualizador de espectro de frecuencia de audio (música) RGB de 32 bandas utilizando Arduino Nano y una matriz de LED RGB WS2812B de 8x32.

El proyecto original que inspiró esto

Un gran agradecimiento para Shajeeb autor del proyecto original basado en la matriz de led MAX72xx. Solo modifiqué la parte piloto de la matriz de leds para adaptarla a la Matriz de Led RGB WS2812B.

Enlace al proyecto original:Analizador de visualizador de espectro de audio de 32 bandas

La matriz de LED RGB WS2812B

Utilizando una matriz de LED RGB basada en LED de alto brillo 5050 SMD, es necesario utilizar una fuente de alimentación externa porque la matriz RGB puede absorber más de 10mA por LED, por lo tanto con todos los LED encendidos al máximo brillo podría absorber más de 2.5 Amperios.

Por esta razón he insertado un diodo en serie a + 5V para poder alimentar Arduino en modo autónomo, cuando el cable USB no está conectado, y para evitar que Arduino sea la fuente de alimentación de la matriz RGB, así evitas sobrecargar los circuitos internos de la placa con una corriente que no podía suministrar.

Al proyecto original, además del diodo de entrada, para proteger la entrada de la matriz LED de posibles picos de voltaje, también agregué una resistencia de 390 ohmios en serie entre el Arduino pind D6 y la entrada de datos, y un capacitor de 12V de 1000 µF para mejorar la estabilidad del voltaje de suministro de Arduino.

Montaje de hardware

Como se ve en la foto principal, hice el primer prototipo en una placa con múltiples orificios de 4x6 cm usando dos tomas de audio RCA (soldadas directamente en la placa) que también se pueden reemplazar con una toma Jack hembra de 3.5 mm. Lo importante para evitar zumbidos es realizar las conexiones entre la fuente y la entrada de audio de la tarjeta con un cable blindado. Otro consejo es mantener la conexión entre Arduino y la matriz de led lo más corta posible.

El código

Al final, todo el software se basa en el gran trabajo realizado por el autor del procedimiento de muestreo a través de la librería FFT y la realización definitiva de Shajeeb.

He agregado dos funciones:

El primero es GetLedFromMatrix (...) para mapear la matriz en filas y columnas y poder direccionar cada uno de los 256 LED a través de coordenadas de fila y columna.

El segundo es el que llamé arbitrariamente SetColumn (...) - que enciende los LED de cada columna en función del valor máximo obtenido por la digitalización de audio ( valores entre 0 y 7 ) y sobre la base de los colores preestablecidos en una matriz bidimensional. Puedes divertirte cambiando los valores y por tanto los colores como prefieras. Para simplificar el código, utilicé una sobrutina llamada Wheel () (tomada de una demostración adjunta a la biblioteca Neopixel de Adafruit) que a partir de un valor entre 0 y 255 devuelve un valor largo de 32 bits sin firmar para pasar directamente a la función setPixelColor. Sobre esto puedes jugar a tu antojo, teniendo en cuenta las limitaciones de memoria de Arduino evitando en lo posible el uso de variables de 32 bits para almacenar valores de colores RGB.

Audio ecualización

Además, como realicé las pruebas con el audio proveniente de la tarjeta de sonido integrada en la placa base de la PC, para mejorar la respuesta de frecuencia, agregué una matriz de bytes de 32 valores que en efecto constituyen una curva de ecualización para atenuar los graves y mejorar los agudos. Si no lo necesita, simplemente configure la variable EQ_ON en false o cambiar el nivel de atenuación cambiando los 32 valores del eq [32] matriz, un valor de 100 deja la amplitud sin cambios, uno menor que 100 atenúa y uno mayor que 100 acentúa la banda de frecuencia.

Led brillo

El brillo de la matriz está preestablecido en el código en 32 (BRIGHTNESS const). El valor máximo de brillo de la matriz WS2812B (en papel) es 255 pero ya con valores superiores a 100, la luz LED desafortunadamente cambia de blanco a amarillo pálido, probablemente sea necesario suministrar la matriz a través de los dos cables centrales rojo y negro en su lugar del conector del lado derecho.

Todavía lo estoy intentando ...

Finalmente, si usa un brillo máximo de 64, una fuente de alimentación de 1A probablemente sea suficiente; de ​​lo contrario, 2A es esencial.

Actualización futura

Estoy trabajando en una nueva versión que usa OpenMusicLabs FHT biblioteca que resulta ser muchas veces más rápida que Arduino FFT.

Manténganse al tanto. :)

Por favor perdona mi mal inglés, utilicé el traductor de Google.

Código

  • Spectrum_Analyzer_WS2812B.ino
Spectrum_Analyzer_WS2812B.ino Arduino
 / * Copyright (c) 2019 Shajeeb TM Por la presente se otorga permiso, sin cargo, a cualquier persona que obtenga una copia de este software y los archivos de documentación asociados (el "Software"), para operar con el Software sin restricciones, incluyendo sin limitación, los derechos para usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y / o vender copias del Software, y permitir que las personas a quienes se les proporcione el Software lo hagan, sujeto a las siguientes condiciones:Lo anterior El aviso de copyright y este aviso de permiso se incluirán en todas las copias o partes sustanciales del Software. EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO, PERO NO LIMITADO A, LAS GARANTÍAS DE COMERCIABILIDAD, APTITUD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DE LOS DERECHOS DE AUTOR SERÁN RESPONSABLES DE CUALQUIER RECLAMO, DAÑOS U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN DE CONTRATO, AGRAVIO O DE OTRO MODO, QUE SURJA DE, FUERA DE O EN RELACIÓN CON EL SOFTWARE O EL USO U OTRAS NEGOCIACIONES EN EL SOFTWARE. WS2812B Led Matrix vesion por Janux * / # include  #include  #include  #define SAMPLES 64 // Debe ser una potencia de 2 # define xres 32 // Número total de columnas en la pantalla, deben ser <=MUESTRAS / 2 # definir yres 8 // Número total de filas en la pantalla # definir ledPIN 6 // pinta para controlar Matriz de Led # definir NUM_LEDS (xres * yres) #definir BRILLO 32 # definir buttonPin 5 // el número del pin del botón para cambiar displaycolorbyte yvalue; byte displaycolumn, displayvalue; int picos [xres]; byte state =HIGH; // la lectura actual de la entrada pinbyte previousState =LOW; // la lectura anterior de la entrada pinbyte displaycolor =0; // Arrays para sampligdouble vReal [SAMPLES]; double vImag [SAMPLES]; byte data_avgs [xres]; arduinoFFT FFT =arduinoFFT (); // FFT objectunsigned long lastDebounceTime =0; // la última vez que se alteró el pin de salida unsigned long debounceDelay =100; // el tiempo de rebote; aumentar si la salida parpadea // Parámetro 1 =número de leds en la matriz // Parámetro 2 =número de pin (la mayoría son válidos) // Parámetro 3 =indicadores de tipo de píxel, sume según sea necesario:// NEO_KHZ800 800 KHz bitstream (la mayoría de NeoPixel productos con LED WS2812) // NEO_KHZ400 400 KHz (píxeles FLORA clásicos 'v1' (no v2), controladores WS2811) // Los píxeles NEO_GRB están conectados para el flujo de bits GRB (la mayoría de los productos NeoPixel) // Los píxeles NEO_RGB están conectados para el flujo de bits RGB ( v1 FLORA píxeles, no v2) Adafruit_NeoPixel píxel =Adafruit_NeoPixel (NUM_LEDS, ledPIN, NEO_GRB + NEO_KHZ800); // Filtro EQ para atenuar los graves y mejorar los agudos // Útil en la tarjeta de sonido de PC que normalmente tiene muchos graves y bool de baja frecuencia EQ_ON =true; // establecer en falso para deshabilitar eqbyte eq [32] ={50, 55, 60, 70, 75, 80, 85, 95, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 115, 125, 140, 160, 185, 200, 225, 255}; // Definir el color para un solo led, utilizado en la función setColumn, 0 para color personalizado // El color es calculado por la función de rueda, ver abajo colores de bytes [] [8] ={{170, 160, 150, 140, 130, 120, 1, 1}, {1, 5, 10, 15, 20, 25, 90, 90} , {90, 85, 80, 75, 70, 65, 1, 1}, {90, 90, 90, 30, 30, 30, 1, 1}, {170, 160, 150, 140, 130, 120, 0, 0}, {170, 160, 150, 140, 130, 120, 1, 1}, {170, 160, 150, 140, 130, 120, 1, 1}}; void setup () {pixel.begin (); pixel.setBrightness (BRILLO); // Iniciar operaciones FFT ADCSRA =0b11100101; // establecer ADC en modo de ejecución libre y establecer preescalar en 32 (0xe5) ADMUX =0b00000000; // usa el pin A0 y la referencia de voltaje externo} void loop () {// ++ Muestreo para (int i =0; i  peaks [i]) peaks [i] =yvalue; // guardar pico si> pico anterior yvalue =picos [i]; displaycolumn =i; displayvalue =yvalue; setColumn (displaycolumn, displayvalue); // dibujar cubos} pixel.show (); // mostrar cubos displaycolorChange (); // verifica si se presiona el botón para cambiar el modo de color} // ------------------------------------- ---------------------------- // Leds de luz de la columna x según el valor de yvoid setColumn (byte x, byte y) {byte led , I; para (i =0; i  i) {cambiar (color de pantalla) {caso 4:// poner cero 0 en el valor de la matriz para personalizar el color de los picos if (colores [color de pantalla] [i]> 0) {// color normal definido en la matriz de colores pixel.setPixelColor (led, Wheel (colors [displaycolor] [i])); } else {// color personalizado para picos solo con 0 en el valor de la matriz pixel.setPixelColor (led, 255, 255, 255); // Número de LED, valores R, G, B} break; caso 5:// cambio de color por píxel de columna.setPixelColor (led, Wheel (x * 16)); descanso; caso 6:// cambia el color por píxel de fila.setPixelColor (led, Wheel (i * 36)); descanso; predeterminado:// conjunto de colores de visualización -> color de visualización de 0 a 3 // el color se define en la matriz de colores pixel.setPixelColor (led, Wheel (colors [displaycolor] [i])); } // FINALIZAR INTERRUPTOR} else {pixel.setPixelColor (led, 0); }}} // ====================================================================// Calcular un número de led por las coordenadas x, y // válido para WS2812B con diseño serpentino colocado en horizontal // y led cero en la parte inferior derecha (conector de entrada en el lado derecho) // valor de entrada:x =0-31, y =0-7, devuelve un número de led de 0 a 255 // ======================================================================byte GetLedFromMatrix (byte x, byte y) {x =xres - x - 1; if (x &0x01) {// Las columnas impares aumentan hacia atrás return ((x + 1) * yres - y - 1); } else {// Las columnas pares aumentan normalmente return ((x + 1) * yres - yres + y); }} // ======================================================================void displaycolorChange () {int lectura =digitalRead (buttonPin); if (lectura ==HIGH &&previousState ==LOW &&millis () - lastDebounceTime> debounceDelay) // funciona solo cuando se presiona {displaycolor ++; if (displaycolor> 6) displaycolor =0; lastDebounceTime =millis (); } previousState =reading;} / * Utilidad del boceto de demostración de Adafruit Neopixel Ingrese un valor de 0 a 255 para obtener un valor de color. Los colores son una transición R - G - B - de regreso a R. * / Rueda larga sin signo (byte WheelPos) {WheelPos =255 - WheelPos; if (WheelPos <85) {return pixel.Color (255 - WheelPos * 3, 0, WheelPos * 3); } si (WheelPos <170) {WheelPos - =85; return pixel.Color (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos - =170; return pixel.Color (WheelPos * 3, 255 - WheelPos * 3, 0);} 

Piezas y carcasas personalizadas

arduino_rgb_audio_analyzer_lX4Dv4Pta2.zip

Esquemas


Proceso de manufactura

  1. Analizador de espectro de audio de 32 (Linier) / 11 (Pseudo Log) bandas
  2. Alerta de sed Alarma de planta
  3. Reloj Word en italiano
  4. Medidor de kWh Sigfox
  5. Monitor de temperatura Bluetooth
  6. Bloqueo controlado por gestos
  7. El IC complementario
  8. Adaptador MIDI USB
  9. Una entrada analógica aislada para Arduino
  10. Cable de salida de TV Arduino
  11. Mide tu tiempo de reacción