Interpretando mando infrarrojos con dsPIC

Se interpreta la trama recibida del mando a través de un TSOP1738.
Gestión vía interrupciones, dejando al micro libre para otras tareas.


A menudo nos vendría bien conectar a nuestros proyectos un teclado para poder interactuar con él de forma fácil. Hay varias alternativas, siendo la más típica la del teclado de matriz 4×3 o 4×4, que requieren 7 u 8 pines respectivamente. Teniendo en cuenta que en cualquiera de nuestras casas hay un montón de mandos -no se en la vuestra, pero en la mía roza la locura- os propongo una solución que a mi entender está llena de ventajas: la utilización de un mando a distancia estándar para enviar comandos al dsPIC.

Las ventajas son evidentes, puesto que es una solución económica (el receptor sólo cuesta 2 euros), utilizas sólo un pin del micro, y se gestiona por interrupciones sin que se utilicen recursos en el programa principal. Todo ello sin olvidar la ventaja que supone en determinadas aplicaciones poder hacerlo a distancia .

Y ahora, sin más preámbulos, vamos al tajo.

CONEXIONES
El receptor que utilizo en este proyecto es un TSOP1738 y como os digo, viene a costar unos dos euros. Sólo tiene tres pines, los dos de alimentación y la salida de datos. Y esta maravilla se encarga él solito de amplificar la señal que recibe, separarla de la portadora de 38KHz y enviarnos los bits limpitos para nuestro proceso. Si la frecuencia a la que esté modulada la señal de vuestro mando es distinta, tendréis que poner un TSOP17XX; los hay de 30, 36, 38 y 40 KHz. Adicionalmente he de deciros que el TSOP se encuentra disponible con varios nombres, por lo que si en vuestra tienda no lo conocen podéis intentárlo con algún sinónimo como el TFMS.

La entrada que vamos a utilizar en el dsPIC es cualquiera del módulo Input Capture , en nuestro caso usaremos el pin IC7 de un dsPIC 30F4011. El módulo Input Capture nos permite medir el tiempo transcurrido entre pulsos de entrada y levanta la interrupción asociada. Dicho módulo se puede configurar para que llame a la interrupción con cada flanco con independencia del signo, o con cada flanco de bajada, o con cada flanco de subida, o cada 4 o 16 flancos. Cada vez que se lanza la interrupción tendremos una medición del tiempo transcurrido desde el último evento en un registro del dsPIC. Esta medición es bastante precisa porque la hace el módulo a nivel hard y será independiente del programa.

La conexión entre el TSOP y el dsPIC es directa, sin necesidad de interponer ningún componente.

PREPARATIVOS
Para poder acometer el proyecto, es necesario conocer perfectamente qué tipo de trama nos envía el mando que vamos a usar, y para ello nada mejor que un osciloscopio. Pero no os asustéis, no necesitáis más que un conector tipo Jack conectado a la entrada de Línea de vuestro PC y un programa como OSCILOSCOPIO VIRTUAL para que la tarjeta de audio haga todo el trabajo. La señal del mando es lo suficientemente lenta como para poder verla sin mayor problema. Aquí os dejo la foto de la señal que envía mi mando:

En dicha foto se observa claramente como tras un largo bit de Start, la señal está compuesta por ceros y unos que se distinguen por su ancho de pulso a nivel alto.

Con esta información ya podemos consultar en esta web en la que vienen explicados la mayoría de los protocolos más comunes:

http://www.sbprojects.com/projects/ircontrol/ircontrol.htm

Al revisar de un vistazo los que hay, vemos perfectamente como mi mando está usando el protocolo NEC:

El protocolo NEC envía 4 bytes, en los cuales repite dos veces la dirección y dos veces el comando; en ambos casos primero envía el byte normal y luego su complemento. Por tanto, como lo que nos interesa es la parte que distingue a una tecla de otra, nos quedaremos con el comando, y como nos da igual qué comando sea mientras podamos distinguir las teclas, nos quedaremos con los últimos 8 bits de la trama.

EXPLICACIÓN DEL PROGRAMA
Encabezado y definiciones
Aquí definimos los fuses, las librerías y las variables globales que utilizaremos. También están las funciones que sirven para los retardos.

Inicialización de la UART
La UART sólo la usaremos para poder enviar al puerto serie la lectura del mando. No es el objetivo ahora explicar su funcionamiento, por lo que sólo pegaré aquí la rutina de inicialización:

Rutina principal
El programa principal inicialmente configura los TRIS, inicia la UART y muestra un mensaje de arranque.

A continuación se configura el Timer3 y el módulo Input Capture. Con estas líneas establecemos que debe saltar una interrupción cada vez que entre un flanco descendente (IC_EVERY_FALL_EDGE) en el pin IC7 (ConfigIntCapture7). En dicha interrupción encontraremos almacenado el dato del Timer4, que lleva un prescaler de 64 (T3_PS_1_64) .

Ahora ya todo el trabajo nos lo hace la interrupción, y en el programa principal sólo tendremos que comprobar si ha volcado algún dato en la variable TSOP_Dato comprobando el flag TSOP_HayDato.

Interrupción de Captura
La interrupción de captura es la clave del proceso, y se encuentra autocomentada, por lo que será mejor que la veamos directamente:

FUNCIONAMIENTO
El funcionamiento es simple: sólo hay que enfrentar el mando y pulsar para que vayan apareciendo bytes capturados en el Terminal. En las pruebas que he hecho el TSOP recibe perfectamente desde una distancia de 5 metros a plena luz del día:

Encontrarás el código fuente completo en la zona de Descargas.

Share