Sensores de distancia
 

Sensor IR GP2D12

 

1.- Fundamentos

El sensor medidor de distancia GP2D12 proviene de una extensa familia de la casa Sharp de la gama GP2DXX. Este en particular indica mediante una salida analógica la distancia medida. Esta salida es no lineal y atiende a la curva siguiente:

Si observamos detenidamente la gráfica, vemos que el sensor es eficaz en el intervalo de distancias 10 hasta 60 cm ya que a distancias menores la curva no es homogenea y para distancias mayores el intervalo de voltaje de salida del sensor es muy pequeño. Es por ello necesario limitar el sensor a este intervalo ya sea por software o hardware.

Este tiene únicamente tres pines, los cuales son masa, alimentación (5V) y salida analógica (entre 0 y 3V).

Para su buen funcionamiento es recomendable poner un condensador de desacoplo de 100nF entre la alimentación y masa.

El funcionamiento de este sensor es muy sencillo, este tiene un fotodiodo emisor de IR, el cual podeis ver si está encendido con cualquier cámara, inclusive la del móvil. Por otro lado este tiene un array de fotodetectores CCD que trabajan a la misma longitud de onda del emisor (850 nm de pico). Mediante una sencilla triangulación entre el emisor y el receptor podemos saber a que distancia se situa el objeto, tal y como se muestra a continuación.

 

2.- Cálculo matemático de la distancia

El sensor tiene como salida un voltaje entre 0 y 3 voltios dependiendo de la distancia del obstáculo, pero este dato no es suficiente para saber a que distancia está el objeto, con lo que tendremos que hacer una regresión polinomial de la curva entre la salida del sensor y la distancia. Para ello hemos recogido los siguientes puntos:

Salida (V)
Distancia (cm)
2.6
8.5
2.5
10
2.2
11.5
2
13
1.75
15
1.4
20
1.12
25
0.96
30
0.85
35
0.75
40
0.68
45
0.62
50
0.58
55
0.52
60
0.5
65
0.47
70
0.44
75
0.41
80

Mediante dichos puntos hemos realizado una regresión polinomial de 4º grado quedando como resultado la siguiente gráfica comparada con la curva real del sensor.

Por tanto la curva de la regresión queda representada por la función:

y = 16.75·x^4 - 119.26·x^3 + 311.7·x^2 - 365.71·x + 184.03 donde y(cm) y x(voltio)

Dada esta función si tenemos el valor en voltios del sensor y lo sustituimos por x en la ecuación tendremos la distancia del objeto en centímetros que es y.

 

3.- Recogiendo los datos del GP2D12

Ahora 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 SRF05, el cual lo podéis ver en el siguiente enlace.

Sensor US SRF05

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, dura 8 veces más

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);
}
}
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 conversión analógica-digital cada vez que el PIC recibe un caracter '1' para luego procesar la conversión y pasarlo a distancia mediante la ecuación de la curva del sensor, más tarde enviar el dato al ordenador a través del usb.

 

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 GP2D12.

Esquemático en OrCAD.

Proyecto PIC en CCS.

Ejecutable MetroTrasto.

 

6.- Ejemplo visual de la aplicación

 
 



Inicio | Foro | FAQ | MapaWeb | BuscadorWeb