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