En este artículo vamos a ver una manera muy sencilla, rápida y barata de aprovechar cualquier mando a distancia que tengamos por casa para interactuar con un PIC, aunque el mismo método se puede adaptar de forma muy simple a una placa Arduino o cualquier otro tipo de microcontrolador.
La idea es aprovechar algún aparato viejo para obtener el sensor de IR y el mando a distancia, aunque también podemos comprar por poco dinero ambos elementos (entorno a 2€ el conjunto o 1€ el sensor). Yo he probado con el mismo sensor (tipo 1838B) los mandos a distancia que tengo en casa y funcionan todos correctamente, pero no puedo garantizar que eso sea así para todo el mundo, ya que existen diversas codificaciones y frecuencias de modulación en función del fabricante. La forma más fácil de que todo vaya bien es comprar el pack de receptor y mando.
El sensor es como un led de color negro con tres patas, dos de ellas sirven para alimentarlo y la tercera nos devuelve la señal en forma de un tren de pulsos.
En mi caso el datasheet indica que la pata izquierda es la señal, la central 0V y la derecha +Vcc (de 2.7V a 5.5V).
Lo que voy a hacer ahora es poner el osciloscopio en la pata de señal para ver que es lo que obtenemos al salida al pulsar los botones de diferentes tipos de mando a distancia.
Enchufamos la fuente de 5V entre las patas central y derecha y ponemos la pinza del osciloscopio en la pata izquierda. Lo primero que vemos es que cuando no hay señal IR obtenemos 5V y cuando se pulsa un botón del mando aparecen varios trenes de pulsos. Si congelamos uno de ellos vemos lo siguiente:
Cada mensaje empieza con un pulso «muy largo» de unos 9 ms a 0 y luego otro pulso de unos 4 ms a 1 y luego una trama que depende en parte del botón que se ha pulsado y en parte del modelo del mando a distancia.
En este artículo vamos a buscar la aplicación más simple posible así que simplemente intentaremos detectar con el micro el primer flanco de la señal y con eso encenderemos y apagaremos un led conectado a una pata.
Usaré una maqueta de un PIC18F1320 a 20MHz y conecto en RA0 el sensor y en RB3 el led con una resistencia en serie de 1K.
El programa muestréa continuamente la entrada RA0 y cuando se pone a 0 cuenta el tiempo hasta que vuelve a ser 1 y si es mayor de 8 ms cambia el estado del led.
#include <main.h> void main() { int16 t0; setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); //1.6 us while(TRUE) { if (!input(PIN_A0)) { t0=get_timer1(); while (!input(PIN_A0)); if ((get_timer1()-t0)>5000) { output_toggle(PIN_B3); delay_ms(100); } } } }
Se puede hacer aun más simple eliminando el timer1 y poniendo un delay un poco más largo, de 1 sg por ejemplo con lo que el programa queda reducido a 3 líneas:
#include <main.h> void main() { while(TRUE) { if (!input(PIN_A0)) { output_toggle(PIN_B3); delay_ms(1000); } } }
Y por supuesto se puede decodificar el tren de pulsos y diferenciar la tecla pulsada para realizar diferentes acciones pero eso lo veremos en algún otro momento.