You are on page 1of 22

BENEMRITA UNIVERSIDAD AUTNOMA DE PUEBLA

FACULTAD DE CIENCIAS DE LA ELECTRNICA

CONTROL REMOTO INFRARROJO SONY

Alumno:
Ziga Lpez Jos Alberto Aguilar Prez Oscar Abelardo Prez Romero

ASIGNATURA: INTERFACES

PROFESOR:
M.C. ARROYO DIAZ SALVADOR ANTONIO

Puebla de Zaragoza, a 7 de diciembre del 2008

DECODIFICACION DE CONTROL REMOTO INFRARROJO SONY

El presente proyecto tiene como objetivo la decodificacin de un control remoto infrarrojo Sony con el fin de utilizarlo en aplicaciones diversas, en este caso se utilizo para poder enviar comandos a una PC por el puerto serial utilizando el protocolo de comunicacin RS232 y la adquisicin de los datos se hizo con un programa en Visual c++, la decodificacin se hizo con un PIC16f628 el cual, a su vez controla un carro a control remoto de RF, este control remoto forma parte de un proyecto final el cual mas adelante se describir y se explicara el uso de este control remoto en dicho proyecto. Para poder explicar como se llevo a cabo la decodificacin del tren de pulsos del control remoto es necesario explicar el protocolo de comunicacin infrarroja de SONY, cabe aclarar que para cada marca de equipos electrnicos existe un protocolo diferente, en el caso de SONY es el RC-5. Teora de Operacin Sony utiliza una codificacin bit-width, es decir, un pulso alto de 2.6ms para indicar elencabezado, seguido de un pulso bajo de 400s y luego un pulso alto de 800s o de 1400s para indicar un 0 o un 1 respectivamente. Normalmente a la salida de cualquier modulo detector de IR la seal se muestra invertida, tal como se muestra en la figura 2.

La codificacin Sony consiste en un cdigo de 12 bits, los primeros 7 bits corresponden al comando o tecla presionada y los ltimos 5 bits corresponden a la direccin del dispositivo, ver Fig.3. La transmisin es realizada serialmente primero se enva el comando partiendo de los bits menos significativos (LSB) y luego la direccin del dispositivo partiendo igualmente de los LSB del mismo. Si se deja presionada una tecla, la transmisin del comando y la direccin del dispositivo es repetitiva cada 25s.

La siguiente tabla muestra las teclas ms comunes del control remoto y el valor en binario y decimal de cada comando. Esta tabla fue realizada utilizando un pequeo hardware para captar las seales del control remoto y analizador lgico el cual resulta muy interesante ya que corre en Windows 98 y se pueden monitorear hasta cuatro seales en tiempo real conectadas al puerto paralelo de la pc . En el analizador lgico podemos observar el encabezado seguido de 12 bits. Nuestro inters se centra en los primeros 7 bits que corresponden al comando; se le agrega un octavo bit puesto a cero para completar un byte y as poder trabajar mejor a nivel del software. La direccin del dispositivo son cinco bits igual para todos los comandos y que identifica, como su nombre lo indica, al dispositivo o control remoto. Este campo no es de inters prctico en el presente trabajo.

COMANDO 1 2 3 4 5 6 7 8 9 0 Volumen + Volumen Chanel + Chanel Enter Flecha up Flecha down Flecha right Flecha left

BINARIO 00000001 1000000 0100000 1100000 0010000 1010000 0110000 1110000 0001000 1001000 0100100 1100100 0000100 1000100 1101000 0010111 1010111 1100110 0010110

DECIMAL 0 1 2 3 4 5 6 7 8 9 18 19 16 17 11 116 117 51 52

ANALIZADOR LOGICO

Se me hizo necesario el uso de un analizador lgico para poder ver las seales que se reciben y mandaban por el puerto en cada momento, pero como no tengo uno ni dinero para comprrmelo, me tuve que montar uno con un AMD K6 viejo que tena en casa y con ayuda del programa Logic Analyzer de Logixell. He aqu algunas fotos de mi mesa en pleno desarrollo y algunas capturas del analizador en el AMD K6.

Deteccin de luz infrarroja La deteccin de luz infrarroja la podemos realizar a travs de los denominados mdulos IR. Estos mdulos de IR son capaces de detectar una seal codificada modulada normalmente a 38Khz. La modulacin se realiza para evitar la falsa informacin que produce la luz infrarroja ambiental. Los mdulos infrarrojos constan de 3 pines: seal, comn y VCC.

Fig. 4 Modulo Detector de IR Radio

Hardware El hardware diseado para este proyecto se muestra en la figura 5. En el podemos destacar la comunicacin va serial conectado al MAX232 para hacer la conversin de voltajes entre RS232 y TTL conectados al puerto B del microcontrolador cuyo fin es visualizar el comando recibido en binario. El mdulo IR es conectado al pin RB5 el cual se configura como entrada en el microcontrolador. El Pin MCLR el cual esta desactivado y con el oscilador interno activado. El mdulo IR utilizado es similar al presentado en la figura 4. La frecuencia de trabajo es de 4Mhz y todo el circuito es alimentado con +5 voltios.

Integrado MAX232: Los circuitos con letra T son "Transmitters", que trasladan nivel TTL/CMOS en su entrada a nivel RS232 en su salida. Los circuitos con letra R son "Receivers", que trasladan seales RS232 en su entrada (que pueden ser de hasta +30/-30 V) a nivel TTL/CMOS en su salida.

Distribucin de patas (con sus funciones) del PIC 16F628A. El PIC 16F84A puede estar muy bien como eleccin para comenzar, pero la nica razn que va quedando para hacerlo es que la mayora de los ejemplos de programa y de circuito que se encuentran por all estn realizados sobre l. En base a lo dicho en el prrafo anterior, entonces el PIC 16F628A es igual de elegible, ya que es un reemplazo prcticamente directo de nuestro famoso microcontrolador "de batalla". Pero por qu cambiar, si ambos estn disponibles en el mercado? Por una razn muy simple: el PIC 16F628A tiene ms memoria de programa (el doble), ms RAM, ms EEPROM, ms modos de uso, ms timers, y ms prestaciones, incluyendo la que aprovechamos en este diseo, el puerto serie implementado por hardware.
COMPARACIN

El microcontrolador se comunica utilizando su puerto serie. He programado este puerto a una velocidad de 9600 baudios, un formato de dato de 8 bits, sin paridad, un bit de parada, y sin ningn control de flujo.

HABLEMOS DEL SOFTWARE: Hay dos programas hechos en ensamblador en los cuales me base para hacer el programa del pic, a continuacin muestro los dos programas y finalmente el programa para el pic el cual por las prisas fue echo en Pic basic Pro.

Software
;********************************************************************** ; Programa para decodificar un tren de pulsos codificados en * ; formato Sony para el Microcontrolador PIC16F84 @ 4Mhz. * ; * ; Este programa es una adaptacin del programa del autor Jim Nagy * ; presentado en el articulo DS40160A/6_007 Michochip Technology Inc.* ; * ; * ;********************************************************************** ; * ; Filename: decosony.asm * ; Date: 20/08/2001 * ; File Version: 1.0 * ; * ; Author: Carlos A. Narvaez V. * ; Company: Universidad de Oriente * ; * ; * ;********************************************************************** list p=16F84 #include <p16F84.inc> __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;******* Eques del Programa Zero Carry IR EQU EQU EQU 2 0 4

; RA4

input IR

;******* Definicin de las teclas del Control Remoto Power ChanelL ChanelP TvVtr EQU 0x15 EQU 0x11 EQU 0x10 EQU 0x4A Rew EQU 0x1B Play .EQU 0x1A FF EQU 0x1C Stop EQU 0x18 EQU 0x19

Pause

;******* Definicin de Variables Temp CntrLo byte) CntrMid byte) CntrHi byte) BitCnt Command EQU EQU EQU EQU EQU EQU 0x0D 0x0E 0x0F 0x10 0x11 0x12 ; Contador de tiempo (low ; (middle ; (high ; Contador de bits ; Ultimo comando recibido ; vector reset del init ; ir a comienzo del

ORG 0x000 procesador goto programa

; Subrutinas ; ;********************************************************************** ; Delay ; Espera por aproximadamente W mseg y retorna ;********************************************************************** Delay CLRF Temp d1 NOP DECFSZ Temp,F ; Lazo 255 * 4uS GOTO d1 MOVWF Temp ; repita el lazo W veces DECFSZ Temp,W GOTO Dela y RETLW 0 ;********************************************************************** ; GetaByte espera hasta 2 segundos por 12 bits. Los datos ; Sony son enviados como 7 bits del comando y 5 bits ; del cdigo de dispositivo, en ambos casos los LSB ; primero. Slo necesitamos el comando de 7 bit al cual ; agregamos un octavo bit puesto a cero para completar ; un byte ;********************************************************************** GetaByte CLRF CntrLo ; reset contadores MOVLW 0x80 MOVWF CntrMid CLRF CntrHi gb1 INCF BTFSC CntrLo,F ; Espera por una seal

STATUS,Ze ro INCF CntrMid,F BTFSC STATUS,Ze ro INCF CntrHi,F MOVLW D'3' SUBWF CntrHi,W 2seg) BTFSC GOTO main BTFSC PORTA,IR seal Goto ; ; Hay seal CALL BTFSS GOTO ; ; ; HdrCheck STATUS,Carry gb1

; pero no mas de 2 seg ; (2.5*256*256*12us ~ STATUS,Carry ; aborte si el tiempo se excede ; sino cheque a ver si hay gb1 ; y sino, loop

; ver si es un encabezado

Es un encabezado...continue Lee los primeros 7 bit. Resultado en Command MOVLW D'7' MOVWF BitCnt CLRF Command gb2 CALL GetaBit RRF Command ,F DECFSZ BitCnt,F GOTO gb2 RRF Command,F BCF Command,7 ; preparado para recibir 7 bits

; agrega un 8 bit ; puesto a cero

Lee 5 bit Cdigo del dipositivo pero los ignora

; bits gb3 MOVLW D'5' MOVWF BitCnt CALL GetaBit DECFSZ BitCnt,F GOTO gb3 ; Preparado para recibir 5

Como test final, asegurese que son solo 12 bits los recibidos CLRF CLRF BTFSS CntrLo CntrMid PORTA,IR ; Reset contadores ; Chequee que no hay seal por el ; resto del main ; Si CntrLo,F ; Cheque cuanto he esperado ; (4*256*10us = STATUS,Carry ; loop hasta que los 10ms expiren

gb4

frame GOTO hay aborte INCF BTFSC STATUS,Zero INCF CntrMid,F MOVLW D'4' SUBWF CntrMid,W 10ms) BTFSS GOTO gb4 RETLW 0

;********************************************************************** ; GetaBit Determina el valor del bit que se esta recibiendo. ; Retorna con carry = 1 si el bit = 1 y carry = 0 si el bit = 0 ; Los bits Sony son codificados como 400us sin portadora (low) seguido ; de 800us de portadora (high) para un "0" o 1400us para un "1". ;********************************************************************** GetaBit CLRF CntrLo ; Reset contador b1 INCF CntrLo,F ; determne tiempo de no portadora MOVLW D'100' SUBWF CntrLo,W ; permite hasta 800us (100*8us) BTFSC STATUS,Carry GOTO main ; aborte si es mayor BTFSC PORTA,IR ; mantengase contando portadora viene GOTO b1 ; ; Un espacio menor que 800us fue recibido MOVLW SUBWF BTFSS GOTO ; b2 D'25' CntrLo,W STATUS,Carry main ; Asegurese que es mas grande que ; 25*8us = 200us ; aborte si es menor

Determine la longitud del pulso IR que esta siendo recibido CLRF CntrLo INCF CntrLo,F MOVLW D'225' SUBWF CntrLo,W (255*8us) BTFSC GOTO main BTFSS PORTA,IR GOTO b2 ; Cuente este pase ; Permita hasta 1800us STATUS,Carry ; Aborte si es mayor ; siga contando hasta final pulso

Seal presente MOVLW SUBWF BTFSS GOTO D'50' CntrLo,W STATUS,Carry main ; Asegurese que es mayor que ; 50*8us = 400us ; Si no aborte

Que es: un 1 o un 0 MOVLW SUBWF RETLW End D'125' CntrLo,W 0 ; Compare con un ancho de 1000us ; Carry 1 o 0

SEGUNDO PROGRAMA SOBRE COMUNICACION SERIAL ENTRE LA COMPUTADORA Y EL PIC16F628. ;******************************************************************* ; INTERFAZ SERIE RS232 - ECO Y DISPLAY EN LEDS ; CONVERTIDOR SERIE RS232 - PARALELO 8 BITS ;******************************************************************* LIST P=16F628, R=DEC ; Usar el PIC16F628 y sistema decimal

#include "P16F628A.INC" ; Incluye datos de PIC16F628A CONFIG _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF ;******************************************************************* ; CONFIGURACION ;******************************************************************* ; El PIC es configurado para usar todas las entradas y salidas ; posibles = 16. Por eso no se usa el oscilador con cristal externo, ; lo que deja libres las patas 15 y 16 para usar como bits de puerto. ; Se define el clock interno a 4 MHz. No se usa el master reset ; (pata 4), que queda convertida en el Puerto A, bit 5 (entrada). ;******************************************************************* ; VARIABLES ;******************************************************************* contador EQU dato_serie 0x28 EQU ; variable 0x29 ; dato serie desde la PC

;*******************************************************************

ORG

0x000

; El programa empieza en 0x000

;******************************************************************* ; Inhibe comparadores ;******************************************************************* movlw 7 movwf CMCON

; CMCON=7 inhibir los comparadores

;******************************************************************* ; Inicializar Puertos ;******************************************************************* movlw b'00000000' ; valor inicial portA movwf PORTA movlw b'00000000' ; valor inicial portB movwf PORTB bsf STATUS,RP0 movlw b'00000000' movwf TRISA ; Pg 1 RAM

; salidas (para mostrar el dato en LEDS) ; de estas salidas, no usaremos ; PORTA 4, que tiene salida open drain, y ; PORTA 5, que slo puede ser entrada ; RB0 entrada ; RB1 (RX) = entrada ; RB2 (TX) = salida ; RB3 = entrada ; RB2 = salida del bit 4 del dato a LEDS ; RB5 = salida del bit 5 del dato a LEDS ; RB6 y RB7 = entradas

movlw b'11001011'

movwf TRISB ;******************************************************************* ; BAUD RATE para la comunicacin RS232 ; y otras definiciones para USART ;******************************************************************* ; Baud Rate = 9600, Sin Paridad, 1 Bit parada ; movlw 0x19 ; 0x19=9600 bps (0x0C=19200 bps) movwf SPBRG movlw b'00100100' ; movwf TXSTA ; habilita la transmisin Async bcf STATUS,RP0 ; RAM PAGE 0

movlw b'10010000' movwf RCSTA

; habilita de recepcin Async

;******************************************************************* ; TIEMPO DE ESTABILIZACION ;******************************************************************* clrf contador estab decfsz contador,F goto estab movf RCREG,W movf RCREG,W movf RCREG,W call Bienvenida

; vaca el buffer de recepcin ; enva mensaje de bienvenida

;******************************************************************* ; LAZO PRINCIPAL ;******************************************************************* loop clrw btfss PIR1,RCIF ; (5) se fija si hay dato RS232 goto loop ; no, no lleg call recibeRS232 ; s, hay movwf dato_serie ; guarda dato (para uso de cualquier rutina) call enviaRS232 ; enva el eco a la PC call muestra ; muestra el caracter recibido en LEDS goto loop ;******************************************************************* ; RECIBE CARACTER SERIE - RS232 - DESDE LA PC ;******************************************************************* recibeRS232 movf RCREG,W return

; guarda dato recibido en acumulador

;******************************************************************* ; ENVIA CARACTER SERIE - RS232 - A LA PC Y ESPERA A QUE HAYA SALIDO ;******************************************************************* enviaRS232 movwf TXREG bsf STATUS,RP0

; envo el dato en acunulador w ; Pg 1 RAM

Espere

btfss TXSTA,TRMT goto Espere bcf STATUS,RP0 return

; transmision completa si es alto ; Pg 0 RAM

;******************************************************************* ; MUESTRA DATO ;******************************************************************* muestra movf dato_serie,w ; recupera el dato guardado movwf PORTA ; exhibe el dato en LEDS en PORTA btfss dato_serie,4 ; pero, como el PORTA tiene el bit 4 que es bcf PORTB,4 ; open drain, nos conviene poner btfsc dato_serie,4 ; el bit 4 del dato en otra salida; bsf PORTB,4 ; lo hacemos en el bit 4 del PORTB. btfss dato_serie,5 ; y , como el PORTA tiene el bit 5 que es bcf PORTB,5 ; slo usable como entrada, tenemos que poner btfsc dato_serie,5 ; el bit 5 del dato en alguna salida; bsf PORTB,5 ; lo hacemos en el bit 5 del PORTB. return ;******************************************************************* ; MENSAJES ;******************************************************************* Bienvenida ; los primeros caracteres 0x00 son ; para estabilizacin del circuito movlw 0x00 call enviaRS232 movlw 0x00 call enviaRS232 movlw 0x00 call enviaRS232 movlw 0x00 call enviaRS232 movlw 0x00 call enviaRS232 call msgCR movlw 'H' call enviaRS232 movlw 'o' call enviaRS232 movlw 'l' call enviaRS232 movlw 'a'

call movlw call movlw call movlw call movlw call movlw call movlw call msgCR movlw call movlw goto END

enviaRS232 '' enviaRS232 'a' enviaRS232 'm' enviaRS232 'i' enviaRS232 'g' enviaRS232 'o' enviaRS232 0x0D enviaRS232 0x0A enviaRS232

PROGRAMA PRINCIPAL DEL PIC16F628 PARA LA TARJETA RECEPTORADECODIFICADORA '**************************************************************** '* Name : decoder infra.BAS * '* Author : Jos Alberto Ziga Lpez * '* Notice : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] * '* : All Rights Reserved * '* Date : 17/11/2008 * '* Version : 1.0 * '* Notes : trabajando al 100% * '* : * '**************************************************************** 'INCLUDE "bs1defs.bas" w0 VAR word b0 VAR WORD b1 VAR WORD b2 VAR WORD b3 VAR WORD b4 VAR WORD b5 VAR WORD b6 VAR WORD

b7 VAR WORD b9 var word TRISB = %00000000 TRISC = %00000000 TRISD = %00000001

Main: PulsIn PORTD.0,0,w0 IF w0< 200 Then Main PulsIn PORTD.0,0,b0 PulsIn PORTD.0,0,b1 PulsIn PORTD.0,0,b2 PulsIn PORTD.0,0,b3 PulsIn PORTD.0,0,b4 PulsIn PORTD.0,0,b5 PulsIn PORTD.0,0,b6 PulsIn PORTD.0,0,b7 GoSub detectair GoTo Main detectair: IF b0<80 Then b0=0 Else b0=1 EndIF IF b1<80 Then b1=0 Else b1=1 EndIF IF b2<80 Then b2=0 Else b2=1 EndIF IF b3<80 Then b3=0 Else b3=1 EndIF

IF b4<80 Then b4=0 Else b4=1 EndIF IF b5<80 Then b5=0 Else b5=1 EndIF IF b6<80 Then b6=0 Else b6=1 EndIF b7=0 b9=(128*b7)+(64*b6)+(32*b5)+(16*b4)+(8*b3)+(4*b2)+(2*b1)+(1*b0) IF b9=0 Then high PORTB.7 Else low PORTB.7 EndIF IF b9=1 Then high PORTB.6 Else low PORTB.6 EndIF IF b9=2 Then high PORTB.5 Else low PORTB.5 EndIF IF b9=3 Then high PORTB.4 Else low PORTB.4 EndIF IF b9=4 Then

high PORTB.3 Else low PORTB.3 EndIF IF b9=5 Then high PORTB.2 Else low PORTB.2 EndIF IF b9=6 Then high PORTB.1 Else low PORTB.1 EndIF IF b9=7 Then high PORTB.0 Else low PORTB.0 EndIF IF b9=8 Then high PORTD.7 Else low PORTD.7 EndIF IF b9=9 Then high PORTD.6 Else low PORTD.6 EndIF IF b9=18 Then high PORTD.5 Else low PORTD.5 EndIF IF b9=19 Then high PORTD.4 Else low PORTD.4 EndIF

IF b9=16 Then high PORTC.7 Else low PORTC.7 EndIF IF b9=17 Then high PORTC.6 Else low PORTC.6 EndIF IF b9=11 Then high PORTC.5 Else low PORTC.5 EndIF IF b9=116 Then high PORTC.4 Else low PORTC.4 EndIF IF b9=117 Then high PORTD.3 Else low PORTD.3 EndIF IF b9=51 Then high PORTD.2 Else low PORTD.2 EndIF IF b9=52 Then high PORTD.1 Else low PORTD.1 EndIF return end

APLICASION EN VISUAL C++ PARA RESIVIR LOS DATO VIA PUERTO SERIAL DE LA TARJETA DECOFIFICADORA.

CONCLUSIONES: Se cumpli exitosamente con el propsito de esta practica, el nico inconveniente que se encontr fue con el programa en Visual c++ para poder recibir los datos va serial, no se pudo encontrar la variable en la cual se guardan los datos recibidos de la tarjeta decodificadora, por lo tanto no se pudo manipular aplicaciones dentro de Windows con esta tarjeta, lo que si se pudo es manipular un carrito a control remoto de RF pudindolo controlar con las siguientes teclas coincidiendo con las flechas su movimiento.

ADELANTE

IZQUIERDA

DERECHA

ATRAS