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.
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.
SHARP | MODELO | RANGO |
---|---|---|
GP2Y0A21 | 10 a 80cm | |
GP2Y0A02 | 20 a 150cm | |
GP2Y0A710 | 100 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.
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.
Conexión entre Sensor SAHRP y Arduino
SENSOR SHARP |
ARDUINO |
---|---|
1. Vout |
A0 |
2. GND |
GND |
3. Vcc |
5V |
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.
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.
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:
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.
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.
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:
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:
Em****** 27/07/2022 Responder
Planeo utilizar este sensor como detector de obstáculos para un mini sumo de combate, para evitar que la luz solar lo afecte quiero colocarlo dentro de la carcaza, al ser de detección puntual no debería tener problemas por la misma carcaza ¿o sí?Ma**** 23/03/2021 Responder
Hola. soy nuevo en ésto.Dónde puedo encotrar las instrucciones para agregarle una memoria que almacene las mediciones? Gracias!Fe****** 08/02/2022 Responder
Hola que tal disculpa pudiste encontrar las instrucciones para almacenar las mediciones?Ju** ****** ** ****io 12/04/2020 Responder
Hola quisiera saber cual es la formula para el sensor Sharp Gp2y0a710k0f, ya que en el datasheet no esta la formula. GraciasVi**** 12/03/2020 Responder
Para Tiva C como puedo declarar la ecuaciónEd***** 05/02/2020 Responder
Con respecto al trabajo en el exterior, con el 02.afecta la luz ambiente, medianamente lo solucione poniendo valor mínimo de 195 a 250. El problema es que reduce la detección a unos 50 CM. Y necesitaría un mínimo de 80 CM. Lo necesito como sensor de movimiento para medir velocidad de carrera.Mi**** 25/03/2019 Responder
Estupendo tutorial. Me gustaría saber que precisión se puede alcanzar en la medición de la distencia. Mi propósito es hacer un "escaner tridimensional" y obtener la nube de puntos del objeto con las medidas de este sensorVi*** 21/03/2019 Responder
buenas noches, éste Sensor me puede servir para contar objetos?Al* 07/12/2018 Responder
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!!
Os*** ***az 30/09/2018 Responder
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 programaJo*** 29/05/2018 Responder
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.Ja**** *****do 28/10/2019 Responder
Justo estoy investigando lo mismoJe** ***te 07/05/2018 Responder
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 numeroPa******* 03/10/2018 Responder
El numero de veces que se hara el bucle de la funcion distanciaLg*** 04/12/2019 Responder
De hecho indica la cantidad de veces que promedia. Por ejemplo: si el parametro es 20, quiere decir que sensara 20 veces y luego hara el promedio con 20.Ho** ** ******** *** ***** *** ****** ***** ***** ***** ** ***or 05/04/2018 Responder
ChecoDi*** *****ón 01/08/2017 Responder
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.ni***** 12/06/2017 Responder
esos sensores que angulo de detección tienen ?Na***** 18/06/2017 Responder
Hola Nicolas, estos sensores no tienen ángulo de visión, sino línea de visión. De allí su término SHARPSe**** ********ky 22/02/2017 Responder
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?Os*** ****** *****ro 26/02/2019 Responder
Hola! Encontraste algo de ayuda con eso? Estoy en una situación parecida.Saludos.
Ri***** 23/10/2016 Responder
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?
Na***** 25/10/2016 Responder
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.