You are on page 1of 16

PROTOCOLO DE COMUNICACION SONY SIRC

Protocolo de Comunicacin Sony SIRC para mandos Infrarrojos


Un mando a distancia o control remoto es un circuito electrnico usado para realizar una operacin remota sobre una mquina. El trmino se emplea generalmente para referirse al mando a distancia (llamado por lo general simplemente "el mando" o Control Remoto) para la televisin u otro tipo de aparato electrnico, como DVD, HIFI, computadoras, y para encender y apagar un interruptor. Los mandos a distancia para esos aparatos son normalmente pequeos objetos (fcilmente manipulables con una mano) con una matriz de botones para ajustar los distintos valores, como por ejemplo, el canal de televisin, el nmero de cancin y el volumen. De hecho, en la mayora de dispositivos modernos, el mando contiene todas las funciones de control, mientras que el propio aparato controlado slo dispone de los controles ms primarios. La mayora de estos controles remotos se comunican con sus respectivos aparatos va seales de infrarrojo (IR) y slo unos pocos utilizan seales de radio. Su fuente de energa suele ser pequeas pilas de tipo AA o AAA. Extrado de wikipedia (http://es.wikipedia.org/wiki/Mando_a_distancia)

Dado ello los fabricantes de los equipos electrnicos, han creado su propio Protocolo de comunicaciones para transmitir los datos necesarios del mando al equipo electrnico. Estos protocolos son casi siempre en forma asncrona, ya que siempre que se transmita un dato, se enviar primeramente el encabezado de la trama para indicar el principio del tren de pulsos (trama). Entonces nos entramos de lleno al protocolo Sony SIRC, lo estudiaremos paso a paso para ver cada detalle de la trama Sony, en esta pgina web: http://www.sbprojects.com/knowledge/ir/sirc.htm se encuentran los datos que mencionare (estn en ingls, as que tratare de interpretarlo, para una buena comprensin) Protocolo de transmisin IR SONY SIRC: Parece que existieran 3 versiones para el protocolo: 12-bits (que ser la desarrollada ac), 15-bits y 20bits. Se puede asumir que las versiones de 15-bits y 20-bits difieren en el nmero de bits transmitidos en la secuencia de comando. Talvez exista discrepancias entre otras explicaciones de pginas web, pero de ser necesario sern corregidas en este documento, o talvez alguien podra notificar alguna falla.

Caractersticas: Para el Protocolo, existen versiones de: 12-bits, 15-bits y 20-bits (12-bits ser descrita en el presente documento) Longitud de: 5-bits de direccin y 7-bits de comando (Protocolo de 12-bits) Modulacin por Ancho de Pulsos (PWM) Frecuencia de portadora de 40 Khz. Tiempo de bit de 1.2ms 0.6ms

Modulacin: El Protocolo SIRC usa una codificacin por ancho de pulsos para los bits. El pulso que representa el estado lgico "1" es 1.2ms de presencia de la portadora de 40kHz, mientras que el ancho para el estado lgico "0" es 0.6ms de largo. Todas las presencias de portadora son separadas por un intervalo sin presencia de portadora de duracin de 0.6ms. El ciclo de trabajo recomendado, de la portadora es 1/4 1/3.

Protocolo:

La figura anterior muestra un tren de pulsos del protocolo SIRC. Con este protocolo el LSB es transmitido primero. El bit de inicio (Start) tiene una duracin de 2.4ms y despus vendr su respectiva separacin de 0.6ms como en cualquier bit. Aparte de sealar la salida de un mensaje de SIRC este bit de inicio tambin se usa para ajustar la ganancia del receptor IR. Entonces los 7 bits de comando son transmitidos, seguidos de los 5 bits de direccin del dispositivo, en el ejemplo de la figura se transmite la direccin 1 y el comando 19. Se repite la transmisin de comandos cada 45ms, cuando el botn del mando Sony se mantiene presionado. Ejemplos de comandos: La tabla siguiente muestra algunos mensajes enviados por controles remotos Sony, en el protocolo de 12-bits. Esta lista no est completa, ya que la asignacin de funciones es probablemente bastante dinmica. A esta tabla aumentaremos algunos comandos que he logrado observar con un osciloscopio, y de la misma manera, cualquiera puede ver el comando y/o direccin que le enva cualquier mando sony, solo es necesario un receptor IR y el osciloscopio propiamente mencionado.

Address 1 2 3 6 12 16 17 18

Device TV VCR 1 VCR 2 Laser Disc Unit Surround Sound Cassette deck / Tuner CD Player Equalizer

Command 0 1 2 3 4 5 6 7 8 9 16 17 18 19 20 21 22 23 24 25 26 27 30 31 38 39 47

Function Digit key 1 Digit key 2 Digit key 3 Digit key 4 Digit key 5 Digit key 6 Digit key 7 Digit key 8 Digit key 9 Digit key 0 Channel + Channel Volume + Volume Mute Power Reset Audio Mode Contrast + Contrast Colour + Colour Brightness + Brightness Balance Left Balance Right Standby

Material De esta manera pasamos a describir como trabajaremos, y el material que se utilizar, todo de acuerdo a lo descrito anteriormente. Estos son los componentes electrnicos que necesitaremos: Transmisor - Un microcontrolador cualquiera - Un 555 para la modulacin - Un LED IR - Algunos resistores - Condensadores - Pulsadores - Todo puede ser reemplazado por un mando Receptor - Un microcontrolador cualquiera - Un receptor IR - LEDs para visualizacin - Algunos condensadores - Algunos resistores

Para ambos necesitaremos la alimentacin correspondiente de 5 voltios independientemente, ya sea mediante bateras y reguladores o fuentes de transformador u otro

Cada uno de esos componentes, si bien no son conocidos por el lector, daremos una explicacin breve de cada uno: Microcontrolador, es un circuito integrado o chip programable, que incluye en su interior las tres unidades funcionales de una computadora: CPU, Memoria y Unidades de E/S, es decir, se trata de un computador completo en un solo circuito integrado. (Ms detalles en wikipedia, o en pginas web)

555, es un temporizador, que configurado como oscilador astable nos proporcionar la seal de portadora para el transmisor, tambin tiene otras formas de configuracin

LED IR, es un Diodo Emisor de Luz infrarroja, cuando esta correctamente polarizado

Resistores, son los encargados de limitar el paso de corriente por una rama.

Condensadores, almacenan energa por un periodo de tiempo que depende de su capacidad

Pulsadores, componentes mecnicos que cumplen la funcin de cerrar o abrir momentneamente sus contactos

Receptor IR, es un Circuito Integrado que es capaz de demodular una seal infrarroja modulada a una determinada frecuencia.

LED, es un Diodo Emisor de Luz, que cuando esta polarizado correctamente emite una luz de un color, existen tambin LEds bicolores, tricolores, y RGB.

Tambin ser necesario un programador para los microcontroladores con su respectivo software (como un JDM y el winpic800, por ejemplo), y a la vez el compilador, necesario, yo utilizare el PCWH de CCS, pero con la explicacin que vendr a continuacin fcilmente puede llevarse a cualquier otro lenguaje de programacin. Tambin puede usarse algn software de simulacin como el Proteus VSM, el cual admite simulacin de microcontroladores. Se usar en el presente trabajo cualquier microcontrolador de microchip ya sea de la familia PIC16Fxxx o de la PIC18Fxxx Transmisor El transmisor ser el encargado de emitir los bits necesarios (la trama de bits) cada vez que se presione algn pulsador, en este caso nos servir de apoyo para la realizacin de la simulacin antes de grabar el programa en el microcontrolador. El microcontrolador que usaremos para el transmisor ser un PIC16F88, porque? Por simple gusto, como mencionamos anteriormente, puede ser cualquier PIC. Crearemos una funcin para cada etapa de la trama que sea necesaria y repetitiva, en este caso, podemos empezar con el cdigo necesario para el bit de Start, ya siempre ser el mismo, y como vimos en la descripcin del protocolo es la siguiente:

Que consiste como ya es sabido en un estado en alto por una duracin de 2.4ms, seguido de 600us en estado bajo Entonces el cdigo para este bit de Start consistir en: void bit_start() { output_bit(PIN_salida_datos,1); delay_us(2400); output_bit(PIN_salida_datos,0); delay_us(600); }

// enva durante 2400 useg un 1 // enva durante 600 useg un 0

Donde PIN_salida_datos estar definido anteriormente: #define PIN_salida_datos PIN_A1 Puede usarse cualquier pin, en el ejemplo usaremos el PIN_A1 Ahora crearemos funciones para enviar los bits, uno por uno, del protocolo, consistir en una funcin que recibir un parmetro (que ser el estado del bit a enviar). Si lo que se desea enviar es un 1 lgico, o un 0 lgico:

Se debe cumplir con el protocolo, y la diferencia es que para el 1 la duracin de estado en alto ser de 1.2ms, en cambio para el 0 ser solo de 600us, que es la mitad de tiempo, ambos bits despus del estado alto tendrn una separacin para el siguiente bit de 600us. Para ello nuestra funcin ser la siguiente: void enviaIR(int1 bit) // enva un bit en el protocolo Sony SIRC { if(bit==1) // enva un 1 { output_bit(PIN_salida_datos,1); // enva durante 1200 useg un 1 delay_us(1200); } else // enva un 0 { output_bit(PIN_salida_datos,1); // enva durante 600 useg un 1 delay_us(600); }

output_bit(PIN_salida_datos,0); delay_us(600); }

// enva durante 600 useg un 0 (separacin entre bits)

Ahora necesitaremos enviar toda la trama del protocolo, es decir los 7 bits de comando, y los 5 bits de direccin y siempre de LSB a MSB. Para ello hemos creado la siguiente funcin, que recibir los parmetros de comando y direccin para enviar los datos que estos indiquen: void envia_trama_Sony(int comando,int direccion) { bit_start(); // enva el bit de start for(x=0;x!=7;x++) // usas 7 bits por Comando Sony SIRC (del 0 al 6) enviaIR(bit_test(comando,x)); // enva los 7 bits de menor peso de la variable direccion for(x=0;x!=5;x++) // usas 5 bits por Direccion Sony SIRC enviaIR(bit_test(direccion,x)); // enva los 6 bits de menor peso de la variable comando } Y listo con eso ya tenemos todas las funciones necesarias para poder enviar una trama Sony SIRC. Entonces haremos una aplicacin sencilla, para enviar solo unos 4 5 comandos (mediante 4 5 pulsadores), posteriormente se puede ampliar y talvez usar un teclado matricial o analgico para incrementar la cantidad de comandos, siendo tambin uno de los motivos para el uso del PIC16F88, ya que posee conversor A/D, para un teclado analgico, de esta manera se puede administrar un teclado de varias filas y columnas a travs de un solo pin, en una posterior ampliacin del proyecto. Entonces el cdigo total para la administracin de los pulsadores ser: #include <16f88.h> #fuses INTRC_IO,NOMCLR,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT #use delay(clock=4000000) #define PIN_salida_datos PIN_A1 #define digit_7 6 #define digit_0 9 #define mute 20 #define power 21 int x; void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_oscillator(OSC_4MHZ); output_bit(PIN_salida_datos,0); // Pone la salida al emisor de IR a 0 para que siempre comience as do // bucle continuo { // transmisin del dato correspondiente al pulsador activado if(input(PIN_B0)) { envia_trama_Sony(power,1); // enva comando Power delay_ms(45); // retardo para retransmisin } if(input(PIN_B1)) {

envia_trama_Sony(mute,1); delay_ms(45); } if(input(PIN_B2)) { envia_trama_Sony(digit_0,1); delay_ms(45); } if(input(PIN_B3)) { envia_trama_Sony(digit_7,1); delay_ms(45); } }while (TRUE); }

// enva comando Mute // retardo para retransmisin

// enva comando Digito 0 // retardo para retransmisin

// enva comando Digito 7 // retardo para retransmisin

En este cdigo antes del Main debern ir todas las funciones creadas anteriormente, para poder enviar la trama del protocolo Sony SIRC. Receptor Para la parte de recepcin lo que necesitamos es primeramente el receptor de infrarrojos (que solo presenta tres pines, dos de alimentacin y uno de salida de datos), el cual tiene la siguiente funcin:

http://www.sbprojects.com/knowledge/ir/ir.htm Lo que significa que el receptor IR invertir la seal recibida, lo cual debemos considerar para el diseo de nuestro receptor, ya que si no lo hacemos nos traer problemas. Para ello existe dos formas de solucin, uno colocar un negador a la salida del receptor IR (por hardware), y realizar el cdigo para el microcontrolador, como menciona el protocolo, y la otra solucin invertir la lgica del protocolo (por software) para evitar el incremento de hardware (que sera colocar un C.I. que contenga negadores). Entonces como siempre es mejor ahorrar hardware, porque este a la vez nos cuesta dinero y nos ocupa espacio en la placa o protoboard, lo cual es casi siempre perjudicial en la ejecucin de un proyecto, tomaremos la segunda opcin, la de invertir la lgica en el programa del microcontrolador, esta es una solucin por software. Conociendo ahora la funcin del receptor IR, pasamos a la descripcin de las funciones que utilizaremos en el programa, para facilitar la obtencin de los datos. Entonces esta ser nuestra funcin para recibir cada bit, que retornar el valor 0 1 segn corresponda, la funcin se basa en retardos, retardos que son seguidos segn los da el protocolo para la representacin de los bits 1 0, para ello avanzaremos cada 600us y en el medio de cada segmento (consideraremos un segmento como un bloque de 600us) y preguntaremos que estado se lee y entonces podremos asegurar despus de 2 y 3 pasos que bit es el que se ha recibido, de acuerdo a la siguiente figura:

El cdigo entonces quedar de la siguiente manera: OJO! Receptor IR INVIERTE LOS DATOS (el 1 es 0 y el 0 es 1 en el protocolo) como mencionamos anteriormente int1 recibir_bit() { delay_us(600); if(input(REC_IR) == 0) { delay_us(600); if(input(REC_IR) == 0) { delay_us(600); if(input(REC_IR) == 1) error =0; return 1; } else { error =0; return 0; } } else { error = 3; return 0; } }

// empieza a leer bits // si lee un 0 es correcto de momento

// si lee un 0 es 1 y es correcto de momento

// si lee un 1 es 1 y es correcto el bit completo

// si es 1 es cero y es correcto y ya acabo el bit completo

Donde REC_IR, est definido anteriormente, y es el pin de salida de datos del Receptor IR #define REC_IR PIN_A4

Una vez obtenido una funcin para descifrar cada bit, armaremos una funcin que verifique el bit de Start y despus interprete cada bit de Comando y Direccin, con la funcin anterior. De la misma manera, para el bit de Start construiremos bloques de 600us, ya que 2.4ms es un mltiplo de 600us, y verificaremos bloque por bloque el bit de Start, para posteriormente usar la funcin anterior para descifrar los bits siguientes; ac es donde nos posicionamos en la mitad de cada bloque, en el bit de Start, y de ah siempre estaremos en la mitad, parra los siguientes bloques. Preguntaremos por el estado entonces en estas posiciones:

void obtener_dato() { // se posiciona para leer en mitad del periodo de 600us a partir de que el flanco bajo delay_us(280); // la mitad seria 300us pero por consumo de reloj por las instrucciones se usar 280 para el retardo if(input(REC_IR)==0) // si llega un 0 es que va bien y continua { delay_us(600); // se posiciona en mitad if(input(REC_IR) == 0) // si llega un 0 es que sigue bien { delay_us(1200); // se posiciona en mitad if(input(REC_IR) == 0) // si llega un 0 es que sigue bien { delay_us(600); // se posiciona en mitad if(input(REC_IR) == 1) // ojo ahora llega el CERO error=0; } else error = 1; } else error=2; // si no se cumple todo as, hay un error } else error = 4; if(error==0) // lee los bits de direccion y comando (5 direccion + 7 comando) { if(recibir_bit()) bit_set(comando,0); if(recibir_bit()) bit_set(comando,1); if(recibir_bit()) bit_set(comando,2);

if(recibir_bit()) bit_set(comando,3); if(recibir_bit()) bit_set(comando,4); if(recibir_bit()) bit_set(comando,5); if(recibir_bit()) bit_set(comando,6); if(recibir_bit()) bit_set(direccion,0); if(recibir_bit()) bit_set(direccion,1); if(recibir_bit()) bit_set(direccion,2); if(recibir_bit()) bit_set(direccion,3); if(recibir_bit()) bit_set(direccion,4); } } Y listo con esto ya tenemos guardado en dos variables, los dos datos enviados por la trama del protocolo Sony SIRC, en el cdigo estn guardados en las variables Comando y Direccin. Ahora cada vez que recibamos un dato preguntaremos que es lo que tenemos recibido y haremos diferentes eventos, de acuerdo a nuestras necesidades. Para ello el programa principal ser: #include <16F648a.h> #fuses INTRC_IO,MCLR,NOWDT,NOPROTECT,PUT,NOLVP,BROWNOUT #use delay(clock=4000000) // Oscilador a 4 Mhz #use fast_io(a) #use fast_io(b) #define REC_IR PIN_A4 #define digit_7 6 #define digit_0 9 #define mute 20 #define power 21 int error=0,comando=0,direccion=0; void main() // programa principal { setup_oscillator(OSC_4MHZ); set_tris_a(0x1f); // definicin de puertos set_tris_b(0x00); output_b(0); while(true) { comando=0; direccion=0; while(input(REC_IR)==0) // Espera al 1er bit de START (flanco de bajada) del receptor IR; mientras se queda en el bucle While {

// Los Fuses

// selecciona la entrada a usar para el sensor IR

obtener_dato(); switch(comando) { case power: { output_toggle(PIN_B4); delay_ms(50); break; } case mute: { output_toggle(PIN_B5); delay_ms(50); break; } case digit_0: { output_toggle(PIN_B6); delay_ms(50); break; } case digit_7: { output_toggle(PIN_B7); delay_ms(50); break; } } } } } En este cdigo debern ir tambin antes de la funcin MAIN, las anteriores funciones descritas para el receptor En este ejemplo el programa realiza la conmutacin de un LED por cada diferente comando recibido, solo se usan los 4 comandos ya sea de un control remoto de algn equipo electrnico Sony que posea un mando IR (Control Remoto) o uno diseado, estos son: el botn POWER, MUTE, DIGITO 0 y DIGITO 7. El circuito esquemtico del receptor, para este cdigo ser:

En cuanto al Transmisor podemos usar cualquier mando Sony, ya que en el programa no se pregunta por la direccin por tanto, ya sea uno de TV, Radio, VHS, DVD, etc. de marca Sony, para este cdigo nos servir. Ahora plantearemos un circuito para utilizar con el cdigo descrito anteriormente para el transmisor, este bsicamente estar formado por el microcontrolador correspondiente, un juego de pulsadores con sus resistores, condensadores para la alimentacin, y un 555 configurado como astable a la frecuencia de 40KHz con un ciclo de trabajo de , como recomendamos anteriormente.

De igual manera podemos simular todo el circuito para ver el correcto funcionamiento, el circuito es muy similar al anterior, pero no hace falta el modulador con el 555, ya que podemos tomar directamente la salida del microcontrolador transmisor, pero debemos usar un negador para lograr el efecto del receptor IR que invierte la seal recibida:

Ahora este proyecto puede hacerse con cualquier mando, solo se tiene que saber cual es la marca o protocolo que utiliza el control remoto y listo, puedes realizar un cdigo parecido para poder determinar cuando recibes un bit, el bit de start, comando y direccin, y captar completamente el contenido de una trama de cualquier protocolo. Adems si no encuentras, talvez algunos comandos de un mando o el protocolo, puedes observarlo con un receptor IR y un osciloscopio, as he logrado determinar algunos comando de controles de televisin de Sony.

A continuacin una tabla agregando los resultados que he obtenido con el osciloscopio (en negrilla): Comando 0 1 2 3 4 5 6 7 8 9 11 14 16 17 18 19 20 21 22 23 24 25 26 27 30 31 38 37 39 47 51 52 54 58 59 96 101 115 116 Es todo, gracias. Tecla Digit key 1 Digit key 2 Digit key 3 Digit key 4 Digit key 5 Digit key 6 Digit key 7 Digit key 8 Digit key 9 Digit key 0 Enter Ch Guide Channel + Channel Volume + Volume Mute Power Reset Audio Mode MTS/SAP Contrast + Contrast Colour + Colour Brightness + Brightness Balance Left TV/Video Balance Right Standby Flecha derecha Flecha izquierda Sleep Display Jump - Prev Ch Menu Return Flecha abajo Flecha arriba

Derechos de Autor: Recopilacin de Informacin del protocolo de Comunicacin Sony SIRC + aporte. RODRIGO ANDRES FLORES CALLE e-mail: rodrigo@ielectronica.com para cualquier consulta. Universidad Mayor de San Simn Diciembre-2007 Ingeniera Electrnica. Cochabamba - Bolivia

You might also like