Medir distancias

Hola, pretendo montar un robot que tenga varios sensores de distancia diferentes que le permitan elegir la mejor ruta posible; pero tengo dos problemas (o tres si tenemos en cuenta lo poco que sé todavía jaja):

  • La escasa fiabilidad de los sensores. He probado con los de ultrasonidos HC-SR04 (creo que es una copia china) y fluctuan demasiado las distancias. En general está bien, pero de vez en cuando da un resultado completamente absurdo (como por ejemplo 0cm), lo que hace que el robot se vuelva loco.
    He probado los de infrarrojos sharp GP2Y0A02YK y, encima de que sólo miden de 10 a 80 cm, constamente está tomando mediciones erróneas. Sinceramente, no sé ni por qué los venden... Incluso con el sensor completamente quieto delante de una pared blanca, mide continuamente valores diferentes.

¿Qué sensores me recomendáis como más fiables? Más que mucha precisión (ojalá) necesito que no den valores extraños de repente. He leído que hay sensores láser, pero no sé nada de ellos.

Quizás el problema es que los que tengo son demasiado baratos y malos. No me importa gastarme dinero en unos buenos...

  • El otro problema es que cuando conecto dos sensores de ultrasonidos al arduino, uno de ellos me da siempre 0 cm o valores extraños. Los dos sensores están en el frontal del robot, mirando hacia adelante, un poquito abiertos, es decir, ligeramente desviados uno del otro para intentar evitar interferencias.

el código que utilizo es este (por si podéis indicarme algo que corregir o lo que sea):

Muchas gracias por vuestra ayuda!!

long distanciaD; //distancia del sensor de la derecha
long tiempoD; //tiempo del sensor de la derecha
long distanciaI;//distancia del sensor de la izquierda
long tiempoI; //tiempo del sensor de la izquierda

void setup(){
Serial.begin(9600);
pinMode(2, OUTPUT); /activación del pin 2 como salida: para el pulso ultrasónico/
pinMode(3, INPUT); /activación del pin 3 como entrada: tiempo del rebote del ultrasonido/
pinMode(4, OUTPUT); /activación del pin 4 como salida: para el pulso ultrasónico/
pinMode(5, INPUT); /activación del pin 5 como entrada: tiempo del rebote del ultrasonido/
}

void loop(){
digitalWrite(4,LOW);/* Por cuestión de estabilización del sensor*/
delayMicroseconds(5);
digitalWrite(4, HIGH); /* envío del pulso ultrasónico*/
delayMicroseconds(15);
tiempoD=pulseIn(5, HIGH);/* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío
del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que
deja de hacerlo, LOW, la longitud del pulso entrante*/
distanciaD= int(0.017*tiempoD); /fórmula para calcular la distancia obteniendo un valor entero/
/Monitorización en centímetros por el monitor serial/

digitalWrite(2,LOW);/* Repito lo mismo para el sensor de la izquierda*/
delayMicroseconds(5);
digitalWrite(3, HIGH);
delayMicroseconds(15);
tiempoI=pulseIn(3, HIGH);
distanciaI= int(0.017*tiempoI);

//Visualizo los resultados de las mediciones
Serial.print("Derecha: ");
Serial.println(distanciaD);
Serial.print("Izquierda: ");
Serial.println(distanciaI);

delay(500);

}

Me respondo a mí mismo jaja!! He encontrado aquí:
http://www.ardublog.com/library-for-arduino-ultrasonic-ranging-hc-sr04/
una librería específica para el sensor HC-SR04. Ahora el código que uso es mucho más reducido (lo copio al final). Genial!

  • Sigo necesitando ayuda para que me recomendéis sensores. He visto uno de 145€ que seguro que es el que necesito jaja pero no voy a gastarme tanto. Sin embargo, entre 30 y 50€ sí me parece un precio aceptable (aunque doloroso)

El código (mucho más elegante ahora)

#include <Ultrasonic.h>

Ultrasonic distanciaD(2,3); // (Trig PIN,Echo PIN)
Ultrasonic distanciaI(4,5); // (Trig PIN,Echo PIN)

void setup() {
Serial.begin(9600);
}

void loop()
{
Serial.print("Izquierda: ");
Serial.print(distanciaI.Ranging(CM)); // CM or INC
Serial.print(" cm " );
delay(50);
Serial.print("Derecha: ");
Serial.print(distanciaD.Ranging(CM)); // CM or INC
Serial.println(" cm" );
delay(500);
}

Hola Gonmoa yo te recomiendo la libreria NewPing para el HCSR04 principalmente porque te permite medir la media de la medida lo cual aumenta la fiabilidad de la medida he trabajado con ella y esos sensores y me ha parecido muy estable.

Uf, el código queda muchísimo más largo con esa librería y la verdad es que no termino de entender cómo funciona; lo que me dificultaría mucho después la tarea de dar órdenes a los motores dependiendo de la distancia de cada sensor. Además, no sé por qué, uno de los sensores me marca 0 casi siempre con esa librería... Pero muchas gracias por la aportación en cualquier caso. Seguiré investigando esa librería a ver si estoy haciendo algo mal.

¿Alguna idea sobre qué sensores debería usar? Me encantaría encontrar uno de infrarrojos o laser no excesivamente caro y fiable...

No es tan complicado usar NewPing.
Primero y fundamental NewPing no te dará respuestas erróneas.
Segundo no usa PULSEIN que es una lágrima (expresión que significa No me gusta) según mi punto de vista, resuelve sus lecturas usando un TIMER del Arduino, algo que debes tener en cuanta si luego usas librería de motor con PWM. Atención.
El problema del 0 cm ocurre cuando no encuentra obstáculo, eso pasa con PULSEIN e incluso con versiones viejas de librerías Ultrasónicas. Con obviar ese resultado, no tienes porque desesperarte por recibir un 0.
0 entonces es camino libre.
Respecto de los sensores en líneas generales, piensa que son sensores para usos hobbistas de manera que no exijas comportamientos profesionales. Si quieres algo mejor, hay que pagar por algo mejor.