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

Visualizador de espectro de áudio RGB de 32 bandas

Componentes e suprimentos

Arduino Nano R3
× 1
WS2812B 8x32 RGB LED MATRIX
× 1
Resistor 4,75 k ohm
× 3
Resistor 100k ohm
× 2
Resistor 10k ohm
× 1
Resistor de furo passante, 390 ohm
× 1
Capacitor 100 nF
× 2
Capacitor 1000 µF
× 1
SparkFun Botão de pressão 12 mm
× 1
Placa de prototótipo multi-furo 4x6 cm
× 1

Ferramentas e máquinas necessárias

Ferro de soldar (genérico)
Cabo divisor Jack de 3,5 mm

Sobre este projeto





O Projeto


Este projeto é para fazer um visualizador de espectro de frequência de áudio (música) RGB de 32 bandas usando Arduino Nano e um 8x32 WS2812B RGB Led Matrix.





O projeto original que inspirou este


Muito obrigado a Shajeeb autor do projeto original baseado na matriz de led MAX72xx. Eu apenas modifiquei a parte piloto da matriz de led para adaptá-la à matriz de led RGB WS2812B.

Link para o projeto original:Analisador de Visualizador de Espectro de Áudio de 32 Bandas





Matriz LED WS2812B RGB


Usando uma matriz RGB LED baseada em LEDs de alto brilho 5050 SMD, é necessário usar uma fonte de alimentação externa porque a matriz RGB pode absorver mais de 10mA por LED, portanto, com todos os LEDs acesos com brilho máximo poderia absorver mais de 2,5 Amperes.

Por esta razão eu inseri um diodo em série a + 5V para poder alimentar o Arduino no modo autônomo, quando o cabo USB não está conectado, e para evitar que o Arduino seja a fonte de alimentação da matriz RGB, então você evita sobrecarregando os circuitos internos da placa com uma corrente que ela não poderia fornecer.

Ao projeto original, além do diodo de entrada, para proteger a entrada da matriz de LED de possíveis picos de tensão, também adicionei um resistor de 390 ohm em série entre o Arduino pind D6 e a entrada de dados, e um capacitor de 1000 µF 12V para melhorar a estabilidade da tensão de alimentação do Arduino.





Montagem de ferragens


Como pode ser visto na foto principal, fiz o primeiro protótipo em uma placa multiorifícios 4x6 cm usando dois soquetes de áudio RCA (soldados diretamente na placa) que também podem ser substituídos por um soquete Jack fêmea de 3,5 mm. O importante para evitar zumbidos é fazer as conexões entre a fonte e a entrada de áudio da placa com um cabo blindado. Outra dica é manter a conexão entre o Arduino e a matriz de led o mais curta possível.





O código


No final, todo o software é baseado no grande trabalho realizado pelo autor do procedimento de amostragem através da biblioteca FFT e a realização definitiva do Shajeeb.

Eu adicionei duas funções:

O primeiro é GetLedFromMatrix (...) para mapear a matriz em linhas e colunas e ser capaz de endereçar cada um dos 256 LEDs por meio de coordenadas de linha e coluna.

O segundo é aquele - que chamei arbitrariamente de SetColumn (...) - que liga os LEDs de cada coluna com base no valor de pico obtido pela digitalização de áudio ( valores entre 0 e 7 ) e com base nas cores predefinidas em uma matriz bidimensional. Você pode se divertir alterando os valores e, portanto, as cores como preferir. Para simplificar o código, usei uma sobredotina chamada Wheel () (tirada de uma demonstração anexada à biblioteca Neopixel da Adafruit) que, começando com um valor entre 0 e 255, retorna um valor longo de 32 bits sem sinal para ser passado diretamente para a função setPixelColor. Nisto você pode jogar à vontade, tendo em mente as limitações de memória do Arduino evitando sempre que possível o uso de variáveis ​​de 32 bits para armazenar valores de cores RGB.

Áudio equalização

Além disso, como eu executei os testes com o áudio proveniente da placa de som integrada na placa-mãe do PC, a fim de melhorar a resposta de frequência, adicionei uma matriz de bytes de 32 valores que na verdade constituem uma curva de equalização para atenuar os graves e realce os agudos. Se você não precisar disso, basta definir a variável EQ_ON como false ou altere o nível de atenuação alterando os 32 valores do eq [32] matriz, um valor de 100 deixa a amplitude inalterada, um menor que 100 atenua e um maior que 100 acentua a banda de frequência.

Led brilho

O brilho da matriz é predefinido no código em 32 (BRIGHTNESS const). O valor máximo de brilho da matriz WS2812B (no papel) é 255, mas já com valores maiores que 100, a luz do LED infelizmente muda de branco para amarelo pálido, provavelmente é necessário fornecer a matriz através dos dois fios centrais vermelho e preto do conector do lado direito.

Ainda estou tentando ...

Finalmente, se você usar um brilho máximo de 64, uma fonte de alimentação 1A é provavelmente o suficiente, caso contrário, 2A é essencial.





Futuro Udate


Estou trabalhando em uma nova versão que usa o OpenMusicLabs FHT biblioteca que acaba sendo muitas vezes mais rápida do que o Arduino FFT.

Fique ligado. :)

Por favor perdoe meu inglês ruim, usei o tradutor do google.

Código

  • Spectrum_Analyzer_WS2812B.ino
Spectrum_Analyzer_WS2812B.ino Arduino
 / * Copyright (c) 2019 Shajeeb TM A permissão é concedida, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para lidar com o Software sem restrições, incluindo sem limitação, os direitos de usar, copiar, modificar, fundir, publicar, distribuir, sublicenciar e / ou vender cópias do Software, e permitir que as pessoas a quem o Software é fornecido o façam, sujeito às seguintes condições:aviso de copyright e este aviso de permissão devem ser incluídos em todas as cópias ou partes substanciais do Software. O SOFTWARE É FORNECIDO "NO ESTADO EM QUE SE ENCONTRA", SEM QUALQUER TIPO DE GARANTIA, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM NENHUMA HIPÓTESE OS AUTORES OU TITULARES DOS DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, DELITO OU DE OUTRA FORMA, DECORRENTE DE, FORA DE OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO PROGRAMAS. WS2812B Led Matrix vesion por Janux * / # include  #include  #include  #define AMOSTRAS 64 // Deve ser uma potência de 2 # define xres 32 // Número total de colunas no display, devem ser <=AMOSTRAS / 2 # definir anos 8 // Número total de linhas no display # define ledPIN 6 // pint para controlar a matriz Led # define NUM_LEDS (xres * anos) #define BRIGHTNESS 32 # define buttonPin 5 // o número do pino do botão para alterar displaycolorbyte yvalue; byte displaycolumn, displayvalue; int peaks [xres]; byte state =HIGH; // a leitura atual do pinbyte de entrada previousState =LOW; // a leitura anterior da entrada pinbyte displaycolor =0; // Arrays para sampligdouble vReal [SAMPLES]; double vImag [SAMPLES]; byte data_avgs [xres]; arduinoFFT FFT =arduinoFFT (); // FFT objectunsigned long lastDebounceTime =0; // a última vez que o pino de saída foi alternado para assinar long debounceDelay =100; // o tempo de debounce; aumentar se a saída piscar // Parâmetro 1 =número de leds na matriz // Parâmetro 2 =número do pino (a maioria são válidos) // Parâmetro 3 =sinalizadores de tipo de pixel, adicionar conforme necessário:// NEO_KHZ800 800 KHz bitstream (maioria NeoPixel produtos c / LEDs WS2812) // NEO_KHZ400 400 KHz (clássico 'v1' (não v2) pixels FLORA, drivers WS2811) // NEO_GRB Pixels são conectados para GRB bitstream (a maioria dos produtos NeoPixel) // NEO_RGB Pixels são conectados para bitstream RGB ( v1 FLORA pixels, não v2) Adafruit_NeoPixel pixel =Adafruit_NeoPixel (NUM_LEDS, ledPIN, NEO_GRB + NEO_KHZ800); // Filtro EQ para atenuar os graves e melhorar os agudos // Útil na placa de som do PC, que geralmente tem muitos graves e baixa frequência alta bool EQ_ON =true; // definir como falso para desativar 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 cor para LED único, usado na função setColumn, 0 para cor personalizada // As cores são calculado pela função de roda, veja as cores de byte abaixo [] [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}}; configuração vazia () {pixel.begin (); pixel.setBrightness (BRIGHTNESS); // Começa as operações FFT ADCSRA =0b11100101; // definir ADC para modo de execução livre e definir pré-escalar para 32 (0xe5) ADMUX =0b00000000; // use o pino A0 e a referência de tensão externa} void loop () {// ++ Amostragem para (int i =0; i  peaks [i]) peaks [i] =yvalue; // salvar o pico se> previuos pico yvalue =peaks [i]; displaycolumn =i; displayvalue =yvalue; setColumn (displaycolumn, displayvalue); // desenha baldes} pixel.show (); // mostra baldes displaycolorChange (); // verifique se o botão foi pressionado para alterar o modo de cor} // ------------------------------------- ---------------------------- // Leds claros da coluna x de acordo com o valor yevoid setColumn (byte x, byte y) {byte led , eu; para (i =0; i  i) {switch (displaycolor) {case 4:// coloque zero 0 no valor da matriz para personalizar a cor dos picos if (colors [displaycolor] [i]> 0) {// cor normal definida na matriz de cores pixel.setPixelColor (led, Wheel (colors [displaycolor] [i])); } else {// cor personalizada para picos apenas com 0 no valor do array pixel.setPixelColor (led, 255, 255, 255); // Número do Led, valores R, G, B} break; caso 5:// muda a cor pela coluna pixel.setPixelColor (led, Wheel (x * 16)); pausa; caso 6:// muda a cor por linha pixel.setPixelColor (led, Wheel (i * 36)); pausa; default:// display color set -> displaycolor de 0 a 3 // as cores são definidas no array de cores pixel.setPixelColor (led, Wheel (colors [displaycolor] [i])); } // END SWITCH} else {pixel.setPixelColor (led, 0); }}} // ==============================================================================// Calcule um número led por coordenadas x, y // válido para WS2812B com layout serpentino colocado em horizzontal // e zero led na parte inferior direita (conector de entrada no lado direito) // valor de entrada:x =0-31, y =0-7, retorna um número de led de 0 a 255 // ================================================================================byte GetLedFromMatrix (byte x, byte y) {x =xres - x - 1; if (x &0x01) {// Colunas ímpares aumentam para trás return ((x + 1) * yres - y - 1); } else {// Colunas pares aumentam normalmente return ((x + 1) * yres - yres + y); }} // ================================================================================void displaycolorChange () {int reading =digitalRead (buttonPin); if (lendo ==HIGH &&previousState ==LOW &&millis () - lastDebounceTime> debounceDelay) // funciona apenas quando pressionado {displaycolor ++; if (displaycolor> 6) displaycolor =0; lastDebounceTime =millis (); } previousState =reading;} / * Utilitário do esboço de demonstração Adafruit Neopixel Insira um valor de 0 a 255 para obter um valor de cor. As cores são uma transição R - G - B - de volta para R. * / Roda longa sem sinal (byte WheelPos) {WheelPos =255 - WheelPos; if (WheelPos <85) {return pixel.Color (255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) {WheelPos - =85; retornar pixel.Color (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos - =170; return pixel.Color (WheelPos * 3, 255 - WheelPos * 3, 0);} 

Peças personalizadas e gabinetes

arduino_rgb_audio_analyzer_lX4Dv4Pta2.zip

Esquemas


Processo de manufatura

  1. 32 (Linier) / 11 (Pseudo Log) banda Audio Spectrum Analyzer
  2. Alarme de planta de alerta de sede
  3. Word Clock italiano
  4. Medidor Sigfox kWh
  5. Monitor de temperatura Bluetooth
  6. Bloqueio controlado por gestos
  7. O Companion IC
  8. Adaptador USB MIDI
  9. Uma entrada analógica isolada para Arduino
  10. Meça seu tempo de reação