Artículos recientes

Novedades

Tutorial Sensor de Distancia SHARP

Tutorial Sensor de Distancia SHARP

En este tutorial trabajaremos los sensores de distancia Sharp, veremos las  características, conexiones y aplicaciones prácticas de estos sensores, analizaremos las diferencias entre los sensores GP2Y0A21, GP2Y0A02, GP2Y0A710 entre otros. Veremos ejemplos básicos para poder leer los sensores y realizaremos la calibración para tener una lectura en cm.


Un sensor SHARP es un sensor óptico capaz de medir la distancia entre él y un objeto, para esto el sensor con la ayuda de un emisor infrarrojo y un receptor miden la distancia usando triangulación.

El método de triangulación consiste en medir uno de los ángulos que forma el  triángulo emisor-objeto-receptor, el Receptor es un PSD (Position Sensitive Detector) que detecta el punto de incidencia el cual depende del ángulo y a su vez de la distancia del objeto.

Metodo de triangulacion SHARP

La geometría del sensor y de su óptica es el que limita el rango del sensor.

El termino SHARP (Agudo) es porque tiene un rango de visión muy reducido, esto porque la luz que emite es puntual,  lo que permite usar el sensor para escanear o mapear áreas, pero teniendo en cuenta que objetos pequeños serán difíciles de detectar.

También podemos usar varios sensores SAHRP para ampliar el rango de visión estos se pueden poner en diferente dirección e incluso  en la misma dirección siempre y cuando las líneas de visión no queden muy cercanas.

Una ventaja adicional es que no son sensibles a la luz ambiental o el Sol, enemigo de los sensores infrarrojos, un SHARP usa una luz infrarroja intermitente  con una frecuencia determinada, que en el receptor es filtrada y elimina cualquier otra fuente de luz diferente a la frecuencia emitida.


Existen varios fabricantes y modelos de sensores SHARP, para escoger un sensor SHARP hay que tener en cuenta el rango.

 

SHARPMODELORANGO
Sensor Infrarrojo de distancia SHARP GP2Y0A21GP2Y0A2110 a 80cm
Sensor Infrarrojo de distancia SHARP GP2Y0A21GP2Y0A0220 a 150cm
Sensor Infrarrojo de distancia SHARP GP2Y0A710GP2Y0A710100 a 550cm

La salida del sensor Sharp no es lineal sino tiene una forma potencial negativa pero a partir del rango mínimo como se muestra en la siguiente imagen.

 

Curva V vs D sensor SHARP


Notar que para distancias pequeñas, la lectura del sensor podría confundirse con una distancia grande. Es por esto que es recomendable asegurarnos que el objeto no se acerque demasiado al sensor con el fin de evitar una lectura incorrecta.

Una buena opción es ubicar el sensor cm atrás  del filo o de la posición que inicialmente queremos medir (ver imagen).

Ubicacion del sensor SHARP

Por ejemplo si nuestro sensor es el GP2Y0A21 es necesario restringir mecánicamente los 10cm en donde el sensor se comporta de forma inestable.



Conexión entre Sensor SAHRP y Arduino

 

SENSOR SHARP

ARDUINO

1. Vout

A0

2. GND

GND

3. Vcc

5V

 

conexion SHARP y arduino


Adicional a la conexión se puede conectar un condensador electrolítico de 10uF o más entre Vcc y GND pero lo más cercano al sensor, esto con el fin de eliminar el ruido en la fuente que genera el sensor.



Ej 1. Lectura ADC del sensor SHARP



El sensor SHARP tiene una salida analógica, que podemos leer desde el arduino como si trabajáramos con un potenciómetro.

void setup() {
  // Comunicación seria a 9600 baudios
  Serial.begin(9600);
}

void loop() {
  // Leemos la entrada analógica 0 :
  int ADC_SHARP = analogRead(A0);
  Serial.println(ADC_SHARP);
  delay(10);
}


Si abrimos el monitor serial podemos ver que al acercar un objeto al sensor el valor del adc aumenta mientras que si lo alejamos disminuye.

Lectura ADC del SHARP



También podemos observar que a pesar que el objeto lo dejemos estático, el valor de la lectura varía, esto por el ruido que genera el sensor, el nivel del ruido va a depender de la fuente que usen, para visualizar mejor el ruido pueden abrir el serial plotter de arduino:

plotter ADC del SHARP

El ruido que se observa no es por una mala precisión del sensor sino por el ruido que el emisor infrarrojo del sensor genera en la fuente, y esto también afectará a otros sensores analógicos que tengan conectado.

Par eliminar la lectura agregaremos un filtro, en nuestro caso solo usaremos un promedio de n muestras, pero pueden implementar cualquier otro filtro que les parezca adecuado

el nuevo sketch seria el siguiente:

void setup() {
  // // Comunicación seria a 9600 baudios
  Serial.begin(9600);
}


void loop() {
  // Leemos el promedio de la entrada analógica 0 
  int ADC_SHARP=ADC0_promedio(20);
 
  Serial.println(ADC_SHARP);
  delay(10);
}

int ADC0_promedio(int n)
{
  long suma=0;
  for(int i=0;i<n;i++)
  {
    suma=suma+analogRead(A0);
  }  
  return(suma/n);
}


Ahora podemos notar que el ruido a disminuido considerablemente:

plotter filtro ADC del SHARP


La imagen es usando el filtro de un promedio de 20 muestras. Pueden modificar la cantidad de muestras de acuerdo al nivel de ruido que tengan, a mayor cantidad de muestras tendrán mejores resultados, pero teniendo en cuenta que también aumentara el tiempo de la lectura, para 20 muestras arduino demora aproximadamente 2ms en sacar el promedio, un tiempo aceptable para casi todas las aplicaciones.


Ej 2. Detección de obstáculos: Sensor de proximidad

 

Una de las aplicaciones en las que más se usa el sensor SHARP es para detectar obstáculos y de esta forma se estaría trabajando simplemente como un sensor de proximidad, pues solo nos interesa saber si hay algún objeto frente a nosotros mas no la distancia.

En este caso primero debemos de determinar la distancia a la cual queremos que se considera que el objeto está cercano.

Para este ejemplo trabajaremos como dicho umbral 30cm pero ustedes pueden tomar cualquier otra distancia.

El siguiente paso es usar una regla y ubicar un objeto frente al sensor exactamente en 30cm, la distancia se mide a partir del lente del sensor.

Usando el primer ejemplo tomamos la lectura del ADC correspondiente para dicha distancia: En nuestro caso el valor es de 195.

Finalmente en el programa solo hay que comparar la lectura del sensor con el umbral para determinar si hay o no objetos.

A continuación mostramos el sketch para usar el SAHRP como un detector de obstáculos o sensor de proximidad

void setup() {
  // Comunicación seria a 9600 baudios
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}


void loop() {
  // Leemos el promedio de la entrada analógica 0 :
  int ADC_SHARP=ADC0_promedio(20);
  if(ADC_SHARP>195)
  {
    digitalWrite(13, HIGH);
    Serial.print("Objeto Detectado:");
  }
  else
  {
    digitalWrite(13, LOW);
    Serial.print("Objeto ausente:");
  }
  
  Serial.println(ADC_SHARP);
  delay(10);
}

int ADC0_promedio(int n)
{
  long suma=0;
  for(int i=0;i<n;i++)
  {
    suma=suma+analogRead(A0);
  }  
  return(suma/n);
}


Cambiando el valor de 195 pueden ampliar o disminuir el umbral de detección.

En nuestro ejemplo solo encendemos el LED que está conectado al pin 13 y confirmamos por el puerto serial que se ha detectado un objeto, pero esto dependerá de su aplicación.

A continuación se muestra la salida del monitor serial cuando acercamos un objeto al sensor.

deteccion de obtaculos SHARP


Ej 3. Realizando medidas de distancia con el Sensor Sharp


En este ejemplo usaremos el SHARP para medir distancia, para esto solo es necesario tener la relación ADC vs Distancia. En el del datasheet del sensor encontramos la relación Voltaje Vs Distancia. Pode aplicar regresión a dicha curva y despejar voltaje para reemplazar por ADC , nosotros tomaremos muestras y hallaremos la ecuación.



De la curva del datasheet solo tomamos la forma que como se observa es potencial pero teniendo en cuenta que la ecucion trabajará dentro del rango de trabajo del sensor.

ecuacion potencia

Como voltaje y el valor del ADC que leemos desde el arduino son proporcional, hallaremos la ecuación en función del valor del ADC, esto con el fin de ahorrarnos un cálculo por parte del arduino para obtener el voltaje. Entonces para nosotros “x” es el valor del ADC

Con el ejemplo 1 pero aumentando el número de muestras para eliminar el ruido, realizamos dos medidas o puntos. Estos puntos no tienen que ser muy cercanos, por ejemplo lecturas a 15cm y 50cm para el sensor SHARP GP2YA021.

Estos dos puntos medidos son:


X1 = 350 para L1=15cm
X2 = 129  para L2=50cm



Reemplazando estos valores en la ecuación, podemos formar un sistema de ecuaciones y hallar las variables “a” y “b”,

Con nuestros valores tomados la ecuación obtenida es:

ecuacion para la distancia sensor SHARP

El mismo método pueden aplicar para otros modelos de Sensores SHARP.


A continuación mostramos el sketch para sensar distancia.

void setup() {
  // Comunicación seria a 9600 baudios
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}


void loop() {
  
  long tiempo=millis(); //tiempo antes de iniciar la lectura
  int D_cm=distancia(20); //lectura de distancia
  tiempo=millis()-tiempo; //milisegundos que duró la lectura
  Serial.print("Tiempo de lectura: ");
  Serial.print(tiempo); 
  Serial.print("ms  Distancia: ");
  Serial.print(D_cm);
  Serial.println("  cm");
  delay(100);
}

float distancia(int n)
{
  long suma=0;
  for(int i=0;i<n;i++)
  {
    suma=suma+analogRead(A0);
  }  
  float adc=suma/n;
  float distancia_cm = 17569.7 * pow(adc, -1.2062);
  return(distancia_cm);
}


Como se observa solo se agregó la ecuación antes calculada y adicionalmente a esto mostramos el tiempo en milisegundos que demora en realizar la lectura, esto con el fin de no excedernos en tomar muchas muestras en cada lectura, y poder elegir o combinar entre el nivel de ruido que podemos tolerar y el tiempo de lectura.

A continuación mostramos  la salida del monitor serial cuando se ubica un objeto a 30 cm del sensor.

Lectura de distancia con SHARP


De igual manera pueden trabajar con los otros modelos de SHARP, si están trabajando con el SHARP GP2Y0A02 deben obtener una ecuación cercana a esta:


ecuacion de distancia SHARP GP2Y0A02

17 Comments

    • Avatar
      Richard
      oct 23, 2016

      Hola! tengo el sensor SHARP GP2Y0A02 estuve probando el circuito de encender un led si se encuentra un objeto y note que a la luz del sol tiene malas lecturas enciende y apaga el led determinadas veces estando en movimiento el sensor (como si encontrar obstáculos) cosa que no pasa estando bajo techo, asi funciona al 100%. en el post menciona que la luz ambiente no influye en las mediciones, en el datasheet habla de algo parecido, que la influencia que tiene es minima y no afecta en casi nada. pero la experiencia que tengo es todo lo contrario, alguna sugerencia?

      • Avatar
        Naylamp
        oct 25, 2016

        Estimado Richard, podría deberse a la calidad del sensor, el fabricante también recomienda ubicar el sensor perpendicular al movimiento. Si tu movimiento es horizontal, ubica el sensor en forma vertical.

    • Avatar
      Sergio Pluchinsky
      feb 22, 2017

      Hola, estoy con un proyecto donde necesito medir desplazamientos pero con una precisión de décimas de milímetro, tienes alguna idea q tipo de sensor podría utilizar?

    • Avatar
      nicolas
      jun 12, 2017

      esos sensores que angulo de detección tienen ?

      • Avatar
        Naylamp
        jun 18, 2017

        Hola Nicolas, estos sensores no tienen ángulo de visión, sino línea de visión. De allí su término SHARP

    • Avatar
      Diego Garzón
      ago 1, 2017

      Hola, no se mucho de mecatrónica ni de programación, pero quiero accionar un motor cualquiera através de un arduino y un sensor Sharp, alguien podría ayudarme en estos aspectos, porfavor. Gracias.

    • Avatar
      Checho
      mar 1, 2018

      CHECHO CHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHOCHECHO

    • Avatar
      CHOMELO
      mar 1, 2018

      I LIKE FUCK ASIANS

      • Avatar
        Romero
        mar 1, 2018

        Le borramos su comentario, no tiene nada que ver co n el tema

    • Avatar
      Campesinito
      mar 1, 2018

      Quiobo su merced

    • Avatar
      OHCAS
      mar 1, 2018

      I M GAY, I LIKE TO MET NEW PEOPLE BECOUSE I LIKE THE BLACK COCKS :)

    • Avatar
      Hola me gustaria con ayuda del sensor SHARP poder mover un motor al momento de que el sensor encuentre un objeto en su rango de deteccion alguien podria ayudarme
      abr 5, 2018

      Checo

    • Avatar
      Jean Corte
      may 7, 2018

      Disculpe el valor de 20 en la linea int D_cm=distancia(20) de la lectura de distancia con el sensor a que corresponde, es decir que funcion cumple ese numero

      • Avatar
        Patatejas
        oct 3, 2018

        El numero de veces que se hara el bucle de la funcion distancia

    • Avatar
      Jorge
      may 29, 2018

      Puedo usar este sensor para medir nivel de agua? Hay alguna forma de hacerlo o el agua no refleja nada de la luz infrarroja? Yo sé que se suele usar un sensor ultrasónico para eso pero no quiero cablear los 4 pines de esos sensores.

    • Avatar
      Oscar Díaz
      sep 30, 2018

      Oye en el tercer esquema de programación en arduino el sensor no me reconoce ninguna entrada y creo qye se deba a que no se le declara como A0 en nngun momento, dimde si estoy equivocado, esque no me funciona la programacion ni el led en ese programa

    • Avatar
      Alo
      dic 7, 2018

      Muchas gracias por el tutorial, me viene estupendo. Una cosa, sin ánimo de desmerecer el estupendo tutorial, lo de "Sharp" creo que no se refiere al tipo de sensor ni a su funcionamiento, sino al FABRICANTE (http://www.sharp-world.com/products/device/lineup/selection/opto/haca/diagram.html). Además, para describir un ángulo en inglés se utiliza la palabra "acute", no "sharp". De nuevo gracias por la info!!

Leave a Reply

* Name:
* E-mail: (Not Published)
   Website: (Site url withhttp://)
* Comment: