Infra Rojo

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 7

..

proyectos

Receptor de mandos infrarrojos

La intencin del artculo es la de explicar cmo realizar un sistema receptor de infrarrojos, que sea capaz de descodificar un protocolo especfico de cualquier mando a distancia comn en cualquier hogar. Tambin implementaremos un pequeo sistema por contrasea. // por: Miguel ngel Borrego Trujillo // correo autor

Para realizar dicho receptor, utilizaremos un microcontrolador de la empresa Microchip, concretamente el PIC16F877. Podramos haber utilizado cualquier otro microcontrolador, pero escog este microcontrolador porque es el que tena a disposicin. Una vez determinado el protocolo y habiendo estudiado las caractersticas del PIC, estableceremos qu elementos (pines, registros, interrupciones...) deberemos utilizar y qu requerimientos de hardware adicional nos harn falta para desarrollar las tareas requeridas. Introduccin a la solucin: Sabiendo cul es el proyecto que debemos realizar, tenemos que fijar unos objetivos para llevar a cabo el trabajo de una manera organizada. Los objetivos para el correcto del desarrollo del trabajo son:
1. Concretar el protocolo de comunicacin. 2. Estudio del protocolo de comunicacin. 3. Definir el hardware y circuitera necesaria. 4. Implementar el programa. 5. Simulacin del circuito.

6. Test del circuito en protoboard. 7. Desarrollo final en una placa agujereada o pcb.

Concretar el protocolo de comunicacin. El protocolo de comunicacin que usaremos para realizar a cabo la comunicacin entre el emisor y el receptor, es el cdigo SIRC, que ha desarrollado la empresa SONY y es el mismo protocolo que encontramos en los mandos de infrarrojos que esta empresa fabrica y distribuye. Estudio del protocolo de comunicacin SIRC 12-bits: Podemos observar cmo est estructurado

el cdigo SIRC, que es un cdigo que distribuye los bits que enva en dos partes, el comando y la direccin. Para empezar la comunicacin se enva una seal de 'START' que consiste en un pulso en alto de 2400 us y un pulso en bajo de 600 us, seguidamente se envan los datos. Para enviar un 1 se genera una seal en alto de 1200 us y uno en bajo de 600 us, para enviar un 0 se genera una seal

/ / pgina 0x14

.receptor de mandos infrarrojos en alto de 600 us y uno en bajo de 600 us. En la imagen anterior podemos observar cmo se envan los bits menos significativos (LSB) hacia los ms significativos (MSB) del comando y la direccin. Utilizando la imagen de ejemplo Adress = 00001 i Command = 001001. ste protocolo es de 12 bits de datos, 7 bits de comando y 5 bits de direccin. El comando nos indica la accin a realizar y la direccin nos indica el dispositivo que debe recibir el comando.

En la generacin del seal, ste se modula a una frecuencia de 40 Khz segn la norma del protocolo y posteriormente se demodula con el sensor de infrarojos como podemos ver en la imagen. Definicin del Hardware y circuitera necesaria. Para poder recibir correctamente los datos se necesita un sensor de infrarrojos, que nos acondicione la seal enviada por el emisor. El sensor elegido para hacer este trabajo es el TSOP1740 aunque este podra ser sustituido por cualquier otro sensor que reciba infrarojos. Los dos ltimos nmeros del nombre del sensor corresponden a la frecuencia de demodulacin en la que trabaja el sensor. Otro elemento importante es el PIC. En este caso decid utilizar el PIC16F877 ya que es el microcontrolador que tena. Para acabar, el ltimo elemento importante del hardware sera el LCD ya que por ste mostraremos los datos que enviaremos a travs del emisor. Otros elementos necesarios son los siguientes: las pilas, el portapilas, los bornes de alimentacin, el cristal de cuarzo, los condensadores, los botones, el potencimetro para el display y las resistencias de PULL-UP. / / pgina 0x15

El siguiente paso despus de definir el hardware necesario corresponde a decidir cmo conectaremos los diferentes elementos entre ellos. De los diferentes pines de entrada / salida que tenemos, decidiremos qu pines utilizaremos, ya que el 16F877 tiene 5 puertos. El sensor TSOP1740 tiene 3 pines, alimentacin, masa y salida. Como quiero determinar el tiempo de los diferentes pulsos que nos llegan del sensor, he decidido conectar la salida del sensor a la pata RB0 del PORTB, ya que este pin nos genera una interrupcin cada vez que nos llega un flanco de subida o de bajada, segn el flanco configurado en el programa. Cabe destacar que el sensor TSOP1740 invierte la seal de salida, cuando recibe seal infrarroja nos pone un 0 a la salida y cuando no recibe nos pone un 1 (lo tendremos que tener en cuenta en el programa). El display LCD que disponemos, est constituido por 16 pines que son alimentacin, masa, contraste, habilitacin, lectura / escritura, comando / direccin, 8 pines de datos y 2 pines del backlight. De los 8 pines de datos slo utilizaremos los 4 pines de mayor peso y los conectaremos al PORTD, debido a que la librera que el programa CCS incorpora hace funcionar el LCD a 4 bits con el PORTD. De los 5 botones, 4 los utilizar para hacer una proteccin mediante contrasea

.receptor de mandos infrarrojos conectados a los 4 bits altos del PORTB, ya que utilizar la interrupcin por cambio de estado que estos 4 pines me generan al haber algn cambio en estos. El botn que queda lo conectar al pin de reset (MCLR). Estos pulsadores estarn conectados a los pines correspondientes mediante resistencias de PULL-UP de 10k. El resto de conexiones son las conexiones bsicas del oscilador, los condensadores y las alimentaciones de los diferentes elementos.
Lista del hardware necesario: 1 LCD 16x2 1 PIC16F877 1 Cristal 4MHz 5 Resistencias 10K ohm 1 Condensador 100nf (Alimentacin) 5 Pulsadores 1 Resistencia 330 ohm 1 Led rojo (On / Off) 1 Receptor TSOP1740 1 Potencimetro (Contraste LCD) 1 Portapilas

Configuracin para emulacin de cdigo SIRC en simulacin:

Ejemplo de conexionado en Proteus:

/ / pgina 0x16

.receptor de mandos infrarrojos Implementacin del programa. El programa lo deberemos de estructurar muy bien para no perdernos durante la programacin y para posteriormente poder detectar los errores de programacin ms rpido y poder hacer los retoques oportunos. La estructura del programa est basada en diferentes funciones que ir explicando. 1) Rutina de interrupcin por flanco. Lo que hacemos en esta rutina es configurar la interrupcin para que se active con un flanco de bajada ( ya que el sensor nos invierte el seal), si hemos recibido un flanco de bajada ponemos el TIMER0 a 0 y establecemos una interrupcin para detectar un flanco de subida. Una vez se recibe el flanco de subida guardamos el tiempo entre
#INT_EXT void ext_isr(){

los dos flancos en una variable llamada tiempo. Despus de esto detectamos si el valor de la variable tiempo cumple los requisitos de START dentro de un intervalo. Si cumple ponemos un flag llamado START a 1. A partir de aqu ya podemos rellenar la palabra de cdigo de 12 bits con unos y ceros comparando los valores de la variable tiempo. Si obtenemos un valor de 600 us le corresponde un 0, si obtenemos un tiempo de 1200 us le corresponde un 1. Al TIMER0 se le ha puesto un divisor de 16 para no sobrepasar su valor mximo de 255 cuando nos llegue el START (que es el pulso que ms dura).

if(cambio){ // Hemos recibido flanco de subida tiempo=get_timer0(); // Miramos de cuanto tiempo es el pulso EXT_INT_EDGE(H_TO_L); //Configuramos para recibir flanco de bajada cambio=0; }else { // Hemos recibido flanco de bajada set_timer0(0); // Timer0 a 0 tiempo=0; // Tiempo a 0 EXT_INT_EDGE(L_TO_H); //Configurramos para recibir flanco de subida cambio=1; } if (tiempo>140 && tiempo<160){ // Comprobamos START start=1; // flag start a 1 i=0; // Reseteamos el contador de bits } if(start){ // Si hemos detectado start... if(tiempo>27 && tiempo<55){ // es un 0 ? bit_clear(word,i); // Aadimos el bit a la palabra i++; // incrementa contador bits } if(tiempo>65 && tiempo<90){ // es un 1 ? bit_set(word,i); // Aadimos el bit a la palabra i++; // incrementa contador } if(i==longitud){ // Si contador = ntotalbits dato_recibido=1; // flag dato redibido activado EXT_INT_EDGE(H_TO_L); // Flanco de subida para el START start=0; // Inicializacin para la siguiente palabra } }

/ / pgina 0x17

.receptor de mandos infrarrojos 2) Rutinas de descodificacin de comando y direccin. Una vez terminada la transmisin de datos se activa un flag de dato_recibido y seguidamente hacemos las modificaciones oportunas para separar el comando y la direccin. Para hacer esto lo que hacemos es coger la palabra de 12 bits y separar las 2 partes, la direccin que es de 5 bits y comando que es de 7 bits teniendo en consideracin que en el protocolo se envan los datos del bit menos significativo al bit ms significativo (al revs).

void take_adress(void){ // Separamos la direccin de la palabra i=longitud-1; adress=0; for(j=0;j<longitud-7;j++){ // Hacemos un recorrido al revs adress=adress<<1; //al revs para separar la direccion adress=adress+bit_test(word,i); i--; } }

void take_command(void){ //Separamos el comando de la palabra i=6; command=0; for(j=0;j<7;j++){ // Hacemos un recorrido para separar el comando command=command<<1; command=command+bit_test(word,i); i--; } }

3) Rutina del programa principal En esta rutina lo que hacemos es esperar a que la recepcin de datos haya finalizado, deshabilitamos la interrupcin externa para

poder extraer la direccin y el comando. Seguidamente escribimos en el LCD qu comando hemos enviado y volvemos a activar la interrupcin externa de RB0.

if(start==1){ // Si hem rebut START, esperem dades while(!dato_recibido); // Esperamos mientras recibimos datos dato_recibido=0; // Ponemos datos recibidos a 0 DISABLE_INTERRUPTS(INT_EXT); // Deshabilitamos INT EXTERNA // Tratamos los datos take_adress(); // Cogemos la Direccin take_command(); // Cogemos el Comando // En este caso no se utiliza adress switch (command){ // Mostramos por el LCD la tecla // del mando pulsada case 0: printf(lcd_putc,"\fCanal 1");break; case 1: printf(lcd_putc,"\fCanal 2");break; case 2: printf(lcd_putc,"\fCanal 3");break; case 3: printf(lcd_putc,"\fCanal 4");break; case 4: printf(lcd_putc,"\fCanal 5");break; case 5: printf(lcd_putc,"\fCanal 6");break; case 6: printf(lcd_putc,"\fCanal 7");break;

/ / pgina 0x18

.receptor de mandos infrarrojos


case 7: printf(lcd_putc,"\fCanal 8");break; case 8: printf(lcd_putc,"\fCanal 9");break; case 9: printf(lcd_putc,"\fCanal 0");break; case 16: printf(lcd_putc,"\fCanal +");break; case 17: printf(lcd_putc,"\fCanal -");break; case 18: printf(lcd_putc,"\fVolumen +");break; case 19: printf(lcd_putc,"\fVolumen -");break; case 20: printf(lcd_putc,"\fSilencio");break; case 47: printf(lcd_putc,"\fStandby");break; default: printf(lcd_putc,"\fCom:%3U Adr:%2U",command,adress); // Habilitamos la interrupcin externa

} ENABLE_INTERRUPTS(INT_EXT);

4) Rutina de interrupcin por cambio de estado Lo que hago en esta rutina es leer el estado del teclado al inicio del programa para implementar una pequea contrasea. Cuando llega la interrupcin quiere decir que hubo un cambio de estado en los 4 pines
#INT_RB void rb_interrupt(){ disable_interrupts(global); delay_ms(100); lectura_portb=PORTB; lectura_portb&=0xF0; if(!(lectura_portb==0xF0)){

altos del PORTB, primero hago una mscara para descartar el nibble bajo del PORTB, una vez he hecho esto comparo si los bits del nibble alto del PORTB estn a 1 (ninguna tecla pulsada) o no lo estn (alguna tecla pulsada), si no estn todos a 1 procedo a hacer la lectura del PORTB y retorno el valor de las teclas que he apretado.

// Deshabilitamos las interrupciones // Esperamos 100 ms para no tener ruido // // Nos quedamos con los bits altos // Comprobamos si se ha pulsado una tecla

tecla1=bit_test(lectura_portb,7); // guardamos estado tecla1 tecla2=bit_test(lectura_portb,6); // guardamos estado tecla2 tecla3=bit_test(lectura_portb,5); // guardamos estado tecla3 tecla4=bit_test(lectura_portb,4); // guardamos estado tecla4 tecla_pulsada=1; //flag de telca pulsada } enable_interrupts(global); // Volvemos a habilitar interrupciones

5) Trozo de cdigo de deteccin de contrasea Esta rutina sirve para detectar si la contrasea introducida es vlida o no. Lo que hacemos para saber si la contrasea que hemos enviado es correcta, es habilitar las interrupciones del PORTB por cambio de / / pgina 0x19

estado y as poder obtener las teclas pulsadas. Una vez hemos obtenido las teclas pulsadas, determinamos qu tecla ha sido pulsada y seguidamente hacemos la accin correspondiente, incrementar, decrementar, enviar y resetear la contrasea respectivamente Password = 3.

.receptor de mandos infrarrojos


while (!password_ok){ // Comprobamos password

ENABLE_INTERRUPTS(INT_RB); // Habilitamos interrupcion PORTB if(tecla_pulsada){ // Si se ha pulsado miramos que tecla es if(!tecla1) { // Si es la tecla1 password++; // Aumentamos valor de password } else if(!tecla2){ // Si es tecla2 password--; // Disminuimos valor de password } else if(!tecla3){ // Si es tecla3 if(password==0x03){ // Comprobamos contrasenya password_ok = 1; // Password Okey ! } } else if(!tecla4) { // Si es tecla4 password=0; // Reseteamos el password } tecla_pulsada=0; printf(lcd_putc,"\fIntroduce el \nPassword: %U",password); //Mostramos Lcd } if (password_ok)printf(lcd_putc,"\fPassword Correcto\nRecibiendo Datos");//Password correcto }

APLICACIONES La aplicacin ms importante que podemos implementar en el receptor de infrarrojos es la del control de dispositivos a distancia. Una vez hemos podido descifrar el cdigo que

enva el emisor, podemos controlar dispositivos como bombillas, motores, rels, ect.

/ / pgina 0x1A

También podría gustarte