Como emular un mando con Arduino


A veces   puede ser  interesante emular del comportamiento  de un mando infrarrojo  con el fin de automatizar procesos  que de otra manera  seria mucho mas complejo . Como ejemplo típico de dispositivos que podemos controlar vía infrarojos, hablamos de  reproductores de cámaras, televisores, DVD, VCR, lectores de blueray, equipos de sonidos, descodificadores  y  un largo etcétera 

Aunque pueda parecer descabellado repetir las mismas señales desde una placa Arduino , lo cierto  es que no es descabellado querer emular este comportamiento , porque  podemos  hacer cosas  que seria muy dificultoso  sin la ayuda del procesamiento de señales de infrarojos como por ejemplo  encender automáticamente  el Aire Acondicionado  cuando la temperatura  suba un determinado valor , o se desconecte a una determinadas horas ,  se apague  cuando no haya movimiento  y un largo  etcétera 

Como paso previo  debemos analizar las señales infrarrojas emitidas por el mando usado para el control de ese dispositivo  por lo que deberemos averiguar  cómo recibir los códigos y luego una vez conocidas intentar ver como transmitirlas.

Para nuestra tarea necesitamos :

  • 1 x Arduino (cualquier versión sirve  siempre que pueda procesar señales  «PWM» )
  • 1 x LED IR   (usted puede conseguir éstos de cualquier TV remoto)
  • 1 x receptor IR (usted puede conseguir éstos de cualquier TV remoto)

 

Preparación para recibir señales

Para el análisis  de las señales infrarrojas  producidas por el mando del  dispositivo a controlar en primer lugar necesitaremos  un receptor de infrarrojos ,   que bien  puede proceder de   uno reciclado de cualquier viejo proyecto que ya no utilice  o bien adquirido específicamente  en el comercio

Una interesante opción son los famosos kits para Arduino que integran por unos 4€  todo los necesario para habilitar la comunicación en los dos sentidos  gracias a un led IRDa, un receptor IRDA  y un mando para pruebas.

Kit Modulo Receptor Infrarojo IR Protocolo Nec con Mando a Distancia Arduino

Como sugerencia  para captar el código correcto , deberíamos poner el receptor IR y el mando en una caja opaca  o algo que sea oscuro  lo cual  asegurará que habrá el mínimo de interferencias y  podremos tener el código más claro para que no tengamos que programar  nuestro  Arduino  muchas veces para una simple tarea. También, asegúrese de que estar alejados de personas viendo la televisión.

Realmente el circuito es bastante sencillo pues únicamente tendremos que alimentar con 5v DC  ( que podemos tomar directamente desde nuestro Arduino )   y luego conectar la salida del receptor digital al pin digital A2 de Arduino

 

Una vez montado el simple circuito del receptor de infrarrojo es hora de  subir el programa a su Arduino  para  poder descodificar la señal infrarroja .

El siguiente programa utiliza el Arduino y un PNA4602 para descifrar IR recibido lo cual se  puede utilizar para hacer un receptor de infrarrojos. (buscando un código en particular) o transmisor (pulsando un LED IR a ~ 38KHz para el duraciones detectadas,

Este código es de dominio público (visite http://www.ladyada.net y adafruit.com), pero en esta ocasión se ha traducido para que sea mas legible y fácil de entender:


// Necesitamos usar los métodos de lectura de pin ‘raw’  porque el tiempo es muy importante aquí y el digitalRead () es un  procedimiento s más lento!

IRpin_PIN PIND
IRpin 2

// el pulso máximo que escucharemos: 65 milisegundos es mucho tiempo
MAXPULSE 65000

// lo que debería ser nuestra resolución de tiempo, más grande es mejor ya que es más ‘preciso’ – pero demasiado grande y no se conseguirá  tiempo exacto
RESOLUTION 20

// almacenaremos hasta 100 pares de pulsos (esto son muchos )
uint16_t pulses[100][2]; // par es pulso alto  y bajo 
uint8_t currentpulse = 0; // indice para pulsos que estamos almacenando

void setup(void)

{
Serial.begin(9600);
Serial.println(«Ready to decode IR!»);
}

void loop(void)

{

// tiempo de almacenamiento temporal
uint16_t highpulse, lowpulse;

//empezar sin pulso 
highpulse = lowpulse = 0;

//esto es demasiado lento!
while (IRpin_PIN & (1 << IRpin)) {
// pin esta a nivel alto

// continúa otros microsegundos
highpulse++;
delayMicroseconds(RESOLUTION);

// Si el pulso es demasiado largo, ‘se agotó el tiempo’ – o bien nada / se recibió o el código está terminado, así que imprima lo que  hemos obtenido hasta ahora, y luego reiniciamos
if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();
currentpulse=0;
return;
}
}
// no nos detuvimos, así que escondamos la lectura
pulses[currentpulse][0] = highpulse;

// lo mismo que arriba
while (! (IRpin_PIN & _BV(IRpin))) {
// pin esta aun bajo
lowpulse++;
delayMicroseconds(RESOLUTION);
if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();
currentpulse=0;
return;
}
}
pulses[currentpulse][1] = lowpulse;

// leemos un pulso alto-bajo con éxito, ¡continuamos!
currentpulse++;
}

void printpulses(void) {
Serial.println(«\n\r\n\rReceived: \n\rOFF \tON»);
for (uint8_t i = 0; i < currentpulse; i++) {
Serial.print(pulses[i][0] * RESOLUTION, DEC);
Serial.print(» usec, «);
Serial.print(pulses[i][1] * RESOLUTION, DEC);
Serial.println(» usec»);
}
}


Una vez que hemos subido el código anterior  y  todo está configurado correctamente, abrir el serial monitor haciendo clic en el botón en el programa de Arduino que es el botón de un círculo en la imagen y  ya estára en marcha así que ahora usted necesitará encontrar un control remoto que desee usar para controlar algo con Arduino

El proceso  esquemáticamente  a seguir es el siguiente :

  1. Encontrar el mando a distancia del dispositivo  que quiere controla
  2. Ejecutar el código del  receptor anteriormente citado
  3. Presione el botón del mando cuyo  código desea obtener 
  4. Ver el Monitor Serial
  5. Pegar el todo el código del monitor serie  en un editor de texto 
  6. Repetir los paso 3, 4 6  con todos los botones del mando que desee descodificar 

 Interpretando las señales

Una vez siga la secuencia de paso anteriores recibirá un montón de números seguidos por «usecs» o «usec».
Asegúrese de que ha copiado la señal que se desea formateando la salida para más fácil referencia.

Se verá algo como esto:
500 usec, 300 usec
600 usec, usec 1200

Pero habrá números mucho más que eso.

Ahora en el programa emisor  verá esto bastantes veces:

delayMicroseconds();
pulseIR();

Es decir tenemos que  tomar el primer número y poner paréntesis en delayMicroseconds(«here»); el  valor obtenido en el monitor
y a su vez   tomar el segundo número de la misma línea como el de la delayMicroseconds()  valorar y poner en el paréntesis de pulseIR(); valor.

Veamos otro ejemplo .Si conseguimos esto en el monitor serial:

OFF ON
1660 usec, usec 580
1640 usec, usec 560

Ahroa para poner los  correspondiente valores en sus áreas correspondientes lo haremos asi :

delayMicroseconds(1660);
pulseIR(580);
delayMicroseconds(1640);
pulseIR(560);

Como puede apreciar ,la  tarea de transcripción  es muy fácil.

Una vez que tenga los códigos que desee, abra un nuevo  archivo IR_SEND.pde en el programa de Arduino y luego tendremos que  poner  los valores que tiene del monitor de serie entre paréntesis haciéndolo  del mismo modo  que hemos visto anteriormente .

Ahora, una vez que tenemos los códigos que desea y haya cargado el programa con la señal que desea enviar, todo lo que tiene que hacer es conectar el LED IR al pin 13 y luego a tierra  No necesita la resistencia si tiene un Duemilanove Arduino porque tiene una resistencia integrada para PIN 13, por lo que no tiene que preocuparse.


Como ejemplo veamos este código cuando se presiona el botón para subir el canal en un  control remoto de Comcast. . Aquí está el código de Serial Monitor: Recibido:

OFF  ON
36328 usec, 280 usec
820 usec, 300 usec
1580 usec, 320 usec
640 usec, 240 usec
2740 usec, 240 usec
1280 usec, 240 usec
1240 usec, 240 usec
1120 usec, 240 usec
2600 usec, 240 usec
12740 usec, 240 usec
840 usec, 240 usec
980 usec, 240 usec
700 usec, 240 usec
700 usec, 240 usec
720 usec, 240 usec
2460 usec, 260 usec
700 usec, 240 usec
700 usec, 240 usec
14904 usec, 260 usec
820 usec, 240 usec
1660 usec, 240 usec
700 usec, 260 usec
2740 usec, 240 usec
1240 usec, 240 usec
1260 usec, 240 usec
1100 usec, 240 usec
2620 usec, 240 usec
12720 usec, 260 usec
840 usec, 220 usec
2080 usec, 240 usec
1780 usec, 260 usec
700 usec, 240 usec
700 usec, 240 usec
2480 usec, 240 usec
700 usec, 240 usec
700 usec, 240 usec

Aquí está el código realizado a partir de los datos en bruto anteriores  pero no se  asociado al código  

En el siguiente  programa   se ha introducido  un detalla original ; Arduino cambiará el canal cada diez segundos para que se puedan hacer otras cosas , Por ejemplo mientras se ve televisión y esta haciendo otras cosa  así  no tendrá que cambiar el canal de modo que el sw  recorrerá los canales para que tenga las manos libres. (todos sabemos que presionar un botón es tan difícil, ¿por qué no hacerlo de forma automática?)

 

He aquí el programa realizado por Wally_Z:


int IRledPin =  13;    // LED conectado al pin digital 13

// El método setup () se ejecuta una vez, cuando comienza el boceto

void setup()   {               
  // initializa  el pin como salida :
  pinMode(IRledPin, OUTPUT);     

  Serial.begin(9600);
}

void loop()                    
{
  SendChannelUpCode();

  delay(20*1000);  // espera veinte segundos (20 segundos * 1000 milisegundos) Cambia este valor para diferentes intervalos.

}

// Este procedimiento envía un pulso de 38KHz al IRledPin  para un cierto  numero de microsegundos. Usaremos esto siempre que tengamos que enviar códigos.

void pulseIR(long microsecs)

{
  // contaremos desde la cantidad de microsegundos que se nos dice que esperemos

  cli();  // esto apaga cualquier interrupción de fond

  while (microsecs > 0) {
   // 38 kHz tiene aproximadamente 13 microsegundos de alto y 13 microsegundos de bajo
   digitalWrite(IRledPin, HIGH);  //Esto lleva alrededor de 3 microsegundos
   delayMicroseconds(10);         // esperar 10 microseconds
   digitalWrite(IRledPin, LOW);   // esto toma sobre 3 microseconds
   delayMicroseconds(10);         // esperar   10 microseconds

   // asi que  26 microseconds  todo junto
   microsecs -= 26;
  }

  sei();  // esto devuelve el control
}

void SendChannelUpCode()

{
  // Este es el código para CHANNEL + para TV COMCAST.
 
  delayMicroseconds(36328);      //Tiempo libre (columna IZQUIERDA)      
  pulseIR(280);                               //Tiempo en (columna DERECHA) <——- NO MEZCLAR ESTOS ARRIBA
  delayMicroseconds(820);
  pulseIR(300);
  delayMicroseconds(1580);
  pulseIR(320);
  delayMicroseconds(640);
  pulseIR(240);
  delayMicroseconds(1280);
  pulseIR(240);
  delayMicroseconds(1240);
  pulseIR(240);
  delayMicroseconds(1120);
  pulseIR(240);
  delayMicroseconds(2600);
  pulseIR(240);
  delayMicroseconds(12740);
  pulseIR(240);
  delayMicroseconds(840);
  pulseIR(240);
  delayMicroseconds(980);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(720);
  pulseIR(240);
  delayMicroseconds(2460);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(14904);
  pulseIR(240);
  delayMicroseconds(820);
  pulseIR(240);
  delayMicroseconds(1600);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(260);
  delayMicroseconds(2740);
  pulseIR(240);
  delayMicroseconds(1240);
  pulseIR(240);
  delayMicroseconds(1260);
  pulseIR(240);
  delayMicroseconds(1100);
  pulseIR(240);
  delayMicroseconds(2620);
  pulseIR(240);
  delayMicroseconds(12720);
  pulseIR(260);
  delayMicroseconds(840);
  pulseIR(220);
  delayMicroseconds(2080);
  pulseIR(240);
  delayMicroseconds(1780);
  pulseIR(260);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(2480);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
}

 

Via Instrucables.com

 

 

 

Como controlar cualquier electrodoméstico con mando vía wifi


Modernamente están apareciendo muchos electrodomésticos convencionales como equipos de Aire  Acondicionado , Robots de limpieza , Persianas eléctricas , TV , etc con la opción de poderlos controlar  a distancia gracias  a la  conectividad  WIFI ,lo cual puede ser muy interesante  para configurarlos , programarlos o activarlos no solo desde casa, sino incluso fuera de esta  , y con ello mejorar nuestra calidad  de vida  . El punto  negativo es que en la mayoría de los casos   incrementa  sustancialmente el precio  desgraciadamente frente a los  equipos convencionales que no cuentan  con  dicho control y ademas  si contamos con equipos instalados operativos  pero sin esa funcionalidad de control por wifi   , no es una razón de peso para desechar estos¿no?. 

Asimismo ,como sin duda el lector conocerá, cada día  son mas frecuentes los asistentes de voz  como Alexa de Amazon , Google Home o el propio novedoso Aura de Movistar , todos ellos que poco podrán hacer sobre dichos  equipos  a controlar, si no disponen de los  módulos de control  correspondientes. Por ejemplo   con un Amazon Echo Dot o un Google Home Mini  si quiere enseñarle a encender el aparato de Aire Acondicionado  antes de llegar a casa o encender la TV   cuando olvida el mando a distancia lejos del sofá  no podrá hacerlo fácilmente   directamente  pues estos equipos no están preparados par ser controlados por dichos asistentes ,  pero no se alarme, porque   en efecto  no hace falta invertir una gran suma de dinero en cambiar dicho aparato , pues nos bastara ,  si este equipo es controlable   por infrarrojos o RF , de  instalar  un control remoto de luz infrarroja compatible con Alexa o Google Home  que haga las veces de «puente» entre ambos mundos.

Como opción interesante para controlar nuestros dispositivos en el salón destaca el Broadlink RM mini3, un pequeño dispositivo  que  puede controlar sin limitaciones  a  todos los dispositivos y dispositivos controlados con mandos a distancia por infrarrojos  o  que  emiten radiofrecuencia  en las frecuencias de 433 Mhz y 315 Mhz en toda la casa. ( excepto si el código es variable, Broadlink Rm Pro no puede admitirlo) 

 El BroadLink en cuestión tiene el tamaño de un vaso de chupito   contando con  varios leds de infrarojos  repartidos en la cabeza en forma 360° , que hacen que su área de actuación sea muy buena, por ejemplo  para encender el aire acondicionado antes de llegar a casa o para simular presencia encendiendo la tele  gracias a  una app específica para Europa (Intelligent Home Center For EU  , la cual se rige por el Reglamento General de Protección de Datos de la Unión Europea, famoso por ser estricto con el manejo de datos personales).

 

 Con este tipo de dispositivo podremos reemplazar  todos los controles remotos  por  su teléfono inteligente, pues cuenta con soporte para más de 80,000 dispositivos controlados por infrarrojos como aire acondicionado, TV, DVD, PVR, CD, SAT, aire acondicionado, persianas eléctricas, lámparas, purificadores, WiFi, reproductores BluRay, proyectores , Unidades de CA, salidas de RF, ventiladores y mucho más.

Aunque se ha comentado alguna  vez en este blog ,para saber si un mando es IR o RF, enfoque con la cámara del móvil a la punta del mando que controle ese dispositivo y pulse un botón: si en la pantalla del móvil  se ve un destello de  luz azul/blanca, es IR ( si no se ve nada, es de RF).

 

 

Los pasos a seguir para la instalación del el Broadlink RM mini3,  son realmente  muy sencillos:

  1. Instalar la app en el móvil ( esta disponible tanto para Android  como para  iOS)
  2. Enchufarle  una conexión de 5v  por el conector micro-USB ( no esta incluido el adaptador )                                                                                     ,
  3. Abriremos la   app   (esta disponible tanto para Android  como para  iOS)  y vincularemos el  Broadlink RM mini3,por  bluetooth a nuestro terminal                                                                       .
  4. Tendremos que conectar  el  Broadlink RM mini3 a nuestra red wifi añadiendo las credenciales  de nuestra red. Este modelo solo es compatible con redes de 2,4 GHz, pero no 5G  y la  contraseña de Wifi debe ser de  menos de 32 bytes, sin espacios y símbolos especiales, solo con alfabeto y número,
  5. Seguidamente añadiremos el  dispositivo a controlar  para lo cual elegiremos el  tipo de dispositivo, buscando  este modelo en la base de datos   que ofrece la propia aplicación  
  6. Probaremos  si funciona el control remoto desde la propia app , pero  si no funciona , cambiaremos  de modelo  hasta que reaccione)
  7. Si el control remoto no reconoce el dispositivo, puede copiar la señal del mando a distancia manualmente (pero los dispositivos que no están en la base de datos de BroadLink no son compatibles con los asistentes de voz)
  8. Repetiremos el proceso  para  todos los dispositivos controlados por infrarrojo que el BroadLink RM mini 3 tenga a su alcance  como puede ser los equipos de  aire acondicionado, televisores, equipos de música,lectores de dvd o blueray , descodificadores  de televisión de pago ,  barra de sonido, robot aspirador, reproductor multimedia, persianas eléctricas, etc..
  9. .El siguiente paso es configurar escenas que luego usaremos como comandos de Alexa o Google Home. Por  ejemplo para el televisor podemos tener varias  escenas para «encender la television»  o apagar la televisión  o incluso subir o bajar el volumen   o para el equipo de aire acondicionado  por ejemplo podemos tener una escena “calienta la casa” que sube la temperatura a 26 ºC y otra  escena “enfría la casa” que baja la temperatura a 18 ºC.
  10. El último paso es conectar la app de BroadLink con el altavoz inteligente. Hay un manual de instrucciones en el menú Más > Añadir servicio de voz, pero en resumen tenemos que abrir la aplicación Alexa o Google Home en el móvil e instalar la skill o servicio correspondiente. El asistente reconocerá automáticamente los nuevos dispositivos y sus comandos o escenas. Llegados a este punto  ya podrá decir “enciende el aire acondicionado”, “pon el aire acondicionado en modo calefacción” o “enfría la casa” para que el altavoz inteligente se comunique con el control remoto y este, a su vez, envíe la orden al aire acondicionado. También puedes decir “enciende la tele”, “silencia la tele” o “pon La Sexta” para que el control remoto envíe esas órdenes al televisor, aunque no sea una Smart TV ni nada parecido.
  11. Si puede  añadir un nivel de complejidad, creando rutinas desde las apps de Alexa y Google Home para encender las luces del salón de un color determinado cuando ponga el fútbol, conectar  la calefacción todos los días a una hora determinada o apagar el equipo de música cuando enciende la tele. 

 

Conclusiones 

Puede ser interesante para poder manejar la tele, aire acondicionado, bomba de calor y decodificador con el móvil pero sobre todo mediante un asistente de voz como  Google Home o Alexa 

Si nos remitimos al móvil , gracias a este dispositivo se pueden manejar multitud de aparatos sin problemas, configurarse  estos  fácilmente desde la aplicación y enseguida se pueden usar todos, desde casa o fuera de ella ( eso si sólo aquellos que usen infrarrojos  no Radiofrecuencia)

La app ademas permite poner temporizadores para que automáticamente la aplicación ejecute la función del aparato que se desee, en una hora o día concreto, o cada cierto tiempo. También existen los ambientes, que permiten ejecutar varios pasos automáticamente que nosotros indiquemos, de uno o varios aparatos, con un solo click. 

La pega viene con su compatibilidad con Google Home ya que no es del todo correcta. Para el RM Mini3 hay dos app, versión global y europea, que se usan igual para configurar los mandos, pero con la primera de ellas, Google Home no integra ni detecta los dispositivos, sólo los ambientes, y no los ejecuta bien. Con la otra, la europea, Google Home integra los dispositivos, pero solo las de tipo lámpara y tipo aire acondicionado, no las TV ni otros aparatos personalizados.

Respecto a Alexa , aunque la configuración a través de ambientes , escenas y rutinas se hace ardua y repetitiva una vez conseguida el funcionamiento es perfecto. Puedes controlar todo aparato que use infrarojos  que tenga en la misma habitación, y la función de aprendizaje de botones te facilita muchas tareas, así como las funciones pre-configuradas que otros usuarios ya han colgado en el servidor.  Es   un aparato imprescindible en dúo con Alexa.

En el siguiente video podemos ver un ejemplo de integración de Alexa con el Broadlink RM mini3,

https://youtu.be/WURpCSKfd_U

Por cierto este  puente  de infrarrojos con wifi   se puede comprar  en Amazon por unos 24,99,   pero tenga cuidado porque hay otros modelos de Broadlink  algo mas económicos que no son controlables por asistentes de voz como Alexa o Google Home.Si necesita controlar aparatos que vayan por radiofrecuencia en lugar de infrarrojos necesitarás su hermano mayor…. El pro