jueves, 26 de diciembre de 2013

Captando sonido con arduino

Hace algún tiempo compré en ebay una pequeña placa para capturar sonido con arduino de la cual no había hecho uso hasta la fecha. La placa que respondía según el vendedor al nombre de "Analog Sound Sensor Microphone MIC Controller For Arduino" consiste básicamente en un micrófono de tipo "electret", un chip LM393 que actúa como pequeño amplificador, algún que otro componente pasivo y un par de leds, uno para mostrar que la placa está recibiendo alimentación y otro para mostrar que capta algún sonido.

La placa en cuestión la adquirí por 4,66 euros, dispone como puede verse en la imagen inferior de cuatro pines: alimentación, tierra, A0 que permite leer e introducir en el ADC de la placa arduino la señal captada por el micrófono y D0, pin incógnita hasta el día de hoy. Como siempre, ni que decir tiene, toda aportación que arroje algo de luz sobre este último punto será bienvenida.



Una vez realizada las conexiones con la placa arduino, procedí a cargar el siguiente sketch que envía por el puerto serie los valores que se leen desde el micrófono de esta placa hacia nuestro arduino:

const int analogInPin = A0; 
 

int sensorValue = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  sensorValue = analogRead(analogInPin);           
  Serial.print(sensorValue);
  Serial.print('\n');  
  delay(2); // El delay es para dar tiempo a la conversión del ADC antes de la siguiente lectura          
}


Una vez hecho lo anterior, procedí a cargar el siguiente programa en processing disponible en la propia página oficial de arduino, aunque no me acuerdo exactamente dónde:

import processing.serial.*;

Serial myPort;        // El puerto serie
int xPos = 1;         // posición horizontal del gráfico

void setup () {
  // establece el tamaño de la ventana:
  size(800, 600);       

  // lista los puertos serie disponibles
  println(Serial.list());
  // Sé que el primer puerto serie de la lista en mi mac
  // es siempre mi Arduino, así que abro Serial.list()[0].
  // Abre el puerto que estás usando.
  myPort = new Serial(this, Serial.list()[0], 9600);
  // no genera un serialEvent() a menos que reciba un caracter de salto de linea:
  myPort.bufferUntil('\n');
  // Establece el fondo inicial:
  background(0);
}
void draw () {
  // todo se hace en serialEvent()
}

void serialEvent (Serial myPort) {
  // recoge la cadena ASCII:
  String inString = myPort.readStringUntil('\n');

  if (inString != null) {
    // elimina cualquier espacio en blanco:
    inString = trim(inString);
    // convierte a entero y mapea al alto de la pantalla:
    float inByte = float(inString);
    inByte = map(inByte, 0, 1023, 0, height);
    // traza la linea:
    stroke(127,34,255);
    line(xPos, height, xPos, height - (2*inByte));

    // en el borde de la pantalla, vuelve al principio:
    if (xPos >= width) {
      xPos = 0;
      background(0);
    }
    else {
      // incrementa la posición horizontal:
      xPos++;
    }
  }
}


Al ejecutarse se obtiene una representación gráfica de los valores leidos a través del puerto de entrada A0, tal y como puede verse en la siguiente imagen.



Llegados hasta aquí surge inevitablemente la siguiente pregunta: ¿sería posible captar y almacenar sonido, para luego reproducirlo con un mínimo de calidad utilizando únicamente este hardware tan básico?

La respuesta, que no la tengo en estos momentos, espero pueda proporcionarla en próximas entradas.

No hay comentarios:

Publicar un comentario