Sensores de distancia
 

Sensor US SRF05

 

1.- Fundamentos

El sensor medidor de distancia SRF05 es un sensor de US (Ultrasonidos) capaz de medir ditancias de hasta 5 metros. Este es una versión actualizada del sensor SRF04. Básicamente tiene tres mejoras respecto a su antecesor. La primera es la incorporación de un led en su parte trasera que nos indica el buen funcionamiento de éste. La segunda mejora es el aumento de la distancia que pasa de 4 a 5 metros. La última y no por ello menos importante, es el modo de funcionaiento de éste, permite utilizar el mismo sistema que su antecesor (utilizando dos pines) y el nuevo modo que simplifica el sistema utilizando un único pin.

Modo 1: compatible con SRF04 ( 2 pines )

Este modo usa el disparo y el eco de forma separada, para utilizar este modo sólo necesitamos conectar el sensor de la siguiente manera.

Su funcionamiento es muy sencillo, tenemos que enviar un pulso de 10us por la patilla del disparador para que este active el sensor y haga la medición. La salida del sensor no es más que otro pulso de entre 100 us y 25 ms, donde un pulso de duración de 30 ms indicaría que el obstáculo está fuera de rango del sensor.

Modo 2: Mismo pin para disparador y eco ( 1 pin )

Este modo usa el disparo y el eco de forma conjunta, para utilizar este modo sólo necesitamos conectar el sensor de la siguiente manera.

Tiene la ventaja de usar sólo un único pin pero su principal desventaja es que tenemos que programar el pin como entrada y salida en el dispositivo a recivir la salida del sensor, en nuestro caso el microcontrolador.

Su funcionamiento es el siguiente, programamos el pin del PIC como salida y emitimos un pulso de 10us por él. Más tarde programamos el mismo pin como entrada y medimos la duración del pulso de salida del sensor.

 

2.- Cálculando la distancia

El sensor tiene como salida un pulso proporcinal a la distancia, donde la distancia en centímetros es el tiempo de duración del pulso en us entre 58.

d(cm) = pulso(us)/58

d(inches) = pulso(us)/148

Hay que tener en cuenta que el sensor sólo puede hacer una medida cada 50ms, lo que equivale a que podemos realizar medidas a una frecuencia de 20Hz.

 

3.- Recogiendo los datos del SRF05

Hemos creido conveniente realizar la aplicación para el Modo 1 ya que es compatible con el sensor SRF04.

Vamos a recoger los datos del sensor y pasarlos al ordenador mediante usb a través de un microcontrolador de la casa de microchip. Este ejemplo recoge tambien la implementación del sensor de ultrasonidos GP2D12, el cual lo podéis ver en el siguiente enlace.

Sensor IR GP2D12

El esquemático y componentes necesarios para la realización de este tutorial es el siguiente.

ADVERTIR que el esquemático está realizado con un 18F4550 TQFP con lo que la numeración de las patillas difiere al integrado DIP (cucaracha). Lo que no difiere es el nombre o funcionalidad de éstas.

La programación del pic se a realizado mediante el compilador CCS. Este ejemplo procesa a la vez la distancia de un sensor IR y un sensor US por lo que si sólo queremos implementar uno de ellos tendremos que quitar la líneas que correspondan al sensor que no deseemos utilizar.

El código fuente es el siguiente.

#include <18F2550.h>
#device adc=10
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=48000000)

#define LEDV PIN_B4
#define LEDR PIN_B5
#define LED_ON output_high
#define LED_OFF output_low

#define Trigger PIN_A2 // Pin usado para el pulso de Disparo
#define Echo PIN_A1 // Pin usado para recibir el eco ultrasónico

char c;

long echo_delay;
long distance;
long value;
float Voltios;
float distanceIR;

#include <math.h>
#include <usb_cdc.h>//Siempre va antes del include usb_desc_cdc.h
#include <usb_desc_cdc.h>

void medir_srf05(void);

void main() {

float const resoluc= 5.0/1024.0; // Conversión de 10 bits

LED_OFF(LEDV); //encendemos led rojo
LED_ON(LEDR);

output_low(Trigger); // Inicializamos el trigger
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); // Timer1, preescaler 1:8

usb_cdc_init();
usb_init(); //inicializamos el USB
enable_interrupts(global); // Habilita interrupciones

usb_task();
usb_wait_for_enumeration();//Esta linea espera hasta que el usb esté conectado

setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports(AN0);

LED_OFF(LEDR);
LED_ON(LEDV); //encendemos led verde

while (true)
{
if(usb_enumerated())
{
if (usb_cdc_kbhit())
{
c = usb_cdc_getc();
if (c == '1')
{
LED_OFF(LEDR);
LED_ON(LEDV);
medir_srf05();
set_adc_channel(0);
delay_ms(1);//Esperamos a que se estabilice el CAD
value = read_adc();//voltios=((fondo_de_escala*read_adc())/2^n), donde n es el número de bit del CAD
Voltios = value * resoluc;
if ((Voltios >0.5) && (Voltios<2.7))
{
distanceIR=((16.75*pow(Voltios,4.0))-
119.26*pow(Voltios,3.0))+(311.7*pow(Voltios,2.0))-(365.71*Voltios)+184.03);
if (distanceIR>10.0)
{
printf(usb_cdc_putc,"IR: %1.2f voltios (%lu), %1.2f cm\r\n",Voltios, value,distanceIR);//Saca el mayor entero
}
}
else
printf(usb_cdc_putc,"IR: %1.2f voltios (%lu), >60.0 cm\r\n",Voltios, value);

printf(usb_cdc_putc,"Ultrasonido: %lu cm\r\n",distance);//Saca el mayor entero
LED_OFF(LEDR);
LED_OFF(LEDV);
}
}
}
}
}

void medir_srf05(void){
delay_ms(10); // generamos un trigger de 10 ms
output_high(Trigger);
delay_us(10);
output_low(Trigger);
while ( !input(Echo) );// esperamos a que Echo esté en flanco de subida
set_timer1(20536); // Inicializamos el temporizador para contar a lo sumo 30 ms
while ( input(Echo) );// esperamos a que Echo esté en flanco de bajada
echo_delay = get_timer1();//Cuando Echo finalize contamos el tiempo transcurrido
if (echo_delay > 58035){//Si es mayor de 25ms, no hay objeto
distance = 0xffff;//65535
}
else {
distance = (echo_delay-20536)/84;
}
//d(cm)=((4*prescaler*(get_timer1-init_timer)) / (clock(MHz)*58))
//d(cm) = (4*8*(get_timer1()-20536))/(58*48) -> d(cm)= (get_timer1-20536)/84
}

El programa realiza una medición cada vez que el PIC recibe un caracter '1'.

Para la realización del disparador se ha programado mediante delay, ya que es la forma más sencilla de hacerlo aunque es cierto que no es la más adecuada.

Para medir el ancho del pulso hemos realizado un temporizador, el cual se inicia a un valor determinado por nosotros cada vez que el PIC recibe un '1'. Porqué lo hemos inicializado a dicho valor o porqué hemos usado un prescaler de 1:8, vamos a explicarlo:

El temporizador1 o timer1 es de 16 bits con lo que puede tener valores de 2 elevado a 16, es decir entre 0 y 65535, pero cuanto tarda nuestro temporizador en desbordar, ya que el temporizador genera una interrupción cuando transcurre dicho tiempo.

El tiempo transcurrido se calcula a través de la fórmula siguiente:

t(us) = (4*prescaler*(get_timer1-init_timer)) / (clock(MHz))

Si iniciamos el temporozador a cero con la función set_timer1(0) y esperamos a que desborde (que termine de contar), tenemos que:

t(us) = (4*8*(65535-0)) / 48) = 43690 us = 43.69 ms

Pero nosotros queremos que a lo sumo de el temporizador desborde a los 30 ms ya que en dicho tiempo si no recibimos el flanco de bajada del pulso de medida del sensor significará que no hay un obstáculo, por tanto nuestro tiempo inicial tiene que ser:

30.000 = (4*8*(65535-init_timer)) / 48

45.000 = 65535 - init_timer

init_timer = 65535 - 45000 = 25535

Por tanto tendremos que set_timer1(25535). Lo que indica que nuestro temporizador empezará a contar en 25535 hasta llegar a 65535 que en medida de tiempo será de 30 ms.

Si queremos saber la distancia tendremos que dividir el tiempo entre 58 o lo que es lo mismo:

d(cm) = ((4 * prescaler * (get_timer1 - init_timer)) / (clock(MHz) * 58))

En nuestro caso:

d(cm) = (4 * 8 * (get_timer1() - 20536)) / (48 * 58)

d(cm) = (get_timer1() - 20536) / 84

Si queremos usar el temporizador0 o timer0 del PIC hay que tener en cuenta que es de 8 bits.

 

4.- Programación PC

La realización de nuestro propio programa para comprobar el buen funcionamiento de éste es la cuspide de este tutorial de sensores de distancia.

El funcionamiento es muy sencillo, seleccionamos el puerto com correspondiente y sus propiedades (velocidad, paridad...) para más tarde pulsar sobre Inicio para comenzar la comunicación.

Si deseamos una adquisición automática de 4 Hz sólo tendremos que activar la casilla "Activar adquisición automática", si por el contrario lo queremos hacer de forma manual, sólo habrá que poner un 1 en el editbox de enviar y pulsar el botón enviar.

 

5.- Download

Datasheet SRF05.

Esquemático en OrCAD.

Proyecto PIC en CCS.

Ejecutable MetroTrasto.

 

6.- Ejemplo visual de la aplicación

 
 



Inicio | Foro | FAQ | MapaWeb | BuscadorWeb