Esquema para integrar el controlador de volumen dentro de un amplificador viejo junto a un conversor de digital (spdif) a analógico. La intención de este proyecto es poder controlar el volumen de la tele nueva que no tiene salida analógica a través del amplificador viejo y con el propio mando de la tele.
El proyecto está basado en otro existente de Vitim(victornpb) y que se puede encontrar en la siguiente dirección: http://www.instructables.com/id/Remote-Volume-Control-for-old-stereo-amp/
El proyecto original está pensado para construir el control de volumen fuera del amplificador y mi proyecto dentro del amplificador.
A continuación pongo el video y debajo del video encontrareis el esquema y el código del sketch así como los links de descarga de las librerías.
Esquema
Sketch
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
/* Sketch para controlar el volumen mediante un mando a distancia El sistema de control está basado en el controlador de volumen IC PT2257 y un sensor IR común. PT2257 Datasheet: http://www.princeton.com.tw/Portals/0/Product/PT2257.pdf Este código a sido creado por Javier Vicente Medina (jvm.Bricobit.com) 07/01/2018 utilizando como referencia el proyecto y código creado por Víctor NPB, el 11/09/2014 el cual puede ser visitado desde http://www.instructables.com/id/Remote-Volume-Control-for-old-stereo-amp/ La libreria para controlar el IC PT2257 - la podeis descargar desde: https://github.com/victornpb/Evc_pt2257 La libreria para interactuar con el sensor IR la podeis descargar desde: https://github.com/z3t0/Arduino-IRremote Una vez descargadas descomprimir y colocar en la carpeta libraries de vuestro arduino. La librería <Evc_pt2257.h> está configurada para utilizar los siguientes pines por defecto: Conecta el puerto -> 5 SCL(RELOJ) del PT2257 al puerto analógico de arduino nano -> A0 Conecta el puerto -> 4 SDA(DATOS) del PT2257 al puerto analógico de arduino nano -> A1 Métodos disponibles de la librería <Evc_pt2257.h> evc_setVolume(0) Establece para los dos canales, la atenuación a 0db (Es decir el volumen máximo) evc_setVolume(79) Establece para los dos canales la atenuación a 79db (Es decir el volumen mínimo) evc_setVolumeRight(15) Establece solo la atenuación para el canal derecho a 15 evc_setVolumeLeft(15) Establece solo la atenuación para el canal izquierdo 15 evc_mute(true) Silencia los dos canales a 95dB evc_mute(false) Quita el silencio y deja el volumen como estaba antes de ser silenciado evc_off() Apaga el IC y guarda en memoria el volumen actual para cuando vuelva a encenderse ? (No sé si funciona) IMPORTANTE!! LA LIBRERIA Evc_pt2257.h esta desactualizada y solo funciona con la versión 1.6.9 del IDE de arduino, con cualquier otra versión superior el compilador da error. Para descargaros la versión del IDE de arduino 1.6.9 podéis hacerlo desde https://www.arduino.cc/en/Main/OldSoftwareReleases Recomiendo descargar la versión sin instalador portable, y así no tendréis problemas con la ultima versión que tengáis instalada. */ /* * IMPORTS */ #include <Evc_pt2257.h> #include <IRremote.h> /* * INICIALIZACION DE OBJETOS Y VARIABLES */ IRrecv irrecv(7); //Pin por el cual recibimos la señal del sensor de infrarrojos decode_results results; //Objetos a recorrer con los códigos de las teclas pulsadas String lastkey = ""; //Almacena el código de la ultima tecla pulsada boolean timerenabled = false; //Permite o no contabilizar el tiempo transcurrido desde que se pulso una tecla int timer = 0; //Valor incremental int timerlimit = 30; //Limite del valor incremental int vol = 0; //Volumen o atenuación /* * CONTRUCTOR */ /*function*/void setup() { //Serial.begin(9600); //Descomenta si quieres usar el monitor serial evc_init(); //Inicializamos la librería encargada de controlar el integrado pt2257 irrecv.enableIRIn(); //Inicializamos la librería encargada de controlar el sensor IR //Serial.print("Inicializado"); }/*End function setup*/ /* * BUCLE CONSTANTE */ /*function*/void loop() { if(timerenabled){ timer++; if(timer>=timerlimit){ timer=0; timerenabled=false; lastkey=""; } } //Serial.println(irrecv.decode(&results); //Descomenta esta línea si quieres averiguar los códigos de tu mando desde el monitor serial if (irrecv.decode(&results)) {//Si el sensor Infrarrojo está recibiendo datos entonces... irrecv.resume(); if (String(results.value)=="284129415"){//Si el código recibido coincide con el código especificado en el string entonces SUBIMOS EL VOLUMEN +1 timerenabled=true; lastkey = String(results.value); updown("UP"); }else if (String(results.value)=="284115135"){//Si el código recibido coincide con el código especificado en el string entonces BAJAMOS VOLUMEN -1 timerenabled=true; lastkey = String(results.value); updown("DOWN"); }else{//Si ningún código coincide con los if anteriores o si se mantiene una tecla pulsada constantemente entonces... (Si mantenemos una tecla pulsada constantemente la librería devuelve el código de la tecla en el primer ciclo, a partir de ahí devuelve otro código aunque sigamos manteniendo pulsada la misma tecla) if (lastkey=="284115135"){//Si se está pulsando constantemente una tecla y si el código de la tecla que se pulsó coincide con el código especificado en el string BAJAMOS VOLUMEN AUTOMATICAMENTE en -1 por cada ciclo hasta que se suelte la tecla. updown("DOWN"); }else if (lastkey=="284129415"){//Si se está pulsando constantemente una tecla y si el código de la tecla que se pulsó coincide con el código especificado en el string SUBIMOS VOLUMEN AUTOMATICAMENTE en +1 por cada ciclo hasta que se suelte la tecla. updown("UP"); } } }//End if (irrecv.decode(&results)) delay(10);//Añadimos un retardo al bucle para dar estabilidad (Si no, no funciona el subir y bajar el volumen automáticamente cuando mantenemos la tecla pulsada, ¿Porque sucede esto? pues no tengo ni idea ;D) }//End function loop /* * Función encargada de subir o bajar el volumen (Por cada llamada incrementa en + o -1 la atenuación) */ /*function */void updown(String ud){ timer=0; if(ud=="UP"){ if(vol>0){ evc_setVolume(vol--);//Decrementa la atenuación } }else{ if(vol<79){ evc_setVolume(vol++);//Incrementa la atenuación } } //Serial.print(ud+" "); //Serial.println(vol); }//End function updown |
Sketch para controlar el volumen mediante un mando a distancia
El sistema de control está basado en el controlador de volumen IC PT2257 y un sensor IR común. PT2257 Datasheet: http://www.princeton.com.tw/Portals/0/Product/PT2257.pdf
Este código a sido creado por Javier Vicente Medina (jvm.Bricobit.com) 07/01/2018 utilizando como referencia el proyecto y código creado por Víctor NPB, el 11/09/2014 el cual puede ser visitado desde http://www.instructables.com/id/Remote-Volume-Control-for-old-stereo-amp/
La libreria para controlar el IC PT2257 – la podeis descargar desde: https://github.com/victornpb/Evc_pt2257
La libreria para interactuar con el sensor IR la podeis descargar desde: https://github.com/z3t0/Arduino-IRremote
Una vez descargadas descomprimir y colocar en la carpeta libraries de vuestro arduino.
La librería está configurada para utilizar los siguientes pines de arduino por defecto:
Conecta el puerto -> 5 SCL(RELOJ) del PT2257 al puerto analógico de arduino nano -> A0
Conecta el puerto -> 4 SDA(DATOS) del PT2257 al puerto analógico de arduino nano -> A1
Métodos disponibles de la librería
evc_setVolume(0) Establece para los dos canales, la atenuación a 0db (Es decir el volumen máximo)
evc_setVolume(79) Establece para los dos canales la atenuación a 79db (Es decir el volumen mínimo)
evc_setVolumeRight(15) Establece solo la atenuación para el canal derecho a 15
evc_setVolumeLeft(15) Establece solo la atenuación para el canal izquierdo 15
evc_mute(true) Silencia los dos canales a 95dB
evc_mute(false) Quita el silencio y deja el volumen como estaba antes de ser silenciado
evc_off() Apaga el IC y guarda en memoria el volumen actual para cuando vuelva a encenderse ? (No sé si funciona)
IMPORTANTE!! LA LIBRERIA Evc_pt2257.h esta desactualizada y solo funciona con la versión 1.6.9 del IDE de arduino, con cualquier otra versión superior el compilador da error.
Para descargaros la versión del IDE de arduino 1.6.9 podéis hacerlo desde https://www.arduino.cc/en/Main/OldSoftwareReleases
Si ya teneis la ultima instalada, podeis descargar he instalar por separado la versión sin instalador portable.
El integrado pt2257 yo lo compre aqui muy barato y con envio gratuito, ya sabeis si no teneis prisa… https://es.aliexpress.com/item/I2C-2-channels-digital-volume-controller-IC-PT2257-NEW/32802067364.html?spm=a2g0s.9042311.0.0.485rTT
Y el arduino Nano aquí https://es.aliexpress.com/item/Freeshipping-1pcs-lot-Nano-3-0-controller-compatible-for-arduino-nano-CH340-USB-driver-NO-CABLE/32804787481.html?spm=a2g0s.9042311.0.0.485rTT
No es original pero funciona muy bien, si realmente fuera a utilizarlo en un proyecto serio, por ejemplo para comercializarlo, si que me plantearia utilizar el arduino nano original, pero para hacer inventos y chapuzas no me apetece gastar 30€ por cada arduino nano original.
Yo compre 2 de oferta por 1.50€ es decir pagué 3€ en total con envió incluido, ahora no están de oferta pero 2€ por cada uno sigue siendo barato mas 60 céntimos de envió 2.65€, aunque podéis estar al tanto de cuando los ponen en oferta.
Si aun asi no estáis convencidos de comprar un arduino chino podéis colaborar con el proyecto arduino comprándolo original desde bricogeek http://tienda.bricogeek.com/arduino/12-arduino-nano-8058333490342.html
Haasta otra Amigoooos!!!
7 comments on “Controlar con el mando a distancia del televisor el volumen de un amplificador viejo y la propia tv (Con arduino nano + un sensor IR reutilizado)”
Hola, estoy intentando construir este proyecto, pero el código me da errores múltiples a la hora de compilar. ¿Qué es lo que puedo estar haciendo mal?
Arduino:1.6.9 (Windows 10), Tarjeta:»Arduino/Genuino Uno»
C:\Users\info\AppData\Local\Temp\ccjdCx9q.ltrans1.ltrans.o: In function
i2c_write':
C:\Users\info\Dropbox\Sinergetica 1\Arduino\Arduino\libraries\Evc_pt2257/SoftI2CMaster.h:432: undefined reference to ass_i2c_delay_half’
C:\Users\info\Dropbox\Sinergetica 1\Arduino\Arduino\libraries\Evc_pt2257/SoftI2CMaster.h:432: undefined reference to
ass_i2c_wait_scl_high'
C:\Users\info\Dropbox\Sinergetica 1\Arduino\Arduino\libraries\Evc_pt2257/SoftI2CMaster.h:432: undefined reference to ass_i2c_delay_half’
C:\Users\info\Dropbox\Sinergetica 1\Arduino\Arduino\libraries\Evc_pt2257/SoftI2CMaster.h:432: undefined reference to
ass_i2c_delay_half'
C:\Users\info\Dropbox\Sinergetica 1\Arduino\Arduino\libraries\Evc_pt2257/SoftI2CMaster.h:432: undefined reference to ass_i2c_wait_scl_high’
C:\Users\info\Dropbox\Sinergetica 1\Arduino\Arduino\libraries\Evc_pt2257/SoftI2CMaster.h:432: undefined reference to
ass_i2c_delay_half'
C:\Users\info\AppData\Local\Temp\ccjdCx9q.ltrans1.ltrans.o: In function ass_i2c_stop’:
C:\Users\info\Dropbox\Sinergetica 1\Arduino\Arduino\libraries\Evc_pt2257/SoftI2CMaster.h:356: undefined reference to
ass_i2c_delay_half'
C:\Users\info\Dropbox\Sinergetica 1\Arduino\Arduino\libraries\Evc_pt2257/SoftI2CMaster.h:356: undefined reference to ass_i2c_delay_half’
C:\Users\info\Dropbox\Sinergetica 1\Arduino\Arduino\libraries\Evc_pt2257/SoftI2CMaster.h:356: undefined reference to
ass_i2c_wait_scl_high'
C:\Users\info\Dropbox\Sinergetica 1\Arduino\Arduino\libraries\Evc_pt2257/SoftI2CMaster.h:356: undefined reference to ass_i2c_delay_half’
C:\Users\info\AppData\Local\Temp\ccjdCx9q.ltrans2.ltrans.o: In function
i2c_start(unsigned char) [clone .constprop.37]':
C:\Users\info\Dropbox\Sinergetica 1\Arduino\Arduino\libraries\Evc_pt2257/SoftI2CMaster.h:283: undefined reference to ass_i2c_wait_scl_high’
C:\Users\info\Dropbox\Sinergetica 1\Arduino\Arduino\libraries\Evc_pt2257/SoftI2CMaster.h:283: undefined reference to
ass_i2c_delay_half'
C:\Users\info\Dropbox\Sinergetica 1\Arduino\Arduino\libraries\Evc_pt2257/SoftI2CMaster.h:283: undefined reference to ass_i2c_write’
collect2.exe: error: ld returned 1 exit status
Se encontraron múltiples librerías para «IRremote.h»
Usado: C:\Users\info\Dropbox\Sinergetica 1\Arduino\Arduino\libraries\IRremote
No usado: C:\Program Files (x86)\Arduino\libraries\RobotIRremote
exit status 1
Error compilación en tarjeta Arduino/Genuino Uno.
Gracias y un saludo!!
Hola Juan, seguro que estas utilizando la versión 1.6.9 del IDE de Arduino? cualquier otra versión el compilador da error con la librería Evc_pt2257.h
Hola! Quería preguntarte si sabes que CI puedo utilizar si quiero reducir el volumen pero de 5 canales, pensé en poner 3 CI de los que usaste y al momento de bajar o subir volumen que la condificion if afectarán en los 3 CI, pero como puedo definir 3 al mismo tiempo? Como viene predefinido los pines que usara, como puedo definir los otros dos CI?
Hola Max, yo solo encontré ese integrado con información suficiente para poderlo utilizar, no sé si abran otros con capacidad de controlar más canales, lo de utilizar 3 integrados como el que use yo podría funcionar, para ello dependiendo del integrado que quieras controlar el volumen deberás cambiar los pines de salida de manera dinámica, luego tendrás que replicar el circuito por 3, porque me imagino que lo que quieres es controlar el volumen de 3 canales por separado, es una idea que yo creo que pude funcionar, por defecto la librería viene configurada para escuchar por los siguientes puertos al IC
Conecta el puerto -> 5 SCL(RELOJ) del PT2257 al puerto analógico de arduino nano -> A0
Conecta el puerto -> 4 SDA(DATOS) del PT2257 al puerto analógico de arduino nano -> A1
Entonces tu deberías conectar los otros dos IC uno en A2 y A3 y el otro IC en A4 y A5
Después para poder recuperar información de los 3 IC o poderles enviar datos para subir o bajar volumen, tendrás que arreglártelas para enviar o recibir la seña por unos puertos u otros cambiándolos dinámicamente, no se si la librería tendrá alguna función ya prepara que te permita cambiar de puertos en tiempo de ejecución, si no tendrás que destripar la librería y añadirle tu esa funcion, un saludo amigo
Hola
Intento ver cuales son los Códigos de mi control pero cuando desconecto esto da error
//Serial.println(irrecv.decode(&results);
Error
expected primary-expression before ‘/’ token
Me puedes ayudar a elaborar un controlador de volumen con salida 3.5mm AUX estéreo o con RCA sin el convertidor de Audio óptico mejor dicho
Hola man! gracias por el circuito. Esta copado. Lo voy a hacer para ver que sale.
PD: Me causo mucha gracia tu video!!! 😉