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 audio de matriz RGB con Arduino

Componentes y suministros

Arduino UNO
× 1
Adafruit Neopixel Shield para Arduino
× 1
SparkFun Spectrum Shield
× 1
Caja ProtoStax para Arduino
Caja modular apilable para Arduinos (huellas Uno y Mega)
× 1
SPST OFF- (ON) Interruptor de botón azul
× 1
Montaje en panel de conector estéreo aislado de 3,5 mm
× 2
Cables auxiliares de 3,5 mm en ángulo de 90 °
× 2
Cable de conexión de audio estéreo de 3,5 mm macho a macho de 6 pies
× 1

Herramientas y máquinas necesarias

Taladro / atornillador, inalámbrico

Acerca de este proyecto

En este artículo, explico cómo construir un visualizador de audio de matriz de LED RGB, usando un Arduino, un escudo de matriz de LED RGB y un escudo de analizador de espectro de audio, luego lo coloco en un gabinete para que pueda tener un proyecto terminado que pueda visualice su sistema de música para tener un buen espectáculo de luces de su música.

Para el análisis de espectro de audio, uso Spectrum Shield de SparkFun, que usa dos filtros de visualización de ecualizador gráfico MSGEQ7, que dividen una entrada de audio estéreo en 7 bandas (por canal) y leen la amplitud de cada una usando el ADC en su Arduino. Viene con bocetos de muestra de Arduino para comenzar.

Para la matriz de LED RGB, utilizo NeoPixel Shield de Adafruit para Arduino, que consta de 40 RGB NeoPixels (la terminología de Adafruit para su fuente de luz WS2812). Los LED rojos, verdes y azules están integrados junto con un chip de controlador en un pequeño paquete de montaje en superficie controlado a través de un solo cable. Se pueden usar individualmente, encadenar en cadenas más largas o ensamblar en factores de forma aún más interesantes. En el caso del Escudo, están encadenados. El Shield también viene con la biblioteca Adafruit_NeoMatrix, que simplifica el acceso a la matriz de LED RGB y el control de los LED.

Por último llega el recinto. Algunos de ustedes pueden saber que he creado un nuevo sistema de gabinete modular apilable llamado ProtoStax. Era una picazón personal que tenía que rascar:quería un gabinete que soportara diferentes etapas de creación de prototipos, que ofreciera protección y acceso abierto al comenzar, con la capacidad de agregar paredes laterales y la parte superior más tarde, pero también que tuviera la capacidad de apilar múltiples unidades, una al lado de la otra o una encima de la otra, por lo que tienen la capacidad de expandirse con las necesidades de creación de prototipos y la adición de otras placas y componentes.

En este ejemplo, utilizo ProtoStax para Arduino, una carcasa de acrílico transparente para Arduino, que se adapta tanto a la huella Uno / Leonardo como a la huella Mega / Due más grande, que también es apilable y modular y tiene espacio para los dos. Escudos (con algunas modificaciones menores, que describiré). Es claro y resistente y también tiene pies de goma para elevarlo ligeramente y proteger la superficie de su mesa, ¡para que pueda mostrar su visualizador de audio y su espectáculo de luces junto con su sistema de música! 😊

Ok, comencemos, ¿de acuerdo? 😊

Paso 1:monte el Arduino en la placa base del gabinete

Primero montemos el Arduino (Uno en nuestro ejemplo) en la placa base del gabinete. Esto le brinda protección al tiempo que ofrece acceso abierto completo para configurar y configurar el Arduino y jugar con él. Cuando esté listo para cerrarlo, es fácil agregar las paredes laterales y la placa superior y asegurar todo con tornillos.

Monte el Arduino en la placa base y agregue pies y otro hardware para preparar el gabinete en Configuración de plataforma . Vea los pasos a continuación en la presentación de diapositivas:el título de cada imagen está numerado y brinda una explicación adicional para cada paso.

Aquí están todos los pasos como un gif animado:

Paso 2:prepara el SparkFun Spectrum Shield para Arduino

SparkFun Spectrum Shield no viene con encabezados. Afortunadamente para nosotros, Adafruit NeoPixel Shield para Arduino viene con encabezados apilables y encabezados simples. Como quiero que NeoPixel Shield esté en la parte superior, quiero usar encabezados simples con él para que quede nivelado, y esto deja los encabezados apilables para usar con Spectrum Shield, ¡que es justo lo que quiero! 😉

Sin embargo, el Spectrum Shield con encabezados apilables no encaja perfectamente:los puertos USB y Power en el Arduino Uno se interponen, como se muestra en la imagen a continuación.

Hice las siguientes dos modificaciones:

  • Corta el extremo del Spectrum Shield sobre los puertos USB y de alimentación (esa parte tiene un área de creación de prototipos, que no se usa. Incluso si la estás usando, terminarías cortando solo una fila de agujeros). el Spectrum Shield se sienta cómodamente en el Arduino.
  • Es posible que las patas de los encabezados apilables aún sean demasiado largas para que el Spectrum Shield se asiente cómodamente. Recorté un cabello de las patas de los encabezados de apilamiento para que el Spectrum Shield se sentara cómodamente en el Arduino con los encabezados de apilamiento.

¡Ahora se ajusta perfectamente!

Paso 3:inserte Adafruit NeoPixel Shield para Arduino en el encabezado de apilamiento del Spectrum Shield

El Adafruit NeoPixel Shield va encima del Spectrum Shield. Primero deberá soldar los encabezados normales (con los que venía). También soldé el conector del terminal con el que venía, aunque en este ejemplo, lo estoy alimentando usando el Arduino, ya que todos los LED no se encenderán simultáneamente, por lo que el consumo de energía está dentro de las cantidades que el Arduino puede proporcionar. .

Mensaje de la página de NeoPixel Shield para Arduino de Adafruit:

Paso 4:código de demostración

Echemos un vistazo al código de demostración y veamos qué está haciendo. Para hacer eso, podemos dividirlo en dos partes principales:

  • Análisis de espectro y almacenamiento de resultados
  • Traduciendo eso en una pantalla / esquema de color para la matriz NeoPixel 8x5.

Puede consultar rápidamente el código de demostración aquí:

https://github.com/protostax/ProtoStax_Audio_Visualizer_Demo/blob/master/ProtoStax_Audio_Visualizer_Demo.ino

Análisis de espectro

Puede consultar la Guía de conexión de Spectrum Shield para obtener información adicional relacionada con Spectrum Shield. He resumido la información aquí.

Al escribir una secuencia digital en los pines STROBE y RESET del Spectrum Shield, inicializa los chips MSGEQ7 utilizados por el Shield. Luego puede proceder a leer la magnitud de cada una de las 7 bandas de frecuencia diferentes en las que se divide el espectro. Se lee cada banda seguida de pulsaciones del pin STROBE para iniciar la lectura de la siguiente banda. Los valores se almacenan en Frequencies_One [7] y Frequencies_Two [7] para los dos canales de la entrada estéreo. Los valores se leen utilizando los ADC de 10 bits de Arduino y, por lo tanto, el valor de salida puede ser de 0 a 1023; proporcionan una representación de la amplitud de cada banda de frecuencia.

  // Declarar conexiones de pin de Spectrum Shield # definir STROBE 4 # definir RESET 5 # definir DC_One A0 # definir DC_Two A1 // Definir variables de espectroint freq_amp; int Frequencies_One [7]; int Frequencies_Two [7]; int i; void setup () {... // Inicializar analizadores de espectro digitalWrite (STROBE, LOW); retraso (1); escritura digital (RESTABLECER, ALTA); retraso (1); digitalWrite (ESTROBOSCÓPICO, ALTO); retraso (1); digitalWrite (ESTROBOSCÓPICO, BAJO); retraso (1); digitalWrite (RESET, LOW); ...} void loop () {... Read_Frequencies (); ...} / ******************* Extraer frecuencias de Escudo de espectro ******************** / void Read_Frequencies () {... // Leer frecuencias para cada banda para (freq_amp =0; freq_amp <7; freq_amp ++) {Frequencies_One [freq_amp] =(analogRead (DC_One) + analogRead (DC_One))>> 1; Frequencies_Two [freq_amp] =(analogRead (DC_Two) + analogRead (DC_Two))>> 1; ... digitalWrite (ESTROBOSCÓPICO, ALTO); digitalWrite (ESTROBOSCÓPICO, BAJO); }}  

Las 7 bandas del espectro de frecuencias son:

  • 63Hz
  • 160 Hz
  • 400 Hz
  • 1 kHz
  • 2,5 kHz
  • 6,25 kHz
  • 16kHZ

Los dividí en 3 rangos:BASS, MID_RANGE y TREBLE. El rango de graves típico es de 60 a 250 Hz, por lo que las dos primeras bandas están en el rango de BASS. Las frecuencias de rango medio suelen ser de 500 Hz a 2 kHz, por lo que agrupo las siguientes 3 bandas en MID_RANGE. Agrupo las 2 bandas restantes en TREBLE.

[Nota:también anoto la lectura máxima de cada una de las bandas en una variable separada. Esto posiblemente se puede usar para escalar automáticamente las lecturas al nivel representado por las columnas de la matriz RGB; esto es útil en el caso de que la señal de entrada sea baja; de lo contrario, solo muy pocas de la matriz RGB se iluminarían en ese caso. ]

Matriz RGB

Puede consultar la Überguide de Adafruit NeoPixel para obtener información adicional relacionada con NeoPixel Shield y NeoPixels en general. He resumido la información relativa a nuestro uso aquí.

El punto principal que intentaré aclarar, que me pareció un poco confuso al principio, es la dirección y orientación del NeoPixel Shield y la numeración del sistema de coordenadas. La Überguide lo explica, pero creo que puedo hacérselo un poco más fácil.

Lo primero a tener en cuenta es que en el sistema de coordenadas, [0, 0] SIEMPRE se refiere a la parte superior izquierda, independientemente de la orientación.

Lo siguiente es anotar el ANCHO, seguido de ALTURA, de cualquier orientación que le interese (es decir, 5 x 8 frente a 8 x 5 en el caso de nuestro Escudo)

En tercer lugar, observe la posición del LED FÍSICO # 0 (marcado por el lindo logotipo de Adafruit). SUPERIOR DERECHA, SUPERIOR IZQUIERDA, INFERIOR IZQUIERDA e INFERIOR DERECHA según sea el caso. También tenga en cuenta la orientación de la progresión de los LED físicos. El diseño es PROGRESIVO en nuestro tablero (el siguiente led físico después del final de una fila comienza al principio de la siguiente fila como lo indica la línea AMARILLA). La orientación de la progresión es a lo largo de las FILAS para cuando el ancho es más amplio (orientación horizontal) (como lo indican las flechas VERDES cortas) y las COLUMNAS con el ancho son más estrechas (orientación vertical) (nuevamente, como lo indican las flechas VERDES cortas) ).

Estos están ilustrados por las 4 imágenes a continuación en la presentación de diapositivas. ¡Los subtítulos incluyen la configuración pertinente en cada caso!

En nuestro ejemplo, tenemos 7 bandas de frecuencia y una matriz de 8 x 5 (o 5 x 8, ¡dependiendo de cómo se mire!). Elegí mostrar las 7 bandas a lo largo de la 8 dimensión (dejando una sin usar). Luego mostraría la representación de amplitud de cada banda de frecuencia a lo largo de la quinta dimensión. En otras palabras, quiero que mi progresión sea la siguiente:

Quiero que mi origen comience en la esquina inferior izquierda (que representa el nivel más bajo de la banda de frecuencia más baja) y continúe hacia arriba. Pero como lo primero que hay que tener en cuenta en el sistema de coordenadas es que [0, 0] siempre se refiere a ARRIBA-IZQUIERDA, debe inclinar la cabeza hacia la izquierda y mirar la imagen de abajo para comprender la elección de valores para inicializar la NeoMatrix ! 😊 (ANCHO =5, ALTO =8, SUPERIOR DERECHA, COLUMNAS PROGRESIVAS)

Profundicemos un poco en el código de demostración relacionado con NeoMatrix y graficando las frecuencias. En primer lugar, hemos determinado que nuestro NeoPixel tiene ANCHO =5, ALTO =8 y la orientación que nos gusta es SUPERIOR DERECHA y COLUMNAS PROGRESIVAS. Siga la configuración requerida para la matriz en la función de configuración ().

En el loop (), leemos cualquier entrada serial para seleccionar el esquema de color - he definido 3 esquemas de color diferentes

  enumeración ESQUEMA {MAGNITUDE_HUE =0, MAGNITUDE_HUE_2 =1, HSV_COLOR_WHEEL =2};  

Luego llamo Graph_Frequencies con esa opción de esquema de color. Tenga en cuenta también el primer parámetro que puede seleccionar el rango de frecuencias para mostrar (BASS, MID-RANGE o TREBLE)

  enumeración RANGE {BASS =0, MID_RANGE =1, TREBLE =2, ALL =3};  

Por ahora, estoy seleccionando todos los rangos para mostrar; se deja como un ejercicio para el lector implementar la selección de rangos para mostrar, ya sea a través de la entrada en serie o al incluir un botón de presión momentánea para alternar la pantalla entre BASS, MID_RANGE, AGUDOS o TODOS. La selección del RANGE determina el rango "desde" y "hasta" de las filas que se mostrarán.

Para cada fila (banda de frecuencia), elegimos la mayor de las dos magnitudes de frecuencia (canal derecho y canal izquierdo de la entrada estéreo). Ese valor se encuentra entre 0 y 1023, como ya hemos comentado. Necesitamos mapear eso en 5 columnas distintas de la pantalla, por lo que dividimos la frecuencia por FREQ_DIV_FACTOR que se define como 204 (1023/204 =5, que mapeará una salida de 1023 a 5). Para estar seguros, también nos aseguramos de que numCol para mostrar no sea mayor que 5. Esto determina el número de columnas para mostrar para cada banda de frecuencia.

Luego uso matrix.drawPixel () para mostrar el píxel apropiado en el color apropiado.

Utilizo la rueda de color HSV en mi pantalla gráfica. Esto planteó algunas arrugas adicionales que superar.

Normalmente, el uso es matrix.drawPixel (columna, fila, Color (r, g, b)), donde Color (r, g, b) representa un color especificado por los valores ROJO, VERDE y AZUL. Sin embargo, el uso de HSV permite algunas transiciones de color suaves y agradables.

NeoMatrix proporciona el método matrix.ColorHSV (uint16_t hue) que toma un solo valor de tono uint16_t y devuelve un color uint32_t HSV.

Sin embargo, matrix.Color (r, g, b) devuelve un color uint16_t. matrix.drawPixel también espera un color de 16 bits.

La forma de evitar esto es usar matrix.setPassThruColor (valor de color de 32 bits). Esto establece una bandera en la matriz que hace que drawPixel ignore su argumento de color y en su lugar use el color de 32 bits ya establecido por el método anterior. Solo recuerde llamar a matrix.setPassThruColor () para restablecer la bandera en cuestión. No es super elegante, pero funciona. Por ejemplo,

  static uint16_t hue =0; // 21845 22250 a -250 uint16_t hueDelta =200; matiz + =hueDelta; ... rgbcolor =matrix.ColorHSV (matiz); ... matrix.setPassThruColor (rgbcolor); matrix.drawPixel (columna, fila, (uint16_t) 0); // el color no importa aquí matrix.setPassThruColor (); ... matrix.show ();  

Con HSV, es posible incrementar el tono de 16 bits y generar el código de color HSV, obteniendo así agradables y suaves transiciones de color.

Aquí están las diferentes piezas de código para referencia:

  #define NEO_MATRIX_WIDTH 5 # definir NEO_MATRIX_HEIGHT 8 # define NEOPIXEL_PIN 6 // Escudo lo asigna a la patilla 6Adafruit_NeoMatrix matriz =Adafruit_NeoMatrix (NEO_MATRIX_WIDTH, NEO_MATRIX_HEIGHT, NEOPIXEL_PIN, NEO_MATRIX_TOP + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE, NEO_GRB + NEO_KHZ800); .... void setup () {... matrix.begin (); matrix.setTextWrap (falso); matrix.setBrightness (40); matrix.fillScreen (0); matrix.show (); ...} void loop () {esquema int estático =0; while (Serial.available ()> 0) {esquema =Serial.parseInt (); } ... Graph_Frequencies (ALL, esquema); ... delay (50);} void Graph_Frequencies (CANAL c, SCHEME s) {... para (fila =desde; fila  Frecuencias_Una [fila])? Frecuencias_Dos [fila]:Frecuencias_Una [fila]; int numCol =(frecuencia / FREQ_DIV_FACTOR); if (numCol> 5) numCol =5; for (int col =0; col  

Lo siguiente es la selección del esquema de color. Tenga en cuenta que he tomado medidas para poder seleccionar colores para diferentes rangos de frecuencia (bassHue, midHue, trebleHue). He creado 3 esquemas de color diferentes:uno que usa un rango de verde a rojo / rosa para mostrar desde la amplitud más baja a la más alta, y el otro que usa un rango cambiado más rosa / azul. El tercer esquema usa el mismo color para todos los píxeles, pero recorre toda la rueda de colores a medida que avanza. Les mostraré un video de los 3 esquemas de color.

  conmutador (es) {case MAGNITUDE_HUE:bassHue =22250; midHue =22250; // 54613 trebleHue =22250; // 43690 if (fila> =0 &&fila <2) {rgbcolor =matrix.ColorHSV (bassHue - (7416 * col)); } más si (fila> =2 &&fila <5) {rgbcolor =matrix.ColorHSV (midHue - (7416 * col)); } más si (fila> =5 &&fila <7) {rgbcolor =matrix.ColorHSV (trebleHue - (7416 * col)); } descanso; case MAGNITUDE_HUE_2:bassHue =54613; midHue =54613; // 54613 trebleHue =54613; // 43690 if (fila> =0 &&fila <2) {rgbcolor =matrix.ColorHSV (bassHue - (7416 * col)); } más si (fila> =2 &&fila <5) {rgbcolor =matrix.ColorHSV (midHue - (7416 * col)); } más si (fila> =5 &&fila <7) {rgbcolor =matrix.ColorHSV (trebleHue - (7416 * col)); } descanso; case HSV_COLOR_WHEEL:rgbcolor =matrix.ColorHSV (tono); descanso; }  

Paso 6:probar todo

Aquí hay un video de probar todo

Paso 6:ciérrelo

Instale los elementos de refuerzo superiores, las paredes laterales, los cables de audio y la parte superior. Vea los pasos a continuación en la presentación de diapositivas:el título de cada imagen está numerado y brinda una explicación adicional para cada paso.

Estos son todos los pasos en un solo gif animado:

Paso 7:¡Muestre su creación y haga que la música hermosa sea aún más hermosa!

¡Ahora puede tener un visualizador de audio divertido que puede mostrar junto con su sistema de música y hacer que una acción de luz casera mejore su música!

Paso 8:ir más lejos

¡Aquí hay algunas ideas para llevar el proyecto aún más lejos!

1. Actualmente, los cables de audio (entrada y salida) están conectados al Spectrum Shield en el gabinete y, por lo tanto, tiene estos gabinetes con estos cables conectados y colgando afuera. En su lugar, puede agregar un par de tomas estéreo de montaje en panel (enumeradas en la lista de "cosas" utilizadas) a la pared lateral cerca de las tomas estéreo del Spectrum Shield, y luego soldar un cable de audio con una toma de audio estéreo macho de 3,5 mm. a cada uno, y luego conéctelos a las tomas de audio del Spectrum Shield. En este caso, su gabinete se vuelve muy ordenado y todo el cableado es autónomo con solo conectores de audio en el gabinete para que los sistemas externos se conecten.

2. Puede agregar más combinaciones de luces a su visualizador de audio:diferentes gamas de colores, diferentes patrones.

3. Agregue la opción para habilitar / deshabilitar rangos de frecuencia usando la entrada serial; actualmente solo se pueden cambiar los esquemas de color, pero no los rangos de frecuencia para mostrar.

4. Agregue un interruptor para alternar entre diferentes esquemas de color en lugar de usar la entrada serial. Modifique el gabinete para agregar un orificio a una de las paredes laterales largas para acomodar un interruptor de botón pulsador momentáneo de montaje en panel (enumerado en la lista de "cosas" utilizadas).

5. Agregue un segundo interruptor para alternar entre los diferentes rangos de frecuencia mostrados (BASS, MID_RANGE, TREBLE, ALL) y monte ese interruptor en la pared lateral del gabinete.

6. Debido a que el gabinete está hecho de acrílico, puede usar cinta de pintor azul sobre él para proteger la superficie y un taladro para perforar un orificio en el lado requerido para montar los conectores y / o interruptores estéreo de montaje en panel. Se recomienda utilizar un taladro escalonado o comenzar con un orificio más pequeño y luego expandir el orificio hasta que tenga el tamaño que desee. Los conectores estéreo enumerados necesitan un orificio de montaje de 5/16 "y los interruptores necesitan un orificio de montaje de 0,47".

7. Lije la superficie superior de la placa superior de manera ligera y uniforme. Esto actuará como un difusor de luz y le dará un efecto de luz más suave y difuso.

Si hay suficiente interés, actualizaré el proyecto para mostrarlo con los conectores e interruptores de audio y un difusor de luz opaco en la parte superior.¡Por favor, envíeme un mensaje si desea ver el proyecto actualizado! 😊

¿Puedes pensar en algo más? ¡Escriba un comentario a continuación para hacérnoslo saber! 😊 ¡No dude en hacer cualquier pregunta que pueda tener! 😊

¡Feliz fabricación! 😊

Código

Demostración del visualizador de audio ProtoStax
Repositorio de Github que contiene el código utilizado en esta demostración de ProtoStax Audio Visualizer https://github.com/protostax/ProtoStax_Audio_Visualizer_Demo

Proceso de manufactura

  1. Monitoreo de CO2 con sensor K30
  2. Comunicación para personas sordociegas con 1Sheeld / Arduino
  3. Controlar el aceptador de monedas con Arduino
  4. Juego Arduino Pong en Matrix 24x16 con MAX7219
  5. Detector de frecuencia de audio
  6. ¡Arduino con Bluetooth para controlar un LED!
  7. Sensor capacitivo de huellas dactilares con Arduino o ESP8266
  8. Reproducir audio en Arduino
  9. Animar una boca de Billy Bass con cualquier fuente de audio
  10. Mezclador de colores Arduino RGB
  11. Controlar una matriz de LED con Arduino Uno