arduino-sharp-gp2y0a02yk0f

Medir distancias con Arduino y sensor Sharp GP2Y0A02YK0F

¿Qué es un sensor Sharp GP2Y0A02YK0F?

El Sharp GP2Y0A02YK0F es un sensor de distancia óptico. Está compuesto por un LED infrarrojo junto con dispositivo detector de posición (PSD) y un procesador integrado encargado de realizar el cálculo de la distancia.

El sensor escanea de forma continua los objetos ubicados en frente suyo y proporciona la salida mediante una referencia de tensión analógica, por lo que podemos emplear las entradas analógicas de Arduino para leer el valor de la distancia.

El rango de medición es de 20 a 150 cm, manteniendo un grado de precisión elevado en todo el intervalo. La tensión de alimentación es de 4.5 a 5.5V y el consumo de corriente de 33mA. El intervalo de refresco entre mediciones es de unos 80ms.

El GP2Y0A02YK0F es un dispositivo sencillo de conectar y usar. Sin embargo hay que tener en cuenta que incorpora un conector JST (Japanese Solderless Terminal) para su conexión, por lo que tendremos que emplear un conector de este tipo o soldar directamente los terminales en la placa.

El sensor es poco sensible al color y reflectividad del objeto detectado, ni a la temperatura ambiente. Sin embargo, sí puede ser afectado por luz ambiente si recibe un alto grado de luminosidad de forma directamente, en especial al usarlo en exterior. También pueden proporcionar mediciones incorrectas al detectar objetos transparentes o muy brillantes, especialmente vidrios y espejos.

El sensor Sharp es más preciso que los sensores de ultrasonidos como el HC-SR04, especialmente en distancias medias y largas, donde los sensores de ultrasonidos ven afectadas sus mediciones por los rebotes y ecos que producen las geometrías del entorno.

Sin embargo no puede operar en distancias cortas (<20cm) donde el HC-SR04, aunque con baja precisión, al menos puede realizar mediciones.

Cuando montéis estos sensores en un vehículo o robot intentarlos montarlos en la parte trasera del mismo, aunque la primera tendencia sea montarlos en la delantera. Así ganáis el ancho del vehículo como distancia, y podréis medir distancias inferiores.

Por otro lado, el sensor Sharp tiene una zona de medición más estrecho que el HC-SR04, lo cual permite obtener mayores para mediciones en frente del objeto. Por contra, ignorar objetos que el HC-SR04 si detectaría por su mayor ángulo de medición (por ejemplo, las patas de una mesa).

Finalmente, al emplear más de un sensor pueden producirse interferencias entre las mediciones si ambos haces interfieren. Sin embargo, el problema es mucho menor que al combinar sensores HC-SR04, donde podemos tener interferencias incluso sin que los haces interfieran, por los rebotes y ecos secundarios originados por el propio HC-SR04.

Podemos usar el GP2Y0A02YK0F en nuestros robots para medición de distancias en rangos medios y largos en un haz estrecho. Dadas sus diferentes características, podemos combinarlos con sensores ultrasonido tipo HC-SR04 para rangos cortos o amplios, o sensores de detección de obstáculos para distancias muy cortas.

El sensor Sharp también tiene puede ser empleado en otro tipo de aplicaciones como, por ejemplo, sistemas Touch-Less, control de iluminación, sensores de posición, fines de carrera o detección de objetos en un determinada zona.

Precio

El sensor Sharp GP2Y0A02YK0F es más caro que un sensor de ultrasonidos HC-SR04. Podemos encontrar sensores Sharp GP2Y0A02YK0F por 3.70€ en vendedores internacionales de eBay o AliExpress.

arduino-sharp-gp2y0a02yk0f1-componente

¿Cómo funciona el Sharp GP2Y0A02YK0F?

El emisor LED infrarrojo emite un haz de luz pulsada infrarroja con una longitud de onda de 850nm +/-70nm. Se envía una luz pulsada para minimizar la influencia de la luz ambiente y del color del objeto en la medición.

El detector de posición PSD (position sensitive detection) es en realidad es un pequeño sensor CCD lineal que recibe la luz reflejada en cualquier objeto en la trayectoria del rayo. El sensor emplea triangulación para determinar la distancia del sensor a los objetos ubicados frente al rayo.

arduino-sharp-gp2y0a02yk0f1-funcionamiento

La salida analógica tienen un valor de 2.5V a 20 cm, y de 0.4 a 150cm. Sin embargo, como hemos mencionado, la respuesta es no lineal por lo que es necesario interpolar el valor para obtener un nivel de precisión adecuado.

arduino-sharp-GP2Y0A02YK0F1-precision

Esquema de montaje

El esquema de montaje es sencillo. Por un lado, alimentamos el sensor mediante Vcc y GND conectándolos, respectivamente, a 5V y GND de Arduino.

arduino-sharp-gp2y0a02yk0f1-esquema

Finalmente, conectamos el pin de señal a una de las entradas analógicas de Arduino.

arduino-sharp-GP2Y0A02YK0F1-conexion

Ejemplos de código

El siguiente código realiza la medición de la salida del sensor empleando las entradas analógicas de Arduino. A continuación, realiza la interpolación para obtener la distancia en centímetros.

Finalmente, muestra los valores por pantalla empleando el puerto serie. En un montaje real, usaríamos esta zona para hacer las acciones necesarias, como detener un robot o activar un mecanismo.

const int sensorPin = A0;
const long referenceMv = 5000;

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  //lectura de la tensión
  int val = analogRead(sensorPin);
  int mV = (val * referenceMv) / 1023;
  int cm = getDistance(mV);

  
  //mostrar valores por pantalla
  Serial.print(mV);
  Serial.print(",");
  Serial.println(cm);

  delay(1000);
}

//interpolación de la distancia a intervalos de 250mV
const int TABLE_ENTRIES = 12;
const int INTERVAL  = 250;
static int distance[TABLE_ENTRIES] = {150,140,130,100,60,50,40,35,30,25,20,15};

int getDistance(int mV) {
  if (mV > INTERVAL * TABLE_ENTRIES - 1)      return distance[TABLE_ENTRIES - 1];
  else {
    int index = mV / INTERVAL;
    float frac = (mV % 250) / (float)INTERVAL;
    return distance[index] - ((distance[index] - distance[index + 1]) * frac);
  }
}

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github. github-full