collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

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

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

Offline helderjsd

  • Mini Robot
  • *
  • Mensagens: 149
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.733
  • 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: 149
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: 149
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.733
  • 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: 149
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.733
  • 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

Online dropes

  • Mini Robot
  • *
  • Mensagens: 2.189
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: 149
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.598
    • 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: 149
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