Ayuda con proyecto sonido-servo

Hola, soy absolutamente nueva en el tema, estoy haciendo un trabajo para la universidad y necesito conectar un micrófono ambiental (de 12v) que cubre 25m cuadrados, a un servo MG995 para que el mismo se mueva en un rango de 0° a 90°. Estoy usando un Arduino UNO.
Ahora los problemas:
1)Cómo puedo conectar el micrófono a una entrada analógica? El micro tiene su propia fuente de alimentación separada del Arduino, pero por lo que leí no sirve mandarle el out directo de 12v a las entradas analógicas.
2)Hice el intento de amplificar un electret, pero al medir los valores con AnalogReadSerial los mismos no varían.
3) Escribí una programación basada en otra de un Vúmetro que encontré por ahí, pero no estoy segura de que vaya a funcionar (siempre y cuando solucione todo lo anterior); la dejo abajo por si algún alma copada le pega una mirada:

#include <Servo.h>

Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0; // variable to store the servo position

//Las variables que usaremos para el silencio

int Valor;

int Valor1;

int Valor2;

int Valor3;

int Valor4;

//Configuramos los pines y el serial para poder visualizar la entrada analogica

void setup (){

Serial.begin(9600);

myservo.attach(9); // attaches the servo on pin 9 to the servo object

}

void loop (){

//Leemos el valor

Valor = analogRead(A0);

//Transferimos los valores para saber cual era el estado anterior

Valor4 = Valor3;

Valor3 = Valor2;

Valor2 = Valor1;

Valor1 = Valor;

//Visualizamos los valores en Serial Monitor

Serial.print("Valor: ");

Serial.print(Valor);

Serial.print("\t Valor1: ");

Serial.print(Valor1);

Serial.print("\t Valor2: ");

Serial.print(Valor2);

Serial.print("\t Valor3: ");

Serial.print(Valor3);

Serial.print("\t Valor4: ");

Serial.println(Valor4);

//Condicionamos que si el programa lee 4 veces seguidas 0 que se apagen los leds, si no ponemos esto los leds parpadearan mucho

if (Valor1+Valor2+Valor3+Valor4==0){

myservo.write(pos);

}

//Encendemos los leds segun el valor de entrada. En este caso la salida de mi pc como mucho me llega a 400 asi que lo dividimos entre ocho leds.

else{

if (Valor>0){

for (pos = 0; pos <= 12; pos += 1); // goes from 0 degrees to 12 degrees
// in steps of 1 degree

}

else{

for (pos = 12; pos <= 0; pos += 1); // goes from 0 degrees to 12 degrees
// in steps of 1 degree

}

if (Valor>50){

for (pos = 12; pos <= 24; pos += 1); // goes from 0 degrees to 12 degrees
// in steps of 1 degree

}

else{

for (pos = 24; pos <= 12; pos += 1); // goes from 0 degrees to 12 degrees
// in steps of 1 degree

}

if (Valor>100){

for (pos = 24; pos <= 36; pos += 1); // goes from 0 degrees to 12 degrees
// in steps of 1 degree

}

else{

for (pos = 36; pos <= 24; pos += 1); // goes from 0 degrees to 12 degrees
// in steps of 1 degree

}

if (Valor>150){

for (pos = 36; pos <= 48; pos += 1); // goes from 0 degrees to 12 degrees
// in steps of 1 degree

}

else{

for (pos = 48; pos <= 36; pos += 1); // goes from 0 degrees to 12 degrees
// in steps of 1 degree

}

if (Valor>200){

for (pos = 48; pos <= 60; pos += 1); // goes from 0 degrees to 12 degrees
// in steps of 1 degree

}

else{

for (pos = 60; pos <= 48; pos += 1); // goes from 0 degrees to 12 degrees
// in steps of 1 degree

}

if (Valor>250){

for (pos = 60; pos <= 72; pos += 1); // goes from 0 degrees to 12 degrees
// in steps of 1 degree

}

else{

for (pos = 72; pos <= 60; pos += 1); // goes from 0 degrees to 12 degrees
// in steps of 1 degree

}

if (Valor>300){

for (pos = 72; pos <= 84; pos += 1); // goes from 0 degrees to 12 degrees
// in steps of 1 degree

}

else{

for (pos = 84; pos <= 72; pos += 1); // goes from 0 degrees to 12 degrees
// in steps of 1 degree

}

if (Valor>350){

for (pos = 84; pos <= 90; pos += 1); // goes from 0 degrees to 12 degrees
// in steps of 1 degree

}

else{

for (pos = 90; pos <= 84; pos += 1); // goes from 0 degrees to 12 degrees
// in steps of 1 degree
}
}
}

Bueno es la primera vez que intento escribir programación y meterme con estas cosas, así que agradezco profundamente cualquier ayuda. :slight_smile:

cmarcos:
1)Cómo puedo conectar el micrófono a una entrada analógica? El micro tiene su propia fuente de alimentación separada del Arduino, pero por lo que leí no sirve mandarle el out directo de 12v a las entradas analógicas.

Si dices que es una señal que oscila entre los 0 y 12v (con el silencio en los 6v), entonces basta con colocar un divisor de voltaje, que reduzca el voltaje máximo a 5v.
Si la oscilación involucra voltaje negativo, tendrías que hacer un "DC bias"; el cual se logra sumándole a la señal, un voltaje DC constante.

cmarcos:
2)Hice el intento de amplificar un electret, pero al medir los valores con AnalogReadSerial los mismos no varían.

Suena más a problema de hardware que otra cosa. Posibles causas:

  • No unificar tierra.
  • Ganancia insuficiente en el amplificador.
  • Polaridad incorrecta en el micrófono.
  • Daño o ausencia del capacitor (condensador) requerido para micrófonos de ese tipo.
  • Ausencia de resistencia "pull-down" (al menos 20k) que elimine cualquier ruido causado por excesiva impedancia.

Es extraño porque el ADC incluso apenas da para detectar los pocos milivoltios de oscilación que genera el micrófono por sí solo...

Respecto al código, creo que se vería mejor así:

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

void setup() {
  myservo.attach(9);
}

void loop() {
  myservo.write(map(analogRead(A0), 0, 1023, 0, 90));
  // Mueve el servo en proporción al nivel de voltaje que recibe (entre 0V y 5V)
}

Primero que nada, gracias por la respuesta :slight_smile: Y la simplificación del código.
El micrófono es este http://articulo.mercadolibre.com.ar/MLA-627476329-microfono-ambiental-para-camaras-de-seguridad-cctv-mic100-_JM; lo que no entiendo es: si conecto la alimentación del micro a la corriente. Me queda el pin OUT. El mismo puedo unirlo con este circuito: ???? Debería poner tierra en común con el arduino y la fuente de 12?

Con este esquema lo he solucionado! Lo que sí con la programación más sencilla el motor vibra demasiado, así que debo escribirla en rangos para limpiar el movimiento.

Según el diagrama que acabas de colocar:

Vin -> salida de señal del micrófono.
Vout -> entrada analógica A0
GND (punto 3) -> tierra

Lo que me tiene confundido es que dice que la salida de señal es de 2-5v.
2 es el voltaje más bajo posible? O es el voltaje "silencio"?