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 FHT

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
× 2
Resistencia de orificio pasante, 390 ohmios
× 1
1N4007 - Diodo nominal de alta tensión y alta corriente
Incluso un 1N4004 funcionará bien
× 1
Condensador 100 nF
× 2
Condensador 1000 µF
× 1
Interruptor de botón SparkFun de 12 mm
O dos botones del panel si planeas insertar el circuito en una caja
× 2
Tablero prototipo genérico de 4x6 cm
× 1
Conector hembra RCA estéreo de PCB
× 1

Herramientas y máquinas necesarias

Soldador (genérico)
Cable de conector de audio de 3,5 mm a conector RCA estéreo

Acerca de este proyecto

La biblioteca Arduino FHT

FHT hace exactamente el mismo trabajo que el FFT más conocido, pero a diferencia de este, usa solo datos reales, mientras que FFT trabaja con datos complejos, por lo tanto, FHT usa la mitad de la potencia de procesamiento y la mitad de la memoria del sistema.

Esta biblioteca utiliza una única matriz para el muestreo de datos en lugar de dos, una para valores reales y otra para valores imaginarios, utilizada por FFT lib, también simplifica cálculos matemáticos complejos evitando bucles con cálculos logarítmicos de coma flotante complejos y en su lugar utiliza algunas tablas numéricas .

La desventaja es que siempre devuelve la mitad de los valores del tamaño de la matriz utilizada para realizar el muestreo, esto conduce a una cierta pérdida de resolución y precisión en los dos extremos del rango de audio. Sin embargo, en el caso específico no tenemos que desarrollar un instrumento de medición sino un simple gadget, no necesitamos una precisión extrema, solo tenemos que encender un puñado de LEDs en ritmo musical.

Por supuesto, este no es el lugar adecuado para discutir la modalidad de funcionamiento de la biblioteca FHT, cualquiera que desee obtener más información puede consultar el sitio web de Open Music Lab donde encontrará toda la documentación necesaria para comprender los trucos utilizados, la explicación detallada de los varias funciones y algunos ejemplos genéricos ya escritos para Arduino.

La biblioteca FFT es rápida, tan rápida que fue necesario insertar un retraso en el código para reducir el parpadeo. Inmediatamente notará el resultado final, la pantalla es mucho más rápida y receptiva que la versión que usa la biblioteca FFT, que a menudo parecía estar rezagada con respecto a la música. Un menor uso de los recursos del sistema nos permitió agregar algunas líneas de código para administrar funciones adicionales.

La nueva versión

El proyecto es idéntico a la versión anterior, por lo que aquellos que ya han realizado la anterior solo necesitan agregar un botón y una resistencia de 10K y actualizar el código.

Además de la implementación de la biblioteca FHT, esta versión tiene las siguientes funciones adicionales:

  • tiene un botón adicional para ajustar el brillo;
  • permite guardar la configuración de color y brillo en la EEPROM para volver a cargarla la próxima vez que se encienda;
  • muestra el nivel de configuración de color y brillo cuando se presionan los botones y cuando se encienden (se puede desactivar).

Código

  • Versión del código FHT
Versión del código FHT Arduino
 / * Copyright (c) 2020 Janux Por la presente se concede permiso, sin cargo, a cualquier persona que obtenga una copia de este software y los archivos de documentación asociados (el "Software"), para utilizar el Software sin restricciones, incluso sin limitar los derechos de uso, 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:Los derechos de autor anteriores El aviso 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. Basado en un proyecto original para la matriz LED MAX72xx y la biblioteca FFT hecha de Shajeeb. Sección de ajustes de configuración basada en el trabajo de Ragnar Ranøyen Homb de Norvegian Creation. * / # Define LIN_OUT 1 // FHT magnitud de salida lineal # define FHT_N 128 // establece MUESTRAS para FHT, debe ser una potencia de 2 # incluye  #define xres 32 // Número total de columnas en la pantalla, debe ser <=SAMPLES / 2 # define yres 8 // Número total de filas en la pantalla # define ledPIN 6 // out pint para controlar Leds # define NUM_LEDS (xres * yres) // total de leds en Matrix # incluye  #define colorPIN 5 // pin para cambiar el color del led # define shinePIN 10 // pin para cambiar el brillobyte displaycolor =0; // valor de color predeterminadobyte brillo =1; // nivel de brillo predeterminado # incluye  #define CONFIG_START 32 // Ubicación de inicio de memoria # define CONFIG_VERSION "VER01" // Versión de configuración configurationtypedef struct {char version [6]; byte displaycolor; brillo de bytes;} tipo_configuración; tipo_configuración CONFIGURACIÓN ={CONFIG_VERSION, color de la pantalla, brillo}; valor y byte; picos int [xres]; estado del byte =ALTO; // la lectura actual de la entrada pinbyte previousState =LOW; // la lectura anterior de la entrada pinunsigned 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 flickersbyte data_avgs [xres]; // Matriz para muestra // Parámetro 1 =número de leds en matriz // Parámetro 2 =número de pin // Parámetro 3 =banderas de tipo de píxel, agregue según sea necesario:// NEO_KHZ800 800 KHz bitstream (la mayoría de los productos NeoPixel con LED WS2812 ) // NEO_KHZ400 400 KHz (píxeles FLORA clásicos 'v1' (no v2), controladores WS2811) // NEO_GRB Los píxeles 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 (píxeles FLORA v1, no v2) Adafruit_NeoPixel pixel =Adafruit_NeoPixel (NUM_LEDS, ledPIN, NEO_GRB + NEO_KHZ800); // EQ filterbyte eq [32] ={60, 65, 70, 75, 80, 85, 90, 95, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 115, 125, 140, 160, 185, 200, 200, 200}; bool EQ_ON =verdadero; // establecer en falso para deshabilitar eq // Definir 5 juegos de colores para leds, 0 para colores de un solo colorbyte personalizado [] [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, 110, 0}}; // Definir caracteres para la configuración de pantallabyte charBitmap [] ={0x1C, 0x10, 0x10, 0x10, 0x10, 0x1C, 0x08, 0x18, 0x08, 0x08, 0x08, 0x1C, 0x0C, 0x12, 0x04, 0x08, 0x10, 0x1E, 0x0C, 0x12, 0x02, 0x06, 0x12, 0x0C, 0x10, 0x10, 0x10, 0x14, 0x1E, 0x1E, 0x04, 0x14, 0x1E, 0x1E, 0x04, 0x14, 0x1E, 0x1E, 0x04, 0x02, 0x12, 0x0C, 0x1E, 0x10, 0x10, 0x1E, 0x12, 0x1E, 0x1E, 0x02, 0x04, 0x08, 0x08, 0x08, 0x0C, 0x12, 0x0C, 0x12, 0x12, 0x0C, 0x1C, 0x12, 0x1C, 0x12 0x12, 0x1C}; configuración vacía () {pixel.begin (); // inicializar Led Matrix // Iniciar operaciones FFT ADCSRA =0b11100101; // establece ADC en modo de ejecución libre y establece el preescalador en 32 (0xe5) ADMUX =0b00000000; // use el pin A0 y la referencia de voltaje externo // Lea los datos de configuración de EEPROM if (loadConfig ()) {displaycolor =CONFIGURATION.displaycolor; brillo =CONFIGURACIÓN.brillo; } // Establecer el brillo cargado desde EEPROM pixel.setBrightness (brillo * 24 + 8); // Muestra la configuración actual al inicio // cambia de verdadero a falso si no quieres esto showSettings (3, true);} void loop () {while (1) {// reduce el jitter Sampling (); // La biblioteca FHT usa solo una matriz de datos RearrangeFHT (); // reorganiza el resultado de FHT para que coincida con el no. de columnas de visualización SendToDisplay (); // enviar a mostrar según el valor medido colorChange (); // comprobar si se presiona el botón para cambiar el color shineChange (); // verifica si se presiona el botón para cambiar el retardo de brillo (10); // retardo para reducir el parpadeo (FHT es demasiado rápido:D)}} void Sampling () {for (int i =0; i  peaks [i]) peaks [i] =yvalue; // guardar pico si> pico anterior yvalue =picos [i]; // selecciona el pico para mostrar setColumn (i, yvalue); // dibujar columnas} pixel.show (); // mostrar la columna} // Iluminar los leds de la columna x según el valor de yvoid setColumn (byte x, byte y) {int led, i; para (i =0; i  i) {switch (displaycolor) {case 4:if (colors [displaycolor] [i] ==0) {// muestra el color personalizado con valor cero en matriz pixel.setPixelColor (led, 255, 255, 255); // con} else {// color estándar definido en la matriz de colores pixel.setPixelColor (led, Wheel (colors [displaycolor] [i])); } descanso; caso 5:// cambio de color por píxel de columna.setPixelColor (led, Wheel (x * 16)); descanso; caso 6:// cambio de color por píxel de fila.setPixelColor (led, Wheel (i * y * 3)); descanso; caso 7:// cambiar color por ... país:D // Italia flagh // if (x <11) pixel.setPixelColor (led, 0, 255, 0); // if (x> 10 &&x <21) pixel.setPixelColor (led, 255, 255, 255); // if (x> 20) pixel.setPixelColor (led, 255, 0, 0); // estrellas y rayas if (i  debounceDelay) {displaycolor ++; if (displaycolor> 7) displaycolor =0; showSettings (1, verdadero); // establézcalo en falso si no quiere este saveConfig (); lastDebounceTime =millis (); } estado anterior =lectura;} void brilloCambio () {int lectura =digitalRead (brilloPIN); if (lectura ==HIGH &&previousState ==LOW &&millis () - lastDebounceTime> debounceDelay) {brillo ++; si (brillo> 7) brillo =0; pixel.setBrightness (brillo * 24 + 8); showSettings (2, verdadero); // establézcalo en falso si no quiere este saveConfig (); 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. Unigned long Wheel (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);} // carga lo que está en EEPROM en la CONFIGURACIÓN local si es una configuración válidaint loadConfig () {if (EEPROM.read (CONFIG_START + 0) ==CONFIG_VERSION [0] &&EEPROM.read (CONFIG_START + 1) ==CONFIG_VERSION [1] &&EEPROM.read (CONFIG_START + 2) ==CONFIG_VERSION [2] &&EEPROM.read (CONFIG_START + 3) ==CONFIG_VERSION [3 ] &&EEPROM.read (CONFIG_START + 4) ==CONFIG_VERSION [4]) {// cargar (sobrescribir) la estructura de configuración local para (unsigned int i =0; i  =0; x--) {for (int y =5; y> =0; y--) { if ((charBitmap [val * 6 + 5 - y]>> x) &0x01) {pixel.setPixelColor (GetLedFromMatrix (4 - x + pos, y + 1), Wheel ((pos> 10) * 170)); pixel.show (); }}}} // de Janux®, última versión el 28/06/2020. 

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. Visualizador de espectro de audio RGB de 32 bandas
  11. Mide tu tiempo de reacción