Problema: gerar vários ondas quadradas ao mesmo tempo no Arduino (impossível)... alguém sabe uma solução?

Amigos,

Estou fazendo uma aplicação que preciso gerar mais de uma onda quadrada no Arduíno (ao mesmo tempo)... e preciso modular essa onda (mudar sua frequência).

A função tone() seria perfeita, se o Arduíno pudesse "sustentar" várias ondas diferentes ocorrendo em mais de uma porta ao mesmo tempo.

Pra piorar, preciso de exatamente 30 portas, com frequências diferentes.

Por favor, alguém pode me dar uma ajuda quanto a isso? 

Exibições: 504

Responder esta

Respostas a este tópico

Boa tarde CB,

Seja um pouco mais claro na descrição do seu projeto.

Por exemplo, modular uma frequência (seja em Amplitude ou freqüência ) é uma sobreposição

de frequências e não uma simples variação da frequência portadora.

Qual a gama de frequências que você quer trabalhar no seu projeto?

Descreva como quer variar estas frequências. Usando um potenciômetro?

O Arduíno mega tem 32 ports digitais, e conforme seu sketch, podem sair ondas quadradas de todos ports

quase que simultaneamente, (diferenças de microsegundos).

Só mesmo descrevendo seu projeto com mais clareza poderemos ajuda-lo.

Uma boa pergunta gera uma boa resposta.

RV

Boa noite, 

Falta informação no seu tópico. Qual faixa de frequencia precisa ?

Veja esse expansor de portas PWM ( para frequencias até 1,6 KHz) 

16-Channel 12-bit PWM/Servo Driver - I2C interface - PCA9685

https://www.adafruit.com/product/815

No Mercado Livre :

Módulo I2c Para Servo Motor Pca9685 16 Canais Arduino

Mas só gera onda quadrada. 

Vamos lá.

Preciso fazer um dispositivo que terá como finalidade gerar som em vários falantes. Cada alto-falante deve produzir um som diferente. Os sons que  preciso tocar são frequências simples (entre 261 a 450 Hz (sete notas musicais da oitava natural). A amplitude da onda (volume) não é tão importante, mas ficaria extremamente feliz se você me disser como fazer isso de forma simples.

O grande problema é que preciso tocar esse som absolutamente simultaneamente em 30 portas diferentes. Até onde saiba, a família arduino não consegue (via função tone()... que é a que gera onda quadrada) não consegue executar em suas portas mais de um som. Você pode mandar gerar um tone novo, mas não pode mandar ele tocar numa segunda porta, pois o arduino não consegue fazer isso.

Entendo perfeitamente que o controlador trabalha com  uma única pilha de processamento... meu problema não é processar para gerar a frequência... é mantê-la tocando sem parar nas 30 portas. 

O que José Gustavo sugeriu pode até ser uma solução... há, no entanto, uma placa de expansão que possa ser específica para meu caso?

Bom dia CB.

já melhorou um pouco sua explicação do projeto.

Vou tentar escrever um sketch manipulando diretamente os registradores dos ports e

ver se consigo album sucesso.

Você tem uma lista  destas frequências que precisa. Não manjo nadinha de musica e escalas sonoras.

Só sei que em um tal de FA que tem uma frequência de 440 Hz. (Acho kkkk).

Controlar a amplitude via ports digitais é "quase" impossivel, mas pode usar um transistor em cada saída, e dai controlar a amplitude da saída.

Um detalhe, a saída será uma onda quadrada. 

Uma onda quadrada é uma somatória de  "n"  harmonicas de uma determinada frequência.

Uma onda quadrada é de 440 Hz, ele tem na sua composição frequencies de 880 Hz, 1600 Hz, 

3200 Hz, ........... etc.

RV

Fiz menção a onda quadrada, pois é a onda que o arduíno gera... não será ruim para meu projeto uma onda senoidal. Afinal, a forma da onda apenas dá o timbre... tipo assim... uma onda quadrada parece com um trompete e uma onda senoidal parece com uma flauta. 

As frequências são: 

Dó 260Hz
Ré 193Hz
Mi 329Hz
Fá 349Hz
Sol 391Hz
Lá 440Hz
Si 493Hz

Agradecerei muuuuuito esta ajuda!

Olha minha cara de felicidade:   =)

Boa tarde CB,

este sketch que estou anexando é a primeira tentativa.

As frequências você deve ajustar nas linhas   " unsigned long PERIOD17 = base * x;

sendo x um multiplicado que dará como saída a sua frequência.

Da forma que está agora no sketch a minima frequencia é 81,76 hz  e a máxima é  1611 Hz.

Você pode também modificar o valor em "  unsigned long base = 200;  ", mas o minimo será de 

150.

Pra que funcionasse com estes valores de frequências tive que modificar a biblioteca

usada por este sketch.

Segue também a biblioteca.

Abaixo a imagem que capturei rodando este sketch no Arduíno mega.

RV

Anexos

Minerin,

Kramba! Top! Farei todos  os testes, mas de ante mão... acredito que você acertou na mosca!

Desculpe a demora para responder, mas estou num momento muito conturbado do final de meu doutorado! No privado vou perguntar seus dados para fazer um agradecimento oficial na mina tese!

Assim que conseguir testar o código, na prática, eu respondo o resultado!

Vlw manooooooooo

Acredito que vc consiga fazer "na unha".

Na verdade até pouco tempo tudo era feito sem nenhuma biblioteca, agora tudo precisa ser feito com elas..  Não acho correto isso. O que as bilbiotecas não fazer o microcontrolador não faz ??? Um z80 dos anos 80 faria isso tranquilamente. Pq um Arduino não ? 

Não pensando em Hz mas sim em us (microsegundos).

Por ex. Para gerar 260Hz e 193Hz ao mesmo tempo vc precisa de 3846us e 5181us. como vc precisa de 2 momentos (sobe a onda e baixa a onda) vc precisa de metade disso de cada vez. 1923 e 2590 respectivamente.

Aih vc usaria vários contadores, no exemplo C1 e C2.

E faria um loop()

{ espera passar 1 us;

  incrementa C1;

  incrementa C2;

..... incrementa quantos aguentar.

  Verifica se C1 é maior que 1923. Se for { zera ele e inverte a saida S1 };

  Verifica se C2 é maior que 2590. Se for { zera ele e inverte a saida S2 };

}

Bem boladinho vc faz uma matriz de valores, uma de limites e com um for(;;) mata a questão.

Para melhor funcionamento vc pode em vez de esperar passar us usar uma variável do tipo usdecorridos.

Assim a cada loop se passarem 2us vc usa esse valor para somar. Na hora de zerar em vez de zerar vc subtrai a quantidade de um ciclo. Não sei se fui claro... Mas tente do jeito 1us de cada vez primeiro...

  Seu limite seria a capacidade de processamento, que pode ser multiplicada se vc trocar a placa.

  Veja essa, por ex:

https://store.arduino.cc/usa/teensy-3-2-usb-development-board

e esse:

https://store.arduino.cc/usa/arduino-due

Eduardo,

Você tem razão parcial. Criatividade é tudo. Porém, em alguns casos onde o projeto é muito importante é melhor pegar a experiência de alguém emprestada... assim eu entendo o uso de bibliotecas.

Por exemplo: eu sei bastante coisa teórica sobre ondas, mas na hora de implementar algo, por minha falta de experiência nesse tipo de implementação, é mais apropriado usar uma biblioteca. Naturalmente, com o passar do tempo, o implementador vai evoluindo e criando mais experiência e criticando a lib... nesse momento ele desenvolve tudo na raça.

Gostei muito do seu algoritmo. Garanto que também irei testar e relatar aqui.

Abraço mano.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço