Ir ao conteúdo

Como usar dois MSGEQ7 e obter 14 bandas diferentes !


aphawk

Posts recomendados

Postado

Pessoal,

Fiz um analisador de espectro de áudio com dois CI's MSGEQ7, e um Arduíno como controlador. Como tem de ser usado com um microcontrolador, vou postar nesta área do CH.

Vocês podem verificar na Internet que existem dezenas de exemplos de projetos semelhantes, mas todos utilizam apenas 7 bandas, que é o que o CI pode fornecer.

Alguns fizeram com 14 bandas, porém apenas 7 bandas são reais, as outras 7 são obtidas por interpolação ( média ) de duas adjacentes, ou seja, não são reais.

Após estudar um pouco o funcionamento, consegui um circuito que utiliza dois CI's , cada um responsável por 7 bandas DIFERENTES das do outro CI, e funcionou direitinho.

Vou postar as dicas aqui, para que outros possam também montar o seu projeto. Afinal, apenas o hardware é básico, e cada um pode implementar um monte de coisas diferentes no software.

Se tiverem interesse, posso postar o circuito completo do meu, que utiliza duas matrizes de Leds de 8x8 cada uma, e dois CI's MAX7219 para facilitar o controle sem me preocupar com o refresh. O software foi feito em Basic do Bascom, utilizando um simples Arduíno Uno, mas pode ser feito tranquilamente com um Atmega8 ou Atmega328.

Como informação, os custos no Ebay são estes, já com frete gratuíto !!!! :

Matrix de Led 8x8 montada já com o MAX7219 : US$ 3,99 cada

MSGEQ7 : US$ 1,80 cada

Arduino nano Atmega328 : US$ 3,89

Dá para ter uma ideia do baixo custo do projeto !

Vamos ao truque :

O CI MSGEQ7 utiliza filtragem por comutação de capacitor, portanto ele é dependente da frequência de clock. Dois componentes são responsáveis pelo clock, originalmente um resistor de 200K e um capacitor de 33 pF.

Observando o Datasheet, eu reparei que as 7 frequências seguem um multiplo de 2,5 uma da outra adjacente. Estudando o princípio de funcionamento, reparei que um filtro desse tipo tem a seguinte característica :

1 - Q do filtro independe da frequência de clock.

2 - A frequência central de cada filtro é determinada por uma divisão da frequência de clock, e o fator de divisão dos filtros segue a relação de 2,5 , isto é, independente da frequência de clock, os filtros terão frequências espaçadas de 2,5 vezes uma da outra.

3 - O mais interessante, a frequência deve variar inversamente com o valor do capacitor ou do resistor do clock !

O MSEQ7 originalmente possui as seguintes frequências :

63Hz 160Hz 400Hz 1kHz 2.5kHz 6.25 kHz 16 kHz

Vamos criar uma nova tabela de frequências, por exemplo, eu quero que a frequência mais alta seja de 11.125 Hz ( média entre 6.25 e 16 Khz ).

Assim, dividindo por 2,5 em sequência, o novo filtro terá as seguintes frequências aproximadas :

11.125KHz 4,45KHz 1,78KHz 712Hz 285Hz 114Hz 46Hz

Não são as frequências que estamos acostumados a ver em um analisador de espectro, mas temos uma excelente cobertura com as 14 bandas.

Teremos no total :

46 63 114 160 285 400 712 1k 1,78k 2,5K 4,45K 6,25k 11,25k 16k

Claro que voce pode mudar as frequências bases de cada CI, mas lembre-se que sempre vai existir uma relação de 2,5 entre as frequências de cada CI.

E para quem gosta de mais bandas, nada impede de se colocar mais um MSGEQ7, totalizando 21 bandas ! E voce pode no software escolher quais as frequências que te interessam de cada um dos CI's.

A mudança na frequência mais alta de filtragem foi de 16/11.125 = 1,438 para baixo, então teremos de aumentar ou o resistor para 200k x 1,438 ou o capacitor para 33Pf x 1,438 , o que dá os valores de R= 287K ou C= 47pF.

Neste caso, optei por manter R=200K e usei C=47pF. Na verdade, no lugar do resistor, eu uso um resistor de 150K em série com um trim-pot de 100K, assim posso fazer um ajuste fino, utilizando um gerador de sinais e ajustando o resistor para obter a leitura máxima na banda correspondente.

Agora, temos dois circuitos semelhantes, ligamos juntos as entradas de áudio, e os sinais de controle de clock e de strobe. As saídas irão cada uma para um canal do conversor A/D.

Usaremos duas entradas do conversor A/D, e faremos as duas leituras na sequência, e pronto, temos os 14 valores desejados.

Seguem algumas dicas para o software :

1 - Infelizmente, o MSGEQ7 possui uma tensão DC na saída, mesmo com nenhum sinal na entrada de áudio, e esse valor, para piorar, muda de uma banda de filtragem para outra. Portanto, sugiro utilizar um Mosfet tipo 2N7000 na entrada de áudio, polarizado ao +5V com um resistor de 47K, que vai servir como uma chave de curto-circuito para o áudio, controlada por um pino do Arduíno. Assim, voce pode criar um procedimento de ajuste de offset, realizando várias leituras e fazendo a média, com a entrada curto-circuitada pelo 2N7000.

Eu fiz 32 leituras de todas as 14 bandas, e calculei a média para cada uma, e chamei isto de offset

Assim, quando em condição normal voce fizer a leitura do canal A/D , basta diminuir a leitura do valor de offset da banda correspondente , e voce terá um valor que varia de 0 até um máximo. Caso a diferença seja negativa, eu transformo em zero.

2 - Experimentalmente, levantei a função de transferência do CI :

A tensão de saída apresentada varia linearmente com o valor pico a pico da entrada. Não é em decibel como muitos pensam. Mas isto permite algo muito legal : transformar a indicação dos Leds de acordo com uma escala em dB, por exemplo, variar um Led para cada 6dB de variação ! Basta transformar as leituras do A/D em escala logaritmica, e fazer o ajuste "de ganho" para cada Led a mais que acender.

3 - A tensão de saída do MSGEQ7 chega a 4 Volts, e como o datasheet diz que o ganho é de 10, voce só pode aplicar tensões até 400 mV pico a pico na entrada do CI. Por outro lado, lembre-se que o máximo de tensão a ser convertida pelo A/D é de 4 Volts.

4 - O CI MSGEQ7 é um pouco ruidoso, portanto ignore as leituras obtidas de sinal muito baixo.

5 - Por último, existe uma taxa de decay do sinal de saída de 1/10 a cada leitura. voce pode utilizar isto para se ter um bom efeito visual, por exemplo, fazer as 14 leituras das bandas 20 vezes por segundo, e voce vai ver o display com um efeito de os Leds irem diminuindo aos poucos quando voce corta o sinal de áudio. Também pode fazer a 40 vezes por segundo, e a indicação fica quase instantânea.

Por último, eu desconfio que algumas informações no datasheet, sobre a frequência de clock e as 7 frequências centrais, são aproximadas, e na verdade existe uma pequena diferença em cada uma, devido ao fator de divisão de cada filtro... Por exemplo, o manual fala em clock de 165 Khz, e a frequência do filtro de 16 Khz, a divisão não dá um número inteiro. Se a divisão do filtro de 16 Khz for 10, o clock tem de ser 160 Khz.

Neste caso, se f=160 Khz, o primeiro filtro tem divisão por 10, o segundo por 25, e assim sucessivamente, portanto deve existir uma pequena diferença entre as frequências do fabricante e as reais.

Boa diversão a todos.

Paulo

Postado

Agora fiquei curioso.

Posta um vídeo pra gente ver como ficou tudo.

Vou dar uma lida no datasheet dele.

Falou

estou lendo com mais calma seu post colega Paulo.

Tenho algumas dúvidas que não ficaram muito claras (o datasheet é bem limitado)

1 - Não entendi muito bem como você selecionou as novas frequências no CI. Apenas mudando o resistor e o capacitor? No caso as frequências dependem desse conjunto RC?

2 - Como funciona mesmo essa história de curto-circuito na entrada? Qual a função dela mesmo?

3 - No caso, o uC ficaria a cargo de ler a tensão DC na saída e enviar ao MAX7219?

No geral achei a ideia bem legal. Com o uso desse Ci, o circuito fica bem enxuto.

No caso de alguém querer usar matriz de led diferente de 8x8. Como fica?

Como eu disse em outros tópicos, estou estudando um jeito de realizar um BIG analisador. Algo como 32x10 ou 32x16. Mas aí eu montaria a matrix de LED manualmente.

Vou dar uma olhada nesse MAX7219 para ver como ele funciona. Tenho em mente depois que conseguir fazer do jeito inicial que eu quero, aumentar a dificuldade para usar LEDs RGB.

Falou

Postado

Matheus, segue as respostas :

1 - Sim, o clock é inversamente proporcional ao produto RC daqueles dois componentes, R de 200K e C de 33 pF. Imagina assim : a primeira banda de filtragem é a de 16 Khz, se eu quiser que ela seja de 10 Khz, a mudança das frequências é de 1,6 , portanto tenho de aumentar o produto RC de 1,6 em relação ao original.

Mas a segunda banda vai passar a ser de 10 / 2,5 = 4 Khz, e assim sucessivamente.

voce pode também fazer essa conta a partir da última banda, por exemplo, se voce quiser que ela seja de 32,5 Hz, e a original é de 63 hZ, temos de abaixar a frequência do filtro para a metade da original, então teremos de dobrar o valor do produto RC.

2 - Esse MSGEQ7 apresenta um valor de offset na saída dele, mesmo sem nenhu sinal aplicado na entrada..... então temos de eliminar esse valor das nossas leituras. Para isto, eu fiz o seguinte, veja o circuito do datasheet, eu mudei um pouquinho, o original é um capacitor em série com um resistor, eu usei um outro capacitor em série com esse do circuito, e na junção dos dois capacitores eu coloquei um resistor de 47K ligado ao positico, e nessa mesma junção coloquei um Mosfet 2n7000 ligado entre esse ponto e o terra. No gate do Mosfet, coloquei um resistor de 47K que vai ligado a um dos pinos do Arduíno.

Assim, quando eu ligo o circuito, após inicializar tudo, eu mando um nivel alto nessa porta do Arduíno, que vai fazer o Mosfet conduzir, e vai cortar o sinal de áudio. Aí eu faço várias leituras nos dois conversores A/D, e faço a média das leituras, e armazeno em uma matriz para depois descontar das leituras normais.

Quando terminar esse processo, coloco um nivel baixo no pino do Arduíno, o Mosfet vai parar de conduzir, deixando o áudio passar novamente da entrada até o MSGEQ7. Agora podemos fazer as leituras normalmente.

Para resumir, vou te dar um exemplo real, do meu circuito.

Usei como referência do A/D a tensão de 5 volts. Quando coloco a entrada em curto, fiz 32 leituras de cada banda, a média foi esta :

Banda 16 kHZ - Leitura do A/D de 54

Banda 6,25 Khz - Leitura do A/D de 45

Então, quando em funcionamento normal, com o áudio aplicado na entrada, eu leio o valor no conversor A/D, e desconto esses valores obtidos ! Algumas vezes o resultado fica negativo, e nesse caso eu converto para zero.

3 - Quase isso. O Arduino gera todos os sinais para controlar tanto o MSGEQ7 como o MAX7219. Tem uma rotina de interrupção que fica controlando o MSGEQ7, gerando as formas de onda de strobe e reset, e lendo os dois canais nos tempos corretos conforme o datasheet. Quando é feita a leitura de todos os 14 canais, seto um flag, que vai ser lido no programa principal. Enquanto esse flag não for resetado , as próximas interrupções não fazem nada.

O programa principal espera esse flag, e quando ele é setado, eu pego todos os valores medidos , e normalizo eles, de maneira que eu acenda um número de Leds entre 1 e 8 numa mesma coluna. Após esta normalização, eu preparo os dados para enviar serialmente para os dois MAX8719.

A beleza disto é que eu ligo um módulo com o MAX7219 atrás do outro, assim fica fácil basta enviar 4 bytes seriais para acender uma coluna em cada um dos Max7219. Como são 8 colunas, tenho de enviar um total de 32 Bytes para acender todas as 16 colunas ! Claro que no meu caso mantenho duas colunas apagadas o tempo todo.

Leia atentamente o datasheet do MAX7219, ele ajuda uma barbaridade, pois ele pode controlar o brilho dos leds, ele faz o refresh de todos os 64 leds, enfim, é uma mão na roda !

No seu caso, por exemplo, se voce quiser controlar uma matriz 32 x 16, ela é composta por 2 linhas de 4 matrizes 8x8 cada, então voce vai dividir ela em duas metades, e vai ligar em série 4 circuitos com MAX7219 em cada uma dessas metades. Simples e barato !

voce tem de enviar, nesse caso, 8 bytes seriais para cada conjunto, total de 16 bytes.

O legal é que a velocidade de transmissão serial pode ser até 10 Mhz !

Quanto a usar RGB, infelizmente não dá... o que eu fiz foi o seguinte, comprei 10 matrizes catodo comum bicolor verde e vermelho, assim posso usar a cor verde na parte inferior, e ligando verde e vermelho faço uma cor meia laranja como se fosse uma divisão, e na parte superior ligo a vermelha.

Só lembre-se de que tem de ser mesmo catodo comum !

Paulo

post-464954-13884966162087_thumb.jpg

Postado

Bom, vou contar minha saga nessa história também para ajudar os demais.

Tirei a tarde de ontem para dar uma lida no datashhet do MAX7219.

Li umas 50 vezes e consegui trabalhar com o carinha! No momento estou testando com 3 matriz 8x8 e 3 MAX7219.

Consigo escrever em cada matriz de led independentemente e nas 3 ao mesmo tempo caso eu deseje. Show de bola. Tenho q confessar que foi bem chato ligar eles em cascata.

Quando digo que foi chato, me refiro a comunicação entre eles. No datasheet informa sobre o registrador NO-OP (responsável pelo cascateamento) mas não diz exatamente como ele funciona. Tive q ralar pra conseguir comunicar com mais de 1 MAX7219.

No momento, como teste, criei no Proteus 8 "senoides" defasadas em 30º cada. Entenda como "senoide", um sinal senoidal com amplitude 5V de pico a pico mas com offset de +2.5V. Ou seja, um sinal variante com formato de senoide mas sem a parte negativa.

O objetivo é mostrar a amplitude de cada senoide em 1 linha da matriz de LED. Matriz 8x8, ou seja, 8 colunas e 8 "senoides".

Bom, joguei essas 8 ondas em 8 canais AD de um PIC e fiz diversas leituras. Nesse caso, tenho um sinal q vai de 0V a 5V. Usei o AD em 10 bits (1024 steps). Como tenho 8 linhas na matriz de LED, dividi 1024/8. Tenho então 128 como sendo o limiar de amplitude de cada LED. para cada incremento de 128 no AD, acende um LED na coluna da matriz.

Só tenho a dizer q ficou show de bola. Deu um efeito super bacana.

Como colega aphawk comentou, não precisamos nos preocupar com a varredura dos catodos da matriz de LED. Só o que importa é enviar o que deve ser escrito.

O problema é o preço do conjunto no Brasil. Vi no mercado livre a R$23 reais o mais barato (matriz 8x8 + MAX7912). O jeito é importando mesmo.

Para ajudar o pessoal, deixo um pseudo-código para ilustrar como escrever nos MAX7219 em cascata. Tem alguns comentários do meu entendimento.

PS: Desculpe a falta de formatação do texto abaixo. Fiz no notepad e não ficou como esperado.

//	Para facilitar o entendimento do funcionamento do cascateamento, fica mais
// fácil de pensarmos assim:
//
// LEIA O DATASHEET ANTES!
//
// O MAX7219 solicita que você envie 16 bits (2 bytes) para cada coluna a ser
// escrita.
// Primeiro enviamos 8 bits que seleciona o endereço, coluna ou dígito (são
// sinônimos) a ser escrito.
// Depois enviamos mais 8 bits que é nossa informação.
// Pronto. Para 1 MAX7219, basicamente é isso.
//
//
// Para 1+ MAX7219, funciona assim:
// Logo acima, eu disse que enviamos 16 bits ou 2 bytes, certo?
// Imagina que enviamos mais 16 bits ou 2 bytes. O que occorre é que os 16 bits
// que foram enviados antes,
// serão "empurrados" para o 2º MAX7219.
//
// Caso a intenção seja escrever em apenas 1 dos MAX7219, temos que enviar um
// comando que anule a operação
// daquele que não queremos que seja escrito. Isso se faz com o registrador NO-OP
// deve ser abreviação de
// Não operando......
//
// Segue abaixo, um pseudo-código:


max7219_1_spi (address, dataValue)
{
//Escrever no 1º MAX7219 sem alterar o 2º

Pino_LOAD = 0; //Pino CS vai a zero.

spi(NO_OP_ADDRESS); //Escolher o registrador NO-OP (0x00)
spi(NO_OP_ADDRESS); //Escolher de novo o registrador NO-OP (0x00)

spi(address); //Escolher em qual dígito vamos escrever (são 8 ao todo)
spi(dataValue); //Enviar o que deverá ser escrito (8 bits)
//Ex: 0b00000001 -> Acende o LED de baixo
Pino_LOAD = 1; //Colocra o Pino CS em nível alto de novo.
}

max7219_2_spi (address, dataValue)
{
//Escrever no 2º MAX7219 sem alterar o 1º

Pino_LOAD = 0; //Pino CS vai a zero.

spi(address); //Escolher em qual dígito vamos escrever (são 8 ao todo)
spi(dataValue); //Enviar o que deverá ser escrito (8 bits)
//Ex: 0b00000001 -> Acende o LED de baixo
spi(NO_OP_ADDRESS); //Escolher o registrador NO-OP (0x00)
spi(NO_OP_ADDRESS); //Escolher de novo o registrador NO-OP (0x00)

Pino_LOAD = 1; //Colocra o Pino CS em nível alto de novo.
}

max7219_spi (address, dataValue)
{
//Escrever nos 2 MAX ao mesmo tempo

Pino_LOAD = 0; //Pino CS vai a zero.

//Essa primeira informação vai para o 2º MAX (ela
//será empurrada pela info de baixo)
spi(address); //Escolher em qual dígito vamos escrever (são 8 ao todo)
spi(dataValue); //Enviar o que deverá ser escrito (8 bits)
//Ex: 0b00000001 -> Acende o LED de baixo
//Essa segunda informação vai para o 1º MAX
spi(address); //Escolher em qual dígito vamos escrever (são 8 ao todo)
spi(dataValue); //Enviar o que deverá ser escrito (8 bits)
//Ex: 0b00000001 -> Acende o LED de baixo
Pino_LOAD = 1; //Colocra o Pino CS em nível alto de novo.
}

Postado

Grande Matheus,

Parabéns pelas dicas, ficou muito legal mesmo !

Alèm do uso como controlador de uma matriz de Leds, o MAX7219 controla 4 displays de 7 segmentos, inclusive podemos mandar para ele o valor numérico de 4 bits na forma binária mesmo, e ele já decodifica direto no display. Claro que sempre respeitando o formato básico de comunicação, que compreende um total de 16 bits.

Uma dica para quem for ligar vários em cascata : usem SEMPRE um capacitor ceramico de 0.1 em paralelo com um eletrolítico de 100 uF ligado bem pertinho dos pinos de alimentação do CI. Senão os últimos da cascata podem ter problemas de decodificação devido ao ruído na alimentação, além de acabarmos com um belo gerador de interferências nas faixas de rádio.

Esse foi o principal motivo da substituição desse CI por outros que possuem limitação de slew-rate na multiplexação dos Leds.

Mas, também é o motivo desse CI estar custando tão barato fora do Brasil.

Paulo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!