Show Posts
Pages: 1 ... 108 109 [110] 111 112 ... 208
1636  Using Arduino / Programming Questions / Re: Source code of standard fonction on: October 02, 2012, 05:52:06 am
On my computer it's:

C:\Users\bubulindo\Documents\arduino-1.0.1\hardware\arduino\cores
And
C:\Users\bubulindo\Documents\arduino-1.0.1\llibraries

1637  Using Arduino / Programming Questions / Re: Reading signal frequency on: October 02, 2012, 05:49:12 am
What are the intervals for frequencies do you use?

Try this:

Code:
#include <FreqMeasure.h>

void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(14400);
  FreqMeasure.begin();
}/*--(end setup )---*/

double sum=0;
int count=0;

void loop() {
  if (FreqMeasure.available()) {
    // average several reading together
    sum = sum + FreqMeasure.read();
    count = count + 1;
    if (count > 30) {
      double frequency = F_CPU / (sum / count);

      unsigned long speeding = (frequency*0.3)/2; // calculate speed
      Serial.print("Freq:");
      Serial.print(frequency);
      Serial.print("       ");
      delay(5000);
      sum = 0;
      count = 0;
    }
  }

}

1638  International / Portugues / Re: Enviar dado com o SoftwareSerial.h on: October 01, 2012, 03:33:08 pm
ligaste o pino 2 ao 3??

a funcao mySerial.write, retorna 1. é isso que vês no serial monitor.
que pretendes fazer aí???
1639  International / Portugues / Re: encerrar programa on: October 01, 2012, 12:01:34 pm
Aqui não existe o conceito de parar o programa.

Existe o conceito do programa fazer algo para responder a um evento.

No teu caso...

Code:

void programa_que_funciona_muito_bem(void) {};

void setup(){}

unsigned char flag = 0;
void loop(){

if (botao_apertado == TRUE && flag == 0) {
    programa_que_funciona_muito_bem();
    flag = 1;
}

if (botao_apertado == FALSE) {
    flag = 0;
}
}

Quando apertas o botão, ele corre a funcao programa_que_funciona_muito_bem() uma vez. Quando soltas o botão, o Arduino fica pronto a correr de novo a funcão quando carregares no botão de novo.
1640  International / Portugues / Re: [Ajuda] Problema ao ligar arduino no carro com bateria 12v, LCD 16x2 fica maluco on: October 01, 2012, 11:57:49 am
Por favor, isto é um fórum aberto e de borla.

Não custa nada abrir um post só para o teu problema. Ninguém vai ficar chateado. smiley-wink

Aproveita e coloca o esquema ou umas fotos do sistema.
1641  Using Arduino / Programming Questions / Re: RGB Led according to temperature on: September 30, 2012, 11:53:47 am
smiley
1642  Using Arduino / Programming Questions / Re: RGB Led according to temperature on: September 30, 2012, 11:14:11 am
Same applies...

Why don't you adjust the temperature to the PWM directly?

Code:
map(temp, green_low, green_high, 0, 255); //or some other PWM values that do what you want...

Ok, do this:

Code:

for (long temp=0; temp <100; temp++) {
  int blue = 255 - (map(temp, 31, 0, 0, 63) * 4);
  int green = 255 - (map(temp, 34, 26, 0, 100) * 2);
  int red = 255 - (map(temp, 50, 31, 0, 63) * 4);
Serial.print("blue ");
Serial.println(blue);
Serial.print("green ");
Serial.println(green);
Serial.print("red ");
Serial.println(red);

What do you see?
1643  Using Arduino / Programming Questions / Re: RGB Led according to temperature on: September 30, 2012, 10:53:18 am
This was on the arduino website

Quote
For the mathematically inclined, here's the whole function
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Judging by your calls to map, the result may not be what you wanted. shouldn't it be like this?

Code:
  int blue = 255 - (map(temp, 0,31, 0, 63) * 4);
  int green = 255 - (map(temp, 26, 34, 0, 100) * 2);
  int red = 255 - (map(temp, 31,50, 0, 63) * 4);
Also, imagine the temperature is 20. your green will be -175. Which, converted to unsigned char to write in the PWM register will be a bit different than what you expect.

Why don't you adjust the temperature to the PWM directly?

Code:
map(temp, green_low, green_high, 0, 255); //or some other PWM values that do what you want...

1644  International / Portugues / Re: Ajuda com serial.read e float on: September 29, 2012, 11:19:35 pm
Ja agora lendo este post e se desejar mos ao contrario, passar de float para string, existe alguma funçao com isso?

Ftoa().

Mas essa não já depende do compilador
1645  International / Portugues / Re: Geração de acorde on: September 29, 2012, 11:45:10 am
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. smiley-wink
1646  International / Portugues / Re: Geração de acorde on: September 29, 2012, 09:34:09 am
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. smiley-wink

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. smiley 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. smiley-wink
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á. smiley-sad
1647  Using Arduino / Microcontrollers / Re: 8MHz internal oscillator: success! on: September 29, 2012, 03:42:14 am
I used it before on an ATmega8 with heavy serial port needs... No problems whatsoever. This was almost ten years ago too, not sure if the internal oscillator in AVRs has changed much lately.

You can now use the oscillator pins as a RTC and save the external chip.
I'm testing it out on an old ATmega16, and maybe create a library if it works out ok.

Good work.
1648  International / Portugues / Re: Geração de acorde on: September 28, 2012, 11:51:03 pm
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?
1649  International / Portugues / Re: Geração de acorde on: September 28, 2012, 12:15:00 pm
eu já tinha visto esses gráficos e fico sempre com a mesma duvida...

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?

mas faz assim, encontra um denominador comum nas notas todas que queres, tipo 100 ms ou 20 ms. divide o periodo da onda por esse valor.
cria uma interrupção temporizada com os tais ms, e vai gerando as notas e o resultado assim.

eu meto já um exemplo.


Code:


ISR(timer1 ou 2) {


}

//também podes fazer

#define DO 0
#define RE 1
#define MI 2
//...


const unsigned char periodos [] = {10,20,30,40,50,60,70, 80};//na realidade, meios períodos... isto terias de fazer a matemática. É só um exemplo.
unsigned char onda[8];
unsigned char saidas = 0;
unsigned int tempo = 0;

ISR(timer) { //imaginemos de 10 em 10 ms
unsigned char i;
tempo++; //incrementa o tempo

for (i=0; i<=7; i++ ){ //para as oito notas
    if (tempo % periodos[i] == 0) {
    togBit(saidas, i); // depois o bit i da variavel saidas corresponde à nota com indice i    tens de usar aquelas macros uqe postei para isto.
    }
}
//isto vai-te dar o estado das várias notas actualizado de x em x tempo (depende de como activares o timer)

loop() {

//imagina que queres do + mi

if ( testBit(saidas, DO) + testBit(saidas, MI))  //podes e deves trocar o mais por || ("ou" lógico, mas fica mais simples de compreender assim talvez. )
    SetBit (PORTO, PINO_DO_PWM);
else
    ClrBit(PORTO, PINO_DO_PWM);
}

}
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.
1650  International / Portugues / Re: Geração de acorde on: September 28, 2012, 12:30:56 am
Ok...

Assim de repente, o que precisas de entender é:

PWM não vai gerar som. Ou melhor, vai, mas não o som que tu pretendes. O PWM, no entanto, serve para gerar tensões de diferentes níveis, que por sua vez indicam diferentes sons. Se reparares, o PWM é uma onda quadrada, o teu instrumento musical tem senóides (ou sinusóides no dialecto de Portugal).

A série de Fourier indica que a senóide é a onda fundamental, enquanto que qualquer onda quadrada é a soma de várias senóides, logo uma onda quadrada já tem lá várias frequências que tu não queres ouvir (se é que consegues por causa da frequência).

Logo o primeiro passo é gerar um PWM com a maior frequência que puderes, e depois gerares um código que gera uma senóide com esse PWM.

Podes ver isso com a fórmula que o neuron deixou " A sen (2 pi f t)".
Esquece o A, porque neste mundinho não vamos precisar de amplitude. Então, de x em x tempo (t), calculas com aquela fórmula qual o valor que vais meter no circuito de PWM.

Tendo isto, e indo de volta à matemática, tens de ver como calcular (nota, usa inteiros, de preferência pequenos tipo unsigned char) a soma das sinusóides que geram os acordes que pretendes.

Fez algum sentido?

Neste momento, a tua dúvida é "Para que serve então o PWM??".

Ok, o PWM é apenas a forma que os dispositivos digitais têm de criar sinais analógicos (como aqueles que queres ouvir), logo é apenas isso que ele vai estar a fazer... a aproximar a saída digital a uma analógica.

Outra maneira, talvez mais simples, seria usando um amplificador (não no sentido que conheces a palavra amplificador) mas numa montagem somadora. Assim poderias gerar duas senóides dentro do arduino com PWM e enviar isso para o amplificador que somaria as duas ondas.

Não tenho mesmo tempo para me dedicar a isto, o que é uma pena, mas esta é a melhor explicacão que consigo dar agora.

http://elektron.no.sapo.pt/ampop1.htm
http://www.ufrgs.br/eng04030/aulas/teoria/cap_15/circampo.htm
http://www.newtoncbraga.com.br/index.php/matematica-para-eletronica/636-somador-com-amplificador-operacional-m023.html

Nota que o amp-op pode criar distorcões no som que geras... tudo depende da resposta em frequência do mesmo. smiley-wink

Edit:

Aqui tem outra explicacão.

http://www.ecircuitcenter.com/circuits/opsum/opsum.htm
Pages: 1 ... 108 109 [110] 111 112 ... 208