Megafonino

Introducción

Nuestro proyecto se basa en implementar el funcionamiento clásico de un megáfono añadiendo algunas mejoras, como un pulsador para grabar y un vúmetro compuesto por tres leds que indica el volumen con el que nos dirigimos al micrófono.

Tratamiento de audio

Para que la reproducción del sonido captado sea claro. Tenemos una frecuencia de muestreo de 8000Hz, lo que significa que debemos obtener una muestra de audio cada 125µs.

1 / 8000Hz = 125µs

Aunque técnicamente esa frecuencia de muestreo puede ser mejorada a 10000Hz, ya que analogRead() es capaz de leer cada 100µs, en la práctica real no se ha podido llegar a dicho valor.

Problemas encontrados

Frecuencia de voz

La voz del ser humano tiene una frecuencia de voz muy baja, en un rango de 200Hz a 3000Hz, esto supone que cada vez que queríamos captar nuestra propia voz y reproducirla, obteníamos un audio carente de sentido. Este hecho, nos hizo darnos cuenta de la necesidad de amplificar la señal captada. Como primera opción, nos decantamos por implementar de manera rudimentaria un circuito compuesto por varias resistencias y un transistor.

Tras realizar distintas pruebas y no conseguir ningún resultado óptimo, nos deshicimos de esta idea. Pasamos a una segunda opción, que fue la adquisición de un amplificador comercial, que además contenía filtros de ruido. La incorporación de dicho componente más el preamplificardor que contenía el micrófono hizo que empezaramos a conseguir el efecto deseado.

Manipulación audio

La placa Arduino contiene un analog-to-digital converter (ADC) de 10 bits y un digital-to-analog converter (DAC) de 8 bits. Esto supone, que en los procesos de captación, manipulación y reproducción el audio, perdemos 2 bits, y en consecuencia, perdemos calidad de audio. Para solventar dicho problema, tenemos que recurrir al mapeo de la señal.

Código

#include <TimerOne.h>
#include <SPI.h>

#define MICROPHONE A0
#define SPEAKER A3
#define BUTTON 13
#define AUDIO_TIMING 125 // 8,000 hz

int led[3] = {11, 10, 9};

void setup() {
 pinMode(7, INPUT);

 Timer1.initialize(125);
 Timer1.attachInterrupt(play); 
}

void loop() {
}

void play(void) {
  if(digitalRead(BUTTON) == HIGH) {
    digitalWrite(2, HIGH);
    int value = analogRead(A0);
    analogWrite(A3,value);
    int level = map(value, 350, 675, 0, 2);
    for (int i = 0; i < 3; i++) {
      if (i <= level && value > 350) {
        digitalWrite(led[i], HIGH); 
      } else {
        digitalWrite(led[i], LOW);
      }    
    }
  } else {
    digitalWrite(2, LOW);
    for(int i = 0; i < 3; i++) {
      digitalWrite(led[i], LOW);
    }
  }
}

Generamos una interrupción por software cada 125µs y saltamos a la rutina de interrupción. Si el botón está presionado, captamos una muestra de audio, la tratamos y además mapeamos dicha señal para saber cuantos led encender. En el caso anterior, mantendremos los led y el micrófono apagado.

Presupuesto

  • Placa Arduino UNO
  • Protoboard
  • Jumpers
  • Micrófono Electret 8,99€
  • Amplificador PAM8302 6,99€
  • Interruptor
  • Cuatro diodos

El coste total de dicho proyecto es de 15,98€

Vídeo demostración

También te podría gustar...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *