You are on page 1of 9

Control Remoto Inalmbrico

Aplicaciones Personales
Decodificacin de Control Remoto Infrarrojo Sony
Propsito
El presente proyecto tiene como objetivo la decodificacin de un control remoto infrarrojo
Sony con el fin de utilizarlo en aplicaciones diversas. Para ello disponemos de un control remoto
para Betamax modelo RMT 150. Ver Fig. 1. La decodificacin ser realizada utilizando un PIC-
16F84 de Microchip y un software escrito para este microcontrolador.
Teora de Operacin
Sony utiliza una codificacin bit-width, es decir, un pulso alto de 2.6ms para indicar el
encabezado, 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
Carlos A. Narvez V. 2002
Fig. 1 Control Remoto Sony para Betamax
Autor: Carlos A. Narvez V.
Ingeniero Electricista
Universidad de Oriente
Email: cnarvaez@bolivar.udo.edu.ve
Control Remoto Inalmbrico Aplicaciones Personales
Fig. 2 Comando TV/VCR
Fig. 3 Codificacin SONY
La tabla 1 muestra las teclas ms comunes del control remoto y el valor en binario y
hexadecimal de cada comando. Esta tabla fue realizada utilizando un pequeo hardware para
captar las seales del control remoto y un osciloscopio. En el osciloscopio 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.
Carlos A. Narvez V. 2002
1 0 0 0 0 1 1
Encabezado
2.6 ms
400s
800s
1400s
LSB MSB
Comando 7 Bits Direccin 5 Bits
MSB LSB MSB LSB
Control Remoto Inalmbrico Aplicaciones Personales
Tabla 1 Comandos y su valor en binario y hex
Deteccin de luz infrarroja
La deteccin de luz infrarroja la podemos realizar a travs de los denominados modulos IR.
Estos modulos 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: VCC, comun y seal.
Fig. 4 Modulo Detector de IR Radio Shack Cat. No. 276-137B
Carlos A. Narvez V. 2002
Power 0010101 15
Chanel 0010001 11
Chanel+ 0010000 10
Tv/Vtr 1001010 2A
Rew 0011011 1B
Play 0011010 1A
FF 0011100 1C
Stop 0011000 18
Pause 0011001 19
Commando Binario Hex
Control Remoto Inalmbrico Aplicaciones Personales
Hardware
El hardware diseado para este proyecto se muestra en la figura 5. En el podemos
destacar el arreglo de 8 LED conectados a la puerta B del microcontrolador cuyo fin es visualizar
el comando recibido en binario. El mdulo IR es conectado al pin RA4 el cual se configura como
entrada en el microcontrolador. El Pin MCLR el cual es activo bajo, se configura como entrada y es
usado como Reset del microcontrolador. 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.
Fig. 5 Decodificador Sony
Carlos A. Narvez V. 2002
MSB
LSB
Reset
+V
5V
+V
5V
+V
5V
15pF
15pF
4MHZ
PIC16F84
RA3
RA4
MCLR
Vss
RB0
RB1
RB2
RB3
RA0
OSC1
OSC2
VDD
RB7
RB6
RB5
RB4
RA1 RA2
100
2.7K
10K
680 680 680 680 680
680 680 680
Control Remoto Inalmbrico Aplicaciones Personales
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 EQU 2
Carry EQU 0
IR EQU 4 ; RA4 input IR
;******* Definicin de las teclas del Control Remoto
Power EQU 0x15
ChanelL EQU 0x11
ChanelP EQU 0x10
TvVtr EQU 0x4A
Rew EQU 0x1B
Play .EQU 0x1A
FF EQU 0x1C
Stop EQU 0x18
Pause EQU 0x19
;******* Definicin de Variables
Temp EQU 0x0D
CntrLo EQU 0x0E ; Contador de tiempo (low byte)
CntrMid EQU 0x0F ; (middle byte)
CntrHi EQU 0x10 ; (high byte)
BitCnt EQU 0x11 ; Contador de bits
Command EQU 0x12 ; Ultimo comando recibido
ORG 0x000 ; vector reset del procesador
goto init ; ir a comienzo del programa
Carlos A. Narvez V. 2002
Control Remoto Inalmbrico Aplicaciones Personales
; 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 Delay
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 CntrLo,F ; Espera por una seal
BTFSC STATUS,Zero
INCF CntrMid,F
BTFSC STATUS,Zero
INCF CntrHi,F
MOVLW D'3' ; pero no mas de 2 seg
SUBWF CntrHi,W ; (2.5*256*256*12us ~ 2seg)
BTFSC STATUS,Carry
GOTO main ; aborte si el tiempo se excede
BTFSC PORTA,IR ; sino cheque a ver si hay seal
Goto gb1 ; y sino, loop
; Hay seal
;
CALL HdrCheck ; ver si es un encabezado
BTFSS STATUS,Carry
GOTO gb1
;
; Es un encabezado...continue
; Lee los primeros 7 bit. Resultado en Command
MOVLW D'7' ; preparado para recibir 7 bits
MOVWF BitCnt
CLRF Command
gb2 CALL GetaBit
RRF Command,F
DECFSZ BitCnt,F
GOTO gb2
RRF Command,F ; agrega un 8 bit
BCF Command,7 ; puesto a cero
Carlos A. Narvez V. 2002
Control Remoto Inalmbrico Aplicaciones Personales
; Lee 5 bit Cdigo del dipositivo pero los ignora
;
MOVLW D'5'
MOVWF BitCnt ; Preparado para recibir 5 bits
gb3 CALL GetaBit
DECFSZ BitCnt,F
GOTO gb3
; Como test final, asegurese que son solo 12 bits los recibidos
CLRF CntrLo ; Reset contadores
CLRF CntrMid
gb4 BTFSS PORTA,IR ; Chequee que no hay seal por el
; resto del frame
GOTO main ; Si hay aborte
INCF CntrLo,F
BTFSC STATUS,Zero
INCF CntrMid,F
MOVLW D'4' ; Cheque cuanto he esperado
SUBWF CntrMid,W ; (4*256*10us = 10ms)
BTFSS STATUS,Carry
GOTO gb4 ; loop hasta que los 10ms expiren
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 D'25' ; Asegurese que es mas grande que
SUBWF CntrLo,W ; 25*8us = 200us
BTFSS STATUS,Carry
GOTO main ; aborte si es menor
; Determine la longitud del pulso IR que esta siendo recibido
CLRF CntrLo
b2 INCF CntrLo,F ; Cuente este pase
MOVLW D'225'
SUBWF CntrLo,W ; Permita hasta 1800us (255*8us)
BTFSC STATUS,Carry
GOTO main ; Aborte si es mayor
BTFSS PORTA,IR ; siga contando hasta final pulso
GOTO b2
Carlos A. Narvez V. 2002
Control Remoto Inalmbrico Aplicaciones Personales
; Seal presente
MOVLW D'50' ; Asegurese que es mayor que
SUBWF CntrLo,W ; 50*8us = 400us
BTFSS STATUS,Carry
GOTO main ; Si no aborte
; Que es: un 1 o un 0
MOVLW D'125' ; Compare con un ancho de 1000us
SUBWF CntrLo,W ; Carry 1 o 0
RETLW 0
;**********************************************************************
;
; Detecta encabezado > 1.8 ms low
; Retorna con carry = 1 si es un encabezado y carry = 0 si no lo es.
;
;**********************************************************************
HdrCheck
CLRF Temp ; Chequee para un encabezado
; de aprox. 2.5 ms de longitud
hc1 INCF Temp,F ; Cuente cada pase a traves del loop
BSF PORTA,IR
BSF STATUS,RP0 ; Banco 1
MOVLW B'00100000' ;
MOVWF PORTA ; Reset schmitt
MOVLW B'00110000' ; Entrada a la deriva debido a la
MOVWF PORTA ; luz ambiental
BCF STATUS,RP0 ; Banco 0
MOVLW D'250' ; Chequee para un encabezado de
SUBWF Temp,W ; aprox. (250*13us ~3.25 ms)
BTFSC STATUS,Carry
GOTO hc2 ; Aborte si es muy largo
BTFSS PORTA,IR ; Chequee si la seal esta aun ahi
GOTO hc1 ; y si esta mantengase looping
; Un pulso de menos de 3ms de duracin ha sido recibido
;
MOVLW D'138' ; Asegurese que es mayor que
SUBWF Temp,W ; 138*13us ~ 1.8ms
RETLW 0 ; C = 1 si T>1.8ms
hc2 CLRW
ADDWF Temp,W ; Agregando 0 a cualquier numero C=0
RETLW 0
Carlos A. Narvez V. 2002
Control Remoto Inalmbrico Aplicaciones Personales
;**********************************************************************
;
; Programa Principal
;
;**********************************************************************
init
CLRF PORTA ; Clear registro PORTA
CLRF PORTB ; Clear registro PORTB
BSF STATUS,RP0 ; Banco 1
MOVLW B'00110000' ; RA4 - RA5 como input
MOVWF PORTA ; Configure TRISA
MOVLW 0x00 ; PORTB todos Salidas
MOVWF PORTB ; configura TRISA
BCF STATUS,RP0 ; Banco 0
main
CALL GetaByte ; Tomar un byte de Comando
MOVF Command,W
MOVWF PORTB ; Muestre comando por PORTB
GOTO main
END ; directive 'end of program'
Carlos A. Narvez V. 2002