Go Down

Topic: Geração de acorde (Read 8 times) previous topic - next topic

bubulindo


Bubulindo - Excelente pergunta. "o que significa o estado do meio? tu tens pwm on, pwm off e a linha para no meio... como defines isso? e como adaptas isso a um sistema que só tem dois estados? ", acho que eu sei te explicar o que ocorre.

A subida e descida da linha simbolizam a amplitude, que nós não temos controle no Arduino com pulsos PWM, correto? Mas a linha do meio significa que a Amplitude é 0. A linha do meio então pode ser simulada com PWM off, já que não tem amplitude e não gera som, um problema fácil de solucionar.

Mas, se notar no gráfico de somatória de 3 notas (outro post), irá ver que aparecem degraus acima da linha do meio, teoricamente deve haver uma variação na amplitude para obter o efeito desejado. Neste caso além de gerar os pulsos eu acredito que deva ser controlada a voltagem para simular um aumento e a diminuição da amplitude do pulso, a grosso modo o volume do som, o que acredito não ser possível no Arduino utilizando apenas o hardware da placa.
Quote


A amplitude é precisamente o que tu controlas com o PWM. Variando o PWM consegues amplitudes entre 0 e 5 (a tua linha do meio seria 2,5V). Mas depois precisarias de mais lógica para criar a tua onda quadrada ou sinusóidal (como expliquei no post atrás). Se não quiseres controlar amplitude, podes usar o código que postei lá atrás.

Estás a compreender agora o PWM? A sua principal utilizacão é normalmente simular amplitudes diferentes usando apenas sinais digitais.


Pelo que notei a grande diferença da onda senoidal é que para atingir o estado On/Off do PWM a amplitude é diminuída gradualmente até o ponto Off e retorna da mesma forma, isso produz um som mais limpo, como um "tuuuuuuuu" e não os "trutrutrutrutru" de uma onda quadrada.

"O problema é que 1/440 dá uns 2 milissegundos... e o arduino talvez não seja tão potente assim. É caso de ver se consegues gerar uma nota com este método. "

Sobre o texto acima é justamente o que eu imaginei, não sei se o hardware é tão rápido para conseguir executar o pulso, pois ele seria extremamente rápido. Mas o outro desafio é alterar a voltagem do pulso e não liberar sempre os 5V.


O microcontrolador corre a 16MHz... isso dá 6,25 * 10^-8. Eu acho que o chip do Arduino consegue cumprir os 2ms, mas o código não deve usar bibliotecas do Arduino (porque são feitas para o pior caso e normalmente duplicam o tempo de ciclo) e tem de ser feito com cuidado... usar registos se possível para algumas tarefas, etc, etc...

Poder variar a amplitude, por exemplo, iria ser um programa complexo de fazer devido a alguma da matemática e ciclos envolvidos... claro que com algumas práticas de programacão a coisa chegava lá.

Qual é o interesse em fazer isto?
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

spiderpoison

Bubulindo - Essa equação complicada que define a amplitude em relação a linha do tempo é justamente a Série de Fourier, que precisa ser adaptada para realizar a somatória das ondas quadradas, através dela em momento X e Y da onda. Mas o processo para portar isso para o Arduino é justamente o que falou, uma matemática extremamente complicada, ao menos para mim. Acredito que eu terei que estudar muito mais tempo para dominar o assunto e fazer o programa sem usar as bibliotecas do Arduino.

Bom, vamos a utilidade do projeto. De inicio digo que sinto uma vontade incontrolável de aprender, então, eu gosto dos desafios mais difíceis que eu posso encontrar, e notei que gerar um acorde só com o arduino seria "o desafio". mas eu também sou músico e a um tempo montei um programa para treinar o ouvido e fazer com que as pessoas desenvolvam um ouvido absoluto, só que este programa gera apenas notas.

A ideia é um programa que treine tanto a capacidade dos músicos aprenderem a reconhecer notas e acordes. Programas assim já existem aos montes para celular e computador, mas, o custo para músicos que ganham uma miséria aqui no Brasil são muito altos.

Com o Arduino eu consegui reduzir o custo do meu projeto a uns 10 dólares, sendo assim qualquer músico interessado pode ter um.

Abaixando o custo eu também pretendo implantar o projeto em algumas escolas de música que trabalham com pessoas carentes aqui na minha cidade, por isso o custo é extremamente importante.


bubulindo


Bubulindo - Essa equação complicada que define a amplitude em relação a linha do tempo é justamente a Série de Fourier, que precisa ser adaptada para realizar a somatória das ondas quadradas, através dela em momento X e Y da onda. Mas o processo para portar isso para o Arduino é justamente o que falou, uma matemática extremamente complicada, ao menos para mim. Acredito que eu terei que estudar muito mais tempo para dominar o assunto e fazer o programa sem usar as bibliotecas do Arduino.


Não. Acho que entendeste mal. A série de Fourier explica como decompor uma onda em ondas sinusóidais que, quando somadas, originam a onda original com maior ou menor qualidade mediante o número de harmónicos que somares.
Isto é tudo muito bonito, mas o que te interessa aqui é o pormenor de somar as ondas.
E para isso não precisas de muita matemática. ;)

Eu, como disse atrás, não tenho mesmo tempo para isto, mas vou tentar arranjar um exemplo nos meus ficheiros lá em casa que use temporizacões. Ainda não tenho a certeza se não conseguirás criar isto com o motor de PWM no Arduino... mas acho que sim. Quando puder vejo e meto aqui.


Bom, vamos a utilidade do projeto. De inicio digo que sinto uma vontade incontrolável de aprender, então, eu gosto dos desafios mais difíceis que eu posso encontrar, e notei que gerar um acorde só com o arduino seria "o desafio". mas eu também sou músico e a um tempo montei um programa para treinar o ouvido e fazer com que as pessoas desenvolvam um ouvido absoluto, só que este programa gera apenas notas.

Isso fazes bem. Aprender é útil, quanto mais não seja para falar em festas. :) lol


A ideia é um programa que treine tanto a capacidade dos músicos aprenderem a reconhecer notas e acordes. Programas assim já existem aos montes para celular e computador, mas, o custo para músicos que ganham uma miséria aqui no Brasil são muito altos.


Se vocês mandassem a música boa que têm para fora do Brasil, talvez não fosse tão mau assim. ;)
Estou a falar porque em Portugal parece que ninguém conhece os bons músicos Brasileiros. Só os que não conseguem vender no Brasil é que vão para lá. :(
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

neuron_upheaval

#38
Sep 29, 2012, 05:21 pm Last Edit: Sep 29, 2012, 05:31 pm by neuron_upheaval Reason: 1

Bubulindo - Eu consegui sim entender como funciona o PWM e como ele é utilizado para geração de som.
Sei que  o Arduino fica ligando e desligando a porta 440 vezes por segundo para gerar uma nota Lá.

Não; o Arduino não fica ligando e desligando a porta PWM 440 vezes por segundo; a frequência do PWM está próxima aos 500 Hz:

http://www.arduino.cc/en/Tutorial/PWM
Quote

In other words, with Arduino's PWM frequency at about 500Hz, the green lines would measure 2 milliseconds each. A call to analogWrite() is on a scale of 0 - 255, such that analogWrite(255) requests a 100% duty cycle (always on), and analogWrite(127) is a 50% duty cycle (on half the time) for example.


O PWM não serve para gerar os pulsos na frequência que você quer; ele gera, isso sim, um sinal na amplitude que você deseja. A frequência do PWM é fixa, e o que muda é a largura do pulso. Por isso que é chamada de PWM: Pulse Width Modulation, modulação por largura de pulso.

Se você quer que o pulso tenha uma certa frequência, você tem que usar, da forma que bubulindo explicou, um timer e uma interrupção do microcontrolador, caso queira que o seu programa funcione em modo assíncrono, ou usar a forma que eu indiquei no post #9, que é síncrona, isto é, não usa interrupções para fabricar os pulsos.

bubulindo


Se você quer que o pulso tenha uma certa frequência, você tem que usar, da forma que bubulindo explicou, um timer e uma interrupção do microcontrolador, caso queira que o seu programa funcione em modo assíncrono, ou usar a forma que eu indiquei no post #9, que é síncrona, isto é, não usa interrupções para fabricar os pulsos.


Desculpa a correccão... mas o Arduino pode variar a frequência do PWM. A libraria base, não... mas com um pouco de conhecimento de microcontroladores é fácil de o fazer. Vê o modo CTC. ;)
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Go Up