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

RGB Matrix Audio Visualizer com Arduino

Componentes e suprimentos

Arduino UNO
× 1
Adafruit Neopixel Shield para Arduino
× 1
SparkFun Spectrum Shield
× 1
ProtoStax Enclosure para Arduino
Gabinete modular empilhável para Arduinos (pegadas Uno e Mega)
× 1
SPST OFF- (ON) Botão de pressão azul
× 1
Montagem em painel de tomada estéreo isolada de 3,5 mm
× 2
Cabos auxiliares de 3,5 mm em ângulo de 90 °
× 2
Patch Cord Áudio estéreo de 3,5 mm macho para macho 6 pés
× 1

Ferramentas e máquinas necessárias

Drill / Driver, Cordless

Sobre este projeto






Neste artigo, eu explico como construir um visualizador de áudio de matriz RGB LED, usando um Arduino, um RGB LED Matrix Shield e um Audio Spectrum Analyzer Shield e, em seguida, colocá-lo em um gabinete para que você possa ter um projeto concluído que você pode exibir pelo seu sistema de música para ter um belo show de luzes de sua música!

Para a análise de espectro de áudio, eu uso Spectrum Shield do SparkFun, que usa dois filtros de exibição de equalizador gráfico MSGEQ7, que dividem uma entrada de áudio estéreo em 7 bandas (por canal) e leem a amplitude de cada uma usando o ADC em seu Arduino. Ele vem com esboços de amostra do Arduino para começar.

Para a matriz de LED RGB, eu uso o NeoPixel Shield da Adafruit para Arduino, que consiste em 40 NeoPixels RGB (terminologia da Adafruit para sua fonte de luz WS2812). LEDs vermelhos, verdes e azuis são integrados ao lado de um chip de driver em um pequeno pacote de montagem em superfície controlado por um único fio. Eles podem ser usados ​​individualmente, encadeados em cordas mais longas ou montados em fatores de forma ainda mais interessantes. No caso do escudo, eles são acorrentados. O Shield também vem com a biblioteca Adafruit_NeoMatrix, que simplifica o acesso à matriz de LED RGB e o controle dos LEDs.

Por último, vem o gabinete. Alguns de vocês devem estar cientes de que criei um novo sistema de gabinete empilhável e modular chamado ProtoStax. Foi uma coceira pessoal que tive que coçar - eu queria um gabinete que suportasse diferentes estágios de prototipagem, oferecendo proteção e acesso aberto no início, com a capacidade de adicionar paredes laterais e o topo depois, mas também com a capacidade de empilhar unidades múltiplas, lado a lado ou uma em cima da outra, com a capacidade de se expandir com as necessidades de prototipagem e adição de outras placas e componentes.

Neste exemplo, eu uso ProtoStax para Arduino, um gabinete de acrílico transparente para o Arduino - ele se encaixa tanto na pegada Uno / Leonardo quanto na pegada Mega / Due maior - que também é empilhável e modular e tem espaço confortável para os dois Escudos (com algumas pequenas modificações, que irei delinear). É claro e robusto e também possui pés de borracha para elevá-lo ligeiramente e proteger a superfície de sua mesa, para que você possa exibir seu Audio Visualizer e seu show de luzes junto com seu sistema de música! 😊

Ok, vamos começar, vamos? 😊





Etapa 1 - Monte o Arduino na placa de base do gabinete


Vamos primeiro montar o Arduino (Uno em nosso exemplo) na placa de base do gabinete. Isso oferece proteção ao mesmo tempo em que oferece acesso aberto total a ele para configurar e configurar o Arduino e brincar com ele. Quando você estiver pronto para fechá-lo, é fácil adicionar as paredes laterais e a placa superior e prender tudo com parafusos.

Monte o Arduino na placa de base e adicione pés e outro hardware para preparar o gabinete em Configuração da plataforma . Veja as etapas abaixo na apresentação de slides - a legenda de cada imagem é numerada e fornece uma explicação adicional para cada etapa.



Aqui estão todas as etapas como um GIF animado:






Etapa 2 - Prepare o SparkFun Spectrum Shield para o Arduino




O SparkFun Spectrum Shield não vem com cabeçalhos. Felizmente para nós, Adafruit NeoPixel Shield para Arduino vem com cabeçalhos de empilhamento e cabeçalhos simples. Como quero que o NeoPixel Shield fique no topo, quero usar cabeçalhos simples com ele para que fique nivelado e isso deixa os cabeçalhos de empilhamento para uso com o Spectrum Shield, que é exatamente o que eu quero! 😉

No entanto, o Spectrum Shield com cabeçalhos de empilhamento não se encaixa perfeitamente - as portas USB e Power no Arduino Uno atrapalham, como mostrado na imagem abaixo.





Eu fiz as seguintes duas modificações -
  • Corte a extremidade do Spectrum Shield nas portas USB e Power (essa parte tem área de prototipagem, que não é usada. Mesmo se você estiver usando, você acabará cortando apenas uma fileira de orifícios). o Spectrum Shield se encaixa perfeitamente no Arduino.
  • As pernas dos cabeçalhos de empilhamento ainda podem ser muito longas para que o Spectrum Shield se encaixe perfeitamente. Cortei um fio de cabelo nas pernas dos cabeçalhos de empilhamento para fazer o Spectrum Shield se encaixar perfeitamente no Arduino com os cabeçalhos de empilhamento.



Agora ele se encaixa perfeitamente!








Etapa 3 - Insira o Adafruit NeoPixel Shield para Arduino no cabeçalho de empilhamento do Spectrum Shield




O Escudo Adafruit NeoPixel vai para o topo do Escudo Spectrum. Você precisará primeiro soldar nos cabeçalhos regulares (que veio junto). Eu também soldei o conector do terminal que veio com ele, embora neste exemplo, eu o esteja alimentando usando o Arduino, já que todos os LEDs não ligam simultaneamente, então o consumo de energia está dentro dos valores que o Arduino pode fornecer .

Mensagem da página NeoPixel Shield da Adafruit para Arduino:





Etapa 4 - Código de demonstração


Vamos dar uma olhada no Código Demo e ver o que ele está fazendo. Para fazer isso, podemos dividi-lo em duas partes principais:
  • Análise de espectro e salvamento de resultados
  • Traduzindo isso em um esquema de exibição / cores para o 8x5 NeoPixel Matrix.

Você pode consultar rapidamente o código de demonstração aqui:

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





Análise de espectro




Você pode consultar o Guia de Conexão do Spectrum Shield para obter informações adicionais sobre o Spectrum Shield. Eu resumi as informações aqui.

Ao gravar uma sequência digital nos pinos STROBE e RESET do Spectrum Shield, você inicializa os chips MSGEQ7 usados ​​pelo Shield. Você pode então prosseguir para ler a magnitude de cada uma das 7 bandas de frequência diferentes nas quais o espectro é dividido. Cada banda é lida seguida pela pulsação do pino STROBE para iniciar a leitura da próxima banda. Os valores são armazenados em Frequencies_One [7] e Frequencies_Two [7] para os dois canais da entrada estéreo. Os valores são lidos usando os ADCs de 10 bits do Arduino e o valor de saída pode ser 0 - 1023 - eles fornecem uma representação da amplitude de cada banda de frequência.
  // Declara conexões de pino Spectrum Shield # define STROBE 4 # define RESET 5 # define DC_One A0 # define DC_Two A1 // Define variáveis ​​de espectroint freq_amp; int Frequencies_One [7]; int Frequencies_Two [7]; int i; void setup () {... // Inicializar analisadores de espectro digitalWrite (STROBE, LOW); atraso (1); digitalWrite (RESET, HIGH); atraso (1); digitalWrite (STROBE, HIGH); atraso (1); digitalWrite (STROBE, LOW); atraso (1); digitalWrite (RESET, LOW); ...} void loop () {... Read_Frequencies (); ...} / ******************** Extrair frequências de Spectrum Shield ******************** / void Read_Frequencies () {... // Lê frequências 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 (STROBE, HIGH); digitalWrite (STROBE, LOW); }}  

As 7 bandas do espectro de frequência são:
  • 63 Hz
  • 160 Hz
  • 400 Hz
  • 1kHz
  • 2,5 kHz
  • 6,25 kHz
  • 16 kHZ

Eu divido estes em 3 intervalos - BASS, MID_RANGE e TREBLE. A faixa típica de graves é de 60 a 250 Hz, então as duas primeiras bandas estão na faixa de graves. As frequências de faixa média são normalmente de 500 Hz a 2 kHz, então eu agrupo as próximas 3 bandas em MID_RANGE. Eu agrupo as 2 bandas restantes em TREBLE.

[Nota:também observo a leitura máxima de cada uma das bandas em uma variável separada. Isso pode ser usado para dimensionar automaticamente as leituras para o nível representado pelas colunas da matriz RGB - isso é útil no caso em que o sinal de entrada é baixo - caso contrário, apenas muito poucos da matriz RGB acenderiam nesse caso. ]





Matriz RGB


Você pode consultar o Adafruit NeoPixel Überguide para obter informações adicionais sobre o NeoPixel Shield e NeoPixels em geral. Eu resumi as informações relativas ao nosso uso aqui.

O ponto principal que tentarei esclarecer, que achei um pouco confuso no início, é a direção e a orientação do Escudo NeoPixel e a numeração do sistema de coordenadas. O Überguide explica, mas acho que posso facilitar um pouco.

A primeira coisa a notar é que no sistema de coordenadas, [0, 0] SEMPRE se refere ao canto superior esquerdo, independentemente da orientação.

Em seguida, é necessário observar a LARGURA, seguida de ALTURA, de qualquer orientação em que você esteja interessado (ou seja, 5 x 8 vs 8 x 5 no caso do nosso escudo)

Em terceiro lugar, observe a posição do LED FÍSICO # 0 (marcado pelo logotipo bonito da Adafruit). TOP-RIGHT, TOP-LEFT, BOTTOM-LEFT e BOTTOM-RIGHT conforme o caso. Observe também a orientação da progressão dos LEDS físicos. O layout é PROGRESSIVO em nosso tabuleiro (o próximo led físico após o final de uma linha começa no início da próxima linha conforme indicado pela linha AMARELA). A orientação da progressão é ao longo das LINHAS para quando a largura é mais ampla (orientação horizontal) (conforme indicado pelas setas VERDES curtas), e COLUNAS com a largura é mais estreita (orientação vertical) (novamente, conforme indicado pelas setas VERDES curtas) )

Eles são ilustrados pelas 4 imagens abaixo na apresentação de slides. As legendas incluem as configurações pertinentes em cada caso!





Em nosso exemplo, temos 7 bandas de frequência e uma matriz 8 x 5 (ou 5 x 8, dependendo de como você olha para ela!). Eu escolhi exibir as 7 bandas ao longo da dimensão 8 (deixando uma sem uso). Em seguida, exibiria a representação da amplitude de cada banda de frequência ao longo da dimensão 5. Em outras palavras, quero que minha progressão seja a seguinte:



Eu quero que minha origem comece no canto esquerdo inferior (representando o nível mais baixo da banda de frequência mais baixa) e trabalhe seu caminho para cima. Mas como a primeira coisa a se notar no sistema de coordenadas é que [0, 0] sempre se refere a TOP-LEFT, você deve inclinar sua cabeça para a esquerda e olhar a imagem abaixo, para entender a escolha de valores para inicializar o NeoMatrix ! 😊 (LARGURA =5, ALTURA =8, ACIMA DIREITA, COLUNAS PROGRESSIVAS)





Vamos nos aprofundar um pouco no código de demonstração pertencente ao NeoMatrix e fazer um gráfico das frequências. Em primeiro lugar, determinamos que nosso NeoPixel tem LARGURA =5, ALTURA =8 e a orientação que gostamos é ACIMA DIREITA e COLUNAS PROGRESSIVAS. Siga a configuração necessária para a matriz na função setup ().

No loop (), lemos qualquer entrada serial para selecionar o esquema de cores - eu defini 3 esquemas de cores diferentes
  enum SCHEME {MAGNITUDE_HUE =0, MAGNITUDE_HUE_2 =1, HSV_COLOR_WHEEL =2};  

Em seguida, chamo Graph_Frequencies com essa escolha de esquema de cores. Observe também o primeiro parâmetro que pode selecionar a faixa de frequências a serem exibidas (BASS, MID-RANGE ou TREBLE)
  enum RANGE {BASS =0, MID_RANGE =1, TREBLE =2, ALL =3};  

Por enquanto, estou selecionando todos os intervalos para mostrar - é deixado como um exercício para o leitor implementar a seleção de intervalos para exibir - por meio de entrada serial ou incluindo um botão momentâneo de pressão para alternar a exibição entre BASS, MID_RANGE, TREBLE ou ALL. A seleção de RANGE determina o intervalo "de" e "até" das linhas a serem exibidas.

Para cada linha (banda de frequência), escolhemos a maior das duas magnitudes de frequência (canal direito e canal esquerdo da entrada estéreo). Esse valor está entre 0 e 1023, como já discutimos. Precisamos mapear isso em 5 colunas distintas da tela, então dividimos a frequência pelo FREQ_DIV_FACTOR que é definido como 204 (1023/204 =5, que mapeará uma saída de 1023 a 5). Por segurança, também nos certificamos de que numCol a ser exibido não seja maior que 5. Isso determina o número de colunas a serem exibidas para cada banda de frequência.

Em seguida, uso matrix.drawPixel () para exibir o pixel apropriado na cor apropriada.

Eu uso a roda de cores HSV em meu display gráfico. Isso representava algumas rugas extras a serem superadas.

Normalmente, o uso é matrix.drawPixel (coluna, linha, Cor (r, g, b)), onde Cor (r, g, b) representa uma cor conforme especificado pelos valores VERMELHO, VERDE e AZUL. No entanto, o uso do HSV permite algumas transições de cores suaves e agradáveis.

NeoMatrix fornece o método matrix.ColorHSV (uint16_t hue) que usa um único valor de matiz uint16_t e retorna uma cor uint32_t HSV.

No entanto, matrix.Color (r, g, b) retorna uma cor uint16_t. matrix.drawPixel também espera uma cor de 16 bits.

A maneira de contornar isso é usar matrix.setPassThruColor (valor de cor de 32 bits). Isso define um sinalizador na matriz que faz com que drawPixel ignore seu argumento de cor e, em vez disso, use a cor de 32 bits já definida pelo método acima. Apenas lembre-se de chamar matrix.setPassThruColor () para redefinir o sinalizador em questão. Não é super elegante, mas funciona. Por exemplo,
  static uint16_t hue =0; // 21845 22250 a -250 uint16_t hueDelta =200; hue + =hueDelta; ... rgbcolor =matrix.ColorHSV (hue); ... matrix.setPassThruColor (rgbcolor); matrix.drawPixel (col, linha, (uint16_t) 0); // a cor não importa aqui matrix.setPassThruColor (); ... matrix.show ();  

Com o HSV, é possível incrementar o matiz de 16 bits e gerar o código de cores HSV, obtendo transições suaves de cores.

Aqui estão as diferentes peças de código para referência:
  #define NEO_MATRIX_WIDTH 5 # definir NEO_MATRIX_HEIGHT 8 # definir NEOPIXEL_PIN 6 // Escudo mapeia para o pino matriz 6Adafruit_NeoMatrix =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 (false); matrix.setBrightness (40); matrix.fillScreen (0); matrix.show (); ...} void loop () {esquema interno estático =0; while (Serial.available ()> 0) {scheme =Serial.parseInt (); } ... Graph_Frequencies (ALL, scheme); ... delay (50);} void Graph_Frequencies (CHANNEL c, SCHEME s) {... for (row =from; row  Frequencies_One [row])? Frequencies_Two [row]:Frequencies_One [row]; int numCol =(freq / FREQ_DIV_FACTOR); if (numCol> 5) numCol =5; for (int col =0; col  

A seguir está a seleção do esquema de cores. Observe que tomei providências para poder selecionar cores para diferentes faixas de frequência (bassHue, midHue, trebleHue). Eu criei 3 esquemas de cores diferentes - um que usa a faixa de verde a vermelho / rosa para exibição da amplitude mais baixa à mais alta, e o outro que usa uma faixa mais rosa / azul alterada. O terceiro esquema usa a mesma cor para todos os pixels, mas percorre toda a roda de cores à medida que avança. Vou mostrar um vídeo de todos os 3 esquemas de cores.
  switch (s) {case MAGNITUDE_HUE:bassHue =22250; midHue =22250; // 54613 trebleHue =22250; // 43690 if (row> =0 &&row <2) {rgbcolor =matrix.ColorHSV (bassHue - (7416 * col)); } else if (linha> =2 &&linha <5) {rgbcolor =matriz.ColorHSV (midHue - (7416 * col)); } else if (row> =5 &&row <7) {rgbcolor =matrix.ColorHSV (trebleHue - (7416 * col)); } pausa; case MAGNITUDE_HUE_2:bassHue =54613; midHue =54613; // 54613 trebleHue =54613; // 43690 if (row> =0 &&row <2) {rgbcolor =matrix.ColorHSV (bassHue - (7416 * col)); } else if (linha> =2 &&linha <5) {rgbcolor =matriz.ColorHSV (midHue - (7416 * col)); } else if (row> =5 &&row <7) {rgbcolor =matrix.ColorHSV (trebleHue - (7416 * col)); } pausa; case HSV_COLOR_WHEEL:rgbcolor =matriz.ColorHSV (matiz); pausa; }  






Etapa 6 - Testar tudo




Aqui está um vídeo de teste de tudo










Etapa 6 - Fechar




Instale os elementos de reforço superiores, paredes laterais, cabos de áudio e parte superior. Veja as etapas abaixo na apresentação de slides - a legenda de cada imagem é numerada e fornece uma explicação adicional para cada etapa.







Aqui estão todas as etapas em um único GIF animado:








Etapa 7 - Exiba sua criação e torne a música bonita ainda mais bonita!


Agora você pode ter um divertido visualizador de áudio que pode exibir ao lado do seu sistema de música e ter um pouco de ação de luz caseira legal para aumentar sua música!








Etapa 8 - Indo mais longe


Aqui estão algumas ideias para levar o projeto ainda mais longe!

1. Atualmente, os cabos de áudio (entrada e saída) são conectados ao Spectrum Shield no gabinete e, portanto, você tem esses gabinetes com esses fios conectados e pendurados do lado de fora. Em vez disso, você pode adicionar alguns conectores estéreo de montagem em painel (listados na lista de "coisas" usadas) à parede lateral perto dos conectores estéreo do Spectrum Shield e, em seguida, soldar um cabo de áudio com um conector de áudio estéreo macho de 3,5 mm a cada um e, em seguida, conecte-os às entradas de áudio do Spectrum Shield. Nesse caso, seu gabinete se torna muito organizado e toda a fiação é independente, com apenas conectores de áudio no gabinete para a conexão de sistemas externos.

2. Você pode adicionar mais ainda mais esquemas de luz ao seu Visualizador de Áudio - diferentes faixas de cores, diferentes padrões.

3. Adicione a opção de ativar / desativar as faixas de frequência usando a entrada serial - atualmente, apenas os esquemas de cores podem ser alterados, mas não as faixas de frequência a serem exibidas.

4. Adicione uma opção para alternar entre os diferentes esquemas de cores em vez de usar a entrada serial. Modifique o gabinete para adicionar um orifício a uma das longas paredes laterais para acomodar um interruptor de botão momentâneo de montagem em painel (listado na lista de "coisas" usadas).

5. Adicione um segundo interruptor para alternar entre as diferentes faixas de frequência exibidas (BASS, MID_RANGE, TREBLE, ALL) e monte esse interruptor na parede lateral do gabinete.

6. Como o gabinete é feito de acrílico, você pode usar um pouco de fita adesiva azul sobre ele para proteger a superfície e uma furadeira para fazer um orifício no lado necessário para montar os conectores e / ou interruptores estéreo de montagem em painel. Recomenda-se usar uma broca escalonada ou começar com um orifício menor e expandir o orifício até que fique do tamanho desejado. Os conectores estéreo listados precisam de um orifício de montagem de 5/16 "e os switches precisam de um orifício de montagem de 0,47".

7. Lixe a superfície superior da placa superior leve e uniformemente. Isso funcionará como um difusor de luz e fornecerá um efeito de luz mais difuso e suave.

Se houver interesse suficiente, irei atualizar o projeto para mostrá-lo com os conectores e interruptores de áudio e um difusor de luz opaco - por favor, envie-me uma mensagem se você gostaria de ver o projeto atualizado! 😊

Você consegue pensar em mais alguma coisa? Escreva um comentário abaixo para nos avisar! 😊 Sinta-se à vontade para fazer qualquer pergunta que você possa ter! 😊

Feliz fabricação! 😊




Código

Demonstração do visualizador de áudio ProtoStax
Repositório Github contendo o código usado neste ProtoStax Audio Visualizer Demohttps://github.com/protostax/ProtoStax_Audio_Visualizer_Demo

Processo de manufatura

  1. Monitoramento de CO2 com Sensor K30
  2. Comunicação para surdos-cegos com 1Sheeld / Arduino
  3. Aceitar moeda de controle com Arduino
  4. Jogo Arduino Pong em Matriz 24x16 com MAX7219
  5. Detector de frequência de áudio
  6. Arduino com Bluetooth para controlar um LED!
  7. Sensor capacitivo de impressão digital com um Arduino ou ESP8266
  8. Tocar áudio no Arduino
  9. Anime uma boca de Billy Bass com qualquer fonte de áudio
  10. Arduino RGB Color Mixer