Make your own free website on Tripod.com
Robots Móviles
Software y documentación para robots móviles

GP2D12: Sensor de medida de distancias

La familia de sensores Sharp GP2Dxx es una de las más utilizadas tanto en lo que viene a denominarse robótica móvil casera como en el ámbito de investigación debido principalmente a su facilidad de integración y su bajo coste (unos 15 Euros). En la Figura puede verse una imagen de un GP2D12.

[ Sensor GP2D12 ]

Otro dispositivo de esta familia bastante utilizado es el GP2D02. La principal diferencia entre unos y otros es que los GP2D02 ofrecen una salida serie de las medidas proporcionadas mientras que los GP2D12 dan una salida analógica entre 0 y 3 voltios dependiendo de la distancia a la que se encuentre el objeto. La salida analógica no es lineal sino que sigue una curva como la que se muestra en la Figura. En aplicaciones de robótica móvil es común la utilización de un conversor analógico-digital con el que adaptar esa tensión para su tratamiento digital. Cuando además interese conocer la medida con exactitud y no un valor aproximado de la cercanía de los objetos, se debe realizar una calibración del dispositivo que permita dar una magnitud de la distancia junto con una medida del error cometido.

[ Curva de tesnión de salida según la distancia al obstáculo ]

Otra diferencia entre ambos es que los GP2D02 tienen un mayor periodo de actualización de las medidas realizadas, 75 ms frente a los 40 ms de los GP2D12. Esta característica debe tenerse en cuenta a la hora de seleccionar el sensor para aplicaciones concretas.

También existen modelos conocidos como GP2Dx5 que dan una salida a nivel alto cuando la medida sobrepasa determinado umbral y que funcionan como optointerruptores. En las páginas de Sharp puede encontrarse información adicional al respecto.

Tanto unos como otros se basan en el principio de triangulación para realizar las medidas. El elemento a la izquierda del sensor según vemos la Figura es un led infrarrojo que emite un haz que será rebotado por el objeto y posteriormente recogido por el elemento situado a la derecha. Este último se conoce como PSD (Position Sensing Device, Dispositivo de Percepción de Posición) y puede entenderse como una lente situada sobre un array de células sensibles a la luz infrarroja. Dependiendo del ángulo de incidencia del haz rebotado en la lente, se activa una u otra célula del array lo que permite estimar la distancia a la que se encuentra el objeto.

El conexionado de los GP2D12 con un microntrolador es sumamente sencillo requiriendo solamente una entrada del conversor analógico-digital a la que se conectará el pin de salida del sensor (el de más a la izquierda visto de frente según se muestra en la Figura). Los otros dos pines corresponden, respectivamente, con GND y con Vcc, la tensión de alimentación, que deberá ser próxima a los 5 voltios. Se recomienda el uso de una tensión regulada (por ejemplo, mediante un 7805) para no introducir ruido en las medidas debido a que la tensión caiga por debajo de su umbral de funcionamiento. Así mismo, se recomienda utilizar un condensador de 22 uF entre Vcc y GND para reducir el ruido en la alimentación debida a la corriente requerida por el led emisor. También podría utilizase un condensador entre la señal de salida Vo y Vcc o GND (filtro paso bajo) pero se disminuye considerablemente la dinámica del sensor.

[ Conexiones del GP2D12 ]

Antes de pasar a describir su uso desde el punto de vista de la programación, vamos a resumir algunas características de cierta importancia. En el Tabla se recogen los datos principales ofrecidos por el fabricante. Vemos que el rango de medida se encuentra entre los 10 y 80 cm. Si se baja de los 10 cm la tensión de salida disminuye más rápidamente que cuando se supera este umbral (véase la figura anterior) pero no se puede conocer si estamos por encima o por debajo del umbral. Dada esta característica, es bastante habitual colocar el sensor de forma que nunca puedan darse medidas menores a los 10 cm, dejando, por ejemplo, que esa distancia sea cubierta por el chasis del robot.

Rango
10-80 cm
Periodo de lectura
40 ms
Máximo ángulo de reflexión
> 40 grados
Tensión de alimentación
4.5-5.5 V
Ruido de salida
200 mV
Consumo medio
35 mA
Consumo de pico
200 mA

Otra característica menos conocida es el pico de corriente que precisa el sensor debido a la emisión del led infrarrojo. Un valor de 200 mA puede ser relativamente alto dependiendo del tipo de aplicaciones y elementos electrónicos utilizados. Concretamente, de forma empírica se ha comprobado que este hecho puede provocar ruido cuando se utilizan micrófonos como otros elementos sensoriales del robot. En tales casos, se recomienda ampliar la electrónica de conexionado para que se puedan desconectar los sensores de distancia cuando no sean necesarios o mientras que se están realizando otro tipo de medidas.

Integración con el sistema de control

Vamos a conectar el GP2D12 a una tarjeta CT6811 de Microbótica. Utilizaremos el canal 2 del conversor analógico digital del 68HC11 (PE2) para realizar las conversiones de la señal de salida del sensor. Como hemos comentado con anterioridad, los valores de salida están comprendidos entre los 0 y 3 voltios, aproximadamente, con lo que tendremos unas lecturas, una vez convertidas, en el rango [0x17, 0x85].

El valor 0x17 concuerda con el menor valor devuelto por el sensor (cercano a 0 voltios), correspondiente a su máxima distancia (80 centímetros). Pueden obtenerse valores aún menores en las lecturas que corresponderán con objetos todavía más lejanos, concretamente hasta 0x0C que se corresponden con 120 centímetros. El error de medida en esta zona puede ser alto ya que estamos saliendo fuera de las especificaciones del fabricante.

Por su parte, el valor 0x85 se corresponde con el mayor valor devuelto por el sensor (unos 3 voltios) y establece la menor distancia que puede leerse con el GP2D12 que se ha utilizado para las pruebas que es de 8 cm.

Los valores intermedios no se ajustan linealmente sino que como se comentó anteriormente, siguen una curva como la que se muestra en la figura. En el siguiente apartado estableceremos un mecanismo para convertir valores intermedios mediante una tabla look-up y así conocer, con error, la distancia a la que están los obstáculos desde nuestro robot. No conocer con precisión la distancia no es problema para muchos comportamientos de evitación de obstáculos que podemos establecer en nuestro robot, podemos definir etiquetas en ciertas medidas que usadas como umbral nos permitan conocer si los obstáculos están cerca o lejos. Nótese que los humanos no utilizamos información precisa en nuestros movimientos y, normalmente, no chocamos con el mobiliario.

Hemos dicho que vamos a utilizar el canal 2 del conversor del 68HC11. Como es sabido, las entradas del conversor están disponibles a través del puerto E de dicho micro. Esto hace que sea común la utilización de la notación PE2 para referirse al pin correspondiente. Para una comprensión del funcionamiento del conversor se recomienda la consulta del propio Manual de Referencia del microcontrolador o de literatura técnica relacionada (puede consultarse el libro Microcontrolador MC68HC11: Fundamentos, recursos y programación}, C. Doblado et al., Microbótica, S.L., 1999), en este caso vamos el conversor analógico-digital en modo de scan simple y único canal.

La primera tarea a realizar en nuestro programa es encender el conversor analógico-digital del 68HC11. Esta operación se realiza a través del registro OPTION según se indica a continuación:


           LDAA #$80               ; Encience el conversor A/D
           STAA OPTION,X

Recordamos que en el modo utilizado se realizan cuatro conversiones consecutivas del canal seleccionado quedando en los registros ADR1 a ADR4, en nuestro caso usaremos la primera de las conversiones, es decir, la que queda en el registro ADR1. La configuración del modo se realiza mediante el registro ADCTL según se indica a continuación.


   bucle   LDAA #$02               ; Config: Scan=0,Mult=0,PE2
           STAA ADCTL,X

Como decimos, los valores de las conversiones los recogeremos del registro ADR1. Esto puede realizarse con una simple instrucción de carga en un acumulador desde esa posición de memoria. Antes de que la conversión esté disponible debemos realizar una espera activa comprobando que la bandera de conversión (bit más significativo del registro ADCTL) se active. Nótese que en las líneas que se muestran a continuación y que se corresponden con las operaciones de espera y captura del valor se ha utilizado direccionamiento indexado a través del registro índice X; dicho registro debe estar convenientemente inicializado con el valor 0x1000 para acceder a las posiciones de memoria deseadas.


   bucle2  BRCLR ADCTL,X $80 bucle2
           LDAA ADR1,X

El programa completo que nos va a permitir la prueba de los sensores se muestra a continuación y se deja como ejercicio que el lector efectue un seguimiento del código para que entienda el funcionamiento. Sólo indicaremos que tras la inicialización del conversor, el programa se queda en un bucle sin fin en el que se envía cada lectura por el puerto serie asíncrono; de cada valor recibido se envían dos caracteres correspondientes a los nibbles alto y bajo para una mejor representación del valor usando un software de comunicación convencional en el PC.


   * -----------------------------------------------------------------------
   * leeconv.asm
   *
   * Va mostrando por el SCI todos los valores de los canales del conversor
   * -----------------------------------------------------------------------

   PORTA   EQU $00                 ; Dirección del puerto A
   PORTE   EQU $0A                 ; Dirección del puerto E

   SCSR    EQU $2E                 ; Registro de estado del SCI
   SCDR    EQU $2F                 ; Registro de datos del SCI

   OPTION  EQU $39                 ; Direccion del registro OPTION
   ADCTL   EQU $30                 ; Direccion del registro ADCTL
   ADR1    EQU $31                 ; Canal Adr1 del conversor

   * -----------------------------------------------------------------------

           ORG $0000               ; Programa en RAM interna

           LDAA #$80               ; Encience el conversor A/D
           STAA OPTION,X
           BSR f_wait

   bucle   LDAA #$02               ; Config: Scan=0,Mult=0,PE2
           STAA ADCTL,X

   bucle2  BRCLR ADCTL,X $80 bucle2
           LDAA ADR1,X
           BSR sendhex

           BSR f_wait
           BSR f_wait

           BRA bucle

   * -----------------------------------------------------------------------
   * Envía el carácter del acumulador A por el puerto serie SCI
   * -----------------------------------------------------------------------

   sendc   BRCLR SCSR,X $80 sendc  ; Espera a que termine un envío anterior
           STAA SCDR,X             ; Envía el carácter
           RTS

   * -----------------------------------------------------------------------
   * Envía el dato que hay en el acumulador A como dos caracteres numéricos
   * -----------------------------------------------------------------------
 
   sendhex TAB                     ; Guarda el dato en B
           LSRA                    ; Prepara el nibble más significativo
           LSRA
           LSRA
           LSRA
           BSR tohex               ; Lo convierte a carácter
           BSR sendc               ; Lo envía
           TBA                     ; Recupera el dato desde B
           ANDA #$0F               ; Prepara el nibble menos significativo
           BSR tohex               ; Lo convierte a carácter
           BSR sendc               ; Lo envía
           LDAA #' '               ; Envía un espacio para mayor claridad
           BSR sendc
           RTS
 
   tohex   CMPA #$0A
           BLT tohexn
           ADDA #55
           RTS

   tohexn  ADDA #'0
           RTS

* -----------------------------------------------------------------------

           include ../wait.inc

           END

Tabla de conversión

En este caso no vamos a realizar una calibración real del sensor ya que esto implicaría comparar las lecturas devueltas por cada GP2D12 con patrones específicos para cada medida y disponer de un sistema lo suficientemente preciso y con error conocido que nos permitiese determinar a su vez los errores en las medidas del sensor que estamos calibrando. Estos sistemas suelen ser bastante caros o difíciles de conseguir y normalmente se utlizan servicios de laboratorios especializados.

Por nuestra experiencia en Robótica Móvil con sensores de medida de distancia y su integración en el sistema de control, una extrema precisión en las medidas devueltas por los sensores no excluye que se tenga que tener en cuenta la incertidumbre en el sistema completo. Al no trabajar en entornos altamente estructurados y con elementos completamente conocidos, siempre es conveniente adoptar soluciones que convivan con esa incertidumbre y no traten de eliminarla. Esto es por lo que las aproximaciones reactivas o las basadas en técnicas borrosas, por ejemplo, dan tan buenos resultados.

En el Tabla ofrecemos la correspondencia entre la distancia medida de forma aproximada en milímetros y el valor devuelto por el conversor. Para la generación de los valores se ha utilizado una superficie como la recomendada por el fabricante en la hoja de datos del GP2D12, siendo el ángulo de incidencia del haz infrarrojo perpendicular a la superficie. El sistema estaba alimentado con una tensión regulada de 5 voltios. Estos valores pueden ser completados utilizando otros ángulos de incidencia o con otras superficies.

Valor
Distancia (mm)
Valor
Distancia (mm)
Valor
Distancia (mm)
0x85
80
0x4E
160
0x2D
300
0x7D
90
0x48
170
0x26
400
0x75
100
0x46
180
0x20
500
0x6F
110
0x43
190
0x1B
600
0x64
120
0x40
200
0x19
700
0x5C
130
0x3A
210
0x17
800
0x55
140
0x36
220
0x14
900
0x54
150
0x33
230
0x0C
1200
0x32
240
0x2C
250

Podemos añadir unos cuantos comentarios a partir del análisis de los valores recogidos en la tabla. El valor mínimo dado por el fabricante es de 10 cm aunque vemos que es posible obtener lecturas que siguen haciendo crecer los valores hasta los 8 cm. A partir de ese momento, las lecturas comienzan a descender. En cualquier caso se recomienda que se sigan las directrices dadas por el fabricante ya que el error cometido en la estimación de la distancia en el propio sensor puede ser considerable (incluso de 20 mm en los extremos frente a los 2 mm correspondientes al centro del intervalo según la documentación manejada.

En el otro extremo ocurre igual. El fabricante indica que la mínima lectura correspondiente a la máxima distancia es de 80 cm. Empíricamente se ha comprobado que la máxima distancia real que puede obtenerse es de 120 cm aunque las recomendaciones anteriores sobre el error de estimación también debe tenerse en cuenta en este caso. El error a partir de los 80 cm es considerable.

Vemos que las medidas desde los 8 cm a los 25 cm se han tomado cada centímetro, a partir de ese punto las medidas se han realizado cada 10 cm ya que el cambio en los valores no permitían un mejor ajuste. Esto también deberá tenerse en cuenta durante su uso ya que el error en esa zona será mayor.

En la Figura podemos ver la curva que se obtiene representando gráficamente los valores anteriores. Puede comprobarse que es similar a la que proporciona el fabricante en la hoja de datos del sensor en el intervalo de valores considerado.

[ Representación gráfica de la conversión ]

Como último comentario añadiremos que realmente lo que perseguimos es conocer la distancia entre el sensor y el objeto de referencia a partir del valor devuelto. El caso más habitual es que los valores no sean los que están recogidos en la tabla sino que estén dentro de algún subintervalo de los considerados. En esos casos, se realizará una estimación de la distancia correspondiente mediante interpolación lineal.


© Javier de Lope Asiaín 2000-2002
Última modificación
29-Mar-2002