collapse

* Links de Robótica

* Posts Recentes

Ajuda Projecto IR / RF por Njay
[Hoje às 00:03]


Recomendação de um opamp para um DAC r2r por jm_araujo
[Ontem às 23:05]


Ideias para construir um quadrúpede simples por dropes
[Ontem às 22:43]


Ajuda com TRIAC por senso
[17 de Novembro de 2017, 18:00]


TV LG White Screen por almamater
[15 de Novembro de 2017, 08:37]


Pergunta sobre prototipagem ( Pesquisa ) por luisjustin
[14 de Novembro de 2017, 23:22]


Medir Agua que está no Poço por Njay
[14 de Novembro de 2017, 13:28]


Amplificador audio por beirao
[12 de Novembro de 2017, 23:43]


Power_OK Enermax por edeweld
[12 de Novembro de 2017, 17:15]


Driver motor por beirao
[11 de Novembro de 2017, 17:40]

Autor Tópico: Identificar som  (Lida 3086 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline helderjsd

  • Mini Robot
  • *
  • Mensagens: 140
Identificar som
« em: 11 de Outubro de 2013, 22:03 »
Boas. Tenho uma idéia que queria fazer com um arduino mas não estou a ver como lá chegar.
Destina-se ao geocaching e seria um detector de frequência sonora.
A idéia seria colocar o arduino com um microfone e o jogador ao tocar uma determinada nota de um xilofone o aruino atendia um led verde ou vermelho. Alguém tem sugestões para ligar o micro ao arduino? Abraço

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.401
  • Helpdesk do sitio
Re: Identificar som
« Responder #1 em: 11 de Outubro de 2013, 22:11 »
Vamos fazer uma de rádio Cidade FM, a keyword da noite é:
arduino electret microphone circuit

Para distinguir frequências terás de usar FFT, tens código em C para arduino, algo lento, e tens a biblioteca do Elm-chan, keywords:
elm chan fft
arduino fft
Avr fanboy

Offline helderjsd

  • Mini Robot
  • *
  • Mensagens: 140
Re: Identificar som
« Responder #2 em: 11 de Outubro de 2013, 23:56 »
Ha granda Senso.. Es um espectaculo :) :) :)

Muito obrigado, vou ja começar a ler com fartura :)

Offline helderjsd

  • Mini Robot
  • *
  • Mensagens: 140
Re: Identificar som
« Responder #3 em: 12 de Outubro de 2013, 00:17 »
So uma pergunta "estupida"...

Vi que toda a gente usa este microphone: https://www.sparkfun.com/products/9964

Sera que consigo para testar usar um simples, daqueles que se ligam ao PC com "jack" e se compram nas lojas dos chineses?

Ou não vou conseguir?

Abraço

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.401
  • Helpdesk do sitio
Re: Identificar som
« Responder #4 em: 12 de Outubro de 2013, 00:39 »
Sim, se o desmontares tens o mesmo lá dentro, muda o preço, que a Sparkfun sempre gostou de carregar nos preços..
Avr fanboy

Offline helderjsd

  • Mini Robot
  • *
  • Mensagens: 140
Re: Identificar som
« Responder #5 em: 14 de Outubro de 2013, 10:10 »
Boas,

Ontem fui aos chineses 4 vezes e comprei 6 microfones diferentes, em varias lojas..

Todos eles so tinham 2 fios. looooool. Fiquei a mesma sem solução, tendo de aguardar que a compra venha da sparkfun...

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.401
  • Helpdesk do sitio
Re: Identificar som
« Responder #6 em: 14 de Outubro de 2013, 10:37 »
O microfone da Sparkfun tambem só tem 2 fios..
Tem é um op-amp a dar-lhe ganho, por isso é que a pcb tem 3 pinos, abre o esquema deles e copia numa placa branca..
« Última modificação: 14 de Outubro de 2013, 10:48 por senso »
Avr fanboy

Offline dropes

  • Mini Robot
  • *
  • Mensagens: 1.930
Re: Identificar som
« Responder #7 em: 14 de Outubro de 2013, 11:41 »
Se o único problema é o ganho, basta um transístor para o fazer :


Offline helderjsd

  • Mini Robot
  • *
  • Mensagens: 140
Re: Identificar som
« Responder #8 em: 28 de Novembro de 2013, 09:22 »
Ola a todos,

Hoje finalmente chegou um sound detector do ebay, e tentei implementar isto.
Ou seja, o que pretendo é detectar a "frequencia" de um som tocado para criar algun senigmas.

No entanto, usei alguns exemplo se nenhum funciona.
O do cookbook não dá nada de jeito, e aquelas contas embora so atrapalhem, esmifrando o codigo obtenho sempre as mesmas leituras.

Outros exemplos, ele parece que detecta o "volume" do dom e nao a frequencia.
Alguem sabe como posso determinar a frequencia?
Ou seja, basicamente preciso de saber se um so mpre-estabelecido foi ou não tocado (com uma flauta ou xilofone) para activar um dispositivo

Codigo do cookbook
Código: [Seleccione]
const int ledPin = 13;            //the code will flash the LED in pin 13
const int middleValue = 512;      //the middle of the range of analog values
const int numberOfSamples = 128;  //how many readings will be taken each time

int sample;                       //the value read from microphone each time
long signal;                      //the reading once you have removed DC offset
long averageReading;              //the average of that loop of readings

long runningAverage=0;          //the running average of calculated values
const int averagedOver= 16;     //how quickly new values affect running average
                                //bigger numbers mean slower

const int threshold=400;        //at what level the light turns on

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  long sumOfSquares = 0;
  for (int i=0; i<numberOfSamples; i++) { //take many readings and average them
    sample = analogRead(0);               //take a reading
    signal = (sample - middleValue);      //work out its offset from the center
    signal *= signal;                     //square it to make all values positive
    sumOfSquares += signal;               //add to the total
  }
  averageReading = sumOfSquares/numberOfSamples;     //calculate running average
  runningAverage=(((averagedOver-1)*runningAverage)+averageReading)/averagedOver;

  if (runningAverage>threshold){         //is average more than the threshold ?
    digitalWrite(ledPin, HIGH);          //if it is turn on the LED
  }else{
    digitalWrite(ledPin, LOW);           //if it isn't turn the LED off
  }
  Serial.println(runningAverage);        //print the value so you can check it
}

Outros exemplos testados:
Código: [Seleccione]
int sensorPin = 2; 
int YellowLED = 1;
int RedLED = 4;
int sensorValue = 0;

void setup() {
  pinMode(YellowLED, OUTPUT);
pinMode(RedLED, OUTPUT);
Serial.begin(9600);
}

void loop() {
  sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);

/* If you feel that the sensor values on the serial monitor
are going by too quickly for you to read, you can make it
so that the values only show up on the serial monitor
if you make a noise.  You can replace
Serial.println(sensorValue);
  with:
if (sensorValue < 509){
   Serial.println(sensorValue);
}

*/

  digitalWrite(YellowLED, HIGH);  //Yellow is always on.

  if (sensorValue>25){  //The 'silence' sensor value is 509-511
    digitalWrite(RedLED,HIGH);
    delay(15 );            // The red LEDs stay on for 2 seconds
} else {
    digitalWrite(RedLED,LOW);
}
}

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.139
    • Tróniquices
Re: Identificar som
« Responder #9 em: 28 de Novembro de 2013, 12:52 »
O 1º exemplo que aí tens só mede a energia do canal (a "energia RMS", para ser mais exacto).

Se sabes que frequência procuras, podes usar o algoritmo de Goertzel (a wikipedia tem pseudo-código).

Se estás à procura de "um pico" de potência numa frequência mas não sabes que frequência é, então tens que aplicar um FFT (mais complexo que o algoritmo de Goertzel; tb deve haver código por aí).

O algoritmo de Goertzel é usado por exemplo no asterisk para detecção de DTMF, e o código dessa parte está no dominio público se bem me lembro, mas é um módulo mais complexo do que aquilo com que tu és capaz de lidar e do que precisas, pelo que me parece mais simples ires à wikipedia e tentares passar o pseudo-código que lá está para o c/c++ do arduino. Ou então procura por aí outra implementação que deve haver, não vais é aprender nada.

Offline helderjsd

  • Mini Robot
  • *
  • Mensagens: 140
Re: Identificar som
« Responder #10 em: 28 de Novembro de 2013, 15:52 »
Ol aNjay,

A finalidade disto consiste em criar um puzzle, que so "abre" tocando a sequencia certa com uma flauta.
Eu sei exactamente que frequencias procuro, so nao sei como as detectar no arduino, que me da sempre valores "parvos"

Vou entao procurar o que disseste