# Control de volumen mediante "rueda"



## pssdlc (Jun 20, 2009)

Hola, este es mi primer post, estuve buscando en el foro y no encontre solución para lo que voy a plantear.


Comienzo desde el principio. Hace unos dias compre a precio muy, pero muy barato un equipo de audio en un remate. El tema es que le faltan un par de plaquetas y los conectores de atras. Lo que si se puede usar (que es en lo que estoy interesado y trabajando) es la sintonia digital de AM/FM y le voy a hacer una entrada AUX.

Estoy diseñando el control digital con un PIC16F628A y como preamplificador un TDA7449 (esta parte va muy bien encaminada).

Ahora mi pregunta principal es si alguien me puede dar código en C para controlar el volumen con una "rueda" (que es lo original que tiene el equipo). La rueda tiene 3 pines, he estado haciendo pruebas pero da errores, es decir aveces mientras debería estar subiendo baja o viceversa. Cabe aclarar que quiero hacer la parte de volumen mediante esta rueda para no tener que hacerlo mediante botones y tener que modificar la estética.

También mi consulta extra es si un PIC16F628A estando cargado con el programa puede grabar alguna variable en alguna parte de la memoria de si mismo. Especificamente lo que quiero guardar son las variables de VOLUMEN, GRAVES, AGUDOS, BALANCE, GANANCIA, ENTRADA o sea serían 6 variables de 1 byte cada una. La idea es saber si en PIC puede guardar esto estando sin alimentación para no tener que usar una memoria eprom.

Bueno, si alguien tiene idea le voy a estar muy agradecido y si tienen interes luego de terminado el proyecto lo subo para ver como me quedo.

Un abrazo grande para todos.
Pablo.


----------



## Oscar Monsalvo (Jun 20, 2009)

El pic 16F628A tiene internamente una memoria eprom que puedes usar para guardar tus variables.

Saludos


----------



## DJ DRACO (Jun 21, 2009)

A mi gusto, te vas a gastar mucho dinero y complicarte la vida intentando dar solución a ese equipo con un microcontrolador.

hubieras investigado y te comprabas un LM1035 o LM1036, los cuales son integrados de 20 pines solamente, y traen incluidos:
Preamplificador, con control de Graves, Agudos, Volumen, Balance y compensación de ruidos, todo STEREO.

o sea, 1 integrado te sirve para cubrir todo el equipo stereo.

Ademas de eso, sólo necesitas 4 potenciómetros rotativos lineales MONOAURALES ya que controla todo por variación de corriente.

saludos.


----------



## pssdlc (Jun 21, 2009)

Bueno, primero que nada muchas gracias a ambos por molestarse en leer mi post y darme información.

Muy buena la información que me das Oscar Monsalvo, ahora solo buscaré los comandos para guardar mis variables en la eprom del PIC16F628.

DJ DRACO muy bueno el integrado que me pasaste, seguro me va a servir ya que constantemente estoy haciendo proyectos de audio. El gran tema es ver si se consigue el integrado aca en Uruguay.
Pero para este proyecto con el equipo lo que no quiero es cambiarle la estética, por eso la complicación. Lo bueno es que hasta el momento no he gastado dinero ya que el TDA7449 lo saque de un monitor (me dedico a reparación de monitores) y el PIC ya lo tenía (demas componentes salen de las placas de monitores jeje).


Si alguien tiene idea como usar la "ruedita" para modificar una variable hacia arrriba/abajo establemente ya estaría completo el proyecto. Salvo que me quedaría algunas horas para terminar la programación y conexionado.


Nuevamente muchas gracias a todos.
Saludos.


----------



## electrodan (Jun 21, 2009)

Como es la tal "ruedita"? Para mi, podría ser como las ruedas de los ratones de PC, que (creo) son como botones que se activan cada vez que se giran. Podrías poner una foto de  la tal ruedita (desde la parte de atrás del panel, claro), y como se siente al girarla?


----------



## Oscar Monsalvo (Jun 21, 2009)

La forma que comenta electrodan tambien es llamada encoder, se compone de una ruedita con muchas ranuras separadas a la misma distancia, la cuales bloquean o dejan pasar la luz de un led infrarrojo atacando un optotransistor, el cual genera un tren de pulsos cuando se le da vuelta.

La verdad no tengo ni idea como trabaja la ruedita de la que tu hablas, tal vez sea algo parecido.

Saludos.


----------



## asherar (Jun 21, 2009)

En el siglo pasado (siglo XX) algunos potenciometros venían "de costado", 
de modo que la ruedita que asomaba en el panel lo que hacía era mover 
el palito (eje) de un reóstato común y corriente.

No lo simplifiquen si lo pueden hacer complicado !  Jeje !

PD: 
En los pics, las variables se pueden guardar en memoria EEPROM o en la 
misma memoria de programa.


----------



## pssdlc (Jun 21, 2009)

Voy a describir como es el control de "ruedita". De apariencia es como un potenciometro, tiene 3 pines también. En el circuito original un pin va conectado a masa, los otros dos pines van a el integrado controlador. Al girar el eje de control (ruedita) envia un pulso a cada pin, es decir al girar hacia la izquierda o derecha (hace igual para los dos lados) cierra cada pin con respecto a masa, es decir, manda un pulso (como presionar un boton), mientras dura ese pulso digamos que los 3 pines quedan en corto.

Mi forma de pensar era que al girar a la derecha primero se cerraba masa con un pin y al girar para el otro lado se cerraría masa con el otro pin. Estaría excelente que funcione asi porque sería muy facil.

También pense que el cerrarse los pines contra masa uno lo haría com un tiempo de diferencia entre si, es decir si giramos a la izquierda se cierra masa con un pin y enseguida con el otro asi reconocer el sentido de giro.

Enseguida pongo una parte de código con la cual obtengo un resultado pero malo, al PIN_A1 tengo conectado un pin de la "rudita", al PIN_A2 el otro pin de señal y el último pin a masa. volumen es la variable de volumen. Aclaro que conecto un resistor de 10k entre +vcc y el PIN_A1 y lo mismo con el PIN_A2


if ((input(PIN_A1) == TRUE) && (input(PIN_A2) == FALSE))
{
    if (volumen < 47) volumen++;
} else if ((input(PIN_A1 == FALSE) && (input(PIN_A2) == TRUE))
{
   if (volumen > 0) volumen --;
}

delay_ms(50);


Para probar si funcionaba el código hice otra parte de código para mostrar en 2 displays de 7 segmentos el valor de volumen. El programa recibe señal de la "ruedita", al girar para la derecha sube y en sentido contrario baja (generalmente).
Pero con este código hay muchos errores aveces al girar para la derecha baja y viceversa, en pocas palabras asi no funciona bien. Variando el tiempo de delay se obtienen mejoras pero nunca funciona bien, ni aceptable diría.

Seguire haciendo pruebas y si funciona aviso....

Como siempre muchas gracias a quien se molesta en leer mi problema.
Un abrazo.


----------



## Dr. Zoidberg (Jun 21, 2009)

Si las dos señales de salida (llamémoslas A y B) del codificador (rueda+logica interna) salen desfasadas 90º, como debería ser y además cada una adelanta a la otra según el lado para el cual gire la rueda (por ejemplo A adelanta a B cuando gira para la derecha y B adelanta a A cuando gira para la izquierda), entonces lo que tenés que hacer es usar un flip-flop D (tipo CD4013) con una de las salidas conectada al pin de reloj (CK) y la otra salida al pin de datos (D). Al girar ahora la rueda, la salida del FF-D debe estar en 0 o en 1, dependiendo de como conectaste las salidas y del sentido de giro de la rueda. Esa salida en 0 o 1 es la que tenés que usar para controlar el incremento o decremento del contador de "volumen".
Para contar, podés usar cualquiera de las dos señales (la A o la B), o podés multiplicar por 2 la resolución del conteo mandando ambas salidas a las entradas de una compuerta XOR y tomás la señal de conteo de la salida de esta compuerta.

Ahora bien, si vas a estar haciendo polling para ver las transiciones de la señal de conteo entonces es probable que NUNCA obtengas buenos resultados, y además esa es una tarea intensiva en software, lo que probablemente te va a perjudicar si querés hacer otra tareas con el PIC. Lo que debés hacer para contar sin problemas, es tirarle esa tarea a uno de los timers del PIC y hacer un contador por software que se actualice con la diferencias de conteo del timer cuando lo lees cada 10, 50 o la cantidad de milisegundos que te sea cómoda. No son mas de 10 líneas de código para configurar el timer y fijar la frecuencia de exploración del timer y la actualización del contador por software y te deja disponible el 99% del tiempo de procesador libre para hacer lo que se te ocurra.

Saludos!


----------



## electrodan (Jun 23, 2009)

Acá ya se me están poniendo un poquito complejos, pero confirmado que es como el scroll de los mouse, y no como decía alguien por ahí del enconder (Oscar).
Bueno, lo que no entiendo de la explicación de ezavalla es de que "codificador" está hablando, puesto que la "ruedita" es un dispositivo puramente mecánico.


----------



## DJ DRACO (Jun 23, 2009)

Miren, las cosas como son.

Si hay que modificar sentido de giro y velocidad de giro, lo necesario es un ENCODER.

un encoder es una rueda, la cual tiene grabado un código binario o gray, de la cantidad de bits que uno desee.

al ir girando la ruedita los bits aumentan o disminuyen, y cada salida del encoder (cada bit) entra a 1 entrada del PIC.

por ende si el pic consta de 4 entradas podrás crear un encoder de 4 bits, 16 posiciones de cambio por giro.

si tienes 5 entradas, podra hacerlo de 5 bits, lo cual son 32 posiciones de cambio por giro (mayor cambio a menor giro de ruedita)

aca les dejo una imagen de como funciona.


----------



## Dr. Zoidberg (Jun 24, 2009)

electrodan dijo:
			
		

> Bueno, lo que no entiendo de la explicación de ezavalla es de que "codificador" está hablando, puesto que la "ruedita" es un dispositivo puramente mecánico.



El dispositivo ese que genera los pulsos cuando das vuelta la "perilla" se denomina, técnicamente hablando, *codificador óptico*, y no es solo "la ruedita", sino también los emisores y detectores optoelectrónicos, mas los ajustes mecánicos que  sean necesarios para que la generación de pulsos opere como corresponde. Estos codificadores o encoders pueden ser de dos tipos:
1- Absoluto: como el que posteó DJDRACO, que no se usan mucho por que requieren muchas líneas de conexión y es complicado detectar el sentido de giro.
2- Incremental: que son los mas usados y funcionan como los mouse. Esto es seguramente el que tiene pssdlc en su amplificador. Estos codificadores generan dos señales (cuadradas) desfasadas 90º eléctricos una de la otra (se dice que están en *cuadratura*), y trabajan como mas o menos expliqué antes.

Saludos!


----------



## pssdlc (Jun 24, 2009)

Hola nuevamente. Como siempre muchas gracias a todos por molestarse en leer mi post y darme su opinion e información.

Mas abajo pongo dos fotos de la "ruedita", perilla, control, encoder o como se llame jeje. Hay una foto que muestra la parte de afuera y la otra por dentro. Aclaro que es mecánico el control, nada óptico y tiene 3 pines, de los cuales en el circuito original 1 pin va a masa (el de la derecha visto de frente) y los otros 2 pines van al integrado de control (el cual es un SM8952AC25P) que supongo yo la función de subir y bajar volumen esta hecha por sofware ya que el integrado es un microcontrolador con 4/8kb de memoria flash.


----------



## Dr. Zoidberg (Jun 24, 2009)

Hummmm...mecánico e incremental...
Mejor armalo de nuevo antes de que palme alguna de esas chapitas que hacen contacto.

Lamentablemente no es un encoder óptico, con lo cual es probable que su vida útil no sea muy larga, pero si se fijan donde hacen contacto las chapas, van a ver que es un encoder incremental...aunque muy pedestre..

Saludos!


----------



## alfonso82 (Jun 30, 2009)

Gracias ezavalla, al fin entendi como funcionan las benditas rueditas de los mouse.


----------



## Dr. Zoidberg (Jun 30, 2009)

alfonso82 dijo:
			
		

> Gracias ezavalla, al fin entendi como funcionan las benditas rueditas de los mouse.



Fácil, eh?
Me he cansado de usar esos encoders cuando hacía control de posición y velocidad de motores de CC de mando directo, conectando los flip-flops D y las compuertas XOR para duplicar la resolución del encoder...hasta que usé un microcontrolador de Intel que podía contar con los flancos de subida y de bajada, con lo cual se cuadruplica la resolución...usaba un encoder de 1000 líneas por vuelta y terminé con uno de 4000 líneas por vuelta haciendo el jueguito con las compuertas y la configuración del timer del micro.

Saludos!


----------



## DJ DRACO (Jul 1, 2009)

Yo tengo un pote asi en mi etapa de "100+100" y pongo comillas porque no supera los 25+25watts reales, pero estos chinos hijos de put...

bueh, la onda es como dice ezavalla, todos esos contactos van tirando pulsos hacia el micro peroooooooo el problema radica en cuanto a la precisión.

t lo digo pq en mi equipo aveces incrementa de golpe a veces doy mil vueltas y no sube nada y a veces giro a la derecha y el volumen baja (no sabe hacia donde gira)

yo prefiro el de los bits, porque con una logica muy simple podes saber si los bits aumentan o disminuyen y con q velocidad lo estan haciendo.

asi trabajan los encoders de precision.

saludos.


----------

