You are on page 1of 5

Medida de distancias con SRF05 A diferencia del artculo referente a la medida de distancias con el SRF04 o SRF05 en modo de funcionamiento

1, en este artculo se va a emplear el sensor de ultrasonidos SRF05 en el modo de funcionamiento 2, es decir, empleando el mismo pin como entrada del pulso de test y como salida para el pulso eco que nos dar la informacin de la distancia en funcin de su duracin en tiempo. En este artculo se limitar a mostrar el programa del PIC y esquemas para este modo de funcionamiento del SRF05, por lo que para complementar la informacin remito al artculodel SRF04. Para conectar el sensor de ultrasonidos en este modo de funcionamiento, el pin de modo (sin conectar en SRF04 o SRF05 modo 1) debe llevarse a 0v. De esta forma, el pin empleado para dar el pulso de test ser el que nos ofrezca igualmente el pulso ECO.

pulsa en la imgen para ampliarla Por tanto para controlar el SRF05 en modo 2 con el PIC, se deber deshabilitar en primer lugar el registro CCP y configurar el pin correspondiente como salida disable_interrupts(INT_CCP2); //Deshabilitacin interrupcin modo

comparacin trisc=0x00; //Puerto C todos los pines todo salidas

dar el pulso de test (minimo 10 uS) BIT_TEST_ON; //salida de pulso test durante 10us por Bit 0 puerto C delay_us(10); BIT_TEST_OFF; e inmediatamente volver a configurar dicho pin como entrada, habilitar el registro CCP trisc=0b00000010; //Puerto C pin Rc1 como entrada para lectura eco enable_interrupts(INT_CCP2); //Habilitacin interrupcin para medida de pulso eco y esperar la lectura del pulso eco.

[+/-] Ver / Ocultar programa en C //////////////////////////////////////////////////////////////////////////////// // // // MEDIDA DE DISTANCIAS CON SRF05 // // // // (c) RobotyPic 2011 // // // ////////////////////////////////////////////////////////////////////////////////

#include <16F876A.h> #fuses XT, NOWDT, NOPROTECT #use delay(clock=4000000) //Frecuencia del cristal oscilador 4MHz #byte PIR1=0x0C #byte trisa=0x85 #byte porta=0x05 #byte trisb=0x86 #byte portb=0x06 #byte trisc=0x87 #byte portc=0x07 #define use_portb_lcd TRUE //Configuracin del puerto b para uso del lcd #include <lcd.c> //Incluye uso del archivo para control del lcd #define BIT_TEST_ON output_high(PIN_C1) #define BIT_TEST_OFF output_low(PIN_C1) /********************** Prototipos de las funciones ***************************/ void main (void); //funcin principal void pulso_test (void); //da pulso y calcula distancia al objeto void ccp2_int(void); //captura del pulso de eco /******************** Variables para lectura distancia ************************/ int1 nuevopulso=0; //Entra otro pulso de lectura int16 TFB=0,TFS=0,TF=0; //Tiempo flancos float distancia=0.0; //Valor distancia al obstculo int1 cambio=0; //Control flanco subida o bajada del impulso leido /******************************************************************************/ /*********************** FUNCIN PULSO DE TEST ********************************/ void pulso_test(){ BIT_TEST_ON; //salida de pulso test durante 10us por Bit 0 puerto C delay_us(10); BIT_TEST_OFF; trisc=0b00000010; //Puerto C pin Rc1 como entrada para lectura eco enable_interrupts(INT_CCP2); //Habilitacin interrupcin medida de pulso eco while(nuevopulso==0) {} if(nuevopulso==1){ TF=(TFB-TFS); //Espera a finalizar el pulso eco

//Finalizado el pulso eco se calcula su valor. //Valor entre pulso de subida y bajada.

distancia=TF*1.0; //Valor pulso leido en us de 100u a 25ms distancia = distancia/58; //Distancia del obstculo en cm nuevopulso=0; //Listo para recibir nuevo pulso disable_interrupts(INT_CCP2); trisc=0b00000000; //Puerto C pin Rc1 como salida para pulso test } } /******************************************************************************/ /************************ FUNCIN LECTURA OBSTCULO ***************************/ #int_ccp2 //LLamada por interrupcin flanco en RC2

void ccp2_int(){ if(cambio==0){ //Si es flanco de subida... TFS=CCP_2; //Carga en valor flanco subida valor registro ccpr1 setup_ccp2(CCP_CAPTURE_FE); //Configuracin captura en flanco de bajada cambio=1; //Prximo flanco debe ser de bajada } else { //Si es flanco de bajada... TFB=CCP_2; //Carga en valor flanco bajada valor registro ccpr2 setup_ccp2(CCP_CAPTURE_RE); //Configuracin captura en flanco de subida cambio=0; //Prximo flanco debe ser de subida if(nuevopulso==0) nuevopulso=1; } } /******************************************************************************/ /*************************** FUNCIN PRINCIPAL ********************************/ void main(){ trisb=0x00; trisc=0x00; //Puerto B todo salidas //Puerto C todo salidas //Fin de pulso... //Pulso finalizado.

setup_timer_1(T1_INTERNAL); //Configuracin timer1 para lectura objeto setup_ccp2(CCP_CAPTURE_RE); //Configuracin modo captura en flanco de subida disable_interrupts(INT_TIMER1); disable_interrupts(INT_CCP2); //Deshabilitacin interrupcin modo comparacin enable_interrupts (GLOBAL); lcd_init(); //Inicializacin de la pantalla lcd printf(lcd_putc, "\fMedida distancia");

printf(lcd_putc,"\n con srf05 "); delay_ms(2000); printf(lcd_putc,"\f (c) RobotyPic "); delay_ms(2000); while (1){ pulso_test(); //Envo del pulso ultrasnico printf(lcd_putc,"\fDistancia=%5.2f", distancia); delay_ms(500); //Refresco de la medida } }

You might also like