El vúmetro es un dispositivo indicador en equipos de audio para mostrar el nivel de señal en unidades de volumen, también es llamado “indicador del volumen”.

Consta de un instrumento de bobina móvil o galvanómetro con una balística (amortiguamiento) determinada, alimentado por medio de un rectificador de onda completa que se conecta a la línea de audio mediante una resistencia en serie. No necesita más fuente de energía para su funcionamiento que la señal de entrada. Esencialmente permite visualizar las variaciones de la tensión en la señal de audio, rectificándola y obteniendo el valor medio. Este se obtiene por la balística del instrumento usado, no por una integración capacitiva. Lo que exige que el galvanómetro de un vúmetro no sea fabricado igual que otros tipos de medidores eléctricos (como los amperímetros, voltímetros, etc.) para conformar el estándar SVI (Standard Volume Indicator).

El vúmetro no fue diseñado para medir explícitamente la tensión de la señal, sino para que los usuarios tuvieran una referencia u objetivo de 0 VU, identificado como el 100% o 0 decibelios, en telefonía y en la modulación de los transmisores de la época, por lo que no era muy importante que el dispositivo no fuera extremadamente lineal o preciso para bajos niveles. En efecto, la escala de -20 VU a +3 VU, con 0 VU al 70% de la escala, fue limitado por la tecnología de la época. La mitad superior de la escala solo cubre 6 dB, permitiendo ajustar con precisión solo los niveles alrededor de 0 VU.

Se ha reemplazado en muchos equipos el tradicional vúmetro de aguja por indicadores luminosos con LEDs. Además del nivel ponderado, algunos vúmetros digitales también muestran los picos o máximos. Como regla general, los niveles de grabación deben ser tales que no superen el área roja más allá de 0 VU, o solo en raras ocasiones. Si el volumen de grabación es demasiado alto, la calidad del sonido y respuesta en frecuencia es generalmente más pobre y los efectos de saturación y recorte pueden ser especialmente problemáticos para un sistema de grabación digital. Por el contrario si el nivel es demasiado bajo, los niveles de ruido serán altos en relación a la señal principal que se está grabando.

Actualmente, la mayoría de las computadoras utilizan pantallas LED o LCD para indicar el nivel de sonido, por otro lado, dan un aspecto colorido y dramático.
Este proyecto consta de una visualización con memoria de pico que muestra gráficamente la señal de audio estéreo que ingresa a través de dos entradas analógicas de nuestra placa Arduino.
Tiene múltiples aplicaciones, ya que podría ser un indicador de nivel de audio, control de nivel de líquido, voltímetro o amperímetro en una fuente de alimentación, indicador de temperatura, medición de una señal de RF, etc.

El diagrama esquemático del vúmetro estéreo se observa en la siguiente imagen:

(click para ampliar)

Lista de Componentes
1 Display LCD 16×2 con controlador Hitachi HD44780 o compatible
2 Capacitores Electrolíticos 1uF 63V
2 Diodos Rectificadores 1N4001
1 Resistencia 3K3Ω 0.25W
1 Resistencia 220Ω 0.25W
2 Resistencias 330KΩ 0.25W

#include <LiquidCrystal.h>

#define IN_LEFT    A4  // analog input for left channel
#define IN_RIGHT   A5  // analog input for right channel

#define T_REFRESH    100
#define T_PEAKHOLD   (3 * T_REFRESH)

LiquidCrystal lcd(7,  // RS
                  8,  // E
                  3,  // DB4
                  4,  // DB5
                  5,  // DB6
                  6   // DB7
                  );

byte  fill[6] = {0x20, 0x00, 0x01, 0x02, 0x03, 0xFF};
byte  peak[7] = {0x20, 0x00, 0x04, 0x05, 0x06, 0x07, 0x20};
byte block[8][8]=
{
  {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
  {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18},
  {0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C},
  {0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E},

  {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08},
  {0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04},
  {0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02},
  {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
};

int lmax[2];
int dly[2];

long lastT = 0;

void  bar(int row, int lev) {

    lcd.setCursor(0, row);
    lcd.write(row ? 'R' : 'L');

    for(int i = 1; i < 16; i++) {
        int f = constrain(lev-i*5, 0, 5);
        int p = constrain(lmax[row]-i*5, 0, 6);
        if(f)
            lcd.write(fill[f]);
        else
            lcd.write(peak[p]);
    }

    if(lev > lmax[row]) {
        lmax[row] = lev;
        dly[row]  = -(T_PEAKHOLD) / T_REFRESH;
    }
    else {
        if(dly[row] > 0)
            lmax[row] -= dly[row];

        if(lmax[row] < 0)
            lmax[row] = 0;
        else
            dly[row]++;
    }
}

void  setup() {

    byte fillbar[8] = {
    B00000,
    B01000,
    B01100,
    B01010,
    B01001,
    B01010,
    B01100,
    B01000
    };

    byte mark[8] = {
    B00000,
    B01010,
    B10001,
    B10101,
    B10001,
    B01010,
    B00000,
    B00000
    };

    lcd.begin(16, 2);

    lcd.createChar(0, fillbar);
    lcd.createChar(1, mark);

    lcd.setCursor(3, 0);
    lcd.print("JLM Sound");
    lcd.setCursor(12, 0);
    lcd.write(1);

    for(int i = 0; i < 16; i++) {
        lcd.setCursor(i, 1);
        lcd.write((byte)0);

        delay(125);
    }

    lcd.clear();

    for(int j = 0; j < 8; j++)
        lcd.createChar(j, block[j]);
}

void  loop() {

    if(millis() < lastT)
        return;

    lastT += T_REFRESH;

    int anL = map(sqrt(analogRead(IN_LEFT)*16), 0, 128, 0, 80);
    int anR = map(sqrt(analogRead(IN_RIGHT)*16), 0, 128, 0, 80);
    
    bar(0, anL);
    bar(1, anR);
}

Anuncios

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s