ANALÓGICO: SHARP



DISTANCIAS CON SENSORES SHARP

http://www.naylampmechatronics.com/blog/55_tutorial-sensor-de-distancia-sharp.html

ÍNDICE:
1.- TEORÍA
2.- DISTANCIA.
3.- OBSTÁCULOS.
4.- MEDICIÓN DE DISTANCIAS.




1.- TEORÍA

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.




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.

  • GP2Y0A21:  10-80 cm.
  • GP2Y0A02:  20-150 cm.
  • GP2Y0A710: 100-550 cm.


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.





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




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



 1.- DISTANCIA CON UN SHARP.
 



  • Vcc a 5voltios.
  • GND
  • DATOS A0.

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.
 El sensor SHARP tiene una salida analógica, que podemos leer desde el arduino como si trabajáramos con un potenciómetro.
 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.

 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:





 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.


CÓDIGO SIMPLE (con interferencias)
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);
}


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


CÓDIGO CON FILTRO ANTIRRUIDOS.
 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);
}





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

 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.





 CÓDIGO DETECCIÓN OBSTÁCULOS.


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);
}





3.- MEDICIÓN DE DISTANCIAS.

 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.

L= a*x^b

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:

L=17569.7*x^(-1.2062)
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.




 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:


L=28940.1*x^(-1.16)