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 FHT

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
× 2
Resistor de furo passante, 390 ohm
× 1
1N4007 - Alta tensão, diodo nominal de alta corrente
Mesmo um 1N4004 serve bem
× 1
Capacitor 100 nF
× 2
Capacitor 1000 µF
× 1
SparkFun Botão de pressão 12 mm
Ou dois botões do painel se você planeja inserir o circuito em uma caixa
× 2
Placa de protótipo genérico 4x6 cm
× 1
Plugue fêmea RCA estéreo PCB
× 1

Ferramentas e máquinas necessárias

Ferro de soldar (genérico)
Cabo de entrada de áudio de 3,5 mm para conector RCA estéreo

Sobre este projeto





A biblioteca Arduino FHT


O FHT faz exatamente o mesmo trabalho que o FFT mais conhecido, mas ao contrário deste usa apenas dados reais, enquanto o FFT trabalha com dados complexos, portanto, o FHT usa metade do poder de processamento e metade da memória do sistema.

Esta biblioteca usa uma única matriz para amostragem de dados em vez de duas, uma para valores reais e outra para valores imaginários, usada por FFT lib, ela também simplifica cálculos matemáticos complexos evitando loops com cálculos logarítmicos de ponto flutuante complexos e, em vez disso, usa algumas tabelas numéricas .

A desvantagem é que ele sempre retorna a metade dos valores do tamanho do array usado para realizar a amostragem, o que leva a uma certa perda de resolução e precisão nas duas extremidades da faixa de áudio. Porém, no caso específico não temos que desenvolver um instrumento de medição e sim um simples gadget, não precisamos de extrema precisão, basta acender um punhado de LEDs em ritmo musical.

Claro que este não é o lugar certo para discutir o funcionamento da modalidade da biblioteca FHT, quem deseja saber mais pode consultar o site do Open Music Lab onde encontrará toda a documentação necessária para entender os truques usados, a explicação detalhada do várias funções e alguns exemplos genéricos já escritos para o Arduino.

A biblioteca FFT é rápida, tão rápida que foi necessário inserir um atraso no código para reduzir a cintilação. Você notará imediatamente o resultado final, a exibição é muito mais rápida e responsiva do que a versão que usa a biblioteca FFT, que muitas vezes parecia estar atrasada em relação à música. O menor uso de recursos do sistema nos permitiu adicionar algumas linhas de código para gerenciar funções adicionais.





A nova versão


O projeto é idêntico à versão anterior, então quem já fez a anterior precisa apenas adicionar um botão e um resistor de 10K e atualizar o código.

Além da implementação da biblioteca FHT, esta versão possui as seguintes funções adicionais:
  • tem um botão adicional para ajuste de brilho;
  • permite salvar as configurações de cor e brilho na EEPROM para recarregá-las na próxima vez que for ligado;
  • exibe o nível de configuração de cor e brilho quando os botões são pressionados e quando ativados (pode ser desativado).

Código

  • Versão do código FHT
Versão do código FHT Arduino
 / * Copyright (c) 2020 Janux A permissão é concedida, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e arquivos de documentação associados (o "Software"), para lidar com o Software sem restrições, incluindo sem limitar 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:Os direitos autorais acima aviso 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. Baseado em um projeto original para a matriz de LED MAX72xx e FFT lib feito de Shajeeb. Seção de definições de configuração baseada no trabalho de Ragnar Ranøyen Homb da Norvegian Creation. * / # Define LIN_OUT 1 // magnitude de saída linear FHT # define FHT_N 128 // define AMOSTRAS para FHT, deve ser uma potência de 2 # incluir  #define xres 32 // Número total de colunas no display, deve ser <=SAMPLES / 2 # define yres 8 // Número total de linhas no display # define ledPIN 6 // out pint para controlar Leds # define NUM_LEDS (xres * yres) // total de leds na matriz # inclui  #define colorPIN 5 // pino para alterar ledcolor # define brilhoPIN 10 // pino para alterar brilhobyte displaycolor =0; // cor padrão valor por meio de brilho =1; // nível de brilho padrão # include  #define CONFIG_START 32 // Local de início da memória # define CONFIG_VERSION "VER01" // Versão de configuração configurationtypedef struct {char version [6]; byte displaycolor; brilho do byte;} tipo_de_configuração; tipo_de_configuração CONFIGURAÇÃO ={CONFIG_VERSION, cor do display, brilho}; valor y do byte; picos internos [xres]; estado do byte =ALTO; // a leitura atual do pinbyte de entrada previousState =LOW; // a leitura anterior da entrada pinunsigned 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 byte data_avgs [xres]; // Matriz para amostra // Parâmetro 1 =número de leds na matriz // Parâmetro 2 =número do pino // Parâmetro 3 =sinalizadores de tipo de pixel, some conforme necessário:// NEO_KHZ800 800 KHz bitstream (a maioria dos produtos NeoPixel com 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 RGB bitstream (v1 FLORA pixels, não 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 =verdadeiro; // defina como falso para desativar o eq // Defina 5 conjuntos de cores para leds, 0 para cores de byte de cor único 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 as configurações de exibição byte charBitmap [] ={0x1C, 0x10, 0x10, 0x10, 0x10, 0x1C, 0x08, 0x18, 0x08, 0x08, 0x08, 0x1C, 0x0C, 0x12, 0x04, 0x08, 0x10, 0x1E, 0x0C, 0x12, 0x02, 0x06, 0x06, 0x12, 0x0C, 0x10, 0x10, 0x10, 0x14, 0x1E, 0x04, 0x1E, 0x10, 0x1E, 0x02, 0x12, 0x0C, 0x1E, 0x10, 0x10, 0x1E, 0x12, 0x1E, 0x1E, 0x02, 0x04, 0x08, 0x08, 0x08, 0x08, 0x0C, 0x12, 0x0C, 0x12, 0x12, 0x0C, 0x1C, 0x12, 0x1C, 0x12, 0x12, 0x1C}; configuração vazia () {pixel.begin (); // inicializa o Led Matrix // Inicia as operações FFT ADCSRA =0b11100101; // define o ADC para o modo de execução livre e define o pré-escalonador para 32 (0xe5) ADMUX =0b00000000; // use o pino A0 e a referência de tensão externa // Lê os dados de configuração da EEPROM if (loadConfig ()) {displaycolor =CONFIGURATION.displaycolor; brilho =CONFIGURAÇÃO.brilho; } // Define o brilho carregado do EEPROM pixel.setBrightness (brilho * 24 + 8); // Mostra a configuração atual ao iniciar // altera verdadeiro para falso se você não quiser isso showSettings (3, true);} void loop () {while (1) {// reduz o jitter Sampling (); // Biblioteca FHT usa apenas um array de dados RearrangeFHT (); // reorganize o resultado FHT para corresponder ao nº de colunas de exibição SendToDisplay (); // enviar para exibir de acordo com o valor medido colorChange (); // verifique se o botão foi pressionado para alterar a cor BrightChange (); // verifique se o botão pressionado para alterar o retardo de brilho (10); // demora para reduzir a cintilação (FHT é muito rápido:D)}} void Sampling () {for (int i =0; i  peaks [i]) peaks [i] =yvalue; // salvar o pico se> previuos pico yvalue =peaks [i]; // escolhe o pico para exibir setColumn (i, yvalue); // desenha colunas} pixel.show (); // mostrar coluna} // Acender leds da coluna x de acordo com o valor yevoid setColumn (byte x, byte y) {int led, i; para (i =0; i  i) {switch (displaycolor) {case 4:if (colors [displaycolor] [i] ==0) {// mostra cor personalizada com valor zero na matriz pixel.setPixelColor (led, 255, 255, 255); // com} else {// cor padrão definida na matriz de cores pixel.setPixelColor (led, Wheel (colors [displaycolor] [i])); } pausa; 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 * y * 3)); pausa; caso 7:// mudar a cor por ... país:D // Bandeira da Itália // 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); // estrelas e listras if (i  debounceDelay) {displaycolor ++; if (displaycolor> 7) displaycolor =0; showSettings (1, verdadeiro); // defina como falso se você não quiser saveConfig (); lastDebounceTime =millis (); } previousState =reading;} void brilhosChange () {int reading =digitalRead (brilhosPIN); if (lendo ==HIGH &&previousState ==LOW &&millis () - lastDebounceTime> debounceDelay) {brilho ++; se (brilho> 7) brilho =0; pixel.setBrightness (brilho * 24 + 8); showSettings (2, verdadeiro); // defina como falso se você não quiser saveConfig (); 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. não assinada long Wheel (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);} // carregue o que está em EEPROM na CONFIGURAÇÃO local se for uma configuração 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]) {// carregar (sobrescrever) a estrutura de configuração 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 (); }}}} // por Janux®, última versão em 28/06/2020. 

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