Cualquier control remoto en cualquier cosa con Arduino

Advertencia: En el siguiente tutorial se requieren conocimientos previos de ingeniería en electrónica o electrónica básica y programación en C++, no es un tutorial desde 0.

Después de algunos años buscando un control remoto para un televisor sankey que tengo en la sala al que no he conseguido ni uno prestado para “clonarlo”, he decidido buscarle una solución aprovechando todo el tiempo de ocio generado por el virus chino.

Estaba pensando en hacerlo con un ESP8266, pero entonces tendríamos todos que tener teléfono en mano para usar una interfaz web y con lo obsesivo que soy posiblemente hubiese terminado por desarrollar una aplicación android y todo solo para controlar el TV, lo cual seria un despropósito para esta tontería, por eso he decidido hacerlo con una placa de desarrollo arduino ya que tengo varias de ellas y guardar el ESP8266 para otro despropósito.

Lo que he hecho es usar una placa arduino nano con un control remoto samsung para controlar el teclado del televisor sankey.

Para ello he usado la librería IRremote configurando el código para que cuando presione las teclas “Power” “CH+” “CH-” “V+” “V-” “Input” en el control remoto, el microcontrolador que lleva la placa arduino traduzca estos códigos y “presione” esas mismas teclas en el televisor, tranquilos, esta parte también la he diseñado y se encuentra en un diagrama mas abajo.

He usado un arduino nano 328 pero el código no es muy exigente y podríamos usar un 168.

Lo primero que vamos a hacer en un protoboard es conectar el pin DATA de un sensor infrarrojo al pin 3 de un arduino, como ya dije he usado un arduino nano, pueden saltarse el protoboard y armar todo de una vez en el equipo huésped siguiendo el diagrama que esta mas abajo.

Lo siguiente que vamos a hacer es ir al gestor de librerías del arduino ide, instalar la librería IRremote en su versión 2.5.0 y cargar este código:

#include <IRremote.h>
int RECV_PIN = 3;
IRrecv irrecv (RECV_PIN);
decode_results results;

void setup() {
  irrecv.enableIRIn();
  Serial.begin (9600);
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println (results.value, HEX);
    irrecv.resume();
    delay(10);
  }
}

Una vez hechas las conexiones procedemos a identificar los códigos de las teclas del control remoto que vamos a usar, estos los vamos a descubrir en el monitor serial.

Al valor hexadecimal que nos entrega le vamos a añadir “0x”al principio a la hora usarlo en nuestro “sketch”

Para mi tarea he usado el propio receptor infrarrojo que tiene el equipo aprovechando la alimentación del mismo (5v) para conectar el arduino, también he desconectado la salida de este hacia la mainboard para evitar interferencias y hasta me aproveche del circuito impreso para fijar mi arduino nano.

Arduino nano, cableado y transistores brt

Una vez identificados los códigos de las teclas que iba a usar del control remoto escribí este código, como estamos usando una librería te vas a encontrar con que la estructura del código de la mayoría se parecen mucho, la diferencia de este código es que mantiene la salida en alto el tiempo que tengas alguna de las teclas presionadas en el CR.

#include "IRremote.h"
const int receiver = 3; 
const int Power = 12;
const int CHd = 11;
const int CHu = 10;
const int Vd = 9;
const int Vu = 8;
const int Menu = 7;
const int Input = 6;
const int Tiempo = 300;
unsigned long MillisPrevios = 0;
int Z = 0;
IRrecv irrecv(receiver);     
decode_results results;  

void setup() {
irrecv.enableIRIn(); 
pinMode(Power, OUTPUT);
pinMode(CHu, OUTPUT);
pinMode(CHd, OUTPUT);
pinMode(Vu, OUTPUT);
pinMode(Vd, OUTPUT);
pinMode(Menu, OUTPUT);
pinMode(Input, OUTPUT);
}

void loop() {
  
unsigned long Millis = millis();

if ( irrecv.decode(&results) ) {
  
    switch(results.value) {
    case 0xE0E040BF: // Power 
                    digitalWrite(Power,1);
                    MillisPrevios = Millis;
                    Z = 1;
                    break;
    case 0xE0E048B7: // CH+ 
                    digitalWrite(CHu,1);
                    MillisPrevios = Millis;
                    Z = 1;
                    break;
    case 0xE0E008F7: // CH-
                    digitalWrite(CHd,1);
                    MillisPrevios = Millis;
                    Z = 1;
                    break;
    case 0xE0E0E01F:// V+
                    digitalWrite(Vu,1);
                    MillisPrevios = Millis;
                    Z = 1;
                    break;
    case 0xE0E0D02F:// V-
                    digitalWrite(Vd,1);
                    MillisPrevios = Millis;
                    Z = 1;
                    break;
    case 0xE0E058A7: // Menu
                    digitalWrite(Menu,1);
                    MillisPrevios = Millis;
                    Z = 1;
                    break;
    case 0xE0E0807F: //input
                    digitalWrite(Input,1);
                    MillisPrevios = Millis;
                    Z = 1;
                    break;
    }
    irrecv.resume();
    }  
if ( Z == 1 && (Millis - MillisPrevios >= Tiempo )) {
    digitalWrite(Power,0);
    digitalWrite(CHu,0);
    digitalWrite(CHd,0);
    digitalWrite(Vu,0);
    digitalWrite(Vd,0);
    digitalWrite(Menu,0);
    digitalWrite(Input,0);
    Z = 0;
    }
}

Podrían alegar que soy obsesivo compulsivo, pero la variable Z es para que no escriba en los puertos en cada ciclo.

Diagrama esquemático

Como pueden ver en el esquema, he puesto varios ejemplos de lo que se puede usar: Optocouplers, transistores BRT, y transistores mas resistencias,

Puede que te consigas una configuración de teclado en la que los contactos de los pulsadores no deriven a GND, en ese caso solo podrás usar optocouplers.

Por comodidad recomiendo usar transistores BRT (transistor with built-in resistor) «alias transistor digital», es un transistor especial que tiene resistencias integradas y nos va a ahorrar el tener que usar una resistencia en la base de cada transistor, yo he conseguido en una placa de reciclaje varios 2SC3860 y 2SC3899 que ya están descontinuados y han sido los que he usado, si tuviese que comprarlos escogería DTC114ES, también se me ocurrió a ultima hora que pude usar un ULN2003.

Transistores montados detrás de los pulsadores del teclado

Lo pueden modificar para añadirle tareas, como un sistema para controlar el encendido de unas cornetas analógicas, apagar los propios altavoces del televisor en caso de que el equipo no tenga esta opción.. ETC.

No necesariamente tiene que ser un televisor, podríamos implementar un puente H y usar un potenciómetro motorizado para modificar algún cacharro vintage al que quieras ponerle control remoto, tu imaginación es el limite…

Consejo: Cuando estén haciendo el montaje no sean tan cabezotas como yo y dejen acceso al puerto usb por si se les ocurre hacer una actualización en el futuro.

CAVEAT EMPTOR

Si no entiende el articulo léalo las veces necesarias hasta que lo haga, no me escriba para preguntarme como lo puede hacer o si no explico tal o cual cosa, lea el primer párrafo, si necesita que lo ayude en su proyecto tendrá que pasar por mi cuenta bancaria depositando para pagar algo de mi tiempo.

Este documento puede servir de referencias siempre cuando sea a través de un link hacia este contenido.

El codigo publicado es de dominio publico, espero que lo disfruten.