Anda di halaman 1dari 7

Medida de distancias con SRF04

En realidad en este proyecto se emplea un sensor de distancias por ultrasonidos SRF05 pero
funcionando en modo SRF04 con pulso trigger y eco por pines separados. El sensor SRF05 es una
versin mejorada del clsico SRF04 con el que es compatible.

El PIC manda un pulso de al menos 10us por la linea Pulso trigger para comenzar el proceso de
medida. El srf04 responde con un tren de 8 impulsos ultrasnicos a 40Khz. Pone su Pulso eco en
estado alto hasta recibir el eco ultrasnico de los impulsos. La distancia al objeto estar en funcin
del tiempo del pulso eco en un rango de 100us (mnima distancia medible) hasta 25 ms (mxima
distancia medible). Si el sensor no recibe el eco ultrasnico pasa su salida eco a estado bajo a los
30ms.

Para calcular la distancia es necesario por tanto saber la duracin del pulso eco mediante el modo
captura del CCP2 del PIC configurandolo para que detecte los flancos de subida y bajada de la
seal. Cada vez que esto ocurre el valor del timer1 pasa al registro del mdulo CCP.
El valor numrico del pulso ser el valor del timer1 en el pulso de bajada menos su valor en el
flanco de subida del pulso:
TF=(TFB-TFS);

El valor numrico del registro se pasa a uS segn la expresin:


tiempo = TF*1.0;

Y finalmente para pasar este valor de uS a su equivalente en cm:


distancia = tiempo/58;

Aqu se puede ver el programa completo en lenguaje c para el PIC.


[+/-] Ver / Ocultar programa en C
////////////////////////////////////////////////////////////////////////////////
//
//
//
MEDIDA DE DISTANCIAS CON SRF04
//
//
//
//
(c) RobotyPic 2010
//
//
//
////////////////////////////////////////////////////////////////////////////////
#include <16F876A.h>
#fuses XT, NOWDT, NOPROTECT
#use delay(clock=4000000)

//Frecuencia del cristal oscilador 4MHz

#byte PIR1=0x0C
#byte
#byte
#byte
#byte
#byte
#byte

trisa=0x85
porta=0x05
trisb=0x86
portb=0x06
trisc=0x87
portc=0x07

#define use_portb_lcd TRUE


#include <lcd.c>
#define BIT_TEST_ON
#define BIT_TEST_OFF

//Configuracin del puerto b para uso del lcd


//Incluye uso del archivo para control del lcd

output_high(PIN_C0)
output_low(PIN_C0)

/********************** Prototipos de las funciones ***************************/


void main (void);
void pulso_test (void);
void ccp2_int(void);

//funcin principal
//da pulso y calcula distancia al objeto
//captura del pulso de eco

/******************** Variables para lectura distancia ************************/


int1 nuevopulso=0;
int16 TFB=0,TFS=0,TF=0;
float distancia=0.0;
int1 cambio=0;

//Entra otro pulso de lectura


//Tiempo flancos
//Valor distancia al obstculo
//Control flanco subida o bajada del impulso leido

/******************************************************************************/
/*********************** FUNCIN PULSO DE TEST ********************************/
void pulso_test(){
enable_interrupts(INT_CCP2);
BIT_TEST_ON;
delay_us(10);
BIT_TEST_OFF;

//Habilitacin interrupcin para medida de pulso eco


//salida de pulso test durante 10us por Bit 0 puerto C

while(nuevopulso==0)
{}

//Espera a finalizar el pulso eco

if(nuevopulso==1){
TF=(TFB-TFS);
distancia=TF*1.0;
distancia = distancia/58;
nuevopulso=0;
}

//Finalizado el pulso eco se calcula su valor.


//Valor entre pulso de subida y bajada.
//Valor pulso leido en us de 100u a 25ms
//Distancia del obstculo en cm
//Listo para recibir nuevo pulso

disable_interrupts(INT_CCP2);
}
/******************************************************************************/
/************************ FUNCIN LECTURA OBSTCULO ***************************/
#int_ccp2

//LLamada por interrupcin flanco en RC2

void ccp2_int(){
if(cambio==0){
TFS=CCP_2;
setup_ccp2(CCP_CAPTURE_FE);
cambio=1;
}
else {
TFB=CCP_2;
setup_ccp2(CCP_CAPTURE_RE);
cambio=0;
if(nuevopulso==0)
nuevopulso=1;

//Si es flanco de subida...


//Carga en valor flanco subida valor registro ccpr1
//Configuracin modo captura en flanco de bajada
//Prximo flanco debe ser de bajada
//Si es flanco de bajada...
//Carga en valor flanco bajada valor registro ccpr2
//Configuracin modo captura en flanco de subida
//Prximo flanco debe ser de subida
//Fin de pulso...
//Pulso finalizado.

}
}
/******************************************************************************/
/*************************** FUNCIN PRINCIPAL ********************************/
void main(){
trisb=0x00;

//Puerto B todo salidas

trisc=0b00000010;
setup_timer_1(T1_INTERNAL);
setup_ccp2(CCP_CAPTURE_RE);

//Puerto C definicin de entradas y salidas


//Configuracin timer1 para lectura objeto
//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 srf04
");
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
}
}

Segn las especificaciones del sensor, el mnimo tiempo entre pulsos eco para la ejecucin de la
medida es de 50ms para evitar la lectura de ecos de medidas anteriores. En este proyecto se ha
especificado 500ms, es decir, el refresco de la medida se ejecuta y muestra en el lcd cada medio
segundo.

En este video se puede ver el funcionamiento.

Los archivos tanto del codigo fuente como del programa para cargar en el PIC as como el video
demostrativo se pueden descargar del siguiente enlace:
Descargar medida de distancias con SRF04

A continuacin se muestra una simulacin utilizando el proyecto del SRF04 bajo proteus. Hay que
dejar claro que se trata de una simulacin, quiero decir, para simular los valores de distancia se
emplean valores analgicos de tensin, pero puede ser de ayuda para verificar que nuestros
diseos basados en el SRF04 funcionan.

En este enlace, la descarga de archivos para demostrar la simulacin:


Descargar Simulacion medida distancias con SRF04
http://robotypic.blogspot.com.br/2010/10/medida-de-distancias-con-srf04.html

Utilizando sensor ultrasnico no


PIC
Pois bem pessoal , sou novo aqui neste frum e gostaria de uma ajuda para entender um cdigo que estou
utilizando para poder medir distncia com um sensor ultrasnico com um microcontrolador .
bem o cdigo este :
#include <16F870.h>
#FUSES NOWDT //No Watch Dog Timer
//#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
//#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
int16 time;
float distance;

#define trig pin_B1


#define echo pin_B0
void main()
{
delay_ms(1000);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
while(true)
{
output_high(trig);
delay_us(10);
output_low(trig);
while(!input(ECHO))
{}
set_timer1(0);
while(input(ECHO))
{}
time=get_timer1();
distance=time*0.017;

delay_ms(1000);
}
}
Utilizo o compilador CCS e gostaria de uma ajuda para compreender o cdigo uma vez que eu achei ele na
internete e s alterei para poder fazer a leitura em um display LCD .
Fico grato desde j .

Eu pesquisei , fiz desse jeito e deu certo , peguei o valor da varivel distance e direcionei a um
display LCD em outro programa , este programa que postei foi apenas para a leitura da distancia
, no estou atirando para todos os lados , so gostaria humildemente pedir ajuda para interpretar
este cdigo que por sinal funciona muito bem e o meu sensor trabalha como o luis nos descreve
em seu comentario , so quero interpretar o cdigo.

Amigo nao sou o mais indicado para te explicar, o seu codigo parece bem simples, mas se for
funcional o q ha de errado? kk vou te passar um link q passa outro codigo e da uma abordada
sobre a programaao, inclusive se estas pondo em pratica o projeto, gostaria q comparasse eles

e desse uma posicao p galera .espero q nao esteja indo contra as regras do site sobre o link, e se
sim favor moderadores apagar.

http://labdegaragem.com/forum/topics/utilizando-sensor-ultras-nico-no-pic

Anda mungkin juga menyukai