jueves, 29 de septiembre de 2016

SPLIT PARA AUDIO CON PANEO ANALÓGICO Y CONTROL DIGITAL



Origen del proyecto

El concepto del proyecto radica en la necesidad personal (y posiblemente la de alguien más), como aficionado a la guitarra, de poder usar dos amplificadores de guitarra al mismo tiempo (o un amplificador con dos canales con sonidos distintos en paralelo), pero pudiendo controlar en directo (mientras toco) y de manera continua el balance que hay entre los dos sonidos diferentes que proporcionan dichos amplificadores.

Puesto que no he encontrado ningún dispositivo que me ofrezca la solución a mis requerimientos, he optado por intentar diseñar uno propio.



Descripción



El dispositivo consta del módulo principal (que describiremos a continuación), y un pedal de expresión con el que se controla el funcionamiento del primer módulo.


Puesto que la conexión de una guitarra eléctrica a dos amplificadores simultáneamente y sin ningún elemento activo intermedio, plantea un gran problema de pérdida de intensidad en la señal, se ha optado por un diseño basado en bufers (amplificadores operacionales configurados como seguidores de tensión); el primer dispositivo consiste en un búfer de entrada seguido de tres bufers de salida, que repiten la señal de entrada y sirven de adaptadores de impedancia; los cuatro bufers están basados en el amplificador operacional cuádruple LM324N  (aunque pueden servir otros amplificadores quad genéricos como el LM348N).

Mientras una de las tres salidas permanece siempre inalterada (de cara a tener siempre disponible una señal de línea para una mesa de mezclas, por ejemplo), las otras dos son enviadas a dos potenciómetros digitales Intersil X9C103 de 10k (100 pasos de 100 ohmios), cuyo valor es controlado en tiempo real por un microcontrolador Atmega 328p.

El pedal de expresión consta de un mecanismo de engranaje que permite alterar la lectura del voltaje que hay en el terminal intermedio de un potenciómetro de 10k lineal; esta lectura es tomada y referenciada por un PIC continuamente, que envía después de cada lectura al Atmel el valor leído a través de un puerto serie.

El Atmel finalmente ajusta el valor de ambos potenciómetros con base en el valor recibido del PIC.  Suponiendo que hay un potenciómetro A y otro B:  de esta manera, cuando el pedal está en su posición más baja tenemos en las salidas de los potenciómetros una relación "100% A  -  0% B" y, conforme avanzamos en el recorrido, va "disminuyendo A / aumentando B" hasta que en su posición más alta tengamos una relación "0% A - 100% B".

Aparte del control mediante el pedal de expresión, se puede cambiar el modo de funcionamiento mediante un interruptor de dos posiciones, el cual conmuta la salida de los bufers entre los potenciómetros digitales y otros dos potenciómetros tradicionales manuales; en este último modo de funcionamiento, controlamos manualmente la cantidad de señal que proporcionamos a cada una de las dos salidas independientemente de la posición en la que se encuentre el pedal.

En el display LCD el Arduino se proporciona en todo momento un muestreo con la relación de ambas salidas y el modo en el que está funcionando el sistema.

Todo el sistema será alimentado por una fuente de alimentación lineal de diseño propio; como para la etapa de los búfer es necesaria una alimentación simétrica, se optará por usar una fuente basada en los reguladores fijos de tensión 7805 (+5V) y 7905(-5V).

Diagrama de bloques:

















Planificación del proyecto (diagrama de Gantt)







Placa de PIC


1 x PIC16F877a
1 x Cristal 16 Mhz
2 x Condensador cerámico 22 pF
1 x Pulsador momentáneo
1 x Condensador electrolítico 47 uF
1 x Condensador cerámico 100 nF
2 x Resistencia 330 ohm
1 x Led verde 2.2v

Tira de pines hembra




- Vistas de Proteus -







- Placa acabada -








Fuente de alimentación


1 x Conector para toma de corriente de 3 terminales
1 x Fusible 350 mA en portafusible de panel
1 x Transformador 230Vac - 12+12 Vac 3A
1 x Interruptor retroluminado

(Todos los componentes mencionados anteriormente son montados fuera de la placa, debido a su tamaño y funcionalidad concretas)

1 x Puente rectificador KBU6J
2 x Condensador electrolítico 2200 uF 25V
2 x Condensador poliéster 330 nF
2 x Condensador poliéster 100 nF
2 x Diodo 2N4002
1 x LM7805
1 x LM7905

Terminales PCB para atornillar


- Vistas de Proteus - 






- Placa acabada -







Split de audio



Fuera de placa:

2 x Potenciómetro lineal 10k
4 x Jack hembra mono 6.3mm
1 x Miniswitch 2 posiciones - 4 polos

Placa 

1 x LM324N
4 x Resistencia 1M
4 x Resistencia 470 ohm
4 x Condensador poliéster 47 nF
4 x Condensador cerámico 4.7 pF

2 x Intersil X9C103 (Potencómetro digital de 10k)

Tira de pines hembra


- Vistas de Proteus -




- Prototipo en placa perforada -






Para la primera fase de este prototipo se han usado módulos separados, que más adelante y tras depurar posibles anomalías, son unidos en una sola placa.

En lugar de usar placa perforada para el módulo de buffer + mezclado y una placa Arduino, se ha fabricado una sola placa que reúna la del PIC junto a estas dos mencionadas a doble cara, con el fin de optimizar el espacio ocupado y obtener una mayor durabilidad.


Placa final

- Vistas de Proteus -










Pedal (sensor)


1 x Potenciómetro lineal 10k
2 x Jack estéreo hembra 6.3mm
2 x Jack macho 6.3 mm
1 x Cable apantallado de 2 vivos
1 x Resistencia 10k






Otros

Display LCD 2004
Módulo de interfaz I2C


3 x Led 2.2v
3 x resistencia 330 ohm

Placa ARDUINO UNO con uC Atmega 328p






IMÁGENES 


Ensamblado de todos los elementos en el frontal de la caja:




Vista del panel trasero/fuente de alimentación:






(Próximamente se subirá un vídeo demostrativo en el que se mostrará el funcionamiento y manejo del dispositivo acabado con las placas definitivas.)




SOFTWARE:

Programa PIC

#include <main.h>  //Cabecera en la que se encuentran los ajustes para controlar el PIC
  #include <stdio.h>
  #include <stdlib.h>

int pot = 0; //Variable en la que se guarda el valor analógico

void main()
{

   setup_adc_ports(AN0_AN1_VSS_VREF); //Se seleccionan las entradas analógicas A0 y A1; Referencia en A3
   set_adc_channel(1);                            //Selecciona A1 para usarlo
   delay_us(10);
   
   while(1)
   {
     pot = read_adc();                               //Se lee el puerto analógico y se le asigna un valor sito entre 0 y 255
     putc (pot);                                         //Envía por puerto serie un caracter entre 0 y 255 al Arduino
     
   }
}

Programa Arduino

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>  //Librería para el Display LCD
#include <DigiPotX9Cxxx.h>      //Librería especial que permite usar los potenciometros digitales con sentencias sencillas

LiquidCrystal_I2C lcd(0x27,20,4);// configura el display de 20x04

//PINES DE ENTRADA

const int manualPin   = A1;        // Pin que va conectado al interruptor que selecciona el modo manual (con los                                                     potenciometros del frontal) o con el pedal (potenciometros digitales)

//PINES DE SALIDA - LEDS
const int ledA = 9;                // Led que indicará la relación del canal A
const int ledB = 10;               // Led que indicará la relación del canal B
const int ledM = 11;               // Led que indicará el funcionamiento manual del split mediante los                                                                   potenciómetros del frontal

//PINES DE SALIDA - POTENCIOMETROS DIGITALES
DigiPot potA(2,3,4); //asigna pines de la placa ARDUINO a cada uno de los tres terminales del potenciometro                                     para el canal A
DigiPot potB(5,6,7); //asigna pines de la placa ARDUINO a cada uno de los tres terminales del potenciometro                                     para el canal B

//VARIABLES 
int sensorvalue = 0;               // patilla a la que va conectado el potenciometro (pedal); en el conexionado con el PIC, esta patilla se omite, ya que funcionara via RXTX
int percentvalue = 0;              // valor con el que se manejarán en % los potenciometros; servirán para indicar por el display el balance existente entre ambos canales
int manualmode =0;

//Variables para controlar los potenciometros variables
int potref = 0; //valor inicial que van a tomar como referencia los potenciometros digitales
int potact = 0; //valor que se va a tomar como referencia en cada vuelta de programa a la hora de establecer                            el valor de los potenciometros digitales


void setup()
{
  
  lcd.init();                      // iniciar LCD
  lcd.backlight();                 // iniciar la retroiluminacion de la LCD
  Serial.begin(9600);             // inicio de la comunicacion serie
  
  pinMode(manualPin, INPUT_PULLUP);   //se configuran la entrada y las salidas
  pinMode(ledA, OUTPUT);
  pinMode(ledB, OUTPUT);
  pinMode(ledM, OUTPUT);
  
}


void loop()
{
  
  manualmode=digitalRead(manualPin);
  
     
  sensorvalue = Serial.read();
  percentvalue= map(sensorvalue, 0, 255, 0, 100);   // regla de tres de 255 a 100
  
  if (percentvalue > potref)
  {
    potA.increase(percentvalue-potref);
    potB.decrease(percentvalue-potref);
  }
  
  if (percentvalue < potref)
  {
    potA.decrease(potref-percentvalue);
    potB.increase(potref-percentvalue);
  }
  
  potref=percentvalue;

 if(manualmode=LOW)
 { 
  
  analogWrite(ledA, sensorvalue);
  analogWrite(ledB, 255-sensorvalue);
 digitalWrite(ledM,LOW); 
  
  lcd.clear();
  lcd.print("MODO DIGITAL - PEDAL ");
  lcd.setCursor(0,1);
  lcd.print("AMP A: ");lcd.print(percentvalue);lcd.print("%");
  lcd.setCursor(0,2);
  lcd.print("AMP B:  ");lcd.print(100-percentvalue);lcd.print("%");
    
  delay(10);
  }
  
  else
  
  {
    
   digitalWrite(ledA,LOW);
   digitalWrite(ledB,LOW);
   digitalWrite(ledM,HIGH);
    
  lcd.clear();
  lcd.print("MODO MANUAL");
  lcd.setCursor(0,1);
  lcd.print("UTILICE LOS POTENCIOMETROS FRONTALES");

    
  }
}














1 comentario: